tokentracker-cli 1.3.14 → 1.3.15

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 (115) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dashboard/dist/assets/{AchievementBadge-DJK8AWBF.js → AchievementBadge-CSXb26DC.js} +1 -1
  4. package/dashboard/dist/assets/{AchievementsPage-Cle78oKH.js → AchievementsPage-Bs6vIpd0.js} +2 -2
  5. package/dashboard/dist/assets/{AchievementsSection-BPqXDoPP.js → AchievementsSection-BO4u-574.js} +1 -1
  6. package/dashboard/dist/assets/{BadgeDetailModal-HsH_Pwsu.js → BadgeDetailModal-ic60vrZX.js} +1 -1
  7. package/dashboard/dist/assets/{BotAnimated-BWy2-z4Q.js → BotAnimated-BHHAUEQL.js} +1 -1
  8. package/dashboard/dist/assets/{Card-DPGBuBDb.js → Card-8t2FYLJV.js} +1 -1
  9. package/dashboard/dist/assets/{CloudCheckoutPage-ohIQnIhe.js → CloudCheckoutPage-CXaDDial.js} +1 -1
  10. package/dashboard/dist/assets/{CloudPage-OYiiZ4c4.js → CloudPage-DN6s_UrT.js} +2 -2
  11. package/dashboard/dist/assets/{CommandPalette-BmDZmpMi.js → CommandPalette-D7dHMpHK.js} +1 -1
  12. package/dashboard/dist/assets/{CommunityStatsModal-L86uJgyp.js → CommunityStatsModal-C55r20Vb.js} +1 -1
  13. package/dashboard/dist/assets/{ConfirmModal-COQfPXos.js → ConfirmModal-jSEqSSnW.js} +1 -1
  14. package/dashboard/dist/assets/{Controls-BkKlT6Dz.js → Controls-CqmoR37l.js} +1 -1
  15. package/dashboard/dist/assets/{DashboardPage-3dlQBOjz.js → DashboardPage-BLr2XmyZ.js} +1 -1
  16. package/dashboard/dist/assets/{DateRangePopover-D0UeP8ig.js → DateRangePopover-z89rKqjK.js} +1 -1
  17. package/dashboard/dist/assets/{DevicePage-K3CdWKaf.js → DevicePage-Ddm5uKOw.js} +1 -1
  18. package/dashboard/dist/assets/{DialogClose-DKQ2ZVA0.js → DialogClose-imfpTM8a.js} +1 -1
  19. package/dashboard/dist/assets/DialogDescription-BE5CNMW0.js +1 -0
  20. package/dashboard/dist/assets/{DialogTitle-ufFnN-8D.js → DialogTitle-Ca1-hka8.js} +1 -1
  21. package/dashboard/dist/assets/{ElectricLogo-Bb79UnTo.js → ElectricLogo-CrnDjhtG.js} +1 -1
  22. package/dashboard/dist/assets/{FadeIn-DlAKIU4I.js → FadeIn-CAr2EMcK.js} +1 -1
  23. package/dashboard/dist/assets/{HeaderGithubStar-CzwSyhEY.js → HeaderGithubStar-UK7qFFNh.js} +1 -1
  24. package/dashboard/dist/assets/{HoverTooltip-BEpwekkd.js → HoverTooltip-fs1HBOXB.js} +1 -1
  25. package/dashboard/dist/assets/{IpCheckPage-C7kpZ9JX.js → IpCheckPage-Bk-MlPWf.js} +1 -1
  26. package/dashboard/dist/assets/{LandingPage-CfYk0Jzy.js → LandingPage-DJnPCdqP.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardPage-XgjAHwpy.js → LeaderboardPage-wVjwsqyc.js} +2 -2
  28. package/dashboard/dist/assets/{LeaderboardProBadge-wSlqVjBb.js → LeaderboardProBadge-BaQdHu06.js} +1 -1
  29. package/dashboard/dist/assets/{LeaderboardProfileModal-DaQrNYnu.js → LeaderboardProfileModal-D5ZZtIPl.js} +3 -3
  30. package/dashboard/dist/assets/{LeaderboardProfilePage-3SWjG8FQ.js → LeaderboardProfilePage-BZsBL2jT.js} +1 -1
  31. package/dashboard/dist/assets/{LimitsPage-DvM57ri3.js → LimitsPage-Cks_mKSL.js} +1 -1
  32. package/dashboard/dist/assets/{LocalOnlyNotice-CY6eDJEk.js → LocalOnlyNotice-DLnC_Tq4.js} +1 -1
  33. package/dashboard/dist/assets/{LoginCard-4bdpPQeD.js → LoginCard-FXZbjmOY.js} +1 -1
  34. package/dashboard/dist/assets/{LoginModal-Bmw7-b3f.js → LoginModal-_R-0ZtpQ.js} +1 -1
  35. package/dashboard/dist/assets/{LoginPage-CEI4nnlT.js → LoginPage-MzDRyv1Q.js} +1 -1
  36. package/dashboard/dist/assets/{PetPage-7Udtc9GY.js → PetPage-DJ58EiPT.js} +2 -2
  37. package/dashboard/dist/assets/{PopoverPopup-r2BvRKLO.js → PopoverPopup-uQa7G-IO.js} +1 -1
  38. package/dashboard/dist/assets/{ProviderIcon-Cy_pKLdw.js → ProviderIcon-xSNRuia-.js} +1 -1
  39. package/dashboard/dist/assets/{ResetPasswordPage-QKUaLtO3.js → ResetPasswordPage-BcVcWbsW.js} +1 -1
  40. package/dashboard/dist/assets/{Select-BsUrn8Ui.js → Select-Dwix4ZFd.js} +1 -1
  41. package/dashboard/dist/assets/{SelectItemText-Nis0uGZT.js → SelectItemText-Bz5cn5Gk.js} +1 -1
  42. package/dashboard/dist/assets/{SelfHostPage-DF8EzBEV.js → SelfHostPage-BLocCkUo.js} +1 -1
  43. package/dashboard/dist/assets/{ServiceStatusPage-BYmKzI_v.js → ServiceStatusPage-CzMjS7EQ.js} +1 -1
  44. package/dashboard/dist/assets/{SessionsPage-BsCVe75l.js → SessionsPage-Dqzuthrd.js} +1 -1
  45. package/dashboard/dist/assets/{SettingsPage-CIZ6WmNR.js → SettingsPage-DEdNhzKR.js} +3 -3
  46. package/dashboard/dist/assets/{SkillsPage-cwHyK0Hp.js → SkillsPage-CqocOQID.js} +1 -1
  47. package/dashboard/dist/assets/{TokenGalaxy-2S-ud67v.js → TokenGalaxy-B2sMNsM0.js} +1 -1
  48. package/dashboard/dist/assets/{TooltipPopup-GG7xjDOP.js → TooltipPopup-LzbtjRSA.js} +1 -1
  49. package/dashboard/dist/assets/{TrendMonitor-CrbXrVMe.js → TrendMonitor-DpMcMWVh.js} +1 -1
  50. package/dashboard/dist/assets/{WidgetsPage-HrhnI3C-.js → WidgetsPage-aKfztwsk.js} +1 -1
  51. package/dashboard/dist/assets/{WrappedPage-sm7UVFon.js → WrappedPage-NoY2hqbF.js} +1 -1
  52. package/dashboard/dist/assets/__vite-browser-external-BnGukaND.js +45 -0
  53. package/dashboard/dist/assets/{agent-logos-DGrrmPth.js → agent-logos-Oh8CLAYk.js} +1 -1
  54. package/dashboard/dist/assets/{arrow-left-DOzsdmqR.js → arrow-left-Mwggxctm.js} +1 -1
  55. package/dashboard/dist/assets/{arrow-right-CHb0kJou.js → arrow-right-Crx-kuck.js} +1 -1
  56. package/dashboard/dist/assets/{arrow-up-right-CH8vEEN1.js → arrow-up-right-uwoo8I0B.js} +1 -1
  57. package/dashboard/dist/assets/{calendar-days-_D5qnyH_.js → calendar-days-C6MeKaqh.js} +1 -1
  58. package/dashboard/dist/assets/{check-DZLesnNy.js → check-dsWQRYNj.js} +1 -1
  59. package/dashboard/dist/assets/{chevron-down-QL4xkUtL.js → chevron-down-BIf5bhyB.js} +1 -1
  60. package/dashboard/dist/assets/{cloud-checkout-DiCcWJVl.js → cloud-checkout-GnFRQdnr.js} +1 -1
  61. package/dashboard/dist/assets/{composite-DObGcQmb.js → composite-lINFdwLI.js} +1 -1
  62. package/dashboard/dist/assets/{download-BKp8pusR.js → download-B7eyvOxn.js} +1 -1
  63. package/dashboard/dist/assets/{external-link-B3p_TVGc.js → external-link-RNTsFDG4.js} +1 -1
  64. package/dashboard/dist/assets/{flame-Df9OTUym.js → flame-uwCJ6brb.js} +1 -1
  65. package/dashboard/dist/assets/{format-tokens-DXrEDEYs.js → format-tokens-Bf7JxB4E.js} +1 -1
  66. package/dashboard/dist/assets/{gift-DtWubiuR.js → gift-BY7kCGBK.js} +1 -1
  67. package/dashboard/dist/assets/{host-mode-C069A_hB.js → host-mode-Bs-UHw-7.js} +1 -1
  68. package/dashboard/dist/assets/{icons-lB1kfROy.js → icons-CrLu8vlW.js} +1 -1
  69. package/dashboard/dist/assets/{index-DsXIWrJx.js → index-CXQag63s.js} +1 -1
  70. package/dashboard/dist/assets/{index-D356L-jw.js → index-DYIIk93n.js} +1 -1
  71. package/dashboard/dist/assets/{index-M5BiC0jx.js → index-DieuzFHA.js} +1 -1
  72. package/dashboard/dist/assets/{info-CSG8OkG4.js → info-BteHQN_N.js} +1 -1
  73. package/dashboard/dist/assets/{link-2-BkBGu7FX.js → link-2-C1RSbOHv.js} +1 -1
  74. package/dashboard/dist/assets/{loader-circle-BERDkbsP.js → loader-circle-BM3x6_YL.js} +1 -1
  75. package/dashboard/dist/assets/{modifiers.esm-Ce5IvVw2.js → modifiers.esm-BHzOJfH3.js} +1 -1
  76. package/dashboard/dist/assets/{monitor-smartphone-zKuoJldz.js → monitor-smartphone-Ps3VptSt.js} +1 -1
  77. package/dashboard/dist/assets/{play-C0x-pxft.js → play-7MpFYU7a.js} +1 -1
  78. package/dashboard/dist/assets/{plus-DJvks-CX.js → plus-Dk-p9OaZ.js} +1 -1
  79. package/dashboard/dist/assets/{provider-display-C0e4tAFu.js → provider-display-Czwv4ClR.js} +1 -1
  80. package/dashboard/dist/assets/{react-Bg0_YfGs.js → react-D9vco0ZF.js} +1 -1
  81. package/dashboard/dist/assets/{safePolygon-CptquMWZ.js → safePolygon-Ca2iBTNb.js} +1 -1
  82. package/dashboard/dist/assets/{search-CLESf2Tg.js → search-Z2Hfw99-.js} +1 -1
  83. package/dashboard/dist/assets/{server-Cdwhp-2m.js → server-Dh_OraRG.js} +1 -1
  84. package/dashboard/dist/assets/{shield-check-8U4XqmW3.js → shield-check-59NUSZvk.js} +1 -1
  85. package/dashboard/dist/assets/{skills-api-ioDaxLLo.js → skills-api-Bguk8iPD.js} +1 -1
  86. package/dashboard/dist/assets/{sortable.esm-CEohF5EK.js → sortable.esm-C9M-1k5o.js} +1 -1
  87. package/dashboard/dist/assets/{store-CyOeiGFE.js → store-nR9Ah4fr.js} +1 -1
  88. package/dashboard/dist/assets/{terminal-BjgwEAH-.js → terminal-DKTXh9tj.js} +1 -1
  89. package/dashboard/dist/assets/{trash-Skj6z7D1.js → trash-CQRRKbCs.js} +1 -1
  90. package/dashboard/dist/assets/{use-community-stats-Cworqjzy.js → use-community-stats-BoOd2Hhq.js} +1 -1
  91. package/dashboard/dist/assets/{use-latest-request-guard-DMVWXXHE.js → use-latest-request-guard-vQtFEBIX.js} +1 -1
  92. package/dashboard/dist/assets/{use-limits-display-prefs-DKJZcYfE.js → use-limits-display-prefs-BRTj9_xd.js} +1 -1
  93. package/dashboard/dist/assets/{use-native-settings-CQF4BLQl.js → use-native-settings-CC6uEn3j.js} +1 -1
  94. package/dashboard/dist/assets/{use-ordered-list-B9yoUGUU.js → use-ordered-list-BUx6eIN7.js} +1 -1
  95. package/dashboard/dist/assets/use-reduced-motion-BZBrXeyc.js +1 -0
  96. package/dashboard/dist/assets/{use-session-efficiency-pref-K00bK2sQ.js → use-session-efficiency-pref-BsUypXPb.js} +1 -1
  97. package/dashboard/dist/assets/{use-transform-Cfw11yOU.js → use-transform-oomGXI86.js} +1 -1
  98. package/dashboard/dist/assets/{use-usage-limits-BE2dJXFd.js → use-usage-limits-CXeCKJZ_.js} +1 -1
  99. package/dashboard/dist/assets/{useCurrency-BW7y9Tdv.js → useCurrency-DIZEXq5g.js} +1 -1
  100. package/dashboard/dist/assets/{usePositioner-DhtQcPOC.js → usePositioner-Drh2sy7w.js} +1 -1
  101. package/dashboard/dist/assets/{useTokenFormat-BnvzUc-t.js → useTokenFormat-DKURSOqb.js} +1 -1
  102. package/dashboard/dist/assets/{zap-BQ3BR9On.js → zap-BQ8nGK7b.js} +1 -1
  103. package/dashboard/dist/index.html +1 -1
  104. package/dashboard/dist/ip-check.html +1 -1
  105. package/dashboard/dist/leaderboard.html +1 -1
  106. package/dashboard/dist/pricing.html +1 -1
  107. package/dashboard/dist/share.html +1 -1
  108. package/dashboard/dist/terms.html +1 -1
  109. package/package.json +1 -1
  110. package/src/lib/pricing/curated-overrides.json +47 -0
  111. package/src/lib/pricing/matcher.js +11 -3
  112. package/src/lib/pricing/seed-snapshot.json +1 -1
  113. package/dashboard/dist/assets/DialogDescription-MbuaPFlj.js +0 -1
  114. package/dashboard/dist/assets/__vite-browser-external-C7JgMYNl.js +0 -45
  115. package/dashboard/dist/assets/use-reduced-motion-DPUViCfp.js +0 -1
@@ -1,45 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LimitsPage-DvM57ri3.js","assets/react-Bg0_YfGs.js","assets/use-usage-limits-BE2dJXFd.js","assets/use-limits-display-prefs-DKJZcYfE.js","assets/use-latest-request-guard-DMVWXXHE.js","assets/Card-DPGBuBDb.js","assets/FadeIn-DlAKIU4I.js","assets/use-reduced-motion-DPUViCfp.js","assets/ProviderIcon-Cy_pKLdw.js","assets/HoverTooltip-BEpwekkd.js","assets/chevron-down-QL4xkUtL.js","assets/gift-DtWubiuR.js","assets/ConfirmModal-COQfPXos.js","assets/DialogTitle-ufFnN-8D.js","assets/composite-DObGcQmb.js","assets/store-CyOeiGFE.js","assets/DialogDescription-MbuaPFlj.js","assets/LocalOnlyNotice-CY6eDJEk.js","assets/arrow-up-right-CH8vEEN1.js","assets/download-BKp8pusR.js","assets/Select-BsUrn8Ui.js","assets/check-DZLesnNy.js","assets/SelectItemText-Nis0uGZT.js","assets/usePositioner-DhtQcPOC.js","assets/plus-DJvks-CX.js","assets/PopoverPopup-r2BvRKLO.js","assets/safePolygon-CptquMWZ.js","assets/LeaderboardPage-XgjAHwpy.js","assets/sortable.esm-CEohF5EK.js","assets/modifiers.esm-Ce5IvVw2.js","assets/useCurrency-BW7y9Tdv.js","assets/useTokenFormat-BnvzUc-t.js","assets/LeaderboardProBadge-wSlqVjBb.js","assets/TooltipPopup-GG7xjDOP.js","assets/AchievementBadge-DJK8AWBF.js","assets/zap-BQ3BR9On.js","assets/flame-Df9OTUym.js","assets/calendar-days-_D5qnyH_.js","assets/shield-check-8U4XqmW3.js","assets/use-ordered-list-B9yoUGUU.js","assets/arrow-right-CHb0kJou.js","assets/use-community-stats-Cworqjzy.js","assets/LoginModal-Bmw7-b3f.js","assets/LoginCard-4bdpPQeD.js","assets/arrow-left-DOzsdmqR.js","assets/CommandPalette-BmDZmpMi.js","assets/skills-api-ioDaxLLo.js","assets/index-M5BiC0jx.js","assets/search-CLESf2Tg.js","assets/DashboardPage-3dlQBOjz.js","assets/TrendMonitor-CrbXrVMe.js","assets/DateRangePopover-D0UeP8ig.js","assets/terminal-BjgwEAH-.js","assets/provider-display-C0e4tAFu.js","assets/play-C0x-pxft.js","assets/info-CSG8OkG4.js","assets/DialogClose-DKQ2ZVA0.js","assets/use-transform-Cfw11yOU.js","assets/loader-circle-BERDkbsP.js","assets/use-session-efficiency-pref-K00bK2sQ.js","assets/agent-logos-DGrrmPth.js","assets/monitor-smartphone-zKuoJldz.js","assets/ServiceStatusPage-BYmKzI_v.js","assets/external-link-B3p_TVGc.js","assets/AchievementsPage-Cle78oKH.js","assets/AchievementsSection-BPqXDoPP.js","assets/format-tokens-DXrEDEYs.js","assets/LandingPage-CfYk0Jzy.js","assets/host-mode-C069A_hB.js","assets/HeaderGithubStar-CzwSyhEY.js","assets/os-DMmhX9tk.js","assets/icons-lB1kfROy.js","assets/LeaderboardProfilePage-3SWjG8FQ.js","assets/LeaderboardProfileModal-DaQrNYnu.js","assets/link-2-BkBGu7FX.js","assets/LoginPage-CEI4nnlT.js","assets/ResetPasswordPage-QKUaLtO3.js","assets/SettingsPage-CIZ6WmNR.js","assets/Controls-BkKlT6Dz.js","assets/cloud-checkout-DiCcWJVl.js","assets/use-native-settings-CQF4BLQl.js","assets/CloudPage-OYiiZ4c4.js","assets/server-Cdwhp-2m.js","assets/CloudCheckoutPage-ohIQnIhe.js","assets/SelfHostPage-DF8EzBEV.js","assets/SkillsPage-cwHyK0Hp.js","assets/trash-Skj6z7D1.js","assets/SessionsPage-BsCVe75l.js","assets/SessionsPage-GV2fuNmd.css","assets/WidgetsPage-HrhnI3C-.js","assets/PetPage-7Udtc9GY.js"])))=>i.map(i=>d[i]);
2
- function SC(e,t){for(var a=0;a<t.length;a++){const o=t[a];if(typeof o!="string"&&!Array.isArray(o)){for(const s in o)if(s!=="default"&&!(s in e)){const i=Object.getOwnPropertyDescriptor(o,s);i&&Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:()=>o[s]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))o(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const c of i.addedNodes)c.tagName==="LINK"&&c.rel==="modulepreload"&&o(c)}).observe(document,{childList:!0,subtree:!0});function a(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function o(s){if(s.ep)return;s.ep=!0;const i=a(s);fetch(s.href,i)}})();function pk(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function CC(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var t=e.default;if(typeof t=="function"){var a=function o(){var s=!1;try{s=this instanceof o}catch{}return s?Reflect.construct(t,arguments,this.constructor):t.apply(this,arguments)};a.prototype=t.prototype}else a={};return Object.defineProperty(a,"__esModule",{value:!0}),Object.keys(e).forEach(function(o){var s=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(a,o,s.get?s:{enumerable:!0,get:function(){return e[o]}})}),a}var Up={exports:{}},Gi={},Hp={exports:{}},nt={};var q_;function TC(){if(q_)return nt;q_=1;var e=Symbol.for("react.element"),t=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),o=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),f=Symbol.for("react.memo"),g=Symbol.for("react.lazy"),b=Symbol.iterator;function w(N){return N===null||typeof N!="object"?null:(N=b&&N[b]||N["@@iterator"],typeof N=="function"?N:null)}var x={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,E={};function C(N,W,ue){this.props=N,this.context=W,this.refs=E,this.updater=ue||x}C.prototype.isReactComponent={},C.prototype.setState=function(N,W){if(typeof N!="object"&&typeof N!="function"&&N!=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,N,W,"setState")},C.prototype.forceUpdate=function(N){this.updater.enqueueForceUpdate(this,N,"forceUpdate")};function U(){}U.prototype=C.prototype;function L(N,W,ue){this.props=N,this.context=W,this.refs=E,this.updater=ue||x}var M=L.prototype=new U;M.constructor=L,S(M,C.prototype),M.isPureReactComponent=!0;var D=Array.isArray,Y=Object.prototype.hasOwnProperty,J={current:null},Q={key:!0,ref:!0,__self:!0,__source:!0};function T(N,W,ue){var be,ce={},pe=null,Ge=null;if(W!=null)for(be in W.ref!==void 0&&(Ge=W.ref),W.key!==void 0&&(pe=""+W.key),W)Y.call(W,be)&&!Q.hasOwnProperty(be)&&(ce[be]=W[be]);var Ye=arguments.length-2;if(Ye===1)ce.children=ue;else if(1<Ye){for(var De=Array(Ye),et=0;et<Ye;et++)De[et]=arguments[et+2];ce.children=De}if(N&&N.defaultProps)for(be in Ye=N.defaultProps,Ye)ce[be]===void 0&&(ce[be]=Ye[be]);return{$$typeof:e,type:N,key:pe,ref:Ge,props:ce,_owner:J.current}}function $(N,W){return{$$typeof:e,type:N.type,key:W,ref:N.ref,props:N.props,_owner:N._owner}}function ae(N){return typeof N=="object"&&N!==null&&N.$$typeof===e}function Ee(N){var W={"=":"=0",":":"=2"};return"$"+N.replace(/[=:]/g,function(ue){return W[ue]})}var ye=/\/+/g;function ze(N,W){return typeof N=="object"&&N!==null&&N.key!=null?Ee(""+N.key):W.toString(36)}function Se(N,W,ue,be,ce){var pe=typeof N;(pe==="undefined"||pe==="boolean")&&(N=null);var Ge=!1;if(N===null)Ge=!0;else switch(pe){case"string":case"number":Ge=!0;break;case"object":switch(N.$$typeof){case e:case t:Ge=!0}}if(Ge)return Ge=N,ce=ce(Ge),N=be===""?"."+ze(Ge,0):be,D(ce)?(ue="",N!=null&&(ue=N.replace(ye,"$&/")+"/"),Se(ce,W,ue,"",function(et){return et})):ce!=null&&(ae(ce)&&(ce=$(ce,ue+(!ce.key||Ge&&Ge.key===ce.key?"":(""+ce.key).replace(ye,"$&/")+"/")+N)),W.push(ce)),1;if(Ge=0,be=be===""?".":be+":",D(N))for(var Ye=0;Ye<N.length;Ye++){pe=N[Ye];var De=be+ze(pe,Ye);Ge+=Se(pe,W,ue,De,ce)}else if(De=w(N),typeof De=="function")for(N=De.call(N),Ye=0;!(pe=N.next()).done;)pe=pe.value,De=be+ze(pe,Ye++),Ge+=Se(pe,W,ue,De,ce);else if(pe==="object")throw W=String(N),Error("Objects are not valid as a React child (found: "+(W==="[object Object]"?"object with keys {"+Object.keys(N).join(", ")+"}":W)+"). If you meant to render a collection of children, use an array instead.");return Ge}function Me(N,W,ue){if(N==null)return N;var be=[],ce=0;return Se(N,be,"","",function(pe){return W.call(ue,pe,ce++)}),be}function _e(N){if(N._status===-1){var W=N._result;W=W(),W.then(function(ue){(N._status===0||N._status===-1)&&(N._status=1,N._result=ue)},function(ue){(N._status===0||N._status===-1)&&(N._status=2,N._result=ue)}),N._status===-1&&(N._status=0,N._result=W)}if(N._status===1)return N._result.default;throw N._result}var de={current:null},ne={transition:null},Z={ReactCurrentDispatcher:de,ReactCurrentBatchConfig:ne,ReactCurrentOwner:J};function H(){throw Error("act(...) is not supported in production builds of React.")}return nt.Children={map:Me,forEach:function(N,W,ue){Me(N,function(){W.apply(this,arguments)},ue)},count:function(N){var W=0;return Me(N,function(){W++}),W},toArray:function(N){return Me(N,function(W){return W})||[]},only:function(N){if(!ae(N))throw Error("React.Children.only expected to receive a single React element child.");return N}},nt.Component=C,nt.Fragment=a,nt.Profiler=s,nt.PureComponent=L,nt.StrictMode=o,nt.Suspense=m,nt.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Z,nt.act=H,nt.cloneElement=function(N,W,ue){if(N==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+N+".");var be=S({},N.props),ce=N.key,pe=N.ref,Ge=N._owner;if(W!=null){if(W.ref!==void 0&&(pe=W.ref,Ge=J.current),W.key!==void 0&&(ce=""+W.key),N.type&&N.type.defaultProps)var Ye=N.type.defaultProps;for(De in W)Y.call(W,De)&&!Q.hasOwnProperty(De)&&(be[De]=W[De]===void 0&&Ye!==void 0?Ye[De]:W[De])}var De=arguments.length-2;if(De===1)be.children=ue;else if(1<De){Ye=Array(De);for(var et=0;et<De;et++)Ye[et]=arguments[et+2];be.children=Ye}return{$$typeof:e,type:N.type,key:ce,ref:pe,props:be,_owner:Ge}},nt.createContext=function(N){return N={$$typeof:c,_currentValue:N,_currentValue2:N,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},N.Provider={$$typeof:i,_context:N},N.Consumer=N},nt.createElement=T,nt.createFactory=function(N){var W=T.bind(null,N);return W.type=N,W},nt.createRef=function(){return{current:null}},nt.forwardRef=function(N){return{$$typeof:u,render:N}},nt.isValidElement=ae,nt.lazy=function(N){return{$$typeof:g,_payload:{_status:-1,_result:N},_init:_e}},nt.memo=function(N,W){return{$$typeof:f,type:N,compare:W===void 0?null:W}},nt.startTransition=function(N){var W=ne.transition;ne.transition={};try{N()}finally{ne.transition=W}},nt.unstable_act=H,nt.useCallback=function(N,W){return de.current.useCallback(N,W)},nt.useContext=function(N){return de.current.useContext(N)},nt.useDebugValue=function(){},nt.useDeferredValue=function(N){return de.current.useDeferredValue(N)},nt.useEffect=function(N,W){return de.current.useEffect(N,W)},nt.useId=function(){return de.current.useId()},nt.useImperativeHandle=function(N,W,ue){return de.current.useImperativeHandle(N,W,ue)},nt.useInsertionEffect=function(N,W){return de.current.useInsertionEffect(N,W)},nt.useLayoutEffect=function(N,W){return de.current.useLayoutEffect(N,W)},nt.useMemo=function(N,W){return de.current.useMemo(N,W)},nt.useReducer=function(N,W,ue){return de.current.useReducer(N,W,ue)},nt.useRef=function(N){return de.current.useRef(N)},nt.useState=function(N){return de.current.useState(N)},nt.useSyncExternalStore=function(N,W,ue){return de.current.useSyncExternalStore(N,W,ue)},nt.useTransition=function(){return de.current.useTransition()},nt.version="18.3.1",nt}var K_;function kl(){return K_||(K_=1,Hp.exports=TC()),Hp.exports}var V_;function EC(){if(V_)return Gi;V_=1;var e=kl(),t=Symbol.for("react.element"),a=Symbol.for("react.fragment"),o=Object.prototype.hasOwnProperty,s=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,i={key:!0,ref:!0,__self:!0,__source:!0};function c(u,m,f){var g,b={},w=null,x=null;f!==void 0&&(w=""+f),m.key!==void 0&&(w=""+m.key),m.ref!==void 0&&(x=m.ref);for(g in m)o.call(m,g)&&!i.hasOwnProperty(g)&&(b[g]=m[g]);if(u&&u.defaultProps)for(g in m=u.defaultProps,m)b[g]===void 0&&(b[g]=m[g]);return{$$typeof:t,type:u,key:w,ref:x,props:b,_owner:s.current}}return Gi.Fragment=a,Gi.jsx=c,Gi.jsxs=c,Gi}var W_;function AC(){return W_||(W_=1,Up.exports=EC()),Up.exports}var R=AC(),k=kl();const No=pk(k),mk=SC({__proto__:null,default:No},[k]);var jc={},Fp={exports:{}},zn={},Bp={exports:{}},Gp={};var Y_;function PC(){return Y_||(Y_=1,(function(e){function t(ne,Z){var H=ne.length;ne.push(Z);e:for(;0<H;){var N=H-1>>>1,W=ne[N];if(0<s(W,Z))ne[N]=Z,ne[H]=W,H=N;else break e}}function a(ne){return ne.length===0?null:ne[0]}function o(ne){if(ne.length===0)return null;var Z=ne[0],H=ne.pop();if(H!==Z){ne[0]=H;e:for(var N=0,W=ne.length,ue=W>>>1;N<ue;){var be=2*(N+1)-1,ce=ne[be],pe=be+1,Ge=ne[pe];if(0>s(ce,H))pe<W&&0>s(Ge,ce)?(ne[N]=Ge,ne[pe]=H,N=pe):(ne[N]=ce,ne[be]=H,N=be);else if(pe<W&&0>s(Ge,H))ne[N]=Ge,ne[pe]=H,N=pe;else break e}}return Z}function s(ne,Z){var H=ne.sortIndex-Z.sortIndex;return H!==0?H:ne.id-Z.id}if(typeof performance=="object"&&typeof performance.now=="function"){var i=performance;e.unstable_now=function(){return i.now()}}else{var c=Date,u=c.now();e.unstable_now=function(){return c.now()-u}}var m=[],f=[],g=1,b=null,w=3,x=!1,S=!1,E=!1,C=typeof setTimeout=="function"?setTimeout:null,U=typeof clearTimeout=="function"?clearTimeout:null,L=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function M(ne){for(var Z=a(f);Z!==null;){if(Z.callback===null)o(f);else if(Z.startTime<=ne)o(f),Z.sortIndex=Z.expirationTime,t(m,Z);else break;Z=a(f)}}function D(ne){if(E=!1,M(ne),!S)if(a(m)!==null)S=!0,_e(Y);else{var Z=a(f);Z!==null&&de(D,Z.startTime-ne)}}function Y(ne,Z){S=!1,E&&(E=!1,U(T),T=-1),x=!0;var H=w;try{for(M(Z),b=a(m);b!==null&&(!(b.expirationTime>Z)||ne&&!Ee());){var N=b.callback;if(typeof N=="function"){b.callback=null,w=b.priorityLevel;var W=N(b.expirationTime<=Z);Z=e.unstable_now(),typeof W=="function"?b.callback=W:b===a(m)&&o(m),M(Z)}else o(m);b=a(m)}if(b!==null)var ue=!0;else{var be=a(f);be!==null&&de(D,be.startTime-Z),ue=!1}return ue}finally{b=null,w=H,x=!1}}var J=!1,Q=null,T=-1,$=5,ae=-1;function Ee(){return!(e.unstable_now()-ae<$)}function ye(){if(Q!==null){var ne=e.unstable_now();ae=ne;var Z=!0;try{Z=Q(!0,ne)}finally{Z?ze():(J=!1,Q=null)}}else J=!1}var ze;if(typeof L=="function")ze=function(){L(ye)};else if(typeof MessageChannel<"u"){var Se=new MessageChannel,Me=Se.port2;Se.port1.onmessage=ye,ze=function(){Me.postMessage(null)}}else ze=function(){C(ye,0)};function _e(ne){Q=ne,J||(J=!0,ze())}function de(ne,Z){T=C(function(){ne(e.unstable_now())},Z)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(ne){ne.callback=null},e.unstable_continueExecution=function(){S||x||(S=!0,_e(Y))},e.unstable_forceFrameRate=function(ne){0>ne||125<ne?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):$=0<ne?Math.floor(1e3/ne):5},e.unstable_getCurrentPriorityLevel=function(){return w},e.unstable_getFirstCallbackNode=function(){return a(m)},e.unstable_next=function(ne){switch(w){case 1:case 2:case 3:var Z=3;break;default:Z=w}var H=w;w=Z;try{return ne()}finally{w=H}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function(ne,Z){switch(ne){case 1:case 2:case 3:case 4:case 5:break;default:ne=3}var H=w;w=ne;try{return Z()}finally{w=H}},e.unstable_scheduleCallback=function(ne,Z,H){var N=e.unstable_now();switch(typeof H=="object"&&H!==null?(H=H.delay,H=typeof H=="number"&&0<H?N+H:N):H=N,ne){case 1:var W=-1;break;case 2:W=250;break;case 5:W=1073741823;break;case 4:W=1e4;break;default:W=5e3}return W=H+W,ne={id:g++,callback:Z,priorityLevel:ne,startTime:H,expirationTime:W,sortIndex:-1},H>N?(ne.sortIndex=H,t(f,ne),a(m)===null&&ne===a(f)&&(E?(U(T),T=-1):E=!0,de(D,H-N))):(ne.sortIndex=W,t(m,ne),S||x||(S=!0,_e(Y))),ne},e.unstable_shouldYield=Ee,e.unstable_wrapCallback=function(ne){var Z=w;return function(){var H=w;w=Z;try{return ne.apply(this,arguments)}finally{w=H}}}})(Gp)),Gp}var Z_;function RC(){return Z_||(Z_=1,Bp.exports=PC()),Bp.exports}var Q_;function IC(){if(Q_)return zn;Q_=1;var e=kl(),t=RC();function a(n){for(var r="https://reactjs.org/docs/error-decoder.html?invariant="+n,l=1;l<arguments.length;l++)r+="&args[]="+encodeURIComponent(arguments[l]);return"Minified React error #"+n+"; visit "+r+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var o=new Set,s={};function i(n,r){c(n,r),c(n+"Capture",r)}function c(n,r){for(s[n]=r,n=0;n<r.length;n++)o.add(r[n])}var u=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),m=Object.prototype.hasOwnProperty,f=/^[: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]*$/,g={},b={};function w(n){return m.call(b,n)?!0:m.call(g,n)?!1:f.test(n)?b[n]=!0:(g[n]=!0,!1)}function x(n,r,l,d){if(l!==null&&l.type===0)return!1;switch(typeof r){case"function":case"symbol":return!0;case"boolean":return d?!1:l!==null?!l.acceptsBooleans:(n=n.toLowerCase().slice(0,5),n!=="data-"&&n!=="aria-");default:return!1}}function S(n,r,l,d){if(r===null||typeof r>"u"||x(n,r,l,d))return!0;if(d)return!1;if(l!==null)switch(l.type){case 3:return!r;case 4:return r===!1;case 5:return isNaN(r);case 6:return isNaN(r)||1>r}return!1}function E(n,r,l,d,h,_,v){this.acceptsBooleans=r===2||r===3||r===4,this.attributeName=d,this.attributeNamespace=h,this.mustUseProperty=l,this.propertyName=n,this.type=r,this.sanitizeURL=_,this.removeEmptyString=v}var C={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(n){C[n]=new E(n,0,!1,n,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(n){var r=n[0];C[r]=new E(r,1,!1,n[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(n){C[n]=new E(n,2,!1,n.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(n){C[n]=new E(n,2,!1,n,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(n){C[n]=new E(n,3,!1,n.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(n){C[n]=new E(n,3,!0,n,null,!1,!1)}),["capture","download"].forEach(function(n){C[n]=new E(n,4,!1,n,null,!1,!1)}),["cols","rows","size","span"].forEach(function(n){C[n]=new E(n,6,!1,n,null,!1,!1)}),["rowSpan","start"].forEach(function(n){C[n]=new E(n,5,!1,n.toLowerCase(),null,!1,!1)});var U=/[\-:]([a-z])/g;function L(n){return n[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(n){var r=n.replace(U,L);C[r]=new E(r,1,!1,n,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(n){var r=n.replace(U,L);C[r]=new E(r,1,!1,n,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(n){var r=n.replace(U,L);C[r]=new E(r,1,!1,n,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(n){C[n]=new E(n,1,!1,n.toLowerCase(),null,!1,!1)}),C.xlinkHref=new E("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(n){C[n]=new E(n,1,!1,n.toLowerCase(),null,!0,!0)});function M(n,r,l,d){var h=C.hasOwnProperty(r)?C[r]:null;(h!==null?h.type!==0:d||!(2<r.length)||r[0]!=="o"&&r[0]!=="O"||r[1]!=="n"&&r[1]!=="N")&&(S(r,l,h,d)&&(l=null),d||h===null?w(r)&&(l===null?n.removeAttribute(r):n.setAttribute(r,""+l)):h.mustUseProperty?n[h.propertyName]=l===null?h.type===3?!1:"":l:(r=h.attributeName,d=h.attributeNamespace,l===null?n.removeAttribute(r):(h=h.type,l=h===3||h===4&&l===!0?"":""+l,d?n.setAttributeNS(d,r,l):n.setAttribute(r,l))))}var D=e.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Y=Symbol.for("react.element"),J=Symbol.for("react.portal"),Q=Symbol.for("react.fragment"),T=Symbol.for("react.strict_mode"),$=Symbol.for("react.profiler"),ae=Symbol.for("react.provider"),Ee=Symbol.for("react.context"),ye=Symbol.for("react.forward_ref"),ze=Symbol.for("react.suspense"),Se=Symbol.for("react.suspense_list"),Me=Symbol.for("react.memo"),_e=Symbol.for("react.lazy"),de=Symbol.for("react.offscreen"),ne=Symbol.iterator;function Z(n){return n===null||typeof n!="object"?null:(n=ne&&n[ne]||n["@@iterator"],typeof n=="function"?n:null)}var H=Object.assign,N;function W(n){if(N===void 0)try{throw Error()}catch(l){var r=l.stack.trim().match(/\n( *(at )?)/);N=r&&r[1]||""}return`
3
- `+N+n}var ue=!1;function be(n,r){if(!n||ue)return"";ue=!0;var l=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(r)if(r=function(){throw Error()},Object.defineProperty(r.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(r,[])}catch(q){var d=q}Reflect.construct(n,[],r)}else{try{r.call()}catch(q){d=q}n.call(r.prototype)}else{try{throw Error()}catch(q){d=q}n()}}catch(q){if(q&&d&&typeof q.stack=="string"){for(var h=q.stack.split(`
4
- `),_=d.stack.split(`
5
- `),v=h.length-1,A=_.length-1;1<=v&&0<=A&&h[v]!==_[A];)A--;for(;1<=v&&0<=A;v--,A--)if(h[v]!==_[A]){if(v!==1||A!==1)do if(v--,A--,0>A||h[v]!==_[A]){var I=`
6
- `+h[v].replace(" at new "," at ");return n.displayName&&I.includes("<anonymous>")&&(I=I.replace("<anonymous>",n.displayName)),I}while(1<=v&&0<=A);break}}}finally{ue=!1,Error.prepareStackTrace=l}return(n=n?n.displayName||n.name:"")?W(n):""}function ce(n){switch(n.tag){case 5:return W(n.type);case 16:return W("Lazy");case 13:return W("Suspense");case 19:return W("SuspenseList");case 0:case 2:case 15:return n=be(n.type,!1),n;case 11:return n=be(n.type.render,!1),n;case 1:return n=be(n.type,!0),n;default:return""}}function pe(n){if(n==null)return null;if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n;switch(n){case Q:return"Fragment";case J:return"Portal";case $:return"Profiler";case T:return"StrictMode";case ze:return"Suspense";case Se:return"SuspenseList"}if(typeof n=="object")switch(n.$$typeof){case Ee:return(n.displayName||"Context")+".Consumer";case ae:return(n._context.displayName||"Context")+".Provider";case ye:var r=n.render;return n=n.displayName,n||(n=r.displayName||r.name||"",n=n!==""?"ForwardRef("+n+")":"ForwardRef"),n;case Me:return r=n.displayName||null,r!==null?r:pe(n.type)||"Memo";case _e:r=n._payload,n=n._init;try{return pe(n(r))}catch{}}return null}function Ge(n){var r=n.type;switch(n.tag){case 24:return"Cache";case 9:return(r.displayName||"Context")+".Consumer";case 10:return(r._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return n=r.render,n=n.displayName||n.name||"",r.displayName||(n!==""?"ForwardRef("+n+")":"ForwardRef");case 7:return"Fragment";case 5:return r;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return pe(r);case 8:return r===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 r=="function")return r.displayName||r.name||null;if(typeof r=="string")return r}return null}function Ye(n){switch(typeof n){case"boolean":case"number":case"string":case"undefined":return n;case"object":return n;default:return""}}function De(n){var r=n.type;return(n=n.nodeName)&&n.toLowerCase()==="input"&&(r==="checkbox"||r==="radio")}function et(n){var r=De(n)?"checked":"value",l=Object.getOwnPropertyDescriptor(n.constructor.prototype,r),d=""+n[r];if(!n.hasOwnProperty(r)&&typeof l<"u"&&typeof l.get=="function"&&typeof l.set=="function"){var h=l.get,_=l.set;return Object.defineProperty(n,r,{configurable:!0,get:function(){return h.call(this)},set:function(v){d=""+v,_.call(this,v)}}),Object.defineProperty(n,r,{enumerable:l.enumerable}),{getValue:function(){return d},setValue:function(v){d=""+v},stopTracking:function(){n._valueTracker=null,delete n[r]}}}}function Mt(n){n._valueTracker||(n._valueTracker=et(n))}function Wn(n){if(!n)return!1;var r=n._valueTracker;if(!r)return!0;var l=r.getValue(),d="";return n&&(d=De(n)?n.checked?"true":"false":n.value),n=d,n!==l?(r.setValue(n),!0):!1}function Je(n){if(n=n||(typeof document<"u"?document:void 0),typeof n>"u")return null;try{return n.activeElement||n.body}catch{return n.body}}function Ht(n,r){var l=r.checked;return H({},r,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:l??n._wrapperState.initialChecked})}function St(n,r){var l=r.defaultValue==null?"":r.defaultValue,d=r.checked!=null?r.checked:r.defaultChecked;l=Ye(r.value!=null?r.value:l),n._wrapperState={initialChecked:d,initialValue:l,controlled:r.type==="checkbox"||r.type==="radio"?r.checked!=null:r.value!=null}}function Yn(n,r){r=r.checked,r!=null&&M(n,"checked",r,!1)}function yn(n,r){Yn(n,r);var l=Ye(r.value),d=r.type;if(l!=null)d==="number"?(l===0&&n.value===""||n.value!=l)&&(n.value=""+l):n.value!==""+l&&(n.value=""+l);else if(d==="submit"||d==="reset"){n.removeAttribute("value");return}r.hasOwnProperty("value")?ao(n,r.type,l):r.hasOwnProperty("defaultValue")&&ao(n,r.type,Ye(r.defaultValue)),r.checked==null&&r.defaultChecked!=null&&(n.defaultChecked=!!r.defaultChecked)}function $a(n,r,l){if(r.hasOwnProperty("value")||r.hasOwnProperty("defaultValue")){var d=r.type;if(!(d!=="submit"&&d!=="reset"||r.value!==void 0&&r.value!==null))return;r=""+n._wrapperState.initialValue,l||r===n.value||(n.value=r),n.defaultValue=r}l=n.name,l!==""&&(n.name=""),n.defaultChecked=!!n._wrapperState.initialChecked,l!==""&&(n.name=l)}function ao(n,r,l){(r!=="number"||Je(n.ownerDocument)!==n)&&(l==null?n.defaultValue=""+n._wrapperState.initialValue:n.defaultValue!==""+l&&(n.defaultValue=""+l))}var wa=Array.isArray;function xa(n,r,l,d){if(n=n.options,r){r={};for(var h=0;h<l.length;h++)r["$"+l[h]]=!0;for(l=0;l<n.length;l++)h=r.hasOwnProperty("$"+n[l].value),n[l].selected!==h&&(n[l].selected=h),h&&d&&(n[l].defaultSelected=!0)}else{for(l=""+Ye(l),r=null,h=0;h<n.length;h++){if(n[h].value===l){n[h].selected=!0,d&&(n[h].defaultSelected=!0);return}r!==null||n[h].disabled||(r=n[h])}r!==null&&(r.selected=!0)}}function ro(n,r){if(r.dangerouslySetInnerHTML!=null)throw Error(a(91));return H({},r,{value:void 0,defaultValue:void 0,children:""+n._wrapperState.initialValue})}function Ze(n,r){var l=r.value;if(l==null){if(l=r.children,r=r.defaultValue,l!=null){if(r!=null)throw Error(a(92));if(wa(l)){if(1<l.length)throw Error(a(93));l=l[0]}r=l}r==null&&(r=""),l=r}n._wrapperState={initialValue:Ye(l)}}function st(n,r){var l=Ye(r.value),d=Ye(r.defaultValue);l!=null&&(l=""+l,l!==n.value&&(n.value=l),r.defaultValue==null&&n.defaultValue!==l&&(n.defaultValue=l)),d!=null&&(n.defaultValue=""+d)}function _t(n){var r=n.textContent;r===n._wrapperState.initialValue&&r!==""&&r!==null&&(n.value=r)}function zt(n){switch(n){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 jt(n,r){return n==null||n==="http://www.w3.org/1999/xhtml"?zt(r):n==="http://www.w3.org/2000/svg"&&r==="foreignObject"?"http://www.w3.org/1999/xhtml":n}var ht,bt=(function(n){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(r,l,d,h){MSApp.execUnsafeLocalFunction(function(){return n(r,l,d,h)})}:n})(function(n,r){if(n.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in n)n.innerHTML=r;else{for(ht=ht||document.createElement("div"),ht.innerHTML="<svg>"+r.valueOf().toString()+"</svg>",r=ht.firstChild;n.firstChild;)n.removeChild(n.firstChild);for(;r.firstChild;)n.appendChild(r.firstChild)}});function nn(n,r){if(r){var l=n.firstChild;if(l&&l===n.lastChild&&l.nodeType===3){l.nodeValue=r;return}}n.textContent=r}var qa={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},Sa=["Webkit","ms","Moz","O"];Object.keys(qa).forEach(function(n){Sa.forEach(function(r){r=r+n.charAt(0).toUpperCase()+n.substring(1),qa[r]=qa[n]})});function Yt(n,r,l){return r==null||typeof r=="boolean"||r===""?"":l||typeof r!="number"||r===0||qa.hasOwnProperty(n)&&qa[n]?(""+r).trim():r+"px"}function oo(n,r){n=n.style;for(var l in r)if(r.hasOwnProperty(l)){var d=l.indexOf("--")===0,h=Yt(l,r[l],d);l==="float"&&(l="cssFloat"),d?n.setProperty(l,h):n[l]=h}}var Rn=H({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 Ka(n,r){if(r){if(Rn[n]&&(r.children!=null||r.dangerouslySetInnerHTML!=null))throw Error(a(137,n));if(r.dangerouslySetInnerHTML!=null){if(r.children!=null)throw Error(a(60));if(typeof r.dangerouslySetInnerHTML!="object"||!("__html"in r.dangerouslySetInnerHTML))throw Error(a(61))}if(r.style!=null&&typeof r.style!="object")throw Error(a(62))}}function fr(n,r){if(n.indexOf("-")===-1)return typeof r.is=="string";switch(n){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 gr=null;function Va(n){return n=n.target||n.srcElement||window,n.correspondingUseElement&&(n=n.correspondingUseElement),n.nodeType===3?n.parentNode:n}var ca=null,Un=null,da=null;function _r(n){if(n=Ai(n)){if(typeof ca!="function")throw Error(a(280));var r=n.stateNode;r&&(r=Xl(r),ca(n.stateNode,n.type,r))}}function Ll(n){Un?da?da.push(n):da=[n]:Un=n}function li(){if(Un){var n=Un,r=da;if(da=Un=null,_r(n),r)for(n=0;n<r.length;n++)_r(r[n])}}function Ml(n,r){return n(r)}function ci(){}var br=!1;function so(n,r,l){if(br)return n(r,l);br=!0;try{return Ml(n,r,l)}finally{br=!1,(Un!==null||da!==null)&&(ci(),li())}}function yr(n,r){var l=n.stateNode;if(l===null)return null;var d=Xl(l);if(d===null)return null;l=d[r];e:switch(r){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(d=!d.disabled)||(n=n.type,d=!(n==="button"||n==="input"||n==="select"||n==="textarea")),n=!d;break e;default:n=!1}if(n)return null;if(l&&typeof l!="function")throw Error(a(231,r,typeof l));return l}var di=!1;if(u)try{var io={};Object.defineProperty(io,"passive",{get:function(){di=!0}}),window.addEventListener("test",io,io),window.removeEventListener("test",io,io)}catch{di=!1}function P(n,r,l,d,h,_,v,A,I){var q=Array.prototype.slice.call(arguments,3);try{r.apply(l,q)}catch(re){this.onError(re)}}var O=!1,B=null,X=!1,ee=null,Ie={onError:function(n){O=!0,B=n}};function Ce(n,r,l,d,h,_,v,A,I){O=!1,B=null,P.apply(Ie,arguments)}function Ne(n,r,l,d,h,_,v,A,I){if(Ce.apply(this,arguments),O){if(O){var q=B;O=!1,B=null}else throw Error(a(198));X||(X=!0,ee=q)}}function fe(n){var r=n,l=n;if(n.alternate)for(;r.return;)r=r.return;else{n=r;do r=n,(r.flags&4098)!==0&&(l=r.return),n=r.return;while(n)}return r.tag===3?l:null}function je(n){if(n.tag===13){var r=n.memoizedState;if(r===null&&(n=n.alternate,n!==null&&(r=n.memoizedState)),r!==null)return r.dehydrated}return null}function Oe(n){if(fe(n)!==n)throw Error(a(188))}function We(n){var r=n.alternate;if(!r){if(r=fe(n),r===null)throw Error(a(188));return r!==n?null:n}for(var l=n,d=r;;){var h=l.return;if(h===null)break;var _=h.alternate;if(_===null){if(d=h.return,d!==null){l=d;continue}break}if(h.child===_.child){for(_=h.child;_;){if(_===l)return Oe(h),n;if(_===d)return Oe(h),r;_=_.sibling}throw Error(a(188))}if(l.return!==d.return)l=h,d=_;else{for(var v=!1,A=h.child;A;){if(A===l){v=!0,l=h,d=_;break}if(A===d){v=!0,d=h,l=_;break}A=A.sibling}if(!v){for(A=_.child;A;){if(A===l){v=!0,l=_,d=h;break}if(A===d){v=!0,d=_,l=h;break}A=A.sibling}if(!v)throw Error(a(189))}}if(l.alternate!==d)throw Error(a(190))}if(l.tag!==3)throw Error(a(188));return l.stateNode.current===l?n:r}function Be(n){return n=We(n),n!==null?it(n):null}function it(n){if(n.tag===5||n.tag===6)return n;for(n=n.child;n!==null;){var r=it(n);if(r!==null)return r;n=n.sibling}return null}var ft=t.unstable_scheduleCallback,Pt=t.unstable_cancelCallback,pt=t.unstable_shouldYield,dt=t.unstable_requestPaint,at=t.unstable_now,sn=t.unstable_getCurrentPriorityLevel,Wa=t.unstable_ImmediatePriority,ua=t.unstable_UserBlockingPriority,pa=t.unstable_NormalPriority,Ca=t.unstable_LowPriority,Hn=t.unstable_IdlePriority,kr=null,$t=null;function Wo(n){if($t&&typeof $t.onCommitFiberRoot=="function")try{$t.onCommitFiberRoot(kr,n,void 0,(n.current.flags&128)===128)}catch{}}var ln=Math.clz32?Math.clz32:cn,Yo=Math.log,rt=Math.LN2;function cn(n){return n>>>=0,n===0?32:31-(Yo(n)/rt|0)|0}var kn=64,In=4194304;function vr(n){switch(n&-n){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 n&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return n&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return n}}function wr(n,r){var l=n.pendingLanes;if(l===0)return 0;var d=0,h=n.suspendedLanes,_=n.pingedLanes,v=l&268435455;if(v!==0){var A=v&~h;A!==0?d=vr(A):(_&=v,_!==0&&(d=vr(_)))}else v=l&~h,v!==0?d=vr(v):_!==0&&(d=vr(_));if(d===0)return 0;if(r!==0&&r!==d&&(r&h)===0&&(h=d&-d,_=r&-r,h>=_||h===16&&(_&4194240)!==0))return r;if((d&4)!==0&&(d|=l&16),r=n.entangledLanes,r!==0)for(n=n.entanglements,r&=d;0<r;)l=31-ln(r),h=1<<l,d|=n[l],r&=~h;return d}function yt(n,r){switch(n){case 1:case 2:case 4:return r+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 r+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 Ya(n,r){for(var l=n.suspendedLanes,d=n.pingedLanes,h=n.expirationTimes,_=n.pendingLanes;0<_;){var v=31-ln(_),A=1<<v,I=h[v];I===-1?((A&l)===0||(A&d)!==0)&&(h[v]=yt(A,r)):I<=r&&(n.expiredLanes|=A),_&=~A}}function Zo(n){return n=n.pendingLanes&-1073741825,n!==0?n:n&1073741824?1073741824:0}function zl(){var n=kn;return kn<<=1,(kn&4194240)===0&&(kn=64),n}function iu(n){for(var r=[],l=0;31>l;l++)r.push(n);return r}function ui(n,r,l){n.pendingLanes|=r,r!==536870912&&(n.suspendedLanes=0,n.pingedLanes=0),n=n.eventTimes,r=31-ln(r),n[r]=l}function qx(n,r){var l=n.pendingLanes&~r;n.pendingLanes=r,n.suspendedLanes=0,n.pingedLanes=0,n.expiredLanes&=r,n.mutableReadLanes&=r,n.entangledLanes&=r,r=n.entanglements;var d=n.eventTimes;for(n=n.expirationTimes;0<l;){var h=31-ln(l),_=1<<h;r[h]=0,d[h]=-1,n[h]=-1,l&=~_}}function lu(n,r){var l=n.entangledLanes|=r;for(n=n.entanglements;l;){var d=31-ln(l),h=1<<d;h&r|n[d]&r&&(n[d]|=r),l&=~h}}var gt=0;function xf(n){return n&=-n,1<n?4<n?(n&268435455)!==0?16:536870912:4:1}var Sf,cu,Cf,Tf,Ef,du=!1,jl=[],xr=null,Sr=null,Cr=null,pi=new Map,mi=new Map,Tr=[],Kx="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 Af(n,r){switch(n){case"focusin":case"focusout":xr=null;break;case"dragenter":case"dragleave":Sr=null;break;case"mouseover":case"mouseout":Cr=null;break;case"pointerover":case"pointerout":pi.delete(r.pointerId);break;case"gotpointercapture":case"lostpointercapture":mi.delete(r.pointerId)}}function hi(n,r,l,d,h,_){return n===null||n.nativeEvent!==_?(n={blockedOn:r,domEventName:l,eventSystemFlags:d,nativeEvent:_,targetContainers:[h]},r!==null&&(r=Ai(r),r!==null&&cu(r)),n):(n.eventSystemFlags|=d,r=n.targetContainers,h!==null&&r.indexOf(h)===-1&&r.push(h),n)}function Vx(n,r,l,d,h){switch(r){case"focusin":return xr=hi(xr,n,r,l,d,h),!0;case"dragenter":return Sr=hi(Sr,n,r,l,d,h),!0;case"mouseover":return Cr=hi(Cr,n,r,l,d,h),!0;case"pointerover":var _=h.pointerId;return pi.set(_,hi(pi.get(_)||null,n,r,l,d,h)),!0;case"gotpointercapture":return _=h.pointerId,mi.set(_,hi(mi.get(_)||null,n,r,l,d,h)),!0}return!1}function Pf(n){var r=lo(n.target);if(r!==null){var l=fe(r);if(l!==null){if(r=l.tag,r===13){if(r=je(l),r!==null){n.blockedOn=r,Ef(n.priority,function(){Cf(l)});return}}else if(r===3&&l.stateNode.current.memoizedState.isDehydrated){n.blockedOn=l.tag===3?l.stateNode.containerInfo:null;return}}}n.blockedOn=null}function Ul(n){if(n.blockedOn!==null)return!1;for(var r=n.targetContainers;0<r.length;){var l=pu(n.domEventName,n.eventSystemFlags,r[0],n.nativeEvent);if(l===null){l=n.nativeEvent;var d=new l.constructor(l.type,l);gr=d,l.target.dispatchEvent(d),gr=null}else return r=Ai(l),r!==null&&cu(r),n.blockedOn=l,!1;r.shift()}return!0}function Rf(n,r,l){Ul(n)&&l.delete(r)}function Wx(){du=!1,xr!==null&&Ul(xr)&&(xr=null),Sr!==null&&Ul(Sr)&&(Sr=null),Cr!==null&&Ul(Cr)&&(Cr=null),pi.forEach(Rf),mi.forEach(Rf)}function fi(n,r){n.blockedOn===r&&(n.blockedOn=null,du||(du=!0,t.unstable_scheduleCallback(t.unstable_NormalPriority,Wx)))}function gi(n){function r(h){return fi(h,n)}if(0<jl.length){fi(jl[0],n);for(var l=1;l<jl.length;l++){var d=jl[l];d.blockedOn===n&&(d.blockedOn=null)}}for(xr!==null&&fi(xr,n),Sr!==null&&fi(Sr,n),Cr!==null&&fi(Cr,n),pi.forEach(r),mi.forEach(r),l=0;l<Tr.length;l++)d=Tr[l],d.blockedOn===n&&(d.blockedOn=null);for(;0<Tr.length&&(l=Tr[0],l.blockedOn===null);)Pf(l),l.blockedOn===null&&Tr.shift()}var Qo=D.ReactCurrentBatchConfig,Hl=!0;function Yx(n,r,l,d){var h=gt,_=Qo.transition;Qo.transition=null;try{gt=1,uu(n,r,l,d)}finally{gt=h,Qo.transition=_}}function Zx(n,r,l,d){var h=gt,_=Qo.transition;Qo.transition=null;try{gt=4,uu(n,r,l,d)}finally{gt=h,Qo.transition=_}}function uu(n,r,l,d){if(Hl){var h=pu(n,r,l,d);if(h===null)Pu(n,r,d,Fl,l),Af(n,d);else if(Vx(h,n,r,l,d))d.stopPropagation();else if(Af(n,d),r&4&&-1<Kx.indexOf(n)){for(;h!==null;){var _=Ai(h);if(_!==null&&Sf(_),_=pu(n,r,l,d),_===null&&Pu(n,r,d,Fl,l),_===h)break;h=_}h!==null&&d.stopPropagation()}else Pu(n,r,d,null,l)}}var Fl=null;function pu(n,r,l,d){if(Fl=null,n=Va(d),n=lo(n),n!==null)if(r=fe(n),r===null)n=null;else if(l=r.tag,l===13){if(n=je(r),n!==null)return n;n=null}else if(l===3){if(r.stateNode.current.memoizedState.isDehydrated)return r.tag===3?r.stateNode.containerInfo:null;n=null}else r!==n&&(n=null);return Fl=n,null}function If(n){switch(n){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(sn()){case Wa:return 1;case ua:return 4;case pa:case Ca:return 16;case Hn:return 536870912;default:return 16}default:return 16}}var Er=null,mu=null,Bl=null;function Nf(){if(Bl)return Bl;var n,r=mu,l=r.length,d,h="value"in Er?Er.value:Er.textContent,_=h.length;for(n=0;n<l&&r[n]===h[n];n++);var v=l-n;for(d=1;d<=v&&r[l-d]===h[_-d];d++);return Bl=h.slice(n,1<d?1-d:void 0)}function Gl(n){var r=n.keyCode;return"charCode"in n?(n=n.charCode,n===0&&r===13&&(n=13)):n=r,n===10&&(n=13),32<=n||n===13?n:0}function $l(){return!0}function Df(){return!1}function Fn(n){function r(l,d,h,_,v){this._reactName=l,this._targetInst=h,this.type=d,this.nativeEvent=_,this.target=v,this.currentTarget=null;for(var A in n)n.hasOwnProperty(A)&&(l=n[A],this[A]=l?l(_):_[A]);return this.isDefaultPrevented=(_.defaultPrevented!=null?_.defaultPrevented:_.returnValue===!1)?$l:Df,this.isPropagationStopped=Df,this}return H(r.prototype,{preventDefault:function(){this.defaultPrevented=!0;var l=this.nativeEvent;l&&(l.preventDefault?l.preventDefault():typeof l.returnValue!="unknown"&&(l.returnValue=!1),this.isDefaultPrevented=$l)},stopPropagation:function(){var l=this.nativeEvent;l&&(l.stopPropagation?l.stopPropagation():typeof l.cancelBubble!="unknown"&&(l.cancelBubble=!0),this.isPropagationStopped=$l)},persist:function(){},isPersistent:$l}),r}var Jo={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(n){return n.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},hu=Fn(Jo),_i=H({},Jo,{view:0,detail:0}),Qx=Fn(_i),fu,gu,bi,ql=H({},_i,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:bu,button:0,buttons:0,relatedTarget:function(n){return n.relatedTarget===void 0?n.fromElement===n.srcElement?n.toElement:n.fromElement:n.relatedTarget},movementX:function(n){return"movementX"in n?n.movementX:(n!==bi&&(bi&&n.type==="mousemove"?(fu=n.screenX-bi.screenX,gu=n.screenY-bi.screenY):gu=fu=0,bi=n),fu)},movementY:function(n){return"movementY"in n?n.movementY:gu}}),Of=Fn(ql),Jx=H({},ql,{dataTransfer:0}),Xx=Fn(Jx),eS=H({},_i,{relatedTarget:0}),_u=Fn(eS),tS=H({},Jo,{animationName:0,elapsedTime:0,pseudoElement:0}),nS=Fn(tS),aS=H({},Jo,{clipboardData:function(n){return"clipboardData"in n?n.clipboardData:window.clipboardData}}),rS=Fn(aS),oS=H({},Jo,{data:0}),Lf=Fn(oS),sS={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},iS={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"},lS={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function cS(n){var r=this.nativeEvent;return r.getModifierState?r.getModifierState(n):(n=lS[n])?!!r[n]:!1}function bu(){return cS}var dS=H({},_i,{key:function(n){if(n.key){var r=sS[n.key]||n.key;if(r!=="Unidentified")return r}return n.type==="keypress"?(n=Gl(n),n===13?"Enter":String.fromCharCode(n)):n.type==="keydown"||n.type==="keyup"?iS[n.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:bu,charCode:function(n){return n.type==="keypress"?Gl(n):0},keyCode:function(n){return n.type==="keydown"||n.type==="keyup"?n.keyCode:0},which:function(n){return n.type==="keypress"?Gl(n):n.type==="keydown"||n.type==="keyup"?n.keyCode:0}}),uS=Fn(dS),pS=H({},ql,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Mf=Fn(pS),mS=H({},_i,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:bu}),hS=Fn(mS),fS=H({},Jo,{propertyName:0,elapsedTime:0,pseudoElement:0}),gS=Fn(fS),_S=H({},ql,{deltaX:function(n){return"deltaX"in n?n.deltaX:"wheelDeltaX"in n?-n.wheelDeltaX:0},deltaY:function(n){return"deltaY"in n?n.deltaY:"wheelDeltaY"in n?-n.wheelDeltaY:"wheelDelta"in n?-n.wheelDelta:0},deltaZ:0,deltaMode:0}),bS=Fn(_S),yS=[9,13,27,32],yu=u&&"CompositionEvent"in window,yi=null;u&&"documentMode"in document&&(yi=document.documentMode);var kS=u&&"TextEvent"in window&&!yi,zf=u&&(!yu||yi&&8<yi&&11>=yi),jf=" ",Uf=!1;function Hf(n,r){switch(n){case"keyup":return yS.indexOf(r.keyCode)!==-1;case"keydown":return r.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ff(n){return n=n.detail,typeof n=="object"&&"data"in n?n.data:null}var Xo=!1;function vS(n,r){switch(n){case"compositionend":return Ff(r);case"keypress":return r.which!==32?null:(Uf=!0,jf);case"textInput":return n=r.data,n===jf&&Uf?null:n;default:return null}}function wS(n,r){if(Xo)return n==="compositionend"||!yu&&Hf(n,r)?(n=Nf(),Bl=mu=Er=null,Xo=!1,n):null;switch(n){case"paste":return null;case"keypress":if(!(r.ctrlKey||r.altKey||r.metaKey)||r.ctrlKey&&r.altKey){if(r.char&&1<r.char.length)return r.char;if(r.which)return String.fromCharCode(r.which)}return null;case"compositionend":return zf&&r.locale!=="ko"?null:r.data;default:return null}}var xS={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 Bf(n){var r=n&&n.nodeName&&n.nodeName.toLowerCase();return r==="input"?!!xS[n.type]:r==="textarea"}function Gf(n,r,l,d){Ll(d),r=Zl(r,"onChange"),0<r.length&&(l=new hu("onChange","change",null,l,d),n.push({event:l,listeners:r}))}var ki=null,vi=null;function SS(n){ig(n,0)}function Kl(n){var r=rs(n);if(Wn(r))return n}function CS(n,r){if(n==="change")return r}var $f=!1;if(u){var ku;if(u){var vu="oninput"in document;if(!vu){var qf=document.createElement("div");qf.setAttribute("oninput","return;"),vu=typeof qf.oninput=="function"}ku=vu}else ku=!1;$f=ku&&(!document.documentMode||9<document.documentMode)}function Kf(){ki&&(ki.detachEvent("onpropertychange",Vf),vi=ki=null)}function Vf(n){if(n.propertyName==="value"&&Kl(vi)){var r=[];Gf(r,vi,n,Va(n)),so(SS,r)}}function TS(n,r,l){n==="focusin"?(Kf(),ki=r,vi=l,ki.attachEvent("onpropertychange",Vf)):n==="focusout"&&Kf()}function ES(n){if(n==="selectionchange"||n==="keyup"||n==="keydown")return Kl(vi)}function AS(n,r){if(n==="click")return Kl(r)}function PS(n,r){if(n==="input"||n==="change")return Kl(r)}function RS(n,r){return n===r&&(n!==0||1/n===1/r)||n!==n&&r!==r}var ma=typeof Object.is=="function"?Object.is:RS;function wi(n,r){if(ma(n,r))return!0;if(typeof n!="object"||n===null||typeof r!="object"||r===null)return!1;var l=Object.keys(n),d=Object.keys(r);if(l.length!==d.length)return!1;for(d=0;d<l.length;d++){var h=l[d];if(!m.call(r,h)||!ma(n[h],r[h]))return!1}return!0}function Wf(n){for(;n&&n.firstChild;)n=n.firstChild;return n}function Yf(n,r){var l=Wf(n);n=0;for(var d;l;){if(l.nodeType===3){if(d=n+l.textContent.length,n<=r&&d>=r)return{node:l,offset:r-n};n=d}e:{for(;l;){if(l.nextSibling){l=l.nextSibling;break e}l=l.parentNode}l=void 0}l=Wf(l)}}function Zf(n,r){return n&&r?n===r?!0:n&&n.nodeType===3?!1:r&&r.nodeType===3?Zf(n,r.parentNode):"contains"in n?n.contains(r):n.compareDocumentPosition?!!(n.compareDocumentPosition(r)&16):!1:!1}function Qf(){for(var n=window,r=Je();r instanceof n.HTMLIFrameElement;){try{var l=typeof r.contentWindow.location.href=="string"}catch{l=!1}if(l)n=r.contentWindow;else break;r=Je(n.document)}return r}function wu(n){var r=n&&n.nodeName&&n.nodeName.toLowerCase();return r&&(r==="input"&&(n.type==="text"||n.type==="search"||n.type==="tel"||n.type==="url"||n.type==="password")||r==="textarea"||n.contentEditable==="true")}function IS(n){var r=Qf(),l=n.focusedElem,d=n.selectionRange;if(r!==l&&l&&l.ownerDocument&&Zf(l.ownerDocument.documentElement,l)){if(d!==null&&wu(l)){if(r=d.start,n=d.end,n===void 0&&(n=r),"selectionStart"in l)l.selectionStart=r,l.selectionEnd=Math.min(n,l.value.length);else if(n=(r=l.ownerDocument||document)&&r.defaultView||window,n.getSelection){n=n.getSelection();var h=l.textContent.length,_=Math.min(d.start,h);d=d.end===void 0?_:Math.min(d.end,h),!n.extend&&_>d&&(h=d,d=_,_=h),h=Yf(l,_);var v=Yf(l,d);h&&v&&(n.rangeCount!==1||n.anchorNode!==h.node||n.anchorOffset!==h.offset||n.focusNode!==v.node||n.focusOffset!==v.offset)&&(r=r.createRange(),r.setStart(h.node,h.offset),n.removeAllRanges(),_>d?(n.addRange(r),n.extend(v.node,v.offset)):(r.setEnd(v.node,v.offset),n.addRange(r)))}}for(r=[],n=l;n=n.parentNode;)n.nodeType===1&&r.push({element:n,left:n.scrollLeft,top:n.scrollTop});for(typeof l.focus=="function"&&l.focus(),l=0;l<r.length;l++)n=r[l],n.element.scrollLeft=n.left,n.element.scrollTop=n.top}}var NS=u&&"documentMode"in document&&11>=document.documentMode,es=null,xu=null,xi=null,Su=!1;function Jf(n,r,l){var d=l.window===l?l.document:l.nodeType===9?l:l.ownerDocument;Su||es==null||es!==Je(d)||(d=es,"selectionStart"in d&&wu(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),xi&&wi(xi,d)||(xi=d,d=Zl(xu,"onSelect"),0<d.length&&(r=new hu("onSelect","select",null,r,l),n.push({event:r,listeners:d}),r.target=es)))}function Vl(n,r){var l={};return l[n.toLowerCase()]=r.toLowerCase(),l["Webkit"+n]="webkit"+r,l["Moz"+n]="moz"+r,l}var ts={animationend:Vl("Animation","AnimationEnd"),animationiteration:Vl("Animation","AnimationIteration"),animationstart:Vl("Animation","AnimationStart"),transitionend:Vl("Transition","TransitionEnd")},Cu={},Xf={};u&&(Xf=document.createElement("div").style,"AnimationEvent"in window||(delete ts.animationend.animation,delete ts.animationiteration.animation,delete ts.animationstart.animation),"TransitionEvent"in window||delete ts.transitionend.transition);function Wl(n){if(Cu[n])return Cu[n];if(!ts[n])return n;var r=ts[n],l;for(l in r)if(r.hasOwnProperty(l)&&l in Xf)return Cu[n]=r[l];return n}var eg=Wl("animationend"),tg=Wl("animationiteration"),ng=Wl("animationstart"),ag=Wl("transitionend"),rg=new Map,og="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 Ar(n,r){rg.set(n,r),i(r,[n])}for(var Tu=0;Tu<og.length;Tu++){var Eu=og[Tu],DS=Eu.toLowerCase(),OS=Eu[0].toUpperCase()+Eu.slice(1);Ar(DS,"on"+OS)}Ar(eg,"onAnimationEnd"),Ar(tg,"onAnimationIteration"),Ar(ng,"onAnimationStart"),Ar("dblclick","onDoubleClick"),Ar("focusin","onFocus"),Ar("focusout","onBlur"),Ar(ag,"onTransitionEnd"),c("onMouseEnter",["mouseout","mouseover"]),c("onMouseLeave",["mouseout","mouseover"]),c("onPointerEnter",["pointerout","pointerover"]),c("onPointerLeave",["pointerout","pointerover"]),i("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),i("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),i("onBeforeInput",["compositionend","keypress","textInput","paste"]),i("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),i("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),i("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Si="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(" "),LS=new Set("cancel close invalid load scroll toggle".split(" ").concat(Si));function sg(n,r,l){var d=n.type||"unknown-event";n.currentTarget=l,Ne(d,r,void 0,n),n.currentTarget=null}function ig(n,r){r=(r&4)!==0;for(var l=0;l<n.length;l++){var d=n[l],h=d.event;d=d.listeners;e:{var _=void 0;if(r)for(var v=d.length-1;0<=v;v--){var A=d[v],I=A.instance,q=A.currentTarget;if(A=A.listener,I!==_&&h.isPropagationStopped())break e;sg(h,A,q),_=I}else for(v=0;v<d.length;v++){if(A=d[v],I=A.instance,q=A.currentTarget,A=A.listener,I!==_&&h.isPropagationStopped())break e;sg(h,A,q),_=I}}}if(X)throw n=ee,X=!1,ee=null,n}function vt(n,r){var l=r[Lu];l===void 0&&(l=r[Lu]=new Set);var d=n+"__bubble";l.has(d)||(lg(r,n,2,!1),l.add(d))}function Au(n,r,l){var d=0;r&&(d|=4),lg(l,n,d,r)}var Yl="_reactListening"+Math.random().toString(36).slice(2);function Ci(n){if(!n[Yl]){n[Yl]=!0,o.forEach(function(l){l!=="selectionchange"&&(LS.has(l)||Au(l,!1,n),Au(l,!0,n))});var r=n.nodeType===9?n:n.ownerDocument;r===null||r[Yl]||(r[Yl]=!0,Au("selectionchange",!1,r))}}function lg(n,r,l,d){switch(If(r)){case 1:var h=Yx;break;case 4:h=Zx;break;default:h=uu}l=h.bind(null,r,l,n),h=void 0,!di||r!=="touchstart"&&r!=="touchmove"&&r!=="wheel"||(h=!0),d?h!==void 0?n.addEventListener(r,l,{capture:!0,passive:h}):n.addEventListener(r,l,!0):h!==void 0?n.addEventListener(r,l,{passive:h}):n.addEventListener(r,l,!1)}function Pu(n,r,l,d,h){var _=d;if((r&1)===0&&(r&2)===0&&d!==null)e:for(;;){if(d===null)return;var v=d.tag;if(v===3||v===4){var A=d.stateNode.containerInfo;if(A===h||A.nodeType===8&&A.parentNode===h)break;if(v===4)for(v=d.return;v!==null;){var I=v.tag;if((I===3||I===4)&&(I=v.stateNode.containerInfo,I===h||I.nodeType===8&&I.parentNode===h))return;v=v.return}for(;A!==null;){if(v=lo(A),v===null)return;if(I=v.tag,I===5||I===6){d=_=v;continue e}A=A.parentNode}}d=d.return}so(function(){var q=_,re=Va(l),se=[];e:{var te=rg.get(n);if(te!==void 0){var ge=hu,Te=n;switch(n){case"keypress":if(Gl(l)===0)break e;case"keydown":case"keyup":ge=uS;break;case"focusin":Te="focus",ge=_u;break;case"focusout":Te="blur",ge=_u;break;case"beforeblur":case"afterblur":ge=_u;break;case"click":if(l.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":ge=Of;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":ge=Xx;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":ge=hS;break;case eg:case tg:case ng:ge=nS;break;case ag:ge=gS;break;case"scroll":ge=Qx;break;case"wheel":ge=bS;break;case"copy":case"cut":case"paste":ge=rS;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":ge=Mf}var Ae=(r&4)!==0,Ut=!Ae&&n==="scroll",F=Ae?te!==null?te+"Capture":null:te;Ae=[];for(var z=q,G;z!==null;){G=z;var ie=G.stateNode;if(G.tag===5&&ie!==null&&(G=ie,F!==null&&(ie=yr(z,F),ie!=null&&Ae.push(Ti(z,ie,G)))),Ut)break;z=z.return}0<Ae.length&&(te=new ge(te,Te,null,l,re),se.push({event:te,listeners:Ae}))}}if((r&7)===0){e:{if(te=n==="mouseover"||n==="pointerover",ge=n==="mouseout"||n==="pointerout",te&&l!==gr&&(Te=l.relatedTarget||l.fromElement)&&(lo(Te)||Te[Za]))break e;if((ge||te)&&(te=re.window===re?re:(te=re.ownerDocument)?te.defaultView||te.parentWindow:window,ge?(Te=l.relatedTarget||l.toElement,ge=q,Te=Te?lo(Te):null,Te!==null&&(Ut=fe(Te),Te!==Ut||Te.tag!==5&&Te.tag!==6)&&(Te=null)):(ge=null,Te=q),ge!==Te)){if(Ae=Of,ie="onMouseLeave",F="onMouseEnter",z="mouse",(n==="pointerout"||n==="pointerover")&&(Ae=Mf,ie="onPointerLeave",F="onPointerEnter",z="pointer"),Ut=ge==null?te:rs(ge),G=Te==null?te:rs(Te),te=new Ae(ie,z+"leave",ge,l,re),te.target=Ut,te.relatedTarget=G,ie=null,lo(re)===q&&(Ae=new Ae(F,z+"enter",Te,l,re),Ae.target=G,Ae.relatedTarget=Ut,ie=Ae),Ut=ie,ge&&Te)t:{for(Ae=ge,F=Te,z=0,G=Ae;G;G=ns(G))z++;for(G=0,ie=F;ie;ie=ns(ie))G++;for(;0<z-G;)Ae=ns(Ae),z--;for(;0<G-z;)F=ns(F),G--;for(;z--;){if(Ae===F||F!==null&&Ae===F.alternate)break t;Ae=ns(Ae),F=ns(F)}Ae=null}else Ae=null;ge!==null&&cg(se,te,ge,Ae,!1),Te!==null&&Ut!==null&&cg(se,Ut,Te,Ae,!0)}}e:{if(te=q?rs(q):window,ge=te.nodeName&&te.nodeName.toLowerCase(),ge==="select"||ge==="input"&&te.type==="file")var Pe=CS;else if(Bf(te))if($f)Pe=PS;else{Pe=ES;var Ue=TS}else(ge=te.nodeName)&&ge.toLowerCase()==="input"&&(te.type==="checkbox"||te.type==="radio")&&(Pe=AS);if(Pe&&(Pe=Pe(n,q))){Gf(se,Pe,l,re);break e}Ue&&Ue(n,te,q),n==="focusout"&&(Ue=te._wrapperState)&&Ue.controlled&&te.type==="number"&&ao(te,"number",te.value)}switch(Ue=q?rs(q):window,n){case"focusin":(Bf(Ue)||Ue.contentEditable==="true")&&(es=Ue,xu=q,xi=null);break;case"focusout":xi=xu=es=null;break;case"mousedown":Su=!0;break;case"contextmenu":case"mouseup":case"dragend":Su=!1,Jf(se,l,re);break;case"selectionchange":if(NS)break;case"keydown":case"keyup":Jf(se,l,re)}var He;if(yu)e:{switch(n){case"compositionstart":var $e="onCompositionStart";break e;case"compositionend":$e="onCompositionEnd";break e;case"compositionupdate":$e="onCompositionUpdate";break e}$e=void 0}else Xo?Hf(n,l)&&($e="onCompositionEnd"):n==="keydown"&&l.keyCode===229&&($e="onCompositionStart");$e&&(zf&&l.locale!=="ko"&&(Xo||$e!=="onCompositionStart"?$e==="onCompositionEnd"&&Xo&&(He=Nf()):(Er=re,mu="value"in Er?Er.value:Er.textContent,Xo=!0)),Ue=Zl(q,$e),0<Ue.length&&($e=new Lf($e,n,null,l,re),se.push({event:$e,listeners:Ue}),He?$e.data=He:(He=Ff(l),He!==null&&($e.data=He)))),(He=kS?vS(n,l):wS(n,l))&&(q=Zl(q,"onBeforeInput"),0<q.length&&(re=new Lf("onBeforeInput","beforeinput",null,l,re),se.push({event:re,listeners:q}),re.data=He))}ig(se,r)})}function Ti(n,r,l){return{instance:n,listener:r,currentTarget:l}}function Zl(n,r){for(var l=r+"Capture",d=[];n!==null;){var h=n,_=h.stateNode;h.tag===5&&_!==null&&(h=_,_=yr(n,l),_!=null&&d.unshift(Ti(n,_,h)),_=yr(n,r),_!=null&&d.push(Ti(n,_,h))),n=n.return}return d}function ns(n){if(n===null)return null;do n=n.return;while(n&&n.tag!==5);return n||null}function cg(n,r,l,d,h){for(var _=r._reactName,v=[];l!==null&&l!==d;){var A=l,I=A.alternate,q=A.stateNode;if(I!==null&&I===d)break;A.tag===5&&q!==null&&(A=q,h?(I=yr(l,_),I!=null&&v.unshift(Ti(l,I,A))):h||(I=yr(l,_),I!=null&&v.push(Ti(l,I,A)))),l=l.return}v.length!==0&&n.push({event:r,listeners:v})}var MS=/\r\n?/g,zS=/\u0000|\uFFFD/g;function dg(n){return(typeof n=="string"?n:""+n).replace(MS,`
7
- `).replace(zS,"")}function Ql(n,r,l){if(r=dg(r),dg(n)!==r&&l)throw Error(a(425))}function Jl(){}var Ru=null,Iu=null;function Nu(n,r){return n==="textarea"||n==="noscript"||typeof r.children=="string"||typeof r.children=="number"||typeof r.dangerouslySetInnerHTML=="object"&&r.dangerouslySetInnerHTML!==null&&r.dangerouslySetInnerHTML.__html!=null}var Du=typeof setTimeout=="function"?setTimeout:void 0,jS=typeof clearTimeout=="function"?clearTimeout:void 0,ug=typeof Promise=="function"?Promise:void 0,US=typeof queueMicrotask=="function"?queueMicrotask:typeof ug<"u"?function(n){return ug.resolve(null).then(n).catch(HS)}:Du;function HS(n){setTimeout(function(){throw n})}function Ou(n,r){var l=r,d=0;do{var h=l.nextSibling;if(n.removeChild(l),h&&h.nodeType===8)if(l=h.data,l==="/$"){if(d===0){n.removeChild(h),gi(r);return}d--}else l!=="$"&&l!=="$?"&&l!=="$!"||d++;l=h}while(l);gi(r)}function Pr(n){for(;n!=null;n=n.nextSibling){var r=n.nodeType;if(r===1||r===3)break;if(r===8){if(r=n.data,r==="$"||r==="$!"||r==="$?")break;if(r==="/$")return null}}return n}function pg(n){n=n.previousSibling;for(var r=0;n;){if(n.nodeType===8){var l=n.data;if(l==="$"||l==="$!"||l==="$?"){if(r===0)return n;r--}else l==="/$"&&r++}n=n.previousSibling}return null}var as=Math.random().toString(36).slice(2),Ta="__reactFiber$"+as,Ei="__reactProps$"+as,Za="__reactContainer$"+as,Lu="__reactEvents$"+as,FS="__reactListeners$"+as,BS="__reactHandles$"+as;function lo(n){var r=n[Ta];if(r)return r;for(var l=n.parentNode;l;){if(r=l[Za]||l[Ta]){if(l=r.alternate,r.child!==null||l!==null&&l.child!==null)for(n=pg(n);n!==null;){if(l=n[Ta])return l;n=pg(n)}return r}n=l,l=n.parentNode}return null}function Ai(n){return n=n[Ta]||n[Za],!n||n.tag!==5&&n.tag!==6&&n.tag!==13&&n.tag!==3?null:n}function rs(n){if(n.tag===5||n.tag===6)return n.stateNode;throw Error(a(33))}function Xl(n){return n[Ei]||null}var Mu=[],os=-1;function Rr(n){return{current:n}}function wt(n){0>os||(n.current=Mu[os],Mu[os]=null,os--)}function kt(n,r){os++,Mu[os]=n.current,n.current=r}var Ir={},dn=Rr(Ir),Nn=Rr(!1),co=Ir;function ss(n,r){var l=n.type.contextTypes;if(!l)return Ir;var d=n.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===r)return d.__reactInternalMemoizedMaskedChildContext;var h={},_;for(_ in l)h[_]=r[_];return d&&(n=n.stateNode,n.__reactInternalMemoizedUnmaskedChildContext=r,n.__reactInternalMemoizedMaskedChildContext=h),h}function Dn(n){return n=n.childContextTypes,n!=null}function ec(){wt(Nn),wt(dn)}function mg(n,r,l){if(dn.current!==Ir)throw Error(a(168));kt(dn,r),kt(Nn,l)}function hg(n,r,l){var d=n.stateNode;if(r=r.childContextTypes,typeof d.getChildContext!="function")return l;d=d.getChildContext();for(var h in d)if(!(h in r))throw Error(a(108,Ge(n)||"Unknown",h));return H({},l,d)}function tc(n){return n=(n=n.stateNode)&&n.__reactInternalMemoizedMergedChildContext||Ir,co=dn.current,kt(dn,n),kt(Nn,Nn.current),!0}function fg(n,r,l){var d=n.stateNode;if(!d)throw Error(a(169));l?(n=hg(n,r,co),d.__reactInternalMemoizedMergedChildContext=n,wt(Nn),wt(dn),kt(dn,n)):wt(Nn),kt(Nn,l)}var Qa=null,nc=!1,zu=!1;function gg(n){Qa===null?Qa=[n]:Qa.push(n)}function GS(n){nc=!0,gg(n)}function Nr(){if(!zu&&Qa!==null){zu=!0;var n=0,r=gt;try{var l=Qa;for(gt=1;n<l.length;n++){var d=l[n];do d=d(!0);while(d!==null)}Qa=null,nc=!1}catch(h){throw Qa!==null&&(Qa=Qa.slice(n+1)),ft(Wa,Nr),h}finally{gt=r,zu=!1}}return null}var is=[],ls=0,ac=null,rc=0,Zn=[],Qn=0,uo=null,Ja=1,Xa="";function po(n,r){is[ls++]=rc,is[ls++]=ac,ac=n,rc=r}function _g(n,r,l){Zn[Qn++]=Ja,Zn[Qn++]=Xa,Zn[Qn++]=uo,uo=n;var d=Ja;n=Xa;var h=32-ln(d)-1;d&=~(1<<h),l+=1;var _=32-ln(r)+h;if(30<_){var v=h-h%5;_=(d&(1<<v)-1).toString(32),d>>=v,h-=v,Ja=1<<32-ln(r)+h|l<<h|d,Xa=_+n}else Ja=1<<_|l<<h|d,Xa=n}function ju(n){n.return!==null&&(po(n,1),_g(n,1,0))}function Uu(n){for(;n===ac;)ac=is[--ls],is[ls]=null,rc=is[--ls],is[ls]=null;for(;n===uo;)uo=Zn[--Qn],Zn[Qn]=null,Xa=Zn[--Qn],Zn[Qn]=null,Ja=Zn[--Qn],Zn[Qn]=null}var Bn=null,Gn=null,Ct=!1,ha=null;function bg(n,r){var l=ta(5,null,null,0);l.elementType="DELETED",l.stateNode=r,l.return=n,r=n.deletions,r===null?(n.deletions=[l],n.flags|=16):r.push(l)}function yg(n,r){switch(n.tag){case 5:var l=n.type;return r=r.nodeType!==1||l.toLowerCase()!==r.nodeName.toLowerCase()?null:r,r!==null?(n.stateNode=r,Bn=n,Gn=Pr(r.firstChild),!0):!1;case 6:return r=n.pendingProps===""||r.nodeType!==3?null:r,r!==null?(n.stateNode=r,Bn=n,Gn=null,!0):!1;case 13:return r=r.nodeType!==8?null:r,r!==null?(l=uo!==null?{id:Ja,overflow:Xa}:null,n.memoizedState={dehydrated:r,treeContext:l,retryLane:1073741824},l=ta(18,null,null,0),l.stateNode=r,l.return=n,n.child=l,Bn=n,Gn=null,!0):!1;default:return!1}}function Hu(n){return(n.mode&1)!==0&&(n.flags&128)===0}function Fu(n){if(Ct){var r=Gn;if(r){var l=r;if(!yg(n,r)){if(Hu(n))throw Error(a(418));r=Pr(l.nextSibling);var d=Bn;r&&yg(n,r)?bg(d,l):(n.flags=n.flags&-4097|2,Ct=!1,Bn=n)}}else{if(Hu(n))throw Error(a(418));n.flags=n.flags&-4097|2,Ct=!1,Bn=n}}}function kg(n){for(n=n.return;n!==null&&n.tag!==5&&n.tag!==3&&n.tag!==13;)n=n.return;Bn=n}function oc(n){if(n!==Bn)return!1;if(!Ct)return kg(n),Ct=!0,!1;var r;if((r=n.tag!==3)&&!(r=n.tag!==5)&&(r=n.type,r=r!=="head"&&r!=="body"&&!Nu(n.type,n.memoizedProps)),r&&(r=Gn)){if(Hu(n))throw vg(),Error(a(418));for(;r;)bg(n,r),r=Pr(r.nextSibling)}if(kg(n),n.tag===13){if(n=n.memoizedState,n=n!==null?n.dehydrated:null,!n)throw Error(a(317));e:{for(n=n.nextSibling,r=0;n;){if(n.nodeType===8){var l=n.data;if(l==="/$"){if(r===0){Gn=Pr(n.nextSibling);break e}r--}else l!=="$"&&l!=="$!"&&l!=="$?"||r++}n=n.nextSibling}Gn=null}}else Gn=Bn?Pr(n.stateNode.nextSibling):null;return!0}function vg(){for(var n=Gn;n;)n=Pr(n.nextSibling)}function cs(){Gn=Bn=null,Ct=!1}function Bu(n){ha===null?ha=[n]:ha.push(n)}var $S=D.ReactCurrentBatchConfig;function Pi(n,r,l){if(n=l.ref,n!==null&&typeof n!="function"&&typeof n!="object"){if(l._owner){if(l=l._owner,l){if(l.tag!==1)throw Error(a(309));var d=l.stateNode}if(!d)throw Error(a(147,n));var h=d,_=""+n;return r!==null&&r.ref!==null&&typeof r.ref=="function"&&r.ref._stringRef===_?r.ref:(r=function(v){var A=h.refs;v===null?delete A[_]:A[_]=v},r._stringRef=_,r)}if(typeof n!="string")throw Error(a(284));if(!l._owner)throw Error(a(290,n))}return n}function sc(n,r){throw n=Object.prototype.toString.call(r),Error(a(31,n==="[object Object]"?"object with keys {"+Object.keys(r).join(", ")+"}":n))}function wg(n){var r=n._init;return r(n._payload)}function xg(n){function r(F,z){if(n){var G=F.deletions;G===null?(F.deletions=[z],F.flags|=16):G.push(z)}}function l(F,z){if(!n)return null;for(;z!==null;)r(F,z),z=z.sibling;return null}function d(F,z){for(F=new Map;z!==null;)z.key!==null?F.set(z.key,z):F.set(z.index,z),z=z.sibling;return F}function h(F,z){return F=Hr(F,z),F.index=0,F.sibling=null,F}function _(F,z,G){return F.index=G,n?(G=F.alternate,G!==null?(G=G.index,G<z?(F.flags|=2,z):G):(F.flags|=2,z)):(F.flags|=1048576,z)}function v(F){return n&&F.alternate===null&&(F.flags|=2),F}function A(F,z,G,ie){return z===null||z.tag!==6?(z=Dp(G,F.mode,ie),z.return=F,z):(z=h(z,G),z.return=F,z)}function I(F,z,G,ie){var Pe=G.type;return Pe===Q?re(F,z,G.props.children,ie,G.key):z!==null&&(z.elementType===Pe||typeof Pe=="object"&&Pe!==null&&Pe.$$typeof===_e&&wg(Pe)===z.type)?(ie=h(z,G.props),ie.ref=Pi(F,z,G),ie.return=F,ie):(ie=Rc(G.type,G.key,G.props,null,F.mode,ie),ie.ref=Pi(F,z,G),ie.return=F,ie)}function q(F,z,G,ie){return z===null||z.tag!==4||z.stateNode.containerInfo!==G.containerInfo||z.stateNode.implementation!==G.implementation?(z=Op(G,F.mode,ie),z.return=F,z):(z=h(z,G.children||[]),z.return=F,z)}function re(F,z,G,ie,Pe){return z===null||z.tag!==7?(z=ko(G,F.mode,ie,Pe),z.return=F,z):(z=h(z,G),z.return=F,z)}function se(F,z,G){if(typeof z=="string"&&z!==""||typeof z=="number")return z=Dp(""+z,F.mode,G),z.return=F,z;if(typeof z=="object"&&z!==null){switch(z.$$typeof){case Y:return G=Rc(z.type,z.key,z.props,null,F.mode,G),G.ref=Pi(F,null,z),G.return=F,G;case J:return z=Op(z,F.mode,G),z.return=F,z;case _e:var ie=z._init;return se(F,ie(z._payload),G)}if(wa(z)||Z(z))return z=ko(z,F.mode,G,null),z.return=F,z;sc(F,z)}return null}function te(F,z,G,ie){var Pe=z!==null?z.key:null;if(typeof G=="string"&&G!==""||typeof G=="number")return Pe!==null?null:A(F,z,""+G,ie);if(typeof G=="object"&&G!==null){switch(G.$$typeof){case Y:return G.key===Pe?I(F,z,G,ie):null;case J:return G.key===Pe?q(F,z,G,ie):null;case _e:return Pe=G._init,te(F,z,Pe(G._payload),ie)}if(wa(G)||Z(G))return Pe!==null?null:re(F,z,G,ie,null);sc(F,G)}return null}function ge(F,z,G,ie,Pe){if(typeof ie=="string"&&ie!==""||typeof ie=="number")return F=F.get(G)||null,A(z,F,""+ie,Pe);if(typeof ie=="object"&&ie!==null){switch(ie.$$typeof){case Y:return F=F.get(ie.key===null?G:ie.key)||null,I(z,F,ie,Pe);case J:return F=F.get(ie.key===null?G:ie.key)||null,q(z,F,ie,Pe);case _e:var Ue=ie._init;return ge(F,z,G,Ue(ie._payload),Pe)}if(wa(ie)||Z(ie))return F=F.get(G)||null,re(z,F,ie,Pe,null);sc(z,ie)}return null}function Te(F,z,G,ie){for(var Pe=null,Ue=null,He=z,$e=z=0,Jt=null;He!==null&&$e<G.length;$e++){He.index>$e?(Jt=He,He=null):Jt=He.sibling;var ut=te(F,He,G[$e],ie);if(ut===null){He===null&&(He=Jt);break}n&&He&&ut.alternate===null&&r(F,He),z=_(ut,z,$e),Ue===null?Pe=ut:Ue.sibling=ut,Ue=ut,He=Jt}if($e===G.length)return l(F,He),Ct&&po(F,$e),Pe;if(He===null){for(;$e<G.length;$e++)He=se(F,G[$e],ie),He!==null&&(z=_(He,z,$e),Ue===null?Pe=He:Ue.sibling=He,Ue=He);return Ct&&po(F,$e),Pe}for(He=d(F,He);$e<G.length;$e++)Jt=ge(He,F,$e,G[$e],ie),Jt!==null&&(n&&Jt.alternate!==null&&He.delete(Jt.key===null?$e:Jt.key),z=_(Jt,z,$e),Ue===null?Pe=Jt:Ue.sibling=Jt,Ue=Jt);return n&&He.forEach(function(Fr){return r(F,Fr)}),Ct&&po(F,$e),Pe}function Ae(F,z,G,ie){var Pe=Z(G);if(typeof Pe!="function")throw Error(a(150));if(G=Pe.call(G),G==null)throw Error(a(151));for(var Ue=Pe=null,He=z,$e=z=0,Jt=null,ut=G.next();He!==null&&!ut.done;$e++,ut=G.next()){He.index>$e?(Jt=He,He=null):Jt=He.sibling;var Fr=te(F,He,ut.value,ie);if(Fr===null){He===null&&(He=Jt);break}n&&He&&Fr.alternate===null&&r(F,He),z=_(Fr,z,$e),Ue===null?Pe=Fr:Ue.sibling=Fr,Ue=Fr,He=Jt}if(ut.done)return l(F,He),Ct&&po(F,$e),Pe;if(He===null){for(;!ut.done;$e++,ut=G.next())ut=se(F,ut.value,ie),ut!==null&&(z=_(ut,z,$e),Ue===null?Pe=ut:Ue.sibling=ut,Ue=ut);return Ct&&po(F,$e),Pe}for(He=d(F,He);!ut.done;$e++,ut=G.next())ut=ge(He,F,$e,ut.value,ie),ut!==null&&(n&&ut.alternate!==null&&He.delete(ut.key===null?$e:ut.key),z=_(ut,z,$e),Ue===null?Pe=ut:Ue.sibling=ut,Ue=ut);return n&&He.forEach(function(xC){return r(F,xC)}),Ct&&po(F,$e),Pe}function Ut(F,z,G,ie){if(typeof G=="object"&&G!==null&&G.type===Q&&G.key===null&&(G=G.props.children),typeof G=="object"&&G!==null){switch(G.$$typeof){case Y:e:{for(var Pe=G.key,Ue=z;Ue!==null;){if(Ue.key===Pe){if(Pe=G.type,Pe===Q){if(Ue.tag===7){l(F,Ue.sibling),z=h(Ue,G.props.children),z.return=F,F=z;break e}}else if(Ue.elementType===Pe||typeof Pe=="object"&&Pe!==null&&Pe.$$typeof===_e&&wg(Pe)===Ue.type){l(F,Ue.sibling),z=h(Ue,G.props),z.ref=Pi(F,Ue,G),z.return=F,F=z;break e}l(F,Ue);break}else r(F,Ue);Ue=Ue.sibling}G.type===Q?(z=ko(G.props.children,F.mode,ie,G.key),z.return=F,F=z):(ie=Rc(G.type,G.key,G.props,null,F.mode,ie),ie.ref=Pi(F,z,G),ie.return=F,F=ie)}return v(F);case J:e:{for(Ue=G.key;z!==null;){if(z.key===Ue)if(z.tag===4&&z.stateNode.containerInfo===G.containerInfo&&z.stateNode.implementation===G.implementation){l(F,z.sibling),z=h(z,G.children||[]),z.return=F,F=z;break e}else{l(F,z);break}else r(F,z);z=z.sibling}z=Op(G,F.mode,ie),z.return=F,F=z}return v(F);case _e:return Ue=G._init,Ut(F,z,Ue(G._payload),ie)}if(wa(G))return Te(F,z,G,ie);if(Z(G))return Ae(F,z,G,ie);sc(F,G)}return typeof G=="string"&&G!==""||typeof G=="number"?(G=""+G,z!==null&&z.tag===6?(l(F,z.sibling),z=h(z,G),z.return=F,F=z):(l(F,z),z=Dp(G,F.mode,ie),z.return=F,F=z),v(F)):l(F,z)}return Ut}var ds=xg(!0),Sg=xg(!1),ic=Rr(null),lc=null,us=null,Gu=null;function $u(){Gu=us=lc=null}function qu(n){var r=ic.current;wt(ic),n._currentValue=r}function Ku(n,r,l){for(;n!==null;){var d=n.alternate;if((n.childLanes&r)!==r?(n.childLanes|=r,d!==null&&(d.childLanes|=r)):d!==null&&(d.childLanes&r)!==r&&(d.childLanes|=r),n===l)break;n=n.return}}function ps(n,r){lc=n,Gu=us=null,n=n.dependencies,n!==null&&n.firstContext!==null&&((n.lanes&r)!==0&&(On=!0),n.firstContext=null)}function Jn(n){var r=n._currentValue;if(Gu!==n)if(n={context:n,memoizedValue:r,next:null},us===null){if(lc===null)throw Error(a(308));us=n,lc.dependencies={lanes:0,firstContext:n}}else us=us.next=n;return r}var mo=null;function Vu(n){mo===null?mo=[n]:mo.push(n)}function Cg(n,r,l,d){var h=r.interleaved;return h===null?(l.next=l,Vu(r)):(l.next=h.next,h.next=l),r.interleaved=l,er(n,d)}function er(n,r){n.lanes|=r;var l=n.alternate;for(l!==null&&(l.lanes|=r),l=n,n=n.return;n!==null;)n.childLanes|=r,l=n.alternate,l!==null&&(l.childLanes|=r),l=n,n=n.return;return l.tag===3?l.stateNode:null}var Dr=!1;function Wu(n){n.updateQueue={baseState:n.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Tg(n,r){n=n.updateQueue,r.updateQueue===n&&(r.updateQueue={baseState:n.baseState,firstBaseUpdate:n.firstBaseUpdate,lastBaseUpdate:n.lastBaseUpdate,shared:n.shared,effects:n.effects})}function tr(n,r){return{eventTime:n,lane:r,tag:0,payload:null,callback:null,next:null}}function Or(n,r,l){var d=n.updateQueue;if(d===null)return null;if(d=d.shared,(lt&2)!==0){var h=d.pending;return h===null?r.next=r:(r.next=h.next,h.next=r),d.pending=r,er(n,l)}return h=d.interleaved,h===null?(r.next=r,Vu(d)):(r.next=h.next,h.next=r),d.interleaved=r,er(n,l)}function cc(n,r,l){if(r=r.updateQueue,r!==null&&(r=r.shared,(l&4194240)!==0)){var d=r.lanes;d&=n.pendingLanes,l|=d,r.lanes=l,lu(n,l)}}function Eg(n,r){var l=n.updateQueue,d=n.alternate;if(d!==null&&(d=d.updateQueue,l===d)){var h=null,_=null;if(l=l.firstBaseUpdate,l!==null){do{var v={eventTime:l.eventTime,lane:l.lane,tag:l.tag,payload:l.payload,callback:l.callback,next:null};_===null?h=_=v:_=_.next=v,l=l.next}while(l!==null);_===null?h=_=r:_=_.next=r}else h=_=r;l={baseState:d.baseState,firstBaseUpdate:h,lastBaseUpdate:_,shared:d.shared,effects:d.effects},n.updateQueue=l;return}n=l.lastBaseUpdate,n===null?l.firstBaseUpdate=r:n.next=r,l.lastBaseUpdate=r}function dc(n,r,l,d){var h=n.updateQueue;Dr=!1;var _=h.firstBaseUpdate,v=h.lastBaseUpdate,A=h.shared.pending;if(A!==null){h.shared.pending=null;var I=A,q=I.next;I.next=null,v===null?_=q:v.next=q,v=I;var re=n.alternate;re!==null&&(re=re.updateQueue,A=re.lastBaseUpdate,A!==v&&(A===null?re.firstBaseUpdate=q:A.next=q,re.lastBaseUpdate=I))}if(_!==null){var se=h.baseState;v=0,re=q=I=null,A=_;do{var te=A.lane,ge=A.eventTime;if((d&te)===te){re!==null&&(re=re.next={eventTime:ge,lane:0,tag:A.tag,payload:A.payload,callback:A.callback,next:null});e:{var Te=n,Ae=A;switch(te=r,ge=l,Ae.tag){case 1:if(Te=Ae.payload,typeof Te=="function"){se=Te.call(ge,se,te);break e}se=Te;break e;case 3:Te.flags=Te.flags&-65537|128;case 0:if(Te=Ae.payload,te=typeof Te=="function"?Te.call(ge,se,te):Te,te==null)break e;se=H({},se,te);break e;case 2:Dr=!0}}A.callback!==null&&A.lane!==0&&(n.flags|=64,te=h.effects,te===null?h.effects=[A]:te.push(A))}else ge={eventTime:ge,lane:te,tag:A.tag,payload:A.payload,callback:A.callback,next:null},re===null?(q=re=ge,I=se):re=re.next=ge,v|=te;if(A=A.next,A===null){if(A=h.shared.pending,A===null)break;te=A,A=te.next,te.next=null,h.lastBaseUpdate=te,h.shared.pending=null}}while(!0);if(re===null&&(I=se),h.baseState=I,h.firstBaseUpdate=q,h.lastBaseUpdate=re,r=h.shared.interleaved,r!==null){h=r;do v|=h.lane,h=h.next;while(h!==r)}else _===null&&(h.shared.lanes=0);go|=v,n.lanes=v,n.memoizedState=se}}function Ag(n,r,l){if(n=r.effects,r.effects=null,n!==null)for(r=0;r<n.length;r++){var d=n[r],h=d.callback;if(h!==null){if(d.callback=null,d=l,typeof h!="function")throw Error(a(191,h));h.call(d)}}}var Ri={},Ea=Rr(Ri),Ii=Rr(Ri),Ni=Rr(Ri);function ho(n){if(n===Ri)throw Error(a(174));return n}function Yu(n,r){switch(kt(Ni,r),kt(Ii,n),kt(Ea,Ri),n=r.nodeType,n){case 9:case 11:r=(r=r.documentElement)?r.namespaceURI:jt(null,"");break;default:n=n===8?r.parentNode:r,r=n.namespaceURI||null,n=n.tagName,r=jt(r,n)}wt(Ea),kt(Ea,r)}function ms(){wt(Ea),wt(Ii),wt(Ni)}function Pg(n){ho(Ni.current);var r=ho(Ea.current),l=jt(r,n.type);r!==l&&(kt(Ii,n),kt(Ea,l))}function Zu(n){Ii.current===n&&(wt(Ea),wt(Ii))}var Tt=Rr(0);function uc(n){for(var r=n;r!==null;){if(r.tag===13){var l=r.memoizedState;if(l!==null&&(l=l.dehydrated,l===null||l.data==="$?"||l.data==="$!"))return r}else if(r.tag===19&&r.memoizedProps.revealOrder!==void 0){if((r.flags&128)!==0)return r}else if(r.child!==null){r.child.return=r,r=r.child;continue}if(r===n)break;for(;r.sibling===null;){if(r.return===null||r.return===n)return null;r=r.return}r.sibling.return=r.return,r=r.sibling}return null}var Qu=[];function Ju(){for(var n=0;n<Qu.length;n++)Qu[n]._workInProgressVersionPrimary=null;Qu.length=0}var pc=D.ReactCurrentDispatcher,Xu=D.ReactCurrentBatchConfig,fo=0,Et=null,qt=null,Zt=null,mc=!1,Di=!1,Oi=0,qS=0;function un(){throw Error(a(321))}function ep(n,r){if(r===null)return!1;for(var l=0;l<r.length&&l<n.length;l++)if(!ma(n[l],r[l]))return!1;return!0}function tp(n,r,l,d,h,_){if(fo=_,Et=r,r.memoizedState=null,r.updateQueue=null,r.lanes=0,pc.current=n===null||n.memoizedState===null?YS:ZS,n=l(d,h),Di){_=0;do{if(Di=!1,Oi=0,25<=_)throw Error(a(301));_+=1,Zt=qt=null,r.updateQueue=null,pc.current=QS,n=l(d,h)}while(Di)}if(pc.current=gc,r=qt!==null&&qt.next!==null,fo=0,Zt=qt=Et=null,mc=!1,r)throw Error(a(300));return n}function np(){var n=Oi!==0;return Oi=0,n}function Aa(){var n={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Zt===null?Et.memoizedState=Zt=n:Zt=Zt.next=n,Zt}function Xn(){if(qt===null){var n=Et.alternate;n=n!==null?n.memoizedState:null}else n=qt.next;var r=Zt===null?Et.memoizedState:Zt.next;if(r!==null)Zt=r,qt=n;else{if(n===null)throw Error(a(310));qt=n,n={memoizedState:qt.memoizedState,baseState:qt.baseState,baseQueue:qt.baseQueue,queue:qt.queue,next:null},Zt===null?Et.memoizedState=Zt=n:Zt=Zt.next=n}return Zt}function Li(n,r){return typeof r=="function"?r(n):r}function ap(n){var r=Xn(),l=r.queue;if(l===null)throw Error(a(311));l.lastRenderedReducer=n;var d=qt,h=d.baseQueue,_=l.pending;if(_!==null){if(h!==null){var v=h.next;h.next=_.next,_.next=v}d.baseQueue=h=_,l.pending=null}if(h!==null){_=h.next,d=d.baseState;var A=v=null,I=null,q=_;do{var re=q.lane;if((fo&re)===re)I!==null&&(I=I.next={lane:0,action:q.action,hasEagerState:q.hasEagerState,eagerState:q.eagerState,next:null}),d=q.hasEagerState?q.eagerState:n(d,q.action);else{var se={lane:re,action:q.action,hasEagerState:q.hasEagerState,eagerState:q.eagerState,next:null};I===null?(A=I=se,v=d):I=I.next=se,Et.lanes|=re,go|=re}q=q.next}while(q!==null&&q!==_);I===null?v=d:I.next=A,ma(d,r.memoizedState)||(On=!0),r.memoizedState=d,r.baseState=v,r.baseQueue=I,l.lastRenderedState=d}if(n=l.interleaved,n!==null){h=n;do _=h.lane,Et.lanes|=_,go|=_,h=h.next;while(h!==n)}else h===null&&(l.lanes=0);return[r.memoizedState,l.dispatch]}function rp(n){var r=Xn(),l=r.queue;if(l===null)throw Error(a(311));l.lastRenderedReducer=n;var d=l.dispatch,h=l.pending,_=r.memoizedState;if(h!==null){l.pending=null;var v=h=h.next;do _=n(_,v.action),v=v.next;while(v!==h);ma(_,r.memoizedState)||(On=!0),r.memoizedState=_,r.baseQueue===null&&(r.baseState=_),l.lastRenderedState=_}return[_,d]}function Rg(){}function Ig(n,r){var l=Et,d=Xn(),h=r(),_=!ma(d.memoizedState,h);if(_&&(d.memoizedState=h,On=!0),d=d.queue,op(Og.bind(null,l,d,n),[n]),d.getSnapshot!==r||_||Zt!==null&&Zt.memoizedState.tag&1){if(l.flags|=2048,Mi(9,Dg.bind(null,l,d,h,r),void 0,null),Qt===null)throw Error(a(349));(fo&30)!==0||Ng(l,r,h)}return h}function Ng(n,r,l){n.flags|=16384,n={getSnapshot:r,value:l},r=Et.updateQueue,r===null?(r={lastEffect:null,stores:null},Et.updateQueue=r,r.stores=[n]):(l=r.stores,l===null?r.stores=[n]:l.push(n))}function Dg(n,r,l,d){r.value=l,r.getSnapshot=d,Lg(r)&&Mg(n)}function Og(n,r,l){return l(function(){Lg(r)&&Mg(n)})}function Lg(n){var r=n.getSnapshot;n=n.value;try{var l=r();return!ma(n,l)}catch{return!0}}function Mg(n){var r=er(n,1);r!==null&&ba(r,n,1,-1)}function zg(n){var r=Aa();return typeof n=="function"&&(n=n()),r.memoizedState=r.baseState=n,n={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Li,lastRenderedState:n},r.queue=n,n=n.dispatch=WS.bind(null,Et,n),[r.memoizedState,n]}function Mi(n,r,l,d){return n={tag:n,create:r,destroy:l,deps:d,next:null},r=Et.updateQueue,r===null?(r={lastEffect:null,stores:null},Et.updateQueue=r,r.lastEffect=n.next=n):(l=r.lastEffect,l===null?r.lastEffect=n.next=n:(d=l.next,l.next=n,n.next=d,r.lastEffect=n)),n}function jg(){return Xn().memoizedState}function hc(n,r,l,d){var h=Aa();Et.flags|=n,h.memoizedState=Mi(1|r,l,void 0,d===void 0?null:d)}function fc(n,r,l,d){var h=Xn();d=d===void 0?null:d;var _=void 0;if(qt!==null){var v=qt.memoizedState;if(_=v.destroy,d!==null&&ep(d,v.deps)){h.memoizedState=Mi(r,l,_,d);return}}Et.flags|=n,h.memoizedState=Mi(1|r,l,_,d)}function Ug(n,r){return hc(8390656,8,n,r)}function op(n,r){return fc(2048,8,n,r)}function Hg(n,r){return fc(4,2,n,r)}function Fg(n,r){return fc(4,4,n,r)}function Bg(n,r){if(typeof r=="function")return n=n(),r(n),function(){r(null)};if(r!=null)return n=n(),r.current=n,function(){r.current=null}}function Gg(n,r,l){return l=l!=null?l.concat([n]):null,fc(4,4,Bg.bind(null,r,n),l)}function sp(){}function $g(n,r){var l=Xn();r=r===void 0?null:r;var d=l.memoizedState;return d!==null&&r!==null&&ep(r,d[1])?d[0]:(l.memoizedState=[n,r],n)}function qg(n,r){var l=Xn();r=r===void 0?null:r;var d=l.memoizedState;return d!==null&&r!==null&&ep(r,d[1])?d[0]:(n=n(),l.memoizedState=[n,r],n)}function Kg(n,r,l){return(fo&21)===0?(n.baseState&&(n.baseState=!1,On=!0),n.memoizedState=l):(ma(l,r)||(l=zl(),Et.lanes|=l,go|=l,n.baseState=!0),r)}function KS(n,r){var l=gt;gt=l!==0&&4>l?l:4,n(!0);var d=Xu.transition;Xu.transition={};try{n(!1),r()}finally{gt=l,Xu.transition=d}}function Vg(){return Xn().memoizedState}function VS(n,r,l){var d=jr(n);if(l={lane:d,action:l,hasEagerState:!1,eagerState:null,next:null},Wg(n))Yg(r,l);else if(l=Cg(n,r,l,d),l!==null){var h=wn();ba(l,n,d,h),Zg(l,r,d)}}function WS(n,r,l){var d=jr(n),h={lane:d,action:l,hasEagerState:!1,eagerState:null,next:null};if(Wg(n))Yg(r,h);else{var _=n.alternate;if(n.lanes===0&&(_===null||_.lanes===0)&&(_=r.lastRenderedReducer,_!==null))try{var v=r.lastRenderedState,A=_(v,l);if(h.hasEagerState=!0,h.eagerState=A,ma(A,v)){var I=r.interleaved;I===null?(h.next=h,Vu(r)):(h.next=I.next,I.next=h),r.interleaved=h;return}}catch{}l=Cg(n,r,h,d),l!==null&&(h=wn(),ba(l,n,d,h),Zg(l,r,d))}}function Wg(n){var r=n.alternate;return n===Et||r!==null&&r===Et}function Yg(n,r){Di=mc=!0;var l=n.pending;l===null?r.next=r:(r.next=l.next,l.next=r),n.pending=r}function Zg(n,r,l){if((l&4194240)!==0){var d=r.lanes;d&=n.pendingLanes,l|=d,r.lanes=l,lu(n,l)}}var gc={readContext:Jn,useCallback:un,useContext:un,useEffect:un,useImperativeHandle:un,useInsertionEffect:un,useLayoutEffect:un,useMemo:un,useReducer:un,useRef:un,useState:un,useDebugValue:un,useDeferredValue:un,useTransition:un,useMutableSource:un,useSyncExternalStore:un,useId:un,unstable_isNewReconciler:!1},YS={readContext:Jn,useCallback:function(n,r){return Aa().memoizedState=[n,r===void 0?null:r],n},useContext:Jn,useEffect:Ug,useImperativeHandle:function(n,r,l){return l=l!=null?l.concat([n]):null,hc(4194308,4,Bg.bind(null,r,n),l)},useLayoutEffect:function(n,r){return hc(4194308,4,n,r)},useInsertionEffect:function(n,r){return hc(4,2,n,r)},useMemo:function(n,r){var l=Aa();return r=r===void 0?null:r,n=n(),l.memoizedState=[n,r],n},useReducer:function(n,r,l){var d=Aa();return r=l!==void 0?l(r):r,d.memoizedState=d.baseState=r,n={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:n,lastRenderedState:r},d.queue=n,n=n.dispatch=VS.bind(null,Et,n),[d.memoizedState,n]},useRef:function(n){var r=Aa();return n={current:n},r.memoizedState=n},useState:zg,useDebugValue:sp,useDeferredValue:function(n){return Aa().memoizedState=n},useTransition:function(){var n=zg(!1),r=n[0];return n=KS.bind(null,n[1]),Aa().memoizedState=n,[r,n]},useMutableSource:function(){},useSyncExternalStore:function(n,r,l){var d=Et,h=Aa();if(Ct){if(l===void 0)throw Error(a(407));l=l()}else{if(l=r(),Qt===null)throw Error(a(349));(fo&30)!==0||Ng(d,r,l)}h.memoizedState=l;var _={value:l,getSnapshot:r};return h.queue=_,Ug(Og.bind(null,d,_,n),[n]),d.flags|=2048,Mi(9,Dg.bind(null,d,_,l,r),void 0,null),l},useId:function(){var n=Aa(),r=Qt.identifierPrefix;if(Ct){var l=Xa,d=Ja;l=(d&~(1<<32-ln(d)-1)).toString(32)+l,r=":"+r+"R"+l,l=Oi++,0<l&&(r+="H"+l.toString(32)),r+=":"}else l=qS++,r=":"+r+"r"+l.toString(32)+":";return n.memoizedState=r},unstable_isNewReconciler:!1},ZS={readContext:Jn,useCallback:$g,useContext:Jn,useEffect:op,useImperativeHandle:Gg,useInsertionEffect:Hg,useLayoutEffect:Fg,useMemo:qg,useReducer:ap,useRef:jg,useState:function(){return ap(Li)},useDebugValue:sp,useDeferredValue:function(n){var r=Xn();return Kg(r,qt.memoizedState,n)},useTransition:function(){var n=ap(Li)[0],r=Xn().memoizedState;return[n,r]},useMutableSource:Rg,useSyncExternalStore:Ig,useId:Vg,unstable_isNewReconciler:!1},QS={readContext:Jn,useCallback:$g,useContext:Jn,useEffect:op,useImperativeHandle:Gg,useInsertionEffect:Hg,useLayoutEffect:Fg,useMemo:qg,useReducer:rp,useRef:jg,useState:function(){return rp(Li)},useDebugValue:sp,useDeferredValue:function(n){var r=Xn();return qt===null?r.memoizedState=n:Kg(r,qt.memoizedState,n)},useTransition:function(){var n=rp(Li)[0],r=Xn().memoizedState;return[n,r]},useMutableSource:Rg,useSyncExternalStore:Ig,useId:Vg,unstable_isNewReconciler:!1};function fa(n,r){if(n&&n.defaultProps){r=H({},r),n=n.defaultProps;for(var l in n)r[l]===void 0&&(r[l]=n[l]);return r}return r}function ip(n,r,l,d){r=n.memoizedState,l=l(d,r),l=l==null?r:H({},r,l),n.memoizedState=l,n.lanes===0&&(n.updateQueue.baseState=l)}var _c={isMounted:function(n){return(n=n._reactInternals)?fe(n)===n:!1},enqueueSetState:function(n,r,l){n=n._reactInternals;var d=wn(),h=jr(n),_=tr(d,h);_.payload=r,l!=null&&(_.callback=l),r=Or(n,_,h),r!==null&&(ba(r,n,h,d),cc(r,n,h))},enqueueReplaceState:function(n,r,l){n=n._reactInternals;var d=wn(),h=jr(n),_=tr(d,h);_.tag=1,_.payload=r,l!=null&&(_.callback=l),r=Or(n,_,h),r!==null&&(ba(r,n,h,d),cc(r,n,h))},enqueueForceUpdate:function(n,r){n=n._reactInternals;var l=wn(),d=jr(n),h=tr(l,d);h.tag=2,r!=null&&(h.callback=r),r=Or(n,h,d),r!==null&&(ba(r,n,d,l),cc(r,n,d))}};function Qg(n,r,l,d,h,_,v){return n=n.stateNode,typeof n.shouldComponentUpdate=="function"?n.shouldComponentUpdate(d,_,v):r.prototype&&r.prototype.isPureReactComponent?!wi(l,d)||!wi(h,_):!0}function Jg(n,r,l){var d=!1,h=Ir,_=r.contextType;return typeof _=="object"&&_!==null?_=Jn(_):(h=Dn(r)?co:dn.current,d=r.contextTypes,_=(d=d!=null)?ss(n,h):Ir),r=new r(l,_),n.memoizedState=r.state!==null&&r.state!==void 0?r.state:null,r.updater=_c,n.stateNode=r,r._reactInternals=n,d&&(n=n.stateNode,n.__reactInternalMemoizedUnmaskedChildContext=h,n.__reactInternalMemoizedMaskedChildContext=_),r}function Xg(n,r,l,d){n=r.state,typeof r.componentWillReceiveProps=="function"&&r.componentWillReceiveProps(l,d),typeof r.UNSAFE_componentWillReceiveProps=="function"&&r.UNSAFE_componentWillReceiveProps(l,d),r.state!==n&&_c.enqueueReplaceState(r,r.state,null)}function lp(n,r,l,d){var h=n.stateNode;h.props=l,h.state=n.memoizedState,h.refs={},Wu(n);var _=r.contextType;typeof _=="object"&&_!==null?h.context=Jn(_):(_=Dn(r)?co:dn.current,h.context=ss(n,_)),h.state=n.memoizedState,_=r.getDerivedStateFromProps,typeof _=="function"&&(ip(n,r,_,l),h.state=n.memoizedState),typeof r.getDerivedStateFromProps=="function"||typeof h.getSnapshotBeforeUpdate=="function"||typeof h.UNSAFE_componentWillMount!="function"&&typeof h.componentWillMount!="function"||(r=h.state,typeof h.componentWillMount=="function"&&h.componentWillMount(),typeof h.UNSAFE_componentWillMount=="function"&&h.UNSAFE_componentWillMount(),r!==h.state&&_c.enqueueReplaceState(h,h.state,null),dc(n,l,h,d),h.state=n.memoizedState),typeof h.componentDidMount=="function"&&(n.flags|=4194308)}function hs(n,r){try{var l="",d=r;do l+=ce(d),d=d.return;while(d);var h=l}catch(_){h=`
8
- Error generating stack: `+_.message+`
9
- `+_.stack}return{value:n,source:r,stack:h,digest:null}}function cp(n,r,l){return{value:n,source:null,stack:l??null,digest:r??null}}function dp(n,r){try{console.error(r.value)}catch(l){setTimeout(function(){throw l})}}var JS=typeof WeakMap=="function"?WeakMap:Map;function e_(n,r,l){l=tr(-1,l),l.tag=3,l.payload={element:null};var d=r.value;return l.callback=function(){Sc||(Sc=!0,Cp=d),dp(n,r)},l}function t_(n,r,l){l=tr(-1,l),l.tag=3;var d=n.type.getDerivedStateFromError;if(typeof d=="function"){var h=r.value;l.payload=function(){return d(h)},l.callback=function(){dp(n,r)}}var _=n.stateNode;return _!==null&&typeof _.componentDidCatch=="function"&&(l.callback=function(){dp(n,r),typeof d!="function"&&(Mr===null?Mr=new Set([this]):Mr.add(this));var v=r.stack;this.componentDidCatch(r.value,{componentStack:v!==null?v:""})}),l}function n_(n,r,l){var d=n.pingCache;if(d===null){d=n.pingCache=new JS;var h=new Set;d.set(r,h)}else h=d.get(r),h===void 0&&(h=new Set,d.set(r,h));h.has(l)||(h.add(l),n=pC.bind(null,n,r,l),r.then(n,n))}function a_(n){do{var r;if((r=n.tag===13)&&(r=n.memoizedState,r=r!==null?r.dehydrated!==null:!0),r)return n;n=n.return}while(n!==null);return null}function r_(n,r,l,d,h){return(n.mode&1)===0?(n===r?n.flags|=65536:(n.flags|=128,l.flags|=131072,l.flags&=-52805,l.tag===1&&(l.alternate===null?l.tag=17:(r=tr(-1,1),r.tag=2,Or(l,r,1))),l.lanes|=1),n):(n.flags|=65536,n.lanes=h,n)}var XS=D.ReactCurrentOwner,On=!1;function vn(n,r,l,d){r.child=n===null?Sg(r,null,l,d):ds(r,n.child,l,d)}function o_(n,r,l,d,h){l=l.render;var _=r.ref;return ps(r,h),d=tp(n,r,l,d,_,h),l=np(),n!==null&&!On?(r.updateQueue=n.updateQueue,r.flags&=-2053,n.lanes&=~h,nr(n,r,h)):(Ct&&l&&ju(r),r.flags|=1,vn(n,r,d,h),r.child)}function s_(n,r,l,d,h){if(n===null){var _=l.type;return typeof _=="function"&&!Np(_)&&_.defaultProps===void 0&&l.compare===null&&l.defaultProps===void 0?(r.tag=15,r.type=_,i_(n,r,_,d,h)):(n=Rc(l.type,null,d,r,r.mode,h),n.ref=r.ref,n.return=r,r.child=n)}if(_=n.child,(n.lanes&h)===0){var v=_.memoizedProps;if(l=l.compare,l=l!==null?l:wi,l(v,d)&&n.ref===r.ref)return nr(n,r,h)}return r.flags|=1,n=Hr(_,d),n.ref=r.ref,n.return=r,r.child=n}function i_(n,r,l,d,h){if(n!==null){var _=n.memoizedProps;if(wi(_,d)&&n.ref===r.ref)if(On=!1,r.pendingProps=d=_,(n.lanes&h)!==0)(n.flags&131072)!==0&&(On=!0);else return r.lanes=n.lanes,nr(n,r,h)}return up(n,r,l,d,h)}function l_(n,r,l){var d=r.pendingProps,h=d.children,_=n!==null?n.memoizedState:null;if(d.mode==="hidden")if((r.mode&1)===0)r.memoizedState={baseLanes:0,cachePool:null,transitions:null},kt(gs,$n),$n|=l;else{if((l&1073741824)===0)return n=_!==null?_.baseLanes|l:l,r.lanes=r.childLanes=1073741824,r.memoizedState={baseLanes:n,cachePool:null,transitions:null},r.updateQueue=null,kt(gs,$n),$n|=n,null;r.memoizedState={baseLanes:0,cachePool:null,transitions:null},d=_!==null?_.baseLanes:l,kt(gs,$n),$n|=d}else _!==null?(d=_.baseLanes|l,r.memoizedState=null):d=l,kt(gs,$n),$n|=d;return vn(n,r,h,l),r.child}function c_(n,r){var l=r.ref;(n===null&&l!==null||n!==null&&n.ref!==l)&&(r.flags|=512,r.flags|=2097152)}function up(n,r,l,d,h){var _=Dn(l)?co:dn.current;return _=ss(r,_),ps(r,h),l=tp(n,r,l,d,_,h),d=np(),n!==null&&!On?(r.updateQueue=n.updateQueue,r.flags&=-2053,n.lanes&=~h,nr(n,r,h)):(Ct&&d&&ju(r),r.flags|=1,vn(n,r,l,h),r.child)}function d_(n,r,l,d,h){if(Dn(l)){var _=!0;tc(r)}else _=!1;if(ps(r,h),r.stateNode===null)yc(n,r),Jg(r,l,d),lp(r,l,d,h),d=!0;else if(n===null){var v=r.stateNode,A=r.memoizedProps;v.props=A;var I=v.context,q=l.contextType;typeof q=="object"&&q!==null?q=Jn(q):(q=Dn(l)?co:dn.current,q=ss(r,q));var re=l.getDerivedStateFromProps,se=typeof re=="function"||typeof v.getSnapshotBeforeUpdate=="function";se||typeof v.UNSAFE_componentWillReceiveProps!="function"&&typeof v.componentWillReceiveProps!="function"||(A!==d||I!==q)&&Xg(r,v,d,q),Dr=!1;var te=r.memoizedState;v.state=te,dc(r,d,v,h),I=r.memoizedState,A!==d||te!==I||Nn.current||Dr?(typeof re=="function"&&(ip(r,l,re,d),I=r.memoizedState),(A=Dr||Qg(r,l,A,d,te,I,q))?(se||typeof v.UNSAFE_componentWillMount!="function"&&typeof v.componentWillMount!="function"||(typeof v.componentWillMount=="function"&&v.componentWillMount(),typeof v.UNSAFE_componentWillMount=="function"&&v.UNSAFE_componentWillMount()),typeof v.componentDidMount=="function"&&(r.flags|=4194308)):(typeof v.componentDidMount=="function"&&(r.flags|=4194308),r.memoizedProps=d,r.memoizedState=I),v.props=d,v.state=I,v.context=q,d=A):(typeof v.componentDidMount=="function"&&(r.flags|=4194308),d=!1)}else{v=r.stateNode,Tg(n,r),A=r.memoizedProps,q=r.type===r.elementType?A:fa(r.type,A),v.props=q,se=r.pendingProps,te=v.context,I=l.contextType,typeof I=="object"&&I!==null?I=Jn(I):(I=Dn(l)?co:dn.current,I=ss(r,I));var ge=l.getDerivedStateFromProps;(re=typeof ge=="function"||typeof v.getSnapshotBeforeUpdate=="function")||typeof v.UNSAFE_componentWillReceiveProps!="function"&&typeof v.componentWillReceiveProps!="function"||(A!==se||te!==I)&&Xg(r,v,d,I),Dr=!1,te=r.memoizedState,v.state=te,dc(r,d,v,h);var Te=r.memoizedState;A!==se||te!==Te||Nn.current||Dr?(typeof ge=="function"&&(ip(r,l,ge,d),Te=r.memoizedState),(q=Dr||Qg(r,l,q,d,te,Te,I)||!1)?(re||typeof v.UNSAFE_componentWillUpdate!="function"&&typeof v.componentWillUpdate!="function"||(typeof v.componentWillUpdate=="function"&&v.componentWillUpdate(d,Te,I),typeof v.UNSAFE_componentWillUpdate=="function"&&v.UNSAFE_componentWillUpdate(d,Te,I)),typeof v.componentDidUpdate=="function"&&(r.flags|=4),typeof v.getSnapshotBeforeUpdate=="function"&&(r.flags|=1024)):(typeof v.componentDidUpdate!="function"||A===n.memoizedProps&&te===n.memoizedState||(r.flags|=4),typeof v.getSnapshotBeforeUpdate!="function"||A===n.memoizedProps&&te===n.memoizedState||(r.flags|=1024),r.memoizedProps=d,r.memoizedState=Te),v.props=d,v.state=Te,v.context=I,d=q):(typeof v.componentDidUpdate!="function"||A===n.memoizedProps&&te===n.memoizedState||(r.flags|=4),typeof v.getSnapshotBeforeUpdate!="function"||A===n.memoizedProps&&te===n.memoizedState||(r.flags|=1024),d=!1)}return pp(n,r,l,d,_,h)}function pp(n,r,l,d,h,_){c_(n,r);var v=(r.flags&128)!==0;if(!d&&!v)return h&&fg(r,l,!1),nr(n,r,_);d=r.stateNode,XS.current=r;var A=v&&typeof l.getDerivedStateFromError!="function"?null:d.render();return r.flags|=1,n!==null&&v?(r.child=ds(r,n.child,null,_),r.child=ds(r,null,A,_)):vn(n,r,A,_),r.memoizedState=d.state,h&&fg(r,l,!0),r.child}function u_(n){var r=n.stateNode;r.pendingContext?mg(n,r.pendingContext,r.pendingContext!==r.context):r.context&&mg(n,r.context,!1),Yu(n,r.containerInfo)}function p_(n,r,l,d,h){return cs(),Bu(h),r.flags|=256,vn(n,r,l,d),r.child}var mp={dehydrated:null,treeContext:null,retryLane:0};function hp(n){return{baseLanes:n,cachePool:null,transitions:null}}function m_(n,r,l){var d=r.pendingProps,h=Tt.current,_=!1,v=(r.flags&128)!==0,A;if((A=v)||(A=n!==null&&n.memoizedState===null?!1:(h&2)!==0),A?(_=!0,r.flags&=-129):(n===null||n.memoizedState!==null)&&(h|=1),kt(Tt,h&1),n===null)return Fu(r),n=r.memoizedState,n!==null&&(n=n.dehydrated,n!==null)?((r.mode&1)===0?r.lanes=1:n.data==="$!"?r.lanes=8:r.lanes=1073741824,null):(v=d.children,n=d.fallback,_?(d=r.mode,_=r.child,v={mode:"hidden",children:v},(d&1)===0&&_!==null?(_.childLanes=0,_.pendingProps=v):_=Ic(v,d,0,null),n=ko(n,d,l,null),_.return=r,n.return=r,_.sibling=n,r.child=_,r.child.memoizedState=hp(l),r.memoizedState=mp,n):fp(r,v));if(h=n.memoizedState,h!==null&&(A=h.dehydrated,A!==null))return eC(n,r,v,d,A,h,l);if(_){_=d.fallback,v=r.mode,h=n.child,A=h.sibling;var I={mode:"hidden",children:d.children};return(v&1)===0&&r.child!==h?(d=r.child,d.childLanes=0,d.pendingProps=I,r.deletions=null):(d=Hr(h,I),d.subtreeFlags=h.subtreeFlags&14680064),A!==null?_=Hr(A,_):(_=ko(_,v,l,null),_.flags|=2),_.return=r,d.return=r,d.sibling=_,r.child=d,d=_,_=r.child,v=n.child.memoizedState,v=v===null?hp(l):{baseLanes:v.baseLanes|l,cachePool:null,transitions:v.transitions},_.memoizedState=v,_.childLanes=n.childLanes&~l,r.memoizedState=mp,d}return _=n.child,n=_.sibling,d=Hr(_,{mode:"visible",children:d.children}),(r.mode&1)===0&&(d.lanes=l),d.return=r,d.sibling=null,n!==null&&(l=r.deletions,l===null?(r.deletions=[n],r.flags|=16):l.push(n)),r.child=d,r.memoizedState=null,d}function fp(n,r){return r=Ic({mode:"visible",children:r},n.mode,0,null),r.return=n,n.child=r}function bc(n,r,l,d){return d!==null&&Bu(d),ds(r,n.child,null,l),n=fp(r,r.pendingProps.children),n.flags|=2,r.memoizedState=null,n}function eC(n,r,l,d,h,_,v){if(l)return r.flags&256?(r.flags&=-257,d=cp(Error(a(422))),bc(n,r,v,d)):r.memoizedState!==null?(r.child=n.child,r.flags|=128,null):(_=d.fallback,h=r.mode,d=Ic({mode:"visible",children:d.children},h,0,null),_=ko(_,h,v,null),_.flags|=2,d.return=r,_.return=r,d.sibling=_,r.child=d,(r.mode&1)!==0&&ds(r,n.child,null,v),r.child.memoizedState=hp(v),r.memoizedState=mp,_);if((r.mode&1)===0)return bc(n,r,v,null);if(h.data==="$!"){if(d=h.nextSibling&&h.nextSibling.dataset,d)var A=d.dgst;return d=A,_=Error(a(419)),d=cp(_,d,void 0),bc(n,r,v,d)}if(A=(v&n.childLanes)!==0,On||A){if(d=Qt,d!==null){switch(v&-v){case 4:h=2;break;case 16:h=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:h=32;break;case 536870912:h=268435456;break;default:h=0}h=(h&(d.suspendedLanes|v))!==0?0:h,h!==0&&h!==_.retryLane&&(_.retryLane=h,er(n,h),ba(d,n,h,-1))}return Ip(),d=cp(Error(a(421))),bc(n,r,v,d)}return h.data==="$?"?(r.flags|=128,r.child=n.child,r=mC.bind(null,n),h._reactRetry=r,null):(n=_.treeContext,Gn=Pr(h.nextSibling),Bn=r,Ct=!0,ha=null,n!==null&&(Zn[Qn++]=Ja,Zn[Qn++]=Xa,Zn[Qn++]=uo,Ja=n.id,Xa=n.overflow,uo=r),r=fp(r,d.children),r.flags|=4096,r)}function h_(n,r,l){n.lanes|=r;var d=n.alternate;d!==null&&(d.lanes|=r),Ku(n.return,r,l)}function gp(n,r,l,d,h){var _=n.memoizedState;_===null?n.memoizedState={isBackwards:r,rendering:null,renderingStartTime:0,last:d,tail:l,tailMode:h}:(_.isBackwards=r,_.rendering=null,_.renderingStartTime=0,_.last=d,_.tail=l,_.tailMode=h)}function f_(n,r,l){var d=r.pendingProps,h=d.revealOrder,_=d.tail;if(vn(n,r,d.children,l),d=Tt.current,(d&2)!==0)d=d&1|2,r.flags|=128;else{if(n!==null&&(n.flags&128)!==0)e:for(n=r.child;n!==null;){if(n.tag===13)n.memoizedState!==null&&h_(n,l,r);else if(n.tag===19)h_(n,l,r);else if(n.child!==null){n.child.return=n,n=n.child;continue}if(n===r)break e;for(;n.sibling===null;){if(n.return===null||n.return===r)break e;n=n.return}n.sibling.return=n.return,n=n.sibling}d&=1}if(kt(Tt,d),(r.mode&1)===0)r.memoizedState=null;else switch(h){case"forwards":for(l=r.child,h=null;l!==null;)n=l.alternate,n!==null&&uc(n)===null&&(h=l),l=l.sibling;l=h,l===null?(h=r.child,r.child=null):(h=l.sibling,l.sibling=null),gp(r,!1,h,l,_);break;case"backwards":for(l=null,h=r.child,r.child=null;h!==null;){if(n=h.alternate,n!==null&&uc(n)===null){r.child=h;break}n=h.sibling,h.sibling=l,l=h,h=n}gp(r,!0,l,null,_);break;case"together":gp(r,!1,null,null,void 0);break;default:r.memoizedState=null}return r.child}function yc(n,r){(r.mode&1)===0&&n!==null&&(n.alternate=null,r.alternate=null,r.flags|=2)}function nr(n,r,l){if(n!==null&&(r.dependencies=n.dependencies),go|=r.lanes,(l&r.childLanes)===0)return null;if(n!==null&&r.child!==n.child)throw Error(a(153));if(r.child!==null){for(n=r.child,l=Hr(n,n.pendingProps),r.child=l,l.return=r;n.sibling!==null;)n=n.sibling,l=l.sibling=Hr(n,n.pendingProps),l.return=r;l.sibling=null}return r.child}function tC(n,r,l){switch(r.tag){case 3:u_(r),cs();break;case 5:Pg(r);break;case 1:Dn(r.type)&&tc(r);break;case 4:Yu(r,r.stateNode.containerInfo);break;case 10:var d=r.type._context,h=r.memoizedProps.value;kt(ic,d._currentValue),d._currentValue=h;break;case 13:if(d=r.memoizedState,d!==null)return d.dehydrated!==null?(kt(Tt,Tt.current&1),r.flags|=128,null):(l&r.child.childLanes)!==0?m_(n,r,l):(kt(Tt,Tt.current&1),n=nr(n,r,l),n!==null?n.sibling:null);kt(Tt,Tt.current&1);break;case 19:if(d=(l&r.childLanes)!==0,(n.flags&128)!==0){if(d)return f_(n,r,l);r.flags|=128}if(h=r.memoizedState,h!==null&&(h.rendering=null,h.tail=null,h.lastEffect=null),kt(Tt,Tt.current),d)break;return null;case 22:case 23:return r.lanes=0,l_(n,r,l)}return nr(n,r,l)}var g_,_p,__,b_;g_=function(n,r){for(var l=r.child;l!==null;){if(l.tag===5||l.tag===6)n.appendChild(l.stateNode);else if(l.tag!==4&&l.child!==null){l.child.return=l,l=l.child;continue}if(l===r)break;for(;l.sibling===null;){if(l.return===null||l.return===r)return;l=l.return}l.sibling.return=l.return,l=l.sibling}},_p=function(){},__=function(n,r,l,d){var h=n.memoizedProps;if(h!==d){n=r.stateNode,ho(Ea.current);var _=null;switch(l){case"input":h=Ht(n,h),d=Ht(n,d),_=[];break;case"select":h=H({},h,{value:void 0}),d=H({},d,{value:void 0}),_=[];break;case"textarea":h=ro(n,h),d=ro(n,d),_=[];break;default:typeof h.onClick!="function"&&typeof d.onClick=="function"&&(n.onclick=Jl)}Ka(l,d);var v;l=null;for(q in h)if(!d.hasOwnProperty(q)&&h.hasOwnProperty(q)&&h[q]!=null)if(q==="style"){var A=h[q];for(v in A)A.hasOwnProperty(v)&&(l||(l={}),l[v]="")}else q!=="dangerouslySetInnerHTML"&&q!=="children"&&q!=="suppressContentEditableWarning"&&q!=="suppressHydrationWarning"&&q!=="autoFocus"&&(s.hasOwnProperty(q)?_||(_=[]):(_=_||[]).push(q,null));for(q in d){var I=d[q];if(A=h?.[q],d.hasOwnProperty(q)&&I!==A&&(I!=null||A!=null))if(q==="style")if(A){for(v in A)!A.hasOwnProperty(v)||I&&I.hasOwnProperty(v)||(l||(l={}),l[v]="");for(v in I)I.hasOwnProperty(v)&&A[v]!==I[v]&&(l||(l={}),l[v]=I[v])}else l||(_||(_=[]),_.push(q,l)),l=I;else q==="dangerouslySetInnerHTML"?(I=I?I.__html:void 0,A=A?A.__html:void 0,I!=null&&A!==I&&(_=_||[]).push(q,I)):q==="children"?typeof I!="string"&&typeof I!="number"||(_=_||[]).push(q,""+I):q!=="suppressContentEditableWarning"&&q!=="suppressHydrationWarning"&&(s.hasOwnProperty(q)?(I!=null&&q==="onScroll"&&vt("scroll",n),_||A===I||(_=[])):(_=_||[]).push(q,I))}l&&(_=_||[]).push("style",l);var q=_;(r.updateQueue=q)&&(r.flags|=4)}},b_=function(n,r,l,d){l!==d&&(r.flags|=4)};function zi(n,r){if(!Ct)switch(n.tailMode){case"hidden":r=n.tail;for(var l=null;r!==null;)r.alternate!==null&&(l=r),r=r.sibling;l===null?n.tail=null:l.sibling=null;break;case"collapsed":l=n.tail;for(var d=null;l!==null;)l.alternate!==null&&(d=l),l=l.sibling;d===null?r||n.tail===null?n.tail=null:n.tail.sibling=null:d.sibling=null}}function pn(n){var r=n.alternate!==null&&n.alternate.child===n.child,l=0,d=0;if(r)for(var h=n.child;h!==null;)l|=h.lanes|h.childLanes,d|=h.subtreeFlags&14680064,d|=h.flags&14680064,h.return=n,h=h.sibling;else for(h=n.child;h!==null;)l|=h.lanes|h.childLanes,d|=h.subtreeFlags,d|=h.flags,h.return=n,h=h.sibling;return n.subtreeFlags|=d,n.childLanes=l,r}function nC(n,r,l){var d=r.pendingProps;switch(Uu(r),r.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return pn(r),null;case 1:return Dn(r.type)&&ec(),pn(r),null;case 3:return d=r.stateNode,ms(),wt(Nn),wt(dn),Ju(),d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null),(n===null||n.child===null)&&(oc(r)?r.flags|=4:n===null||n.memoizedState.isDehydrated&&(r.flags&256)===0||(r.flags|=1024,ha!==null&&(Ap(ha),ha=null))),_p(n,r),pn(r),null;case 5:Zu(r);var h=ho(Ni.current);if(l=r.type,n!==null&&r.stateNode!=null)__(n,r,l,d,h),n.ref!==r.ref&&(r.flags|=512,r.flags|=2097152);else{if(!d){if(r.stateNode===null)throw Error(a(166));return pn(r),null}if(n=ho(Ea.current),oc(r)){d=r.stateNode,l=r.type;var _=r.memoizedProps;switch(d[Ta]=r,d[Ei]=_,n=(r.mode&1)!==0,l){case"dialog":vt("cancel",d),vt("close",d);break;case"iframe":case"object":case"embed":vt("load",d);break;case"video":case"audio":for(h=0;h<Si.length;h++)vt(Si[h],d);break;case"source":vt("error",d);break;case"img":case"image":case"link":vt("error",d),vt("load",d);break;case"details":vt("toggle",d);break;case"input":St(d,_),vt("invalid",d);break;case"select":d._wrapperState={wasMultiple:!!_.multiple},vt("invalid",d);break;case"textarea":Ze(d,_),vt("invalid",d)}Ka(l,_),h=null;for(var v in _)if(_.hasOwnProperty(v)){var A=_[v];v==="children"?typeof A=="string"?d.textContent!==A&&(_.suppressHydrationWarning!==!0&&Ql(d.textContent,A,n),h=["children",A]):typeof A=="number"&&d.textContent!==""+A&&(_.suppressHydrationWarning!==!0&&Ql(d.textContent,A,n),h=["children",""+A]):s.hasOwnProperty(v)&&A!=null&&v==="onScroll"&&vt("scroll",d)}switch(l){case"input":Mt(d),$a(d,_,!0);break;case"textarea":Mt(d),_t(d);break;case"select":case"option":break;default:typeof _.onClick=="function"&&(d.onclick=Jl)}d=h,r.updateQueue=d,d!==null&&(r.flags|=4)}else{v=h.nodeType===9?h:h.ownerDocument,n==="http://www.w3.org/1999/xhtml"&&(n=zt(l)),n==="http://www.w3.org/1999/xhtml"?l==="script"?(n=v.createElement("div"),n.innerHTML="<script><\/script>",n=n.removeChild(n.firstChild)):typeof d.is=="string"?n=v.createElement(l,{is:d.is}):(n=v.createElement(l),l==="select"&&(v=n,d.multiple?v.multiple=!0:d.size&&(v.size=d.size))):n=v.createElementNS(n,l),n[Ta]=r,n[Ei]=d,g_(n,r,!1,!1),r.stateNode=n;e:{switch(v=fr(l,d),l){case"dialog":vt("cancel",n),vt("close",n),h=d;break;case"iframe":case"object":case"embed":vt("load",n),h=d;break;case"video":case"audio":for(h=0;h<Si.length;h++)vt(Si[h],n);h=d;break;case"source":vt("error",n),h=d;break;case"img":case"image":case"link":vt("error",n),vt("load",n),h=d;break;case"details":vt("toggle",n),h=d;break;case"input":St(n,d),h=Ht(n,d),vt("invalid",n);break;case"option":h=d;break;case"select":n._wrapperState={wasMultiple:!!d.multiple},h=H({},d,{value:void 0}),vt("invalid",n);break;case"textarea":Ze(n,d),h=ro(n,d),vt("invalid",n);break;default:h=d}Ka(l,h),A=h;for(_ in A)if(A.hasOwnProperty(_)){var I=A[_];_==="style"?oo(n,I):_==="dangerouslySetInnerHTML"?(I=I?I.__html:void 0,I!=null&&bt(n,I)):_==="children"?typeof I=="string"?(l!=="textarea"||I!=="")&&nn(n,I):typeof I=="number"&&nn(n,""+I):_!=="suppressContentEditableWarning"&&_!=="suppressHydrationWarning"&&_!=="autoFocus"&&(s.hasOwnProperty(_)?I!=null&&_==="onScroll"&&vt("scroll",n):I!=null&&M(n,_,I,v))}switch(l){case"input":Mt(n),$a(n,d,!1);break;case"textarea":Mt(n),_t(n);break;case"option":d.value!=null&&n.setAttribute("value",""+Ye(d.value));break;case"select":n.multiple=!!d.multiple,_=d.value,_!=null?xa(n,!!d.multiple,_,!1):d.defaultValue!=null&&xa(n,!!d.multiple,d.defaultValue,!0);break;default:typeof h.onClick=="function"&&(n.onclick=Jl)}switch(l){case"button":case"input":case"select":case"textarea":d=!!d.autoFocus;break e;case"img":d=!0;break e;default:d=!1}}d&&(r.flags|=4)}r.ref!==null&&(r.flags|=512,r.flags|=2097152)}return pn(r),null;case 6:if(n&&r.stateNode!=null)b_(n,r,n.memoizedProps,d);else{if(typeof d!="string"&&r.stateNode===null)throw Error(a(166));if(l=ho(Ni.current),ho(Ea.current),oc(r)){if(d=r.stateNode,l=r.memoizedProps,d[Ta]=r,(_=d.nodeValue!==l)&&(n=Bn,n!==null))switch(n.tag){case 3:Ql(d.nodeValue,l,(n.mode&1)!==0);break;case 5:n.memoizedProps.suppressHydrationWarning!==!0&&Ql(d.nodeValue,l,(n.mode&1)!==0)}_&&(r.flags|=4)}else d=(l.nodeType===9?l:l.ownerDocument).createTextNode(d),d[Ta]=r,r.stateNode=d}return pn(r),null;case 13:if(wt(Tt),d=r.memoizedState,n===null||n.memoizedState!==null&&n.memoizedState.dehydrated!==null){if(Ct&&Gn!==null&&(r.mode&1)!==0&&(r.flags&128)===0)vg(),cs(),r.flags|=98560,_=!1;else if(_=oc(r),d!==null&&d.dehydrated!==null){if(n===null){if(!_)throw Error(a(318));if(_=r.memoizedState,_=_!==null?_.dehydrated:null,!_)throw Error(a(317));_[Ta]=r}else cs(),(r.flags&128)===0&&(r.memoizedState=null),r.flags|=4;pn(r),_=!1}else ha!==null&&(Ap(ha),ha=null),_=!0;if(!_)return r.flags&65536?r:null}return(r.flags&128)!==0?(r.lanes=l,r):(d=d!==null,d!==(n!==null&&n.memoizedState!==null)&&d&&(r.child.flags|=8192,(r.mode&1)!==0&&(n===null||(Tt.current&1)!==0?Kt===0&&(Kt=3):Ip())),r.updateQueue!==null&&(r.flags|=4),pn(r),null);case 4:return ms(),_p(n,r),n===null&&Ci(r.stateNode.containerInfo),pn(r),null;case 10:return qu(r.type._context),pn(r),null;case 17:return Dn(r.type)&&ec(),pn(r),null;case 19:if(wt(Tt),_=r.memoizedState,_===null)return pn(r),null;if(d=(r.flags&128)!==0,v=_.rendering,v===null)if(d)zi(_,!1);else{if(Kt!==0||n!==null&&(n.flags&128)!==0)for(n=r.child;n!==null;){if(v=uc(n),v!==null){for(r.flags|=128,zi(_,!1),d=v.updateQueue,d!==null&&(r.updateQueue=d,r.flags|=4),r.subtreeFlags=0,d=l,l=r.child;l!==null;)_=l,n=d,_.flags&=14680066,v=_.alternate,v===null?(_.childLanes=0,_.lanes=n,_.child=null,_.subtreeFlags=0,_.memoizedProps=null,_.memoizedState=null,_.updateQueue=null,_.dependencies=null,_.stateNode=null):(_.childLanes=v.childLanes,_.lanes=v.lanes,_.child=v.child,_.subtreeFlags=0,_.deletions=null,_.memoizedProps=v.memoizedProps,_.memoizedState=v.memoizedState,_.updateQueue=v.updateQueue,_.type=v.type,n=v.dependencies,_.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext}),l=l.sibling;return kt(Tt,Tt.current&1|2),r.child}n=n.sibling}_.tail!==null&&at()>_s&&(r.flags|=128,d=!0,zi(_,!1),r.lanes=4194304)}else{if(!d)if(n=uc(v),n!==null){if(r.flags|=128,d=!0,l=n.updateQueue,l!==null&&(r.updateQueue=l,r.flags|=4),zi(_,!0),_.tail===null&&_.tailMode==="hidden"&&!v.alternate&&!Ct)return pn(r),null}else 2*at()-_.renderingStartTime>_s&&l!==1073741824&&(r.flags|=128,d=!0,zi(_,!1),r.lanes=4194304);_.isBackwards?(v.sibling=r.child,r.child=v):(l=_.last,l!==null?l.sibling=v:r.child=v,_.last=v)}return _.tail!==null?(r=_.tail,_.rendering=r,_.tail=r.sibling,_.renderingStartTime=at(),r.sibling=null,l=Tt.current,kt(Tt,d?l&1|2:l&1),r):(pn(r),null);case 22:case 23:return Rp(),d=r.memoizedState!==null,n!==null&&n.memoizedState!==null!==d&&(r.flags|=8192),d&&(r.mode&1)!==0?($n&1073741824)!==0&&(pn(r),r.subtreeFlags&6&&(r.flags|=8192)):pn(r),null;case 24:return null;case 25:return null}throw Error(a(156,r.tag))}function aC(n,r){switch(Uu(r),r.tag){case 1:return Dn(r.type)&&ec(),n=r.flags,n&65536?(r.flags=n&-65537|128,r):null;case 3:return ms(),wt(Nn),wt(dn),Ju(),n=r.flags,(n&65536)!==0&&(n&128)===0?(r.flags=n&-65537|128,r):null;case 5:return Zu(r),null;case 13:if(wt(Tt),n=r.memoizedState,n!==null&&n.dehydrated!==null){if(r.alternate===null)throw Error(a(340));cs()}return n=r.flags,n&65536?(r.flags=n&-65537|128,r):null;case 19:return wt(Tt),null;case 4:return ms(),null;case 10:return qu(r.type._context),null;case 22:case 23:return Rp(),null;case 24:return null;default:return null}}var kc=!1,mn=!1,rC=typeof WeakSet=="function"?WeakSet:Set,ve=null;function fs(n,r){var l=n.ref;if(l!==null)if(typeof l=="function")try{l(null)}catch(d){Rt(n,r,d)}else l.current=null}function bp(n,r,l){try{l()}catch(d){Rt(n,r,d)}}var y_=!1;function oC(n,r){if(Ru=Hl,n=Qf(),wu(n)){if("selectionStart"in n)var l={start:n.selectionStart,end:n.selectionEnd};else e:{l=(l=n.ownerDocument)&&l.defaultView||window;var d=l.getSelection&&l.getSelection();if(d&&d.rangeCount!==0){l=d.anchorNode;var h=d.anchorOffset,_=d.focusNode;d=d.focusOffset;try{l.nodeType,_.nodeType}catch{l=null;break e}var v=0,A=-1,I=-1,q=0,re=0,se=n,te=null;t:for(;;){for(var ge;se!==l||h!==0&&se.nodeType!==3||(A=v+h),se!==_||d!==0&&se.nodeType!==3||(I=v+d),se.nodeType===3&&(v+=se.nodeValue.length),(ge=se.firstChild)!==null;)te=se,se=ge;for(;;){if(se===n)break t;if(te===l&&++q===h&&(A=v),te===_&&++re===d&&(I=v),(ge=se.nextSibling)!==null)break;se=te,te=se.parentNode}se=ge}l=A===-1||I===-1?null:{start:A,end:I}}else l=null}l=l||{start:0,end:0}}else l=null;for(Iu={focusedElem:n,selectionRange:l},Hl=!1,ve=r;ve!==null;)if(r=ve,n=r.child,(r.subtreeFlags&1028)!==0&&n!==null)n.return=r,ve=n;else for(;ve!==null;){r=ve;try{var Te=r.alternate;if((r.flags&1024)!==0)switch(r.tag){case 0:case 11:case 15:break;case 1:if(Te!==null){var Ae=Te.memoizedProps,Ut=Te.memoizedState,F=r.stateNode,z=F.getSnapshotBeforeUpdate(r.elementType===r.type?Ae:fa(r.type,Ae),Ut);F.__reactInternalSnapshotBeforeUpdate=z}break;case 3:var G=r.stateNode.containerInfo;G.nodeType===1?G.textContent="":G.nodeType===9&&G.documentElement&&G.removeChild(G.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(a(163))}}catch(ie){Rt(r,r.return,ie)}if(n=r.sibling,n!==null){n.return=r.return,ve=n;break}ve=r.return}return Te=y_,y_=!1,Te}function ji(n,r,l){var d=r.updateQueue;if(d=d!==null?d.lastEffect:null,d!==null){var h=d=d.next;do{if((h.tag&n)===n){var _=h.destroy;h.destroy=void 0,_!==void 0&&bp(r,l,_)}h=h.next}while(h!==d)}}function vc(n,r){if(r=r.updateQueue,r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&n)===n){var d=l.create;l.destroy=d()}l=l.next}while(l!==r)}}function yp(n){var r=n.ref;if(r!==null){var l=n.stateNode;n.tag,n=l,typeof r=="function"?r(n):r.current=n}}function k_(n){var r=n.alternate;r!==null&&(n.alternate=null,k_(r)),n.child=null,n.deletions=null,n.sibling=null,n.tag===5&&(r=n.stateNode,r!==null&&(delete r[Ta],delete r[Ei],delete r[Lu],delete r[FS],delete r[BS])),n.stateNode=null,n.return=null,n.dependencies=null,n.memoizedProps=null,n.memoizedState=null,n.pendingProps=null,n.stateNode=null,n.updateQueue=null}function v_(n){return n.tag===5||n.tag===3||n.tag===4}function w_(n){e:for(;;){for(;n.sibling===null;){if(n.return===null||v_(n.return))return null;n=n.return}for(n.sibling.return=n.return,n=n.sibling;n.tag!==5&&n.tag!==6&&n.tag!==18;){if(n.flags&2||n.child===null||n.tag===4)continue e;n.child.return=n,n=n.child}if(!(n.flags&2))return n.stateNode}}function kp(n,r,l){var d=n.tag;if(d===5||d===6)n=n.stateNode,r?l.nodeType===8?l.parentNode.insertBefore(n,r):l.insertBefore(n,r):(l.nodeType===8?(r=l.parentNode,r.insertBefore(n,l)):(r=l,r.appendChild(n)),l=l._reactRootContainer,l!=null||r.onclick!==null||(r.onclick=Jl));else if(d!==4&&(n=n.child,n!==null))for(kp(n,r,l),n=n.sibling;n!==null;)kp(n,r,l),n=n.sibling}function vp(n,r,l){var d=n.tag;if(d===5||d===6)n=n.stateNode,r?l.insertBefore(n,r):l.appendChild(n);else if(d!==4&&(n=n.child,n!==null))for(vp(n,r,l),n=n.sibling;n!==null;)vp(n,r,l),n=n.sibling}var an=null,ga=!1;function Lr(n,r,l){for(l=l.child;l!==null;)x_(n,r,l),l=l.sibling}function x_(n,r,l){if($t&&typeof $t.onCommitFiberUnmount=="function")try{$t.onCommitFiberUnmount(kr,l)}catch{}switch(l.tag){case 5:mn||fs(l,r);case 6:var d=an,h=ga;an=null,Lr(n,r,l),an=d,ga=h,an!==null&&(ga?(n=an,l=l.stateNode,n.nodeType===8?n.parentNode.removeChild(l):n.removeChild(l)):an.removeChild(l.stateNode));break;case 18:an!==null&&(ga?(n=an,l=l.stateNode,n.nodeType===8?Ou(n.parentNode,l):n.nodeType===1&&Ou(n,l),gi(n)):Ou(an,l.stateNode));break;case 4:d=an,h=ga,an=l.stateNode.containerInfo,ga=!0,Lr(n,r,l),an=d,ga=h;break;case 0:case 11:case 14:case 15:if(!mn&&(d=l.updateQueue,d!==null&&(d=d.lastEffect,d!==null))){h=d=d.next;do{var _=h,v=_.destroy;_=_.tag,v!==void 0&&((_&2)!==0||(_&4)!==0)&&bp(l,r,v),h=h.next}while(h!==d)}Lr(n,r,l);break;case 1:if(!mn&&(fs(l,r),d=l.stateNode,typeof d.componentWillUnmount=="function"))try{d.props=l.memoizedProps,d.state=l.memoizedState,d.componentWillUnmount()}catch(A){Rt(l,r,A)}Lr(n,r,l);break;case 21:Lr(n,r,l);break;case 22:l.mode&1?(mn=(d=mn)||l.memoizedState!==null,Lr(n,r,l),mn=d):Lr(n,r,l);break;default:Lr(n,r,l)}}function S_(n){var r=n.updateQueue;if(r!==null){n.updateQueue=null;var l=n.stateNode;l===null&&(l=n.stateNode=new rC),r.forEach(function(d){var h=hC.bind(null,n,d);l.has(d)||(l.add(d),d.then(h,h))})}}function _a(n,r){var l=r.deletions;if(l!==null)for(var d=0;d<l.length;d++){var h=l[d];try{var _=n,v=r,A=v;e:for(;A!==null;){switch(A.tag){case 5:an=A.stateNode,ga=!1;break e;case 3:an=A.stateNode.containerInfo,ga=!0;break e;case 4:an=A.stateNode.containerInfo,ga=!0;break e}A=A.return}if(an===null)throw Error(a(160));x_(_,v,h),an=null,ga=!1;var I=h.alternate;I!==null&&(I.return=null),h.return=null}catch(q){Rt(h,r,q)}}if(r.subtreeFlags&12854)for(r=r.child;r!==null;)C_(r,n),r=r.sibling}function C_(n,r){var l=n.alternate,d=n.flags;switch(n.tag){case 0:case 11:case 14:case 15:if(_a(r,n),Pa(n),d&4){try{ji(3,n,n.return),vc(3,n)}catch(Ae){Rt(n,n.return,Ae)}try{ji(5,n,n.return)}catch(Ae){Rt(n,n.return,Ae)}}break;case 1:_a(r,n),Pa(n),d&512&&l!==null&&fs(l,l.return);break;case 5:if(_a(r,n),Pa(n),d&512&&l!==null&&fs(l,l.return),n.flags&32){var h=n.stateNode;try{nn(h,"")}catch(Ae){Rt(n,n.return,Ae)}}if(d&4&&(h=n.stateNode,h!=null)){var _=n.memoizedProps,v=l!==null?l.memoizedProps:_,A=n.type,I=n.updateQueue;if(n.updateQueue=null,I!==null)try{A==="input"&&_.type==="radio"&&_.name!=null&&Yn(h,_),fr(A,v);var q=fr(A,_);for(v=0;v<I.length;v+=2){var re=I[v],se=I[v+1];re==="style"?oo(h,se):re==="dangerouslySetInnerHTML"?bt(h,se):re==="children"?nn(h,se):M(h,re,se,q)}switch(A){case"input":yn(h,_);break;case"textarea":st(h,_);break;case"select":var te=h._wrapperState.wasMultiple;h._wrapperState.wasMultiple=!!_.multiple;var ge=_.value;ge!=null?xa(h,!!_.multiple,ge,!1):te!==!!_.multiple&&(_.defaultValue!=null?xa(h,!!_.multiple,_.defaultValue,!0):xa(h,!!_.multiple,_.multiple?[]:"",!1))}h[Ei]=_}catch(Ae){Rt(n,n.return,Ae)}}break;case 6:if(_a(r,n),Pa(n),d&4){if(n.stateNode===null)throw Error(a(162));h=n.stateNode,_=n.memoizedProps;try{h.nodeValue=_}catch(Ae){Rt(n,n.return,Ae)}}break;case 3:if(_a(r,n),Pa(n),d&4&&l!==null&&l.memoizedState.isDehydrated)try{gi(r.containerInfo)}catch(Ae){Rt(n,n.return,Ae)}break;case 4:_a(r,n),Pa(n);break;case 13:_a(r,n),Pa(n),h=n.child,h.flags&8192&&(_=h.memoizedState!==null,h.stateNode.isHidden=_,!_||h.alternate!==null&&h.alternate.memoizedState!==null||(Sp=at())),d&4&&S_(n);break;case 22:if(re=l!==null&&l.memoizedState!==null,n.mode&1?(mn=(q=mn)||re,_a(r,n),mn=q):_a(r,n),Pa(n),d&8192){if(q=n.memoizedState!==null,(n.stateNode.isHidden=q)&&!re&&(n.mode&1)!==0)for(ve=n,re=n.child;re!==null;){for(se=ve=re;ve!==null;){switch(te=ve,ge=te.child,te.tag){case 0:case 11:case 14:case 15:ji(4,te,te.return);break;case 1:fs(te,te.return);var Te=te.stateNode;if(typeof Te.componentWillUnmount=="function"){d=te,l=te.return;try{r=d,Te.props=r.memoizedProps,Te.state=r.memoizedState,Te.componentWillUnmount()}catch(Ae){Rt(d,l,Ae)}}break;case 5:fs(te,te.return);break;case 22:if(te.memoizedState!==null){A_(se);continue}}ge!==null?(ge.return=te,ve=ge):A_(se)}re=re.sibling}e:for(re=null,se=n;;){if(se.tag===5){if(re===null){re=se;try{h=se.stateNode,q?(_=h.style,typeof _.setProperty=="function"?_.setProperty("display","none","important"):_.display="none"):(A=se.stateNode,I=se.memoizedProps.style,v=I!=null&&I.hasOwnProperty("display")?I.display:null,A.style.display=Yt("display",v))}catch(Ae){Rt(n,n.return,Ae)}}}else if(se.tag===6){if(re===null)try{se.stateNode.nodeValue=q?"":se.memoizedProps}catch(Ae){Rt(n,n.return,Ae)}}else if((se.tag!==22&&se.tag!==23||se.memoizedState===null||se===n)&&se.child!==null){se.child.return=se,se=se.child;continue}if(se===n)break e;for(;se.sibling===null;){if(se.return===null||se.return===n)break e;re===se&&(re=null),se=se.return}re===se&&(re=null),se.sibling.return=se.return,se=se.sibling}}break;case 19:_a(r,n),Pa(n),d&4&&S_(n);break;case 21:break;default:_a(r,n),Pa(n)}}function Pa(n){var r=n.flags;if(r&2){try{e:{for(var l=n.return;l!==null;){if(v_(l)){var d=l;break e}l=l.return}throw Error(a(160))}switch(d.tag){case 5:var h=d.stateNode;d.flags&32&&(nn(h,""),d.flags&=-33);var _=w_(n);vp(n,_,h);break;case 3:case 4:var v=d.stateNode.containerInfo,A=w_(n);kp(n,A,v);break;default:throw Error(a(161))}}catch(I){Rt(n,n.return,I)}n.flags&=-3}r&4096&&(n.flags&=-4097)}function sC(n,r,l){ve=n,T_(n)}function T_(n,r,l){for(var d=(n.mode&1)!==0;ve!==null;){var h=ve,_=h.child;if(h.tag===22&&d){var v=h.memoizedState!==null||kc;if(!v){var A=h.alternate,I=A!==null&&A.memoizedState!==null||mn;A=kc;var q=mn;if(kc=v,(mn=I)&&!q)for(ve=h;ve!==null;)v=ve,I=v.child,v.tag===22&&v.memoizedState!==null?P_(h):I!==null?(I.return=v,ve=I):P_(h);for(;_!==null;)ve=_,T_(_),_=_.sibling;ve=h,kc=A,mn=q}E_(n)}else(h.subtreeFlags&8772)!==0&&_!==null?(_.return=h,ve=_):E_(n)}}function E_(n){for(;ve!==null;){var r=ve;if((r.flags&8772)!==0){var l=r.alternate;try{if((r.flags&8772)!==0)switch(r.tag){case 0:case 11:case 15:mn||vc(5,r);break;case 1:var d=r.stateNode;if(r.flags&4&&!mn)if(l===null)d.componentDidMount();else{var h=r.elementType===r.type?l.memoizedProps:fa(r.type,l.memoizedProps);d.componentDidUpdate(h,l.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var _=r.updateQueue;_!==null&&Ag(r,_,d);break;case 3:var v=r.updateQueue;if(v!==null){if(l=null,r.child!==null)switch(r.child.tag){case 5:l=r.child.stateNode;break;case 1:l=r.child.stateNode}Ag(r,v,l)}break;case 5:var A=r.stateNode;if(l===null&&r.flags&4){l=A;var I=r.memoizedProps;switch(r.type){case"button":case"input":case"select":case"textarea":I.autoFocus&&l.focus();break;case"img":I.src&&(l.src=I.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(r.memoizedState===null){var q=r.alternate;if(q!==null){var re=q.memoizedState;if(re!==null){var se=re.dehydrated;se!==null&&gi(se)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(a(163))}mn||r.flags&512&&yp(r)}catch(te){Rt(r,r.return,te)}}if(r===n){ve=null;break}if(l=r.sibling,l!==null){l.return=r.return,ve=l;break}ve=r.return}}function A_(n){for(;ve!==null;){var r=ve;if(r===n){ve=null;break}var l=r.sibling;if(l!==null){l.return=r.return,ve=l;break}ve=r.return}}function P_(n){for(;ve!==null;){var r=ve;try{switch(r.tag){case 0:case 11:case 15:var l=r.return;try{vc(4,r)}catch(I){Rt(r,l,I)}break;case 1:var d=r.stateNode;if(typeof d.componentDidMount=="function"){var h=r.return;try{d.componentDidMount()}catch(I){Rt(r,h,I)}}var _=r.return;try{yp(r)}catch(I){Rt(r,_,I)}break;case 5:var v=r.return;try{yp(r)}catch(I){Rt(r,v,I)}}}catch(I){Rt(r,r.return,I)}if(r===n){ve=null;break}var A=r.sibling;if(A!==null){A.return=r.return,ve=A;break}ve=r.return}}var iC=Math.ceil,wc=D.ReactCurrentDispatcher,wp=D.ReactCurrentOwner,ea=D.ReactCurrentBatchConfig,lt=0,Qt=null,Ft=null,rn=0,$n=0,gs=Rr(0),Kt=0,Ui=null,go=0,xc=0,xp=0,Hi=null,Ln=null,Sp=0,_s=1/0,ar=null,Sc=!1,Cp=null,Mr=null,Cc=!1,zr=null,Tc=0,Fi=0,Tp=null,Ec=-1,Ac=0;function wn(){return(lt&6)!==0?at():Ec!==-1?Ec:Ec=at()}function jr(n){return(n.mode&1)===0?1:(lt&2)!==0&&rn!==0?rn&-rn:$S.transition!==null?(Ac===0&&(Ac=zl()),Ac):(n=gt,n!==0||(n=window.event,n=n===void 0?16:If(n.type)),n)}function ba(n,r,l,d){if(50<Fi)throw Fi=0,Tp=null,Error(a(185));ui(n,l,d),((lt&2)===0||n!==Qt)&&(n===Qt&&((lt&2)===0&&(xc|=l),Kt===4&&Ur(n,rn)),Mn(n,d),l===1&&lt===0&&(r.mode&1)===0&&(_s=at()+500,nc&&Nr()))}function Mn(n,r){var l=n.callbackNode;Ya(n,r);var d=wr(n,n===Qt?rn:0);if(d===0)l!==null&&Pt(l),n.callbackNode=null,n.callbackPriority=0;else if(r=d&-d,n.callbackPriority!==r){if(l!=null&&Pt(l),r===1)n.tag===0?GS(I_.bind(null,n)):gg(I_.bind(null,n)),US(function(){(lt&6)===0&&Nr()}),l=null;else{switch(xf(d)){case 1:l=Wa;break;case 4:l=ua;break;case 16:l=pa;break;case 536870912:l=Hn;break;default:l=pa}l=U_(l,R_.bind(null,n))}n.callbackPriority=r,n.callbackNode=l}}function R_(n,r){if(Ec=-1,Ac=0,(lt&6)!==0)throw Error(a(327));var l=n.callbackNode;if(bs()&&n.callbackNode!==l)return null;var d=wr(n,n===Qt?rn:0);if(d===0)return null;if((d&30)!==0||(d&n.expiredLanes)!==0||r)r=Pc(n,d);else{r=d;var h=lt;lt|=2;var _=D_();(Qt!==n||rn!==r)&&(ar=null,_s=at()+500,bo(n,r));do try{dC();break}catch(A){N_(n,A)}while(!0);$u(),wc.current=_,lt=h,Ft!==null?r=0:(Qt=null,rn=0,r=Kt)}if(r!==0){if(r===2&&(h=Zo(n),h!==0&&(d=h,r=Ep(n,h))),r===1)throw l=Ui,bo(n,0),Ur(n,d),Mn(n,at()),l;if(r===6)Ur(n,d);else{if(h=n.current.alternate,(d&30)===0&&!lC(h)&&(r=Pc(n,d),r===2&&(_=Zo(n),_!==0&&(d=_,r=Ep(n,_))),r===1))throw l=Ui,bo(n,0),Ur(n,d),Mn(n,at()),l;switch(n.finishedWork=h,n.finishedLanes=d,r){case 0:case 1:throw Error(a(345));case 2:yo(n,Ln,ar);break;case 3:if(Ur(n,d),(d&130023424)===d&&(r=Sp+500-at(),10<r)){if(wr(n,0)!==0)break;if(h=n.suspendedLanes,(h&d)!==d){wn(),n.pingedLanes|=n.suspendedLanes&h;break}n.timeoutHandle=Du(yo.bind(null,n,Ln,ar),r);break}yo(n,Ln,ar);break;case 4:if(Ur(n,d),(d&4194240)===d)break;for(r=n.eventTimes,h=-1;0<d;){var v=31-ln(d);_=1<<v,v=r[v],v>h&&(h=v),d&=~_}if(d=h,d=at()-d,d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3e3>d?3e3:4320>d?4320:1960*iC(d/1960))-d,10<d){n.timeoutHandle=Du(yo.bind(null,n,Ln,ar),d);break}yo(n,Ln,ar);break;case 5:yo(n,Ln,ar);break;default:throw Error(a(329))}}}return Mn(n,at()),n.callbackNode===l?R_.bind(null,n):null}function Ep(n,r){var l=Hi;return n.current.memoizedState.isDehydrated&&(bo(n,r).flags|=256),n=Pc(n,r),n!==2&&(r=Ln,Ln=l,r!==null&&Ap(r)),n}function Ap(n){Ln===null?Ln=n:Ln.push.apply(Ln,n)}function lC(n){for(var r=n;;){if(r.flags&16384){var l=r.updateQueue;if(l!==null&&(l=l.stores,l!==null))for(var d=0;d<l.length;d++){var h=l[d],_=h.getSnapshot;h=h.value;try{if(!ma(_(),h))return!1}catch{return!1}}}if(l=r.child,r.subtreeFlags&16384&&l!==null)l.return=r,r=l;else{if(r===n)break;for(;r.sibling===null;){if(r.return===null||r.return===n)return!0;r=r.return}r.sibling.return=r.return,r=r.sibling}}return!0}function Ur(n,r){for(r&=~xp,r&=~xc,n.suspendedLanes|=r,n.pingedLanes&=~r,n=n.expirationTimes;0<r;){var l=31-ln(r),d=1<<l;n[l]=-1,r&=~d}}function I_(n){if((lt&6)!==0)throw Error(a(327));bs();var r=wr(n,0);if((r&1)===0)return Mn(n,at()),null;var l=Pc(n,r);if(n.tag!==0&&l===2){var d=Zo(n);d!==0&&(r=d,l=Ep(n,d))}if(l===1)throw l=Ui,bo(n,0),Ur(n,r),Mn(n,at()),l;if(l===6)throw Error(a(345));return n.finishedWork=n.current.alternate,n.finishedLanes=r,yo(n,Ln,ar),Mn(n,at()),null}function Pp(n,r){var l=lt;lt|=1;try{return n(r)}finally{lt=l,lt===0&&(_s=at()+500,nc&&Nr())}}function _o(n){zr!==null&&zr.tag===0&&(lt&6)===0&&bs();var r=lt;lt|=1;var l=ea.transition,d=gt;try{if(ea.transition=null,gt=1,n)return n()}finally{gt=d,ea.transition=l,lt=r,(lt&6)===0&&Nr()}}function Rp(){$n=gs.current,wt(gs)}function bo(n,r){n.finishedWork=null,n.finishedLanes=0;var l=n.timeoutHandle;if(l!==-1&&(n.timeoutHandle=-1,jS(l)),Ft!==null)for(l=Ft.return;l!==null;){var d=l;switch(Uu(d),d.tag){case 1:d=d.type.childContextTypes,d!=null&&ec();break;case 3:ms(),wt(Nn),wt(dn),Ju();break;case 5:Zu(d);break;case 4:ms();break;case 13:wt(Tt);break;case 19:wt(Tt);break;case 10:qu(d.type._context);break;case 22:case 23:Rp()}l=l.return}if(Qt=n,Ft=n=Hr(n.current,null),rn=$n=r,Kt=0,Ui=null,xp=xc=go=0,Ln=Hi=null,mo!==null){for(r=0;r<mo.length;r++)if(l=mo[r],d=l.interleaved,d!==null){l.interleaved=null;var h=d.next,_=l.pending;if(_!==null){var v=_.next;_.next=h,d.next=v}l.pending=d}mo=null}return n}function N_(n,r){do{var l=Ft;try{if($u(),pc.current=gc,mc){for(var d=Et.memoizedState;d!==null;){var h=d.queue;h!==null&&(h.pending=null),d=d.next}mc=!1}if(fo=0,Zt=qt=Et=null,Di=!1,Oi=0,wp.current=null,l===null||l.return===null){Kt=1,Ui=r,Ft=null;break}e:{var _=n,v=l.return,A=l,I=r;if(r=rn,A.flags|=32768,I!==null&&typeof I=="object"&&typeof I.then=="function"){var q=I,re=A,se=re.tag;if((re.mode&1)===0&&(se===0||se===11||se===15)){var te=re.alternate;te?(re.updateQueue=te.updateQueue,re.memoizedState=te.memoizedState,re.lanes=te.lanes):(re.updateQueue=null,re.memoizedState=null)}var ge=a_(v);if(ge!==null){ge.flags&=-257,r_(ge,v,A,_,r),ge.mode&1&&n_(_,q,r),r=ge,I=q;var Te=r.updateQueue;if(Te===null){var Ae=new Set;Ae.add(I),r.updateQueue=Ae}else Te.add(I);break e}else{if((r&1)===0){n_(_,q,r),Ip();break e}I=Error(a(426))}}else if(Ct&&A.mode&1){var Ut=a_(v);if(Ut!==null){(Ut.flags&65536)===0&&(Ut.flags|=256),r_(Ut,v,A,_,r),Bu(hs(I,A));break e}}_=I=hs(I,A),Kt!==4&&(Kt=2),Hi===null?Hi=[_]:Hi.push(_),_=v;do{switch(_.tag){case 3:_.flags|=65536,r&=-r,_.lanes|=r;var F=e_(_,I,r);Eg(_,F);break e;case 1:A=I;var z=_.type,G=_.stateNode;if((_.flags&128)===0&&(typeof z.getDerivedStateFromError=="function"||G!==null&&typeof G.componentDidCatch=="function"&&(Mr===null||!Mr.has(G)))){_.flags|=65536,r&=-r,_.lanes|=r;var ie=t_(_,A,r);Eg(_,ie);break e}}_=_.return}while(_!==null)}L_(l)}catch(Pe){r=Pe,Ft===l&&l!==null&&(Ft=l=l.return);continue}break}while(!0)}function D_(){var n=wc.current;return wc.current=gc,n===null?gc:n}function Ip(){(Kt===0||Kt===3||Kt===2)&&(Kt=4),Qt===null||(go&268435455)===0&&(xc&268435455)===0||Ur(Qt,rn)}function Pc(n,r){var l=lt;lt|=2;var d=D_();(Qt!==n||rn!==r)&&(ar=null,bo(n,r));do try{cC();break}catch(h){N_(n,h)}while(!0);if($u(),lt=l,wc.current=d,Ft!==null)throw Error(a(261));return Qt=null,rn=0,Kt}function cC(){for(;Ft!==null;)O_(Ft)}function dC(){for(;Ft!==null&&!pt();)O_(Ft)}function O_(n){var r=j_(n.alternate,n,$n);n.memoizedProps=n.pendingProps,r===null?L_(n):Ft=r,wp.current=null}function L_(n){var r=n;do{var l=r.alternate;if(n=r.return,(r.flags&32768)===0){if(l=nC(l,r,$n),l!==null){Ft=l;return}}else{if(l=aC(l,r),l!==null){l.flags&=32767,Ft=l;return}if(n!==null)n.flags|=32768,n.subtreeFlags=0,n.deletions=null;else{Kt=6,Ft=null;return}}if(r=r.sibling,r!==null){Ft=r;return}Ft=r=n}while(r!==null);Kt===0&&(Kt=5)}function yo(n,r,l){var d=gt,h=ea.transition;try{ea.transition=null,gt=1,uC(n,r,l,d)}finally{ea.transition=h,gt=d}return null}function uC(n,r,l,d){do bs();while(zr!==null);if((lt&6)!==0)throw Error(a(327));l=n.finishedWork;var h=n.finishedLanes;if(l===null)return null;if(n.finishedWork=null,n.finishedLanes=0,l===n.current)throw Error(a(177));n.callbackNode=null,n.callbackPriority=0;var _=l.lanes|l.childLanes;if(qx(n,_),n===Qt&&(Ft=Qt=null,rn=0),(l.subtreeFlags&2064)===0&&(l.flags&2064)===0||Cc||(Cc=!0,U_(pa,function(){return bs(),null})),_=(l.flags&15990)!==0,(l.subtreeFlags&15990)!==0||_){_=ea.transition,ea.transition=null;var v=gt;gt=1;var A=lt;lt|=4,wp.current=null,oC(n,l),C_(l,n),IS(Iu),Hl=!!Ru,Iu=Ru=null,n.current=l,sC(l),dt(),lt=A,gt=v,ea.transition=_}else n.current=l;if(Cc&&(Cc=!1,zr=n,Tc=h),_=n.pendingLanes,_===0&&(Mr=null),Wo(l.stateNode),Mn(n,at()),r!==null)for(d=n.onRecoverableError,l=0;l<r.length;l++)h=r[l],d(h.value,{componentStack:h.stack,digest:h.digest});if(Sc)throw Sc=!1,n=Cp,Cp=null,n;return(Tc&1)!==0&&n.tag!==0&&bs(),_=n.pendingLanes,(_&1)!==0?n===Tp?Fi++:(Fi=0,Tp=n):Fi=0,Nr(),null}function bs(){if(zr!==null){var n=xf(Tc),r=ea.transition,l=gt;try{if(ea.transition=null,gt=16>n?16:n,zr===null)var d=!1;else{if(n=zr,zr=null,Tc=0,(lt&6)!==0)throw Error(a(331));var h=lt;for(lt|=4,ve=n.current;ve!==null;){var _=ve,v=_.child;if((ve.flags&16)!==0){var A=_.deletions;if(A!==null){for(var I=0;I<A.length;I++){var q=A[I];for(ve=q;ve!==null;){var re=ve;switch(re.tag){case 0:case 11:case 15:ji(8,re,_)}var se=re.child;if(se!==null)se.return=re,ve=se;else for(;ve!==null;){re=ve;var te=re.sibling,ge=re.return;if(k_(re),re===q){ve=null;break}if(te!==null){te.return=ge,ve=te;break}ve=ge}}}var Te=_.alternate;if(Te!==null){var Ae=Te.child;if(Ae!==null){Te.child=null;do{var Ut=Ae.sibling;Ae.sibling=null,Ae=Ut}while(Ae!==null)}}ve=_}}if((_.subtreeFlags&2064)!==0&&v!==null)v.return=_,ve=v;else e:for(;ve!==null;){if(_=ve,(_.flags&2048)!==0)switch(_.tag){case 0:case 11:case 15:ji(9,_,_.return)}var F=_.sibling;if(F!==null){F.return=_.return,ve=F;break e}ve=_.return}}var z=n.current;for(ve=z;ve!==null;){v=ve;var G=v.child;if((v.subtreeFlags&2064)!==0&&G!==null)G.return=v,ve=G;else e:for(v=z;ve!==null;){if(A=ve,(A.flags&2048)!==0)try{switch(A.tag){case 0:case 11:case 15:vc(9,A)}}catch(Pe){Rt(A,A.return,Pe)}if(A===v){ve=null;break e}var ie=A.sibling;if(ie!==null){ie.return=A.return,ve=ie;break e}ve=A.return}}if(lt=h,Nr(),$t&&typeof $t.onPostCommitFiberRoot=="function")try{$t.onPostCommitFiberRoot(kr,n)}catch{}d=!0}return d}finally{gt=l,ea.transition=r}}return!1}function M_(n,r,l){r=hs(l,r),r=e_(n,r,1),n=Or(n,r,1),r=wn(),n!==null&&(ui(n,1,r),Mn(n,r))}function Rt(n,r,l){if(n.tag===3)M_(n,n,l);else for(;r!==null;){if(r.tag===3){M_(r,n,l);break}else if(r.tag===1){var d=r.stateNode;if(typeof r.type.getDerivedStateFromError=="function"||typeof d.componentDidCatch=="function"&&(Mr===null||!Mr.has(d))){n=hs(l,n),n=t_(r,n,1),r=Or(r,n,1),n=wn(),r!==null&&(ui(r,1,n),Mn(r,n));break}}r=r.return}}function pC(n,r,l){var d=n.pingCache;d!==null&&d.delete(r),r=wn(),n.pingedLanes|=n.suspendedLanes&l,Qt===n&&(rn&l)===l&&(Kt===4||Kt===3&&(rn&130023424)===rn&&500>at()-Sp?bo(n,0):xp|=l),Mn(n,r)}function z_(n,r){r===0&&((n.mode&1)===0?r=1:(r=In,In<<=1,(In&130023424)===0&&(In=4194304)));var l=wn();n=er(n,r),n!==null&&(ui(n,r,l),Mn(n,l))}function mC(n){var r=n.memoizedState,l=0;r!==null&&(l=r.retryLane),z_(n,l)}function hC(n,r){var l=0;switch(n.tag){case 13:var d=n.stateNode,h=n.memoizedState;h!==null&&(l=h.retryLane);break;case 19:d=n.stateNode;break;default:throw Error(a(314))}d!==null&&d.delete(r),z_(n,l)}var j_;j_=function(n,r,l){if(n!==null)if(n.memoizedProps!==r.pendingProps||Nn.current)On=!0;else{if((n.lanes&l)===0&&(r.flags&128)===0)return On=!1,tC(n,r,l);On=(n.flags&131072)!==0}else On=!1,Ct&&(r.flags&1048576)!==0&&_g(r,rc,r.index);switch(r.lanes=0,r.tag){case 2:var d=r.type;yc(n,r),n=r.pendingProps;var h=ss(r,dn.current);ps(r,l),h=tp(null,r,d,n,h,l);var _=np();return r.flags|=1,typeof h=="object"&&h!==null&&typeof h.render=="function"&&h.$$typeof===void 0?(r.tag=1,r.memoizedState=null,r.updateQueue=null,Dn(d)?(_=!0,tc(r)):_=!1,r.memoizedState=h.state!==null&&h.state!==void 0?h.state:null,Wu(r),h.updater=_c,r.stateNode=h,h._reactInternals=r,lp(r,d,n,l),r=pp(null,r,d,!0,_,l)):(r.tag=0,Ct&&_&&ju(r),vn(null,r,h,l),r=r.child),r;case 16:d=r.elementType;e:{switch(yc(n,r),n=r.pendingProps,h=d._init,d=h(d._payload),r.type=d,h=r.tag=gC(d),n=fa(d,n),h){case 0:r=up(null,r,d,n,l);break e;case 1:r=d_(null,r,d,n,l);break e;case 11:r=o_(null,r,d,n,l);break e;case 14:r=s_(null,r,d,fa(d.type,n),l);break e}throw Error(a(306,d,""))}return r;case 0:return d=r.type,h=r.pendingProps,h=r.elementType===d?h:fa(d,h),up(n,r,d,h,l);case 1:return d=r.type,h=r.pendingProps,h=r.elementType===d?h:fa(d,h),d_(n,r,d,h,l);case 3:e:{if(u_(r),n===null)throw Error(a(387));d=r.pendingProps,_=r.memoizedState,h=_.element,Tg(n,r),dc(r,d,null,l);var v=r.memoizedState;if(d=v.element,_.isDehydrated)if(_={element:d,isDehydrated:!1,cache:v.cache,pendingSuspenseBoundaries:v.pendingSuspenseBoundaries,transitions:v.transitions},r.updateQueue.baseState=_,r.memoizedState=_,r.flags&256){h=hs(Error(a(423)),r),r=p_(n,r,d,l,h);break e}else if(d!==h){h=hs(Error(a(424)),r),r=p_(n,r,d,l,h);break e}else for(Gn=Pr(r.stateNode.containerInfo.firstChild),Bn=r,Ct=!0,ha=null,l=Sg(r,null,d,l),r.child=l;l;)l.flags=l.flags&-3|4096,l=l.sibling;else{if(cs(),d===h){r=nr(n,r,l);break e}vn(n,r,d,l)}r=r.child}return r;case 5:return Pg(r),n===null&&Fu(r),d=r.type,h=r.pendingProps,_=n!==null?n.memoizedProps:null,v=h.children,Nu(d,h)?v=null:_!==null&&Nu(d,_)&&(r.flags|=32),c_(n,r),vn(n,r,v,l),r.child;case 6:return n===null&&Fu(r),null;case 13:return m_(n,r,l);case 4:return Yu(r,r.stateNode.containerInfo),d=r.pendingProps,n===null?r.child=ds(r,null,d,l):vn(n,r,d,l),r.child;case 11:return d=r.type,h=r.pendingProps,h=r.elementType===d?h:fa(d,h),o_(n,r,d,h,l);case 7:return vn(n,r,r.pendingProps,l),r.child;case 8:return vn(n,r,r.pendingProps.children,l),r.child;case 12:return vn(n,r,r.pendingProps.children,l),r.child;case 10:e:{if(d=r.type._context,h=r.pendingProps,_=r.memoizedProps,v=h.value,kt(ic,d._currentValue),d._currentValue=v,_!==null)if(ma(_.value,v)){if(_.children===h.children&&!Nn.current){r=nr(n,r,l);break e}}else for(_=r.child,_!==null&&(_.return=r);_!==null;){var A=_.dependencies;if(A!==null){v=_.child;for(var I=A.firstContext;I!==null;){if(I.context===d){if(_.tag===1){I=tr(-1,l&-l),I.tag=2;var q=_.updateQueue;if(q!==null){q=q.shared;var re=q.pending;re===null?I.next=I:(I.next=re.next,re.next=I),q.pending=I}}_.lanes|=l,I=_.alternate,I!==null&&(I.lanes|=l),Ku(_.return,l,r),A.lanes|=l;break}I=I.next}}else if(_.tag===10)v=_.type===r.type?null:_.child;else if(_.tag===18){if(v=_.return,v===null)throw Error(a(341));v.lanes|=l,A=v.alternate,A!==null&&(A.lanes|=l),Ku(v,l,r),v=_.sibling}else v=_.child;if(v!==null)v.return=_;else for(v=_;v!==null;){if(v===r){v=null;break}if(_=v.sibling,_!==null){_.return=v.return,v=_;break}v=v.return}_=v}vn(n,r,h.children,l),r=r.child}return r;case 9:return h=r.type,d=r.pendingProps.children,ps(r,l),h=Jn(h),d=d(h),r.flags|=1,vn(n,r,d,l),r.child;case 14:return d=r.type,h=fa(d,r.pendingProps),h=fa(d.type,h),s_(n,r,d,h,l);case 15:return i_(n,r,r.type,r.pendingProps,l);case 17:return d=r.type,h=r.pendingProps,h=r.elementType===d?h:fa(d,h),yc(n,r),r.tag=1,Dn(d)?(n=!0,tc(r)):n=!1,ps(r,l),Jg(r,d,h),lp(r,d,h,l),pp(null,r,d,!0,n,l);case 19:return f_(n,r,l);case 22:return l_(n,r,l)}throw Error(a(156,r.tag))};function U_(n,r){return ft(n,r)}function fC(n,r,l,d){this.tag=n,this.key=l,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=r,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=d,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ta(n,r,l,d){return new fC(n,r,l,d)}function Np(n){return n=n.prototype,!(!n||!n.isReactComponent)}function gC(n){if(typeof n=="function")return Np(n)?1:0;if(n!=null){if(n=n.$$typeof,n===ye)return 11;if(n===Me)return 14}return 2}function Hr(n,r){var l=n.alternate;return l===null?(l=ta(n.tag,r,n.key,n.mode),l.elementType=n.elementType,l.type=n.type,l.stateNode=n.stateNode,l.alternate=n,n.alternate=l):(l.pendingProps=r,l.type=n.type,l.flags=0,l.subtreeFlags=0,l.deletions=null),l.flags=n.flags&14680064,l.childLanes=n.childLanes,l.lanes=n.lanes,l.child=n.child,l.memoizedProps=n.memoizedProps,l.memoizedState=n.memoizedState,l.updateQueue=n.updateQueue,r=n.dependencies,l.dependencies=r===null?null:{lanes:r.lanes,firstContext:r.firstContext},l.sibling=n.sibling,l.index=n.index,l.ref=n.ref,l}function Rc(n,r,l,d,h,_){var v=2;if(d=n,typeof n=="function")Np(n)&&(v=1);else if(typeof n=="string")v=5;else e:switch(n){case Q:return ko(l.children,h,_,r);case T:v=8,h|=8;break;case $:return n=ta(12,l,r,h|2),n.elementType=$,n.lanes=_,n;case ze:return n=ta(13,l,r,h),n.elementType=ze,n.lanes=_,n;case Se:return n=ta(19,l,r,h),n.elementType=Se,n.lanes=_,n;case de:return Ic(l,h,_,r);default:if(typeof n=="object"&&n!==null)switch(n.$$typeof){case ae:v=10;break e;case Ee:v=9;break e;case ye:v=11;break e;case Me:v=14;break e;case _e:v=16,d=null;break e}throw Error(a(130,n==null?n:typeof n,""))}return r=ta(v,l,r,h),r.elementType=n,r.type=d,r.lanes=_,r}function ko(n,r,l,d){return n=ta(7,n,d,r),n.lanes=l,n}function Ic(n,r,l,d){return n=ta(22,n,d,r),n.elementType=de,n.lanes=l,n.stateNode={isHidden:!1},n}function Dp(n,r,l){return n=ta(6,n,null,r),n.lanes=l,n}function Op(n,r,l){return r=ta(4,n.children!==null?n.children:[],n.key,r),r.lanes=l,r.stateNode={containerInfo:n.containerInfo,pendingChildren:null,implementation:n.implementation},r}function _C(n,r,l,d,h){this.tag=r,this.containerInfo=n,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=iu(0),this.expirationTimes=iu(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=iu(0),this.identifierPrefix=d,this.onRecoverableError=h,this.mutableSourceEagerHydrationData=null}function Lp(n,r,l,d,h,_,v,A,I){return n=new _C(n,r,l,A,I),r===1?(r=1,_===!0&&(r|=8)):r=0,_=ta(3,null,null,r),n.current=_,_.stateNode=n,_.memoizedState={element:d,isDehydrated:l,cache:null,transitions:null,pendingSuspenseBoundaries:null},Wu(_),n}function bC(n,r,l){var d=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:J,key:d==null?null:""+d,children:n,containerInfo:r,implementation:l}}function H_(n){if(!n)return Ir;n=n._reactInternals;e:{if(fe(n)!==n||n.tag!==1)throw Error(a(170));var r=n;do{switch(r.tag){case 3:r=r.stateNode.context;break e;case 1:if(Dn(r.type)){r=r.stateNode.__reactInternalMemoizedMergedChildContext;break e}}r=r.return}while(r!==null);throw Error(a(171))}if(n.tag===1){var l=n.type;if(Dn(l))return hg(n,l,r)}return r}function F_(n,r,l,d,h,_,v,A,I){return n=Lp(l,d,!0,n,h,_,v,A,I),n.context=H_(null),l=n.current,d=wn(),h=jr(l),_=tr(d,h),_.callback=r??null,Or(l,_,h),n.current.lanes=h,ui(n,h,d),Mn(n,d),n}function Nc(n,r,l,d){var h=r.current,_=wn(),v=jr(h);return l=H_(l),r.context===null?r.context=l:r.pendingContext=l,r=tr(_,v),r.payload={element:n},d=d===void 0?null:d,d!==null&&(r.callback=d),n=Or(h,r,v),n!==null&&(ba(n,h,v,_),cc(n,h,v)),v}function Dc(n){return n=n.current,n.child?(n.child.tag===5,n.child.stateNode):null}function B_(n,r){if(n=n.memoizedState,n!==null&&n.dehydrated!==null){var l=n.retryLane;n.retryLane=l!==0&&l<r?l:r}}function Mp(n,r){B_(n,r),(n=n.alternate)&&B_(n,r)}function yC(){return null}var G_=typeof reportError=="function"?reportError:function(n){console.error(n)};function zp(n){this._internalRoot=n}Oc.prototype.render=zp.prototype.render=function(n){var r=this._internalRoot;if(r===null)throw Error(a(409));Nc(n,r,null,null)},Oc.prototype.unmount=zp.prototype.unmount=function(){var n=this._internalRoot;if(n!==null){this._internalRoot=null;var r=n.containerInfo;_o(function(){Nc(null,n,null,null)}),r[Za]=null}};function Oc(n){this._internalRoot=n}Oc.prototype.unstable_scheduleHydration=function(n){if(n){var r=Tf();n={blockedOn:null,target:n,priority:r};for(var l=0;l<Tr.length&&r!==0&&r<Tr[l].priority;l++);Tr.splice(l,0,n),l===0&&Pf(n)}};function jp(n){return!(!n||n.nodeType!==1&&n.nodeType!==9&&n.nodeType!==11)}function Lc(n){return!(!n||n.nodeType!==1&&n.nodeType!==9&&n.nodeType!==11&&(n.nodeType!==8||n.nodeValue!==" react-mount-point-unstable "))}function $_(){}function kC(n,r,l,d,h){if(h){if(typeof d=="function"){var _=d;d=function(){var q=Dc(v);_.call(q)}}var v=F_(r,d,n,0,null,!1,!1,"",$_);return n._reactRootContainer=v,n[Za]=v.current,Ci(n.nodeType===8?n.parentNode:n),_o(),v}for(;h=n.lastChild;)n.removeChild(h);if(typeof d=="function"){var A=d;d=function(){var q=Dc(I);A.call(q)}}var I=Lp(n,0,!1,null,null,!1,!1,"",$_);return n._reactRootContainer=I,n[Za]=I.current,Ci(n.nodeType===8?n.parentNode:n),_o(function(){Nc(r,I,l,d)}),I}function Mc(n,r,l,d,h){var _=l._reactRootContainer;if(_){var v=_;if(typeof h=="function"){var A=h;h=function(){var I=Dc(v);A.call(I)}}Nc(r,v,n,h)}else v=kC(l,r,n,h,d);return Dc(v)}Sf=function(n){switch(n.tag){case 3:var r=n.stateNode;if(r.current.memoizedState.isDehydrated){var l=vr(r.pendingLanes);l!==0&&(lu(r,l|1),Mn(r,at()),(lt&6)===0&&(_s=at()+500,Nr()))}break;case 13:_o(function(){var d=er(n,1);if(d!==null){var h=wn();ba(d,n,1,h)}}),Mp(n,1)}},cu=function(n){if(n.tag===13){var r=er(n,134217728);if(r!==null){var l=wn();ba(r,n,134217728,l)}Mp(n,134217728)}},Cf=function(n){if(n.tag===13){var r=jr(n),l=er(n,r);if(l!==null){var d=wn();ba(l,n,r,d)}Mp(n,r)}},Tf=function(){return gt},Ef=function(n,r){var l=gt;try{return gt=n,r()}finally{gt=l}},ca=function(n,r,l){switch(r){case"input":if(yn(n,l),r=l.name,l.type==="radio"&&r!=null){for(l=n;l.parentNode;)l=l.parentNode;for(l=l.querySelectorAll("input[name="+JSON.stringify(""+r)+'][type="radio"]'),r=0;r<l.length;r++){var d=l[r];if(d!==n&&d.form===n.form){var h=Xl(d);if(!h)throw Error(a(90));Wn(d),yn(d,h)}}}break;case"textarea":st(n,l);break;case"select":r=l.value,r!=null&&xa(n,!!l.multiple,r,!1)}},Ml=Pp,ci=_o;var vC={usingClientEntryPoint:!1,Events:[Ai,rs,Xl,Ll,li,Pp]},Bi={findFiberByHostInstance:lo,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},wC={bundleType:Bi.bundleType,version:Bi.version,rendererPackageName:Bi.rendererPackageName,rendererConfig:Bi.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:D.ReactCurrentDispatcher,findHostInstanceByFiber:function(n){return n=Be(n),n===null?null:n.stateNode},findFiberByHostInstance:Bi.findFiberByHostInstance||yC,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 zc=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!zc.isDisabled&&zc.supportsFiber)try{kr=zc.inject(wC),$t=zc}catch{}}return zn.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=vC,zn.createPortal=function(n,r){var l=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!jp(r))throw Error(a(200));return bC(n,r,null,l)},zn.createRoot=function(n,r){if(!jp(n))throw Error(a(299));var l=!1,d="",h=G_;return r!=null&&(r.unstable_strictMode===!0&&(l=!0),r.identifierPrefix!==void 0&&(d=r.identifierPrefix),r.onRecoverableError!==void 0&&(h=r.onRecoverableError)),r=Lp(n,1,!1,null,null,l,!1,d,h),n[Za]=r.current,Ci(n.nodeType===8?n.parentNode:n),new zp(r)},zn.findDOMNode=function(n){if(n==null)return null;if(n.nodeType===1)return n;var r=n._reactInternals;if(r===void 0)throw typeof n.render=="function"?Error(a(188)):(n=Object.keys(n).join(","),Error(a(268,n)));return n=Be(r),n=n===null?null:n.stateNode,n},zn.flushSync=function(n){return _o(n)},zn.hydrate=function(n,r,l){if(!Lc(r))throw Error(a(200));return Mc(null,n,r,!0,l)},zn.hydrateRoot=function(n,r,l){if(!jp(n))throw Error(a(405));var d=l!=null&&l.hydratedSources||null,h=!1,_="",v=G_;if(l!=null&&(l.unstable_strictMode===!0&&(h=!0),l.identifierPrefix!==void 0&&(_=l.identifierPrefix),l.onRecoverableError!==void 0&&(v=l.onRecoverableError)),r=F_(r,null,n,1,l??null,h,!1,_,v),n[Za]=r.current,Ci(n),d)for(n=0;n<d.length;n++)l=d[n],h=l._getVersion,h=h(l._source),r.mutableSourceEagerHydrationData==null?r.mutableSourceEagerHydrationData=[l,h]:r.mutableSourceEagerHydrationData.push(l,h);return new Oc(r)},zn.render=function(n,r,l){if(!Lc(r))throw Error(a(200));return Mc(null,n,r,!1,l)},zn.unmountComponentAtNode=function(n){if(!Lc(n))throw Error(a(40));return n._reactRootContainer?(_o(function(){Mc(null,null,n,!1,function(){n._reactRootContainer=null,n[Za]=null})}),!0):!1},zn.unstable_batchedUpdates=Pp,zn.unstable_renderSubtreeIntoContainer=function(n,r,l,d){if(!Lc(l))throw Error(a(200));if(n==null||n._reactInternals===void 0)throw Error(a(38));return Mc(n,r,l,!1,d)},zn.version="18.3.1-next-f1338f8080-20240426",zn}var J_;function hk(){if(J_)return Fp.exports;J_=1;function e(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}return e(),Fp.exports=IC(),Fp.exports}var X_;function NC(){if(X_)return jc;X_=1;var e=hk();return jc.createRoot=e.createRoot,jc.hydrateRoot=e.hydrateRoot,jc}var DC=NC();var fk=e=>{throw TypeError(e)},gk=(e,t,a)=>t.has(e)||fk("Cannot "+a),na=(e,t,a)=>(gk(e,t,"read from private field"),a?a.call(e):t.get(e)),Zi=(e,t,a)=>t.has(e)?fk("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,a),Ra=(e,t,a,o)=>(gk(e,t,"write to private field"),t.set(e,a),a),jd=/^(?:[a-z][a-z0-9+.-]*:|[\\/]{2})/i,Ud=/^[\\/]{2}/;function _k(e,t){return t+e.replace(/\\/g,"/")}var eb="popstate";function tb(e){return typeof e=="object"&&e!=null&&"pathname"in e&&"search"in e&&"hash"in e&&"state"in e&&"key"in e}function OC(e={}){function t(o,s){let i=s.state?.masked,{pathname:c,search:u,hash:m}=i||o.location;return il("",{pathname:c,search:u,hash:m},s.state&&s.state.usr||null,s.state&&s.state.key||"default",i?{pathname:o.location.pathname,search:o.location.search,hash:o.location.hash}:void 0)}function a(o,s){return typeof s=="string"?s:Cn(s)}return MC(t,a,null,e)}function Xe(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function Dt(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function LC(){return Math.random().toString(36).substring(2,10)}function nb(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function il(e,t,a=null,o,s){return{pathname:typeof e=="string"?e:e.pathname,search:"",hash:"",...typeof t=="string"?Fa(t):t,state:a,key:t&&t.key||o||LC(),mask:s}}function Cn({pathname:e="/",search:t="",hash:a=""}){return t&&t!=="?"&&(e+=t.charAt(0)==="?"?t:"?"+t),a&&a!=="#"&&(e+=a.charAt(0)==="#"?a:"#"+a),e}function Fa(e){let t={};if(e){let a=e.indexOf("#");a>=0&&(t.hash=e.substring(a),e=e.substring(0,a));let o=e.indexOf("?");o>=0&&(t.search=e.substring(o),e=e.substring(0,o)),e&&(t.pathname=e)}return t}function MC(e,t,a,o={}){let{window:s=document.defaultView,v5Compat:i=!1}=o,c=s.history,u="POP",m=null,f=g();f==null&&(f=0,c.replaceState({...c.state,idx:f},""));function g(){return(c.state||{idx:null}).idx}function b(){u="POP";let C=g(),U=C==null?null:C-f;f=C,m&&m({action:u,location:E.location,delta:U})}function w(C,U){u="PUSH";let L=tb(C)?C:il(E.location,C,U);f=g()+1;let M=nb(L,f),D=E.createHref(L.mask||L);try{c.pushState(M,"",D)}catch(Y){if(Y instanceof DOMException&&Y.name==="DataCloneError")throw Y;s.location.assign(D)}i&&m&&m({action:u,location:E.location,delta:1})}function x(C,U){u="REPLACE";let L=tb(C)?C:il(E.location,C,U);f=g();let M=nb(L,f),D=E.createHref(L.mask||L);c.replaceState(M,"",D),i&&m&&m({action:u,location:E.location,delta:0})}function S(C){return bk(s,C)}let E={get action(){return u},get location(){return e(s,c)},listen(C){if(m)throw new Error("A history only accepts one active listener");return s.addEventListener(eb,b),m=C,()=>{s.removeEventListener(eb,b),m=null}},createHref(C){return t(s,C)},createURL:S,encodeLocation(C){let U=S(C);return{pathname:U.pathname,search:U.search,hash:U.hash}},push:w,replace:x,go(C){return c.go(C)}};return E}function bk(e,t,a=!1){let o="http://localhost";e&&(o=e.location.origin!=="null"?e.location.origin:e.location.href),Xe(o,"No window.location.(origin|href) available to create URL");let s=typeof t=="string"?t:Cn(t);return s=s.replace(/ $/,"%20"),!a&&Ud.test(s)&&(s=o+s),new URL(s,o)}var Qi,ab=class{constructor(e){if(Zi(this,Qi,new Map),e)for(let[t,a]of e)this.set(t,a)}get(e){if(na(this,Qi).has(e))return na(this,Qi).get(e);if(e.defaultValue!==void 0)return e.defaultValue;throw new Error("No value found for context")}set(e,t){na(this,Qi).set(e,t)}};Qi=new WeakMap;var zC=new Set(["lazy","caseSensitive","path","id","index","children"]);function jC(e){return zC.has(e)}var UC=new Set(["lazy","caseSensitive","path","id","index","middleware","children"]);function HC(e){return UC.has(e)}function FC(e){return e.index===!0}function ll(e,t,a=[],o={},s=!1){return e.map((i,c)=>{let u=[...a,String(c)],m=typeof i.id=="string"?i.id:u.join("-");if(Xe(i.index!==!0||!i.children,"Cannot specify children on an index route"),Xe(s||!o[m],`Found a route id collision on id "${m}". Route id's must be globally unique within Data Router usages`),FC(i)){let f={...i,id:m};return o[m]=rb(f,t(f)),f}else{let f={...i,id:m,children:void 0};return o[m]=rb(f,t(f)),i.children&&(f.children=ll(i.children,t,u,o,s)),f}})}function rb(e,t){return Object.assign(e,{...t,...typeof t.lazy=="object"&&t.lazy!=null?{lazy:{...e.lazy,...t.lazy}}:{}})}function yk(e,t,a="/"){return ka(e,t,a,!1)}function ka(e,t,a,o,s){let i=typeof t=="string"?Fa(t):t,c=ia(i.pathname||"/",a);if(c==null)return null;let u=s??nd(e),m=null,f=XC(c);for(let g=0;m==null&&g<u.length;++g)m=JC(u[g],f,o);return m}function BC(e,t){let{route:a,pathname:o,params:s}=e;return{id:a.id,pathname:o,params:s,data:t[a.id],loaderData:t[a.id],handle:a.handle}}function nd(e){let t=kk(e);return GC(t),t}function kk(e,t=[],a=[],o="",s=!1){let i=(c,u,m=s,f)=>{let g={relativePath:f===void 0?c.path||"":f,caseSensitive:c.caseSensitive===!0,childrenIndex:u,route:c};if(g.relativePath.startsWith("/")){if(!g.relativePath.startsWith(o)&&m)return;Xe(g.relativePath.startsWith(o),`Absolute route path "${g.relativePath}" nested under path "${o}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),g.relativePath=g.relativePath.slice(o.length)}let b=oa([o,g.relativePath]),w=a.concat(g);c.children&&c.children.length>0&&(Xe(c.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${b}".`),kk(c.children,t,w,b,m)),!(c.path==null&&!c.index)&&t.push({path:b,score:ZC(b,c.index),routesMeta:w.map((x,S)=>{let[E,C]=xk(x.relativePath,x.caseSensitive,S===w.length-1);return{...x,matcher:E,compiledParams:C}})})};return e.forEach((c,u)=>{if(c.path===""||!c.path?.includes("?"))i(c,u);else for(let m of vk(c.path))i(c,u,!0,m)}),t}function vk(e){let t=e.split("/");if(t.length===0)return[];let[a,...o]=t,s=a.endsWith("?"),i=a.replace(/\?$/,"");if(o.length===0)return s?[i,""]:[i];let c=vk(o.join("/")),u=[];return u.push(...c.map(m=>m===""?i:[i,m].join("/"))),s&&u.push(...c),u.map(m=>e.startsWith("/")&&m===""?"/":m)}function GC(e){e.sort((t,a)=>t.score!==a.score?a.score-t.score:QC(t.routesMeta.map(o=>o.childrenIndex),a.routesMeta.map(o=>o.childrenIndex)))}var $C=/^:[\w-]+$/,qC=3,KC=2,VC=1,WC=10,YC=-2,ob=e=>e==="*";function ZC(e,t){let a=e.split("/"),o=a.length;return a.some(ob)&&(o+=YC),t&&(o+=KC),a.filter(s=>!ob(s)).reduce((s,i)=>s+($C.test(i)?qC:i===""?VC:WC),o)}function QC(e,t){return e.length===t.length&&e.slice(0,-1).every((o,s)=>o===t[s])?e[e.length-1]-t[t.length-1]:0}function JC(e,t,a=!1){let{routesMeta:o}=e,s={},i="/",c=[];for(let u=0;u<o.length;++u){let m=o[u],f=u===o.length-1,g=i==="/"?t:t.slice(i.length)||"/",b={path:m.relativePath,caseSensitive:m.caseSensitive,end:f},w=m.matcher&&m.compiledParams?wk(b,g,m.matcher,m.compiledParams):md(b,g),x=m.route;if(!w&&f&&a&&!o[o.length-1].route.index&&(w=md({path:m.relativePath,caseSensitive:m.caseSensitive,end:!1},g)),!w)return null;Object.assign(s,w.params),c.push({params:s,pathname:oa([i,w.pathname]),pathnameBase:nT(oa([i,w.pathnameBase])),route:x}),w.pathnameBase!=="/"&&(i=oa([i,w.pathnameBase]))}return c}function md(e,t){typeof e=="string"&&(e={path:e,caseSensitive:!1,end:!0});let[a,o]=xk(e.path,e.caseSensitive,e.end);return wk(e,t,a,o)}function wk(e,t,a,o){let s=t.match(a);if(!s)return null;let i=s[0],c=Fs(i,1),u=s.slice(1);return{params:o.reduce((f,{paramName:g,isOptional:b},w)=>{if(g==="*"){let S=u[w]||"";c=Fs(i.slice(0,i.length-S.length),1)}const x=u[w];return b&&!x?f[g]=void 0:f[g]=(x||"").replace(/%2F/g,"/"),f},{}),pathname:i,pathnameBase:c,pattern:e}}function xk(e,t=!1,a=!0){Dt(e==="*"||!e.endsWith("*")||e.endsWith("/*"),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,"/*")}".`);let o=[],s="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(c,u,m,f,g)=>{if(o.push({paramName:u,isOptional:m!=null}),m){let b=g.charAt(f+c.length);return b&&b!=="/"?"/([^\\/]*)":"(?:/([^\\/]*))?"}return"/([^\\/]+)"}).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(o.push({paramName:"*"}),s+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):a?s+="\\/*$":e!==""&&e!=="/"&&(s+="(?:(?=\\/|$))"),[new RegExp(s,t?void 0:"i"),o]}function XC(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return Dt(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function ia(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let a=t.endsWith("/")?t.length-1:t.length,o=e.charAt(a);return o&&o!=="/"?null:e.slice(a)||"/"}function eT({basename:e,pathname:t}){return t==="/"?e:oa([e,t])}var dh=e=>jd.test(e);function tT(e,t="/"){let{pathname:a,search:o="",hash:s=""}=typeof e=="string"?Fa(e):e,i;return a?(a=uh(a),a.startsWith("/")||a.startsWith("\\")?i=sb(a.substring(1),"/"):i=sb(a,t)):i=t,{pathname:i,search:aT(o),hash:rT(s)}}function sb(e,t){let a=Fs(t).split("/");return e.split("/").forEach(s=>{s===".."?a.length>1&&a.pop():s!=="."&&a.push(s)}),a.length>1?a.join("/"):"/"}function $p(e,t,a,o){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(o)}]. Please separate it out to the \`to.${a}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function Sk(e){return e.filter((t,a)=>a===0||t.route.path&&t.route.path.length>0)}function Hd(e){let t=Sk(e);return t.map((a,o)=>o===t.length-1?a.pathname:a.pathnameBase)}function vl(e,t,a,o=!1){let s;typeof e=="string"?s=Fa(e):(s={...e},Xe(!s.pathname||!s.pathname.includes("?"),$p("?","pathname","search",s)),Xe(!s.pathname||!s.pathname.includes("#"),$p("#","pathname","hash",s)),Xe(!s.search||!s.search.includes("#"),$p("#","search","hash",s)));let i=e===""||s.pathname==="",c=i?"/":s.pathname,u;if(c==null)u=a;else{let b=t.length-1;if(!o&&c.startsWith("..")){let w=c.split("/");for(;w[0]==="..";)w.shift(),b-=1;s.pathname=w.join("/")}u=b>=0?t[b]:"/"}let m=tT(s,u),f=c&&c!=="/"&&c.endsWith("/"),g=(i||c===".")&&a.endsWith("/");return!m.pathname.endsWith("/")&&(f||g)&&(m.pathname+="/"),m}var uh=e=>e.replace(/[\\/]{2,}/g,"/"),oa=e=>uh(e.join("/"));function Fs(e,t=0){let a=e.length;for(;a>t&&e.charCodeAt(a-1)===47;)a--;return a===e.length?e:e.slice(0,a)}var nT=e=>Fs(e).replace(/^\/*/,"/"),aT=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,rT=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e,oT=["EvalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],wl=class{constructor(e,t,a,o=!1){this.status=e,this.statusText=t||"",this.internal=o,a instanceof Error?(this.data=a.toString(),this.error=a):this.data=a}};function cl(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}function xl(e){let t=e.map(a=>a.route.path).filter(Boolean);return oa(t)||"/"}var Ck=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Tk(e,t){let a=e;if(typeof a!="string"||!jd.test(a))return{absoluteURL:void 0,isExternal:!1,to:a};let o=a,s=!1;if(Ck)try{let i=new URL(window.location.href),c=Ud.test(a)?new URL(_k(a,i.protocol)):new URL(a),u=ia(c.pathname,t);c.origin===i.origin&&u!=null?a=u+c.search+c.hash:s=!0}catch{Dt(!1,`<Link to="${a}"> contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:o,isExternal:s,to:a}}var Wr=Symbol("Uninstrumented");function sT(e,t){let a={lazy:[],"lazy.loader":[],"lazy.action":[],"lazy.middleware":[],middleware:[],loader:[],action:[]};e.forEach(s=>s({id:t.id,index:t.index,path:t.path,instrument(i){let c=Object.keys(a);for(let u of c)i[u]&&a[u].push(i[u])}}));let o={};if(typeof t.lazy=="function"&&a.lazy.length>0){let s=Is(a.lazy,t.lazy,()=>{});s&&(o.lazy=s)}if(typeof t.lazy=="object"){let s=t.lazy;["middleware","loader","action"].forEach(i=>{let c=s[i],u=a[`lazy.${i}`];if(typeof c=="function"&&u.length>0){let m=Is(u,c,()=>{});m&&(o.lazy=Object.assign(o.lazy||{},{[i]:m}))}})}return["loader","action"].forEach(s=>{let i=t[s];if(typeof i=="function"&&a[s].length>0){let c=i[Wr]??i,u=Is(a[s],c,(...m)=>ib(m[0]));u&&(s==="loader"&&c.hydrate===!0&&(u.hydrate=!0),u[Wr]=c,o[s]=u)}}),t.middleware&&t.middleware.length>0&&a.middleware.length>0&&(o.middleware=t.middleware.map(s=>{let i=s[Wr]??s,c=Is(a.middleware,i,(...u)=>ib(u[0]));return c?(c[Wr]=i,c):s})),o}function iT(e,t){let a={navigate:[],fetch:[]};if(t.forEach(o=>o({instrument(s){let i=Object.keys(s);for(let c of i)s[c]&&a[c].push(s[c])}})),a.navigate.length>0){let o=e.navigate[Wr]??e.navigate,s=Is(a.navigate,o,(...i)=>{let[c,u]=i;return{to:typeof c=="number"||typeof c=="string"?c:c?Cn(c):".",...lb(e,u??{})}});s&&(s[Wr]=o,e.navigate=s)}if(a.fetch.length>0){let o=e.fetch[Wr]??e.fetch,s=Is(a.fetch,o,(...i)=>{let[c,,u,m]=i;return{href:u??".",fetcherKey:c,...lb(e,m??{})}});s&&(s[Wr]=o,e.fetch=s)}return e}function Is(e,t,a){return e.length===0?null:async(...o)=>{let s=await Ek(e,a(...o),()=>t(...o),e.length-1);if(s.type==="error")throw s.value;return s.value}}async function Ek(e,t,a,o){let s=e[o],i;if(s){let c,u=async()=>(c?console.error("You cannot call instrumented handlers more than once"):c=Ek(e,t,a,o-1),i=await c,Xe(i,"Expected a result"),i.type==="error"&&i.value instanceof Error?{status:"error",error:i.value}:{status:"success",error:void 0});try{await s(u,t)}catch(m){console.error("An instrumentation function threw an error:",m)}c||await u(),await c}else try{i={type:"success",value:await a()}}catch(c){i={type:"error",value:c}}return i||{type:"error",value:new Error("No result assigned in instrumentation chain.")}}function ib(e){let{request:t,context:a,params:o,pattern:s}=e;return{request:lT(t),params:{...o},pattern:s,context:cT(a)}}function lb(e,t){return{currentUrl:Cn(e.state.location),..."formMethod"in t?{formMethod:t.formMethod}:{},..."formEncType"in t?{formEncType:t.formEncType}:{},..."formData"in t?{formData:t.formData}:{},..."body"in t?{body:t.body}:{}}}function lT(e){return{method:e.method,url:e.url,headers:{get:(...t)=>e.headers.get(...t)}}}function cT(e){if(uT(e)){let t={...e};return Object.freeze(t),t}else return{get:t=>e.get(t)}}var dT=Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function uT(e){if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||t===null||Object.getOwnPropertyNames(t).sort().join("\0")===dT}var cb=new URL("http://localhost");function ph(e){if(e.createURL)return e.createURL("/");try{return new URL(e.createHref("/"),cb)}catch{return cb}}function qp(e,t){return e.origin===t.origin&&(e.origin!=="null"||e.protocol===t.protocol&&e.host===t.host)}function pT(e,t){if(e.startsWith("//"))return!0;let a=t.protocol.toLowerCase();return e.toLowerCase().startsWith(a)?t.host===""||e.slice(a.length).startsWith("//"):!1}function Os(e,t,a,o){let s=null;try{s=e==null?null:new URL(e,a)}catch{}let i=new URL(t,a),c=s!=null&&!qp(s,a),u=!qp(i,a);if(o==="reject"){if(c||u)throw new Error("External navigation is not allowed")}else if(u&&(s==null||!pT(e,s)||!qp(s,i)))throw new Error("External navigation is not allowed")}var Ak=["POST","PUT","PATCH","DELETE"],mT=new Set(Ak),hT=["GET",...Ak],fT=new Set(hT),Pk=new Set([301,302,303,307,308]),gT=new Set([307,308]),Kp={state:"idle",location:void 0,matches:void 0,historyAction:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},_T={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},$i={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},bT=e=>({hasErrorBoundary:!!e.hasErrorBoundary}),Rk="remix-router-transitions",Ik=Symbol("ResetLoaderData"),So,Cs,Gr,Ts,yT=class{constructor(e){Zi(this,So),Zi(this,Cs),Zi(this,Gr),Zi(this,Ts),Ra(this,So,e),Ra(this,Cs,nd(e))}get stableRoutes(){return na(this,So)}get activeRoutes(){return na(this,Gr)??na(this,So)}get branches(){return na(this,Ts)??na(this,Cs)}get hasHMRRoutes(){return na(this,Gr)!=null}setRoutes(e){Ra(this,So,e),Ra(this,Cs,nd(e))}setHmrRoutes(e){Ra(this,Gr,e),Ra(this,Ts,nd(e))}commitHmrRoutes(){na(this,Gr)&&(Ra(this,So,na(this,Gr)),Ra(this,Cs,na(this,Ts)),Ra(this,Gr,void 0),Ra(this,Ts,void 0))}};So=new WeakMap;Cs=new WeakMap;Gr=new WeakMap;Ts=new WeakMap;function kT(e){const t=e.window?e.window:typeof window<"u"?window:void 0,a=typeof t<"u"&&typeof t.document<"u"&&typeof t.document.createElement<"u";Xe(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let o=e.hydrationRouteProperties||[],s=e.mapRouteProperties||bT,i=s;if(e.instrumentations){let P=e.instrumentations;i=O=>({...s(O),...sT(P.map(B=>B.route).filter(Boolean),O)})}let c={},u=new yT(ll(e.routes,i,void 0,c)),m=e.basename||"/";m.startsWith("/")||(m=`/${m}`);let f=e.dataStrategy||CT,g={...e.future},b=null,w=new Set,x=null,S=null,E=null,C=null,U=e.hydrationData!=null,L=ka(u.activeRoutes,e.history.location,m,!1,u.branches),M=!1,D=null,Y,J;if(L==null&&!e.patchRoutesOnNavigation){let P=aa(404,{pathname:e.history.location.pathname}),{matches:O,route:B}=Uc(u.activeRoutes);Y=!0,J=!Y,L=O,D={[B.id]:P}}else if(L&&!e.hydrationData&&br(L,u.activeRoutes,e.history.location.pathname).active&&(L=null),L)if(L.some(P=>P.route.lazy))Y=!1,J=!Y;else if(!L.some(P=>mh(P.route)))Y=!0,J=!Y;else{let P=e.hydrationData?e.hydrationData.loaderData:null,O=e.hydrationData?e.hydrationData.errors:null,B=L;if(O){let X=L.findIndex(ee=>O[ee.route.id]!==void 0);B=B.slice(0,X+1)}J=!1,Y=!0,B.forEach(X=>{let ee=Nk(X.route,P,O);J=J||ee.renderFallback,Y=Y&&!ee.shouldLoad})}else{Y=!1,J=!Y,L=[];let P=br(null,u.activeRoutes,e.history.location.pathname);P.active&&P.matches&&(M=!0,L=P.matches)}let Q,T={historyAction:e.history.action,location:e.history.location,matches:L,initialized:Y,renderFallback:J,navigation:Kp,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||D,fetchers:new Map,blockers:new Map},$="POP",ae=null,Ee=!1,ye,ze=!1,Se=new Map,Me=null,_e=!1,de=!1,ne=new Set,Z=new Map,H=0,N=-1,W=new Map,ue=new Set,be=new Map,ce=new Map,pe=new Set,Ge=new Map,Ye,De=null;function et(){if(b=e.history.listen(({action:P,location:O,delta:B})=>{if(Ye){Ye(),Ye=void 0;return}Dt(Ge.size===0||B!=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 X=da({currentLocation:T.location,nextLocation:O,historyAction:P});if(X&&B!=null){let ee=new Promise(Ie=>{Ye=Ie});e.history.go(B*-1),Un(X,{state:"blocked",location:O,proceed(){Un(X,{state:"proceeding",proceed:void 0,reset:void 0,location:O}),ee.then(()=>e.history.go(B))},reset(){let Ie=new Map(T.blockers);Ie.set(X,$i),Je({blockers:Ie})}}),ae?.resolve(),ae=null;return}return yn(P,O)}),a){$T(t,Se);let P=()=>qT(t,Se);t.addEventListener("pagehide",P),Me=()=>t.removeEventListener("pagehide",P)}return T.initialized||yn("POP",T.location,{initialHydration:!0}),Q}function Mt(){b&&b(),Me&&Me(),w.clear(),ye&&ye.abort(),T.fetchers.forEach((P,O)=>Yt(T.fetchers,O)),T.blockers.forEach((P,O)=>ca(O))}function Wn(P){if(w.add(P),x){let{newErrors:O}=x;x=null,P(T,{deletedFetchers:[],newErrors:O,viewTransitionOpts:void 0,flushSync:!1})}return()=>w.delete(P)}function Je(P,O={}){P.matches&&(P.matches=P.matches.map(ee=>{let Ie=c[ee.route.id],Ce=ee.route;return Ce.element!==Ie.element||Ce.errorElement!==Ie.errorElement||Ce.hydrateFallbackElement!==Ie.hydrateFallbackElement?{...ee,route:Ie}:ee})),T={...T,...P};let B=[],X=[];T.fetchers.forEach((ee,Ie)=>{ee.state==="idle"&&(pe.has(Ie)?B.push(Ie):X.push(Ie))}),pe.forEach(ee=>{!T.fetchers.has(ee)&&!Z.has(ee)&&B.push(ee)}),w.size===0&&(x={newErrors:P.errors??null}),[...w].forEach(ee=>ee(T,{deletedFetchers:B,newErrors:P.errors??null,viewTransitionOpts:O.viewTransitionOpts,flushSync:O.flushSync===!0})),B.forEach(ee=>Yt(T.fetchers,ee)),X.forEach(ee=>T.fetchers.delete(ee))}function Ht(P,O,{flushSync:B}={}){let X=T.actionData!=null&&T.navigation.formMethod!=null&&fn(T.navigation.formMethod)&&T.navigation.state==="loading"&&P.state?._isRedirect!==!0,ee;O.actionData?Object.keys(O.actionData).length>0?ee=O.actionData:ee=null:X?ee=T.actionData:ee=null;let Ie=O.loaderData?yb(T.loaderData,O.loaderData,O.matches||[],O.errors):T.loaderData,Ce=T.blockers;Ce.size>0&&(Ce=new Map(Ce),Ce.forEach((Oe,We)=>Ce.set(We,$i)));let Ne=_e?!1:ci(P,O.matches||T.matches),fe=Ee===!0||T.navigation.formMethod!=null&&fn(T.navigation.formMethod)&&P.state?._isRedirect!==!0;u.commitHmrRoutes(),_e||$==="POP"||($==="PUSH"?e.history.push(P,P.state):$==="REPLACE"&&e.history.replace(P,P.state));let je;if($==="POP"&&!_e&&P!==T.location){let Oe=Se.get(T.location.pathname);Oe&&Oe.has(P.pathname)?je={currentLocation:T.location,nextLocation:P}:Se.has(P.pathname)&&(je={currentLocation:P,nextLocation:T.location})}else if(ze){let Oe=Se.get(T.location.pathname);Oe?Oe.add(P.pathname):(Oe=new Set([P.pathname]),Se.set(T.location.pathname,Oe)),je={currentLocation:T.location,nextLocation:P}}Je({...O,actionData:ee,loaderData:Ie,historyAction:$,location:P,initialized:!0,renderFallback:!1,navigation:Kp,revalidation:"idle",restoreScrollPosition:Ne,preventScrollReset:fe,blockers:Ce},{viewTransitionOpts:je,flushSync:B===!0}),$="POP",Ee=!1,ze=!1,_e=!1,de=!1,ae?.resolve(),ae=null,De?.resolve(),De=null}async function St(P,O){if(ae?.resolve(),ae=null,typeof P=="number"){ae||(ae=xb());let ft=ae.promise;return e.history.go(P),ft}let B=Cm(T.location,T.matches,m,P,O?.fromRouteId,O?.relative),{path:X,submission:ee,error:Ie}=db(!1,B,O),Ce;if(O?.mask){let ft=typeof O.mask=="string"?Fa(O.mask):{...T.location.mask,...O.mask};if(Ce={pathname:ft.pathname??"",search:ft.search??"",hash:ft.hash??""},Ud.test(Ce.pathname))throw new Error("External navigation is not allowed");Ce.pathname.startsWith("\\")&&(Ce.pathname=Ce.pathname.replace(/^\\+/,"/")),Os(typeof O.mask=="string"?O.mask:Cn(O.mask),Cn(Ce),e.history.createURL("/"),"reject")}let Ne=T.location,fe=il(Ne,X,O&&O.state,void 0,Ce);fe={...fe,...e.history.encodeLocation(fe)},Os(P==null?e.history.createHref(T.location):typeof P=="string"?P:Cn(P),e.history.createHref(fe.mask||fe),e.history.createURL("/"),"reject");let je=O&&O.replace!=null?O.replace:void 0,Oe="PUSH";je===!0?Oe="REPLACE":je===!1||ee!=null&&fn(ee.formMethod)&&ee.formAction===T.location.pathname+T.location.search&&(Oe="REPLACE");let We=O&&"preventScrollReset"in O?O.preventScrollReset===!0:void 0,Be=(O&&O.flushSync)===!0,it=da({currentLocation:Ne,nextLocation:fe,historyAction:Oe});if(it){Un(it,{state:"blocked",location:fe,proceed(){Un(it,{state:"proceeding",proceed:void 0,reset:void 0,location:fe}),St(P,O)},reset(){let ft=new Map(T.blockers);ft.set(it,$i),Je({blockers:ft})}});return}await yn(Oe,fe,{submission:ee,pendingError:Ie,preventScrollReset:We,replace:O&&O.replace,enableViewTransition:O&&O.viewTransition,flushSync:Be,callSiteDefaultShouldRevalidate:O&&O.defaultShouldRevalidate})}function Yn(){De||(De=xb()),ht(),Je({revalidation:"loading"});let P=De.promise;return T.navigation.state==="submitting"?P:T.navigation.state==="idle"?(yn(T.historyAction,T.location,{startUninterruptedRevalidation:!0}),P):(yn($||T.historyAction,T.navigation.location,{overrideNavigation:T.navigation,enableViewTransition:ze===!0}),P)}async function yn(P,O,B){ye&&ye.abort(),ye=null,$=P,_e=(B&&B.startUninterruptedRevalidation)===!0,Ml(T.location,T.matches),Ee=(B&&B.preventScrollReset)===!0,ze=(B&&B.enableViewTransition)===!0;let X=u.activeRoutes,ee=B?.initialHydration&&T.matches&&T.matches.length>0&&!M?T.matches:ka(X,O,m,!1,u.branches),Ie=(B&&B.flushSync)===!0;if(ee&&T.initialized&&!de&&OT(T.location,O)&&!(B&&B.submission&&fn(B.submission.formMethod))){Ht(O,{matches:ee},{flushSync:Ie});return}let Ce=br(ee,X,O.pathname);if(Ce.active&&Ce.matches&&(ee=Ce.matches),!ee){let{error:pt,notFoundMatches:dt,route:at}=_r(O.pathname);Ht(O,{matches:dt,loaderData:{},errors:{[at.id]:pt}},{flushSync:Ie});return}let Ne=B&&B.overrideNavigation?{...B.overrideNavigation,matches:ee,historyAction:P}:void 0;ye=new AbortController;let fe=Es(e.history,O,ye.signal,B&&B.submission),je=e.getContext?await e.getContext():new ab,Oe;if(B&&B.pendingError)Oe=[qr(ee).route.id,{type:"error",error:B.pendingError}];else if(B&&B.submission&&fn(B.submission.formMethod)){let pt=await $a(fe,O,B.submission,ee,P,je,Ce.active,B&&B.initialHydration===!0,{replace:B.replace,flushSync:Ie});if(pt.shortCircuited)return;if(pt.pendingActionResult){let[dt,at]=pt.pendingActionResult;if(qn(at)&&cl(at.error)&&at.error.status===404){ye=null,Ht(O,{matches:pt.matches,loaderData:{},errors:{[dt]:at.error}});return}}ee=pt.matches||ee,Oe=pt.pendingActionResult,Ne=Vp(O,ee,P,B.submission),Ie=!1,Ce.active=!1,fe=Es(e.history,fe.url,fe.signal)}let{shortCircuited:We,matches:Be,loaderData:it,errors:ft,workingFetchers:Pt}=await ao(fe,O,ee,P,je,Ce.active,Ne,B&&B.submission,B&&B.fetcherSubmission,B&&B.replace,B&&B.initialHydration===!0,Ie,Oe,B&&B.callSiteDefaultShouldRevalidate);We||(ye=null,Ht(O,{matches:Be||ee,...kb(Oe),loaderData:it,errors:ft,...Pt?{fetchers:Pt}:{}}))}async function $a(P,O,B,X,ee,Ie,Ce,Ne,fe={}){ht();let je=BT(O,X,ee,B);if(Je({navigation:je},{flushSync:fe.flushSync===!0}),Ce){let Be=await so(X,O.pathname,P.signal);if(Be.type==="aborted")return{shortCircuited:!0};if(Be.type==="error"){if(Be.partialMatches.length===0){let{matches:ft,route:Pt}=Uc(u.activeRoutes);return{matches:ft,pendingActionResult:[Pt.id,{type:"error",error:Be.error}]}}let it=qr(Be.partialMatches).route.id;return{matches:Be.partialMatches,pendingActionResult:[it,{type:"error",error:Be.error}]}}else if(Be.matches)X=Be.matches;else{let{notFoundMatches:it,error:ft,route:Pt}=_r(O.pathname);return{matches:it,pendingActionResult:[Pt.id,{type:"error",error:ft}]}}}let Oe,We=ad(X,O);if(!We.route.action&&!We.route.lazy)Oe={type:"error",error:aa(405,{method:P.method,pathname:O.pathname,routeId:We.route.id})};else{let Be=Ls(i,c,P,O,X,We,Ne?[]:o,Ie),it=await zt(P,O,Be,Ie,null);if(Oe=it[We.route.id],!Oe){for(let ft of X)if(it[ft.route.id]){Oe=it[ft.route.id];break}}if(P.signal.aborted)return{shortCircuited:!0}}if(Eo(Oe)){let Be;return fe&&fe.replace!=null?Be=fe.replace:Be=gb(Oe.response.headers.get("Location"),new URL(P.url),m,e.history)===T.location.pathname+T.location.search,await _t(P,Oe,!0,{submission:B,replace:Be}),{shortCircuited:!0}}if(qn(Oe)){let Be=qr(X,We.route.id);return(fe&&fe.replace)!==!0&&($="PUSH"),{matches:X,pendingActionResult:[Be.route.id,Oe,We.route.id]}}return{matches:X,pendingActionResult:[We.route.id,Oe]}}async function ao(P,O,B,X,ee,Ie,Ce,Ne,fe,je,Oe,We,Be,it){let ft=Ce||Vp(O,B,X,Ne),Pt=Ne||fe||wb(ft),pt=!_e&&!Oe;if(Ie){if(pt){let cn=wa(Be);Je({navigation:ft,...cn!==void 0?{actionData:cn}:{}},{flushSync:We})}let rt=await so(B,O.pathname,P.signal);if(rt.type==="aborted")return{shortCircuited:!0};if(rt.type==="error"){if(rt.partialMatches.length===0){let{matches:kn,route:In}=Uc(u.activeRoutes);return{matches:kn,loaderData:{},errors:{[In.id]:rt.error}}}let cn=qr(rt.partialMatches).route.id;return{matches:rt.partialMatches,loaderData:{},errors:{[cn]:rt.error}}}else if(rt.matches)B=rt.matches;else{let{error:cn,notFoundMatches:kn,route:In}=_r(O.pathname);return{matches:kn,loaderData:{},errors:{[In.id]:cn}}}}let dt=u.activeRoutes,{dsMatches:at,revalidatingFetchers:sn}=ub(P,ee,i,c,e.history,T,B,Pt,O,Oe?[]:o,Oe===!0,de,ne,pe,be,ue,dt,m,e.patchRoutesOnNavigation!=null,u.branches,Be,it);if(N=++H,!e.dataStrategy&&!at.some(rt=>rt.shouldLoad)&&!at.some(rt=>rt.route.middleware&&rt.route.middleware.length>0)&&sn.length===0){let rt=new Map(T.fetchers),cn=fr(rt);return Ht(O,{matches:B,loaderData:{},errors:Be&&qn(Be[1])?{[Be[0]]:Be[1].error}:null,...kb(Be),...cn?{fetchers:rt}:{}},{flushSync:We}),{shortCircuited:!0}}if(pt){let rt={};if(!Ie){rt.navigation=ft;let cn=wa(Be);cn!==void 0&&(rt.actionData=cn)}sn.length>0&&(rt.fetchers=xa(sn)),Je(rt,{flushSync:We})}sn.forEach(rt=>{Rn(rt.key),rt.controller&&Z.set(rt.key,rt.controller)});let Wa=()=>sn.forEach(rt=>Rn(rt.key));ye&&ye.signal.addEventListener("abort",Wa);let{loaderResults:ua,fetcherResults:pa}=await jt(at,sn,P,O,ee);if(P.signal.aborted)return{shortCircuited:!0};ye&&ye.signal.removeEventListener("abort",Wa),sn.forEach(rt=>Z.delete(rt.key));let Ca=Hc(ua);if(Ca)return await _t(P,Ca.result,!0,{replace:je}),{shortCircuited:!0};if(Ca=Hc(pa),Ca)return ue.add(Ca.key),await _t(P,Ca.result,!0,{replace:je}),{shortCircuited:!0};let Hn=new Map(T.fetchers),{loaderData:kr,errors:$t}=bb(T,B,ua,Be,sn,pa,Hn);Oe&&T.errors&&($t={...T.errors,...$t});let Wo=fr(Hn),ln=gr(N,Hn),Yo=Wo||ln||sn.length>0;return{matches:B,loaderData:kr,errors:$t,...Yo?{workingFetchers:Hn}:{}}}function wa(P){if(P&&!qn(P[1]))return{[P[0]]:P[1].data};if(T.actionData)return Object.keys(T.actionData).length===0?null:T.actionData}function xa(P){let O=new Map(T.fetchers);return P.forEach(B=>{let X=O.get(B.key),ee=qi(void 0,X?X.data:void 0);O.set(B.key,ee)}),O}async function ro(P,O,B,X){Rn(P);let ee=(X&&X.flushSync)===!0,Ie=u.activeRoutes,Ce=Cm(T.location,T.matches,m,B,O,X?.relative),Ne=ka(Ie,Ce,m,!1,u.branches),fe=br(Ne,Ie,Ce);if(fe.active&&fe.matches&&(Ne=fe.matches),!Ne){nn(P,O,aa(404,{pathname:Ce}),{flushSync:ee});return}let{path:je,submission:Oe,error:We}=db(!0,Ce,X);if(We){nn(P,O,We,{flushSync:ee});return}let Be=e.getContext?await e.getContext():new ab,it=(X&&X.preventScrollReset)===!0;if(Oe&&fn(Oe.formMethod)){await Ze(P,O,je,Ne,Be,fe.active,ee,it,Oe,X&&X.defaultShouldRevalidate);return}be.set(P,{routeId:O,path:je}),await st(P,O,je,Ne,Be,fe.active,ee,it,Oe)}async function Ze(P,O,B,X,ee,Ie,Ce,Ne,fe,je){ht(),be.delete(P);let Oe=T.fetchers.get(P);bt(P,GT(fe,Oe),{flushSync:Ce});let We=new AbortController,Be=Es(e.history,B,We.signal,fe);if(Ie){let yt=await so(X,new URL(Be.url).pathname,Be.signal,P);if(yt.type==="aborted")return;if(yt.type==="error"){nn(P,O,yt.error,{flushSync:Ce});return}else if(yt.matches)X=yt.matches;else{nn(P,O,aa(404,{pathname:B}),{flushSync:Ce});return}}let it=ad(X,B);if(!it.route.action&&!it.route.lazy){let yt=aa(405,{method:fe.formMethod,pathname:B,routeId:O});nn(P,O,yt,{flushSync:Ce});return}Z.set(P,We);let ft=H,Pt=Ls(i,c,Be,B,X,it,o,ee),pt=await zt(Be,B,Pt,ee,P),dt=pt[it.route.id];if(!dt){for(let yt of Pt)if(pt[yt.route.id]){dt=pt[yt.route.id];break}}if(Be.signal.aborted){Z.get(P)===We&&Z.delete(P);return}if(pe.has(P)){if(Eo(dt)||qn(dt)){bt(P,Na(void 0));return}}else{if(Eo(dt))if(Z.delete(P),N>ft){bt(P,Na(void 0));return}else return ue.add(P),bt(P,qi(fe)),_t(Be,dt,!1,{fetcherSubmission:fe,preventScrollReset:Ne});if(qn(dt)){nn(P,O,dt.error);return}}let at=T.navigation.location||T.location,sn=Es(e.history,at,We.signal),Wa=u.activeRoutes,ua=T.navigation.state!=="idle"?ka(Wa,T.navigation.location,m,!1,u.branches):T.matches;Xe(ua,"Didn't find any matches after fetcher action");let pa=++H;W.set(P,pa);let{dsMatches:Ca,revalidatingFetchers:Hn}=ub(sn,ee,i,c,e.history,T,ua,fe,at,o,!1,de,ne,pe,be,ue,Wa,m,e.patchRoutesOnNavigation!=null,u.branches,[it.route.id,dt],je),kr=qi(fe,dt.data),$t=new Map(T.fetchers);$t.set(P,kr),Hn.filter(yt=>yt.key!==P).forEach(yt=>{let Ya=yt.key,Zo=$t.get(Ya),zl=qi(void 0,Zo?Zo.data:void 0);$t.set(Ya,zl),Rn(Ya),yt.controller&&Z.set(Ya,yt.controller)}),Je({fetchers:$t});let Wo=()=>Hn.forEach(yt=>Rn(yt.key));We.signal.addEventListener("abort",Wo);let{loaderResults:ln,fetcherResults:Yo}=await jt(Ca,Hn,sn,at,ee);if(We.signal.aborted)return;We.signal.removeEventListener("abort",Wo),W.delete(P),Z.delete(P),Hn.forEach(yt=>Z.delete(yt.key));let rt=T.fetchers.has(P),cn=yt=>{if(!rt)return yt;let Ya=new Map(yt.fetchers);return Ya.set(P,Na(dt.data)),{...yt,fetchers:Ya}},kn=Hc(ln);if(kn)return T=cn(T),_t(sn,kn.result,!1,{preventScrollReset:Ne});if(kn=Hc(Yo),kn)return ue.add(kn.key),T=cn(T),_t(sn,kn.result,!1,{preventScrollReset:Ne});let In=new Map(T.fetchers);rt&&In.set(P,Na(dt.data));let{loaderData:vr,errors:wr}=bb(T,ua,ln,void 0,Hn,Yo,In);gr(pa,In),T.navigation.state==="loading"&&pa>N?(Xe($,"Expected pending action"),ye&&ye.abort(),Ht(T.navigation.location,{matches:ua,loaderData:vr,errors:wr,fetchers:In})):(Je({errors:wr,loaderData:yb(T.loaderData,vr,ua,wr),fetchers:In}),de=!1)}async function st(P,O,B,X,ee,Ie,Ce,Ne,fe){let je=T.fetchers.get(P);bt(P,qi(fe,je?je.data:void 0),{flushSync:Ce});let Oe=new AbortController,We=Es(e.history,B,Oe.signal);if(Ie){let dt=await so(X,new URL(We.url).pathname,We.signal,P);if(dt.type==="aborted")return;if(dt.type==="error"){nn(P,O,dt.error,{flushSync:Ce});return}else if(dt.matches)X=dt.matches;else{nn(P,O,aa(404,{pathname:B}),{flushSync:Ce});return}}let Be=ad(X,B);Z.set(P,Oe);let it=H,ft=Ls(i,c,We,B,X,Be,o,ee),Pt=await zt(We,B,ft,ee,P),pt=Pt[Be.route.id];if(!pt){for(let dt of X)if(Pt[dt.route.id]){pt=Pt[dt.route.id];break}}if(Z.get(P)===Oe&&Z.delete(P),!We.signal.aborted){if(pe.has(P)){bt(P,Na(void 0));return}if(Eo(pt))if(N>it){bt(P,Na(void 0));return}else{ue.add(P),await _t(We,pt,!1,{preventScrollReset:Ne});return}if(qn(pt)){nn(P,O,pt.error);return}bt(P,Na(pt.data))}}async function _t(P,O,B,{submission:X,fetcherSubmission:ee,preventScrollReset:Ie,replace:Ce}={}){B||(ae?.resolve(),ae=null),O.response.headers.has("X-Remix-Revalidate")&&(de=!0);let Ne=O.response.headers.get("Location");Xe(Ne,"Expected a Location header on the redirect Response");let fe=Ne,je=new URL(P.url);Ne=gb(Ne,je,m,e.history),Os(fe,Ne,je,"allow-explicit");let Oe=il(T.location,Ne,{_isRedirect:!0});if(a){let pt=!1;if(O.response.headers.has("X-Remix-Reload-Document"))pt=!0;else if(dh(Ne)){const dt=bk(t,Ne,!0);pt=dt.origin!==t.location.origin||ia(dt.pathname,m)==null}if(pt){Ce?t.location.replace(Ne):t.location.assign(Ne);return}}ye=null;let We=Ce===!0||O.response.headers.has("X-Remix-Replace")?"REPLACE":"PUSH",{formMethod:Be,formAction:it,formEncType:ft}=T.navigation;!X&&!ee&&Be&&it&&ft&&(X=wb(T.navigation));let Pt=X||ee;if(gT.has(O.response.status)&&Pt&&fn(Pt.formMethod))await yn(We,Oe,{submission:{...Pt,formAction:Ne},preventScrollReset:Ie||Ee,enableViewTransition:B?ze:void 0});else{let pt=Vp(Oe,[],We,X);await yn(We,Oe,{overrideNavigation:pt,fetcherSubmission:ee,preventScrollReset:Ie||Ee,enableViewTransition:B?ze:void 0})}}async function zt(P,O,B,X,ee){let Ie,Ce={};try{Ie=await ET(f,P,O,B,ee,X,!1)}catch(Ne){return B.filter(fe=>fe.shouldLoad).forEach(fe=>{Ce[fe.route.id]={type:"error",error:Ne}}),Ce}if(P.signal.aborted)return Ce;if(!fn(P.method))for(let Ne of B){if(Ie[Ne.route.id]?.type==="error")break;!Ie.hasOwnProperty(Ne.route.id)&&!T.loaderData.hasOwnProperty(Ne.route.id)&&(!T.errors||!T.errors.hasOwnProperty(Ne.route.id))&&Ne.shouldCallHandler()&&(Ie[Ne.route.id]={type:"error",result:new Error(`No result returned from dataStrategy for route ${Ne.route.id}`)})}for(let[Ne,fe]of Object.entries(Ie))if(jT(fe)){let je=fe.result;Ce[Ne]={type:"redirect",response:IT(je,P,Ne,B,m)}}else Ce[Ne]=await RT(fe);return Ce}async function jt(P,O,B,X,ee){let Ie=zt(B,X,P,ee,null),Ce=Promise.all(O.map(async je=>{if(je.matches&&je.match&&je.request&&je.controller){let We=(await zt(je.request,je.path,je.matches,ee,je.key))[je.match.route.id];return{[je.key]:We}}else return Promise.resolve({[je.key]:{type:"error",error:aa(404,{pathname:je.path})}})})),Ne=await Ie,fe=(await Ce).reduce((je,Oe)=>Object.assign(je,Oe),{});return{loaderResults:Ne,fetcherResults:fe}}function ht(){de=!0,be.forEach((P,O)=>{Z.has(O)&&ne.add(O),Rn(O)})}function bt(P,O,B={}){let X=new Map(T.fetchers);X.set(P,O),Je({fetchers:X},{flushSync:(B&&B.flushSync)===!0})}function nn(P,O,B,X={}){let ee=qr(T.matches,O),Ie=new Map(T.fetchers);Yt(Ie,P),Je({errors:{[ee.route.id]:B},fetchers:Ie},{flushSync:(X&&X.flushSync)===!0})}function qa(P){return ce.set(P,(ce.get(P)||0)+1),pe.has(P)&&pe.delete(P),T.fetchers.get(P)||_T}function Sa(P,O){Rn(P,O?.reason),bt(P,Na(null))}function Yt(P,O){let B=T.fetchers.get(O);Z.has(O)&&!(B&&B.state==="loading"&&W.has(O))&&Rn(O),be.delete(O),W.delete(O),ue.delete(O),pe.delete(O),ne.delete(O),P.delete(O)}function oo(P){let O=(ce.get(P)||0)-1;O<=0?(ce.delete(P),pe.add(P)):ce.set(P,O),Je({fetchers:new Map(T.fetchers)})}function Rn(P,O){let B=Z.get(P);B&&(B.abort(O),Z.delete(P))}function Ka(P,O){for(let B of P){let X=O.get(B);Xe(X,`Expected fetcher: ${B}`);let ee=Na(X.data);O.set(B,ee)}}function fr(P){let O=[],B=!1;for(let X of ue){let ee=P.get(X);Xe(ee,`Expected fetcher: ${X}`),ee.state==="loading"&&(ue.delete(X),O.push(X),B=!0)}return Ka(O,P),B}function gr(P,O){let B=[];for(let[X,ee]of W)if(ee<P){let Ie=O.get(X);Xe(Ie,`Expected fetcher: ${X}`),Ie.state==="loading"&&(Rn(X),W.delete(X),B.push(X))}return Ka(B,O),B.length>0}function Va(P,O){let B=T.blockers.get(P)||$i;return Ge.get(P)!==O&&Ge.set(P,O),B}function ca(P){T.blockers.delete(P),Ge.delete(P)}function Un(P,O){let B=T.blockers.get(P)||$i;Xe(B.state==="unblocked"&&O.state==="blocked"||B.state==="blocked"&&O.state==="blocked"||B.state==="blocked"&&O.state==="proceeding"||B.state==="blocked"&&O.state==="unblocked"||B.state==="proceeding"&&O.state==="unblocked",`Invalid blocker state transition: ${B.state} -> ${O.state}`);let X=new Map(T.blockers);X.set(P,O),Je({blockers:X})}function da({currentLocation:P,nextLocation:O,historyAction:B}){if(Ge.size===0)return;Ge.size>1&&Dt(!1,"A router only supports one blocker at a time");let X=Array.from(Ge.entries()),[ee,Ie]=X[X.length-1],Ce=T.blockers.get(ee);if(!(Ce&&Ce.state==="proceeding")&&Ie({currentLocation:P,nextLocation:O,historyAction:B}))return ee}function _r(P){let O=aa(404,{pathname:P}),B=u.activeRoutes,{matches:X,route:ee}=Uc(B);return{notFoundMatches:X,route:ee,error:O}}function Ll(P,O,B){if(S=P,C=O,E=B||null,!U&&T.navigation===Kp){U=!0;let X=ci(T.location,T.matches);X!=null&&Je({restoreScrollPosition:X})}return()=>{S=null,C=null,E=null}}function li(P,O){return E&&E(P,O.map(X=>BC(X,T.loaderData)))||P.key}function Ml(P,O){if(S&&C){let B=li(P,O);S[B]=C()}}function ci(P,O){if(S){let B=li(P,O),X=S[B];if(typeof X=="number")return X}return null}function br(P,O,B){if(e.patchRoutesOnNavigation){let X=u.branches;if(P){if(Object.keys(P[0].params).length>0)return{active:!0,matches:ka(O,B,m,!0,X)}}else return{active:!0,matches:ka(O,B,m,!0,X)||[]}}return{active:!1,matches:null}}async function so(P,O,B,X){if(!e.patchRoutesOnNavigation)return{type:"success",matches:P};let ee=P;for(;;){let Ie=c;try{await e.patchRoutesOnNavigation({signal:B,path:O,matches:ee,fetcherKey:X,patch:(je,Oe)=>{B.aborted||pb(je,Oe,u,Ie,i,!1)}})}catch(je){return{type:"error",error:je,partialMatches:ee}}if(B.aborted)return{type:"aborted"};let Ce=u.branches,Ne=ka(u.activeRoutes,O,m,!1,Ce),fe=null;if(Ne){if(Object.keys(Ne[0].params).length===0)return{type:"success",matches:Ne};if(fe=ka(u.activeRoutes,O,m,!0,Ce),!(fe&&ee.length<fe.length&&yr(ee,fe.slice(0,ee.length))))return{type:"success",matches:Ne}}if(fe||(fe=ka(u.activeRoutes,O,m,!0,Ce)),!fe||yr(ee,fe))return{type:"success",matches:null};ee=fe}}function yr(P,O){return P.length===O.length&&P.every((B,X)=>B.route.id===O[X].route.id)}function di(P){c={},u.setHmrRoutes(ll(P,i,void 0,c))}function io(P,O,B=!1){pb(P,O,u,c,i,B),u.hasHMRRoutes||Je({})}return Q={get basename(){return m},get future(){return g},get state(){return T},get routes(){return u.stableRoutes},get branches(){return u.branches},get manifest(){return c},get window(){return t},initialize:et,subscribe:Wn,enableScrollRestoration:Ll,navigate:St,fetch:ro,revalidate:Yn,createHref:P=>e.history.createHref(P),createURL:P=>e.history.createURL(P),encodeLocation:P=>e.history.encodeLocation(P),getFetcher:qa,resetFetcher:Sa,deleteFetcher:oo,dispose:Mt,getBlocker:Va,deleteBlocker:ca,patchRoutes:io,_internalFetchControllers:Z,_internalSetRoutes:di,_internalSetStateDoNotUseOrYouWillBreakYourApp(P){Je(P)}},e.instrumentations&&(Q=iT(Q,e.instrumentations.map(P=>P.router).filter(Boolean))),Q}function vT(e){return e!=null&&("formData"in e&&e.formData!=null||"body"in e&&e.body!==void 0)}function Cm(e,t,a,o,s,i){let c,u;if(s){c=[];for(let f of t)if(c.push(f),f.route.id===s){u=f;break}}else c=t,u=t[t.length-1];let m=vl(o||".",Hd(c),ia(e.pathname,a)||e.pathname,i==="path");if(o==null&&(m.search=e.search,m.hash=e.hash),(o==null||o===""||o===".")&&u){let f=fh(m.search);if(u.route.index&&!f)m.search=m.search?m.search.replace(/^\?/,"?index&"):"?index";else if(!u.route.index&&f){let g=new URLSearchParams(m.search),b=g.getAll("index");g.delete("index"),b.filter(x=>x).forEach(x=>g.append("index",x));let w=g.toString();m.search=w?`?${w}`:""}}return a!=="/"&&(m.pathname=eT({basename:a,pathname:m.pathname})),Cn(m)}function db(e,t,a){if(!a||!vT(a))return{path:t};if(a.formMethod&&!FT(a.formMethod))return{path:t,error:aa(405,{method:a.formMethod})};let o=()=>({path:t,error:aa(400,{type:"invalid-body"})}),i=(a.formMethod||"get").toUpperCase(),c=Uk(t);if(a.body!==void 0){if(a.formEncType==="text/plain"){if(!fn(i))return o();let b=typeof a.body=="string"?a.body:a.body instanceof FormData||a.body instanceof URLSearchParams?Array.from(a.body.entries()).reduce((w,[x,S])=>`${w}${x}=${S}
10
- `,""):String(a.body);return{path:t,submission:{formMethod:i,formAction:c,formEncType:a.formEncType,formData:void 0,json:void 0,text:b}}}else if(a.formEncType==="application/json"){if(!fn(i))return o();try{let b=typeof a.body=="string"?JSON.parse(a.body):a.body;return{path:t,submission:{formMethod:i,formAction:c,formEncType:a.formEncType,formData:void 0,json:b,text:void 0}}}catch{return o()}}}Xe(typeof FormData=="function","FormData is not available in this environment");let u,m;if(a.formData)u=Am(a.formData),m=a.formData;else if(a.body instanceof FormData)u=Am(a.body),m=a.body;else if(a.body instanceof URLSearchParams)u=a.body,m=_b(u);else if(a.body==null)u=new URLSearchParams,m=new FormData;else try{u=new URLSearchParams(a.body),m=_b(u)}catch{return o()}let f={formMethod:i,formAction:c,formEncType:a&&a.formEncType||"application/x-www-form-urlencoded",formData:m,json:void 0,text:void 0};if(fn(f.formMethod))return{path:t,submission:f};let g=Fa(t);return e&&g.search&&fh(g.search)&&u.append("index",""),g.search=`?${u}`,{path:Cn(g),submission:f}}function ub(e,t,a,o,s,i,c,u,m,f,g,b,w,x,S,E,C,U,L,M,D,Y){let J=D?qn(D[1])?D[1].error:D[1].data:void 0,Q=s.createURL(i.location),T=s.createURL(m),$;if(g&&i.errors){let _e=Object.keys(i.errors)[0];$=c.findIndex(de=>de.route.id===_e)}else if(D&&qn(D[1])){let _e=D[0];$=c.findIndex(de=>de.route.id===_e)-1}let ae=D?D[1].statusCode:void 0,Ee=ae&&ae>=400,ye={currentUrl:Q,currentParams:i.matches[0]?.params||{},nextUrl:T,nextParams:c[0].params,...u,actionResult:J,actionStatus:ae},ze=xl(c),Se=c.map((_e,de)=>{let{route:ne}=_e,Z=null;if($!=null&&de>$)Z=!1;else if(ne.lazy)Z=!0;else if(!mh(ne))Z=!1;else if(g){let{shouldLoad:ue}=Nk(ne,i.loaderData,i.errors);Z=ue}else wT(i.loaderData,i.matches[de],_e)&&(Z=!0);if(Z!==null)return Tm(a,o,e,m,ze,_e,f,t,Z);let H=!1;typeof Y=="boolean"?H=Y:Ee?H=!1:(b||Q.pathname+Q.search===T.pathname+T.search||Q.search!==T.search||xT(i.matches[de],_e))&&(H=!0);let N={...ye,defaultShouldRevalidate:H},W=al(_e,N);return Tm(a,o,e,m,ze,_e,f,t,W,N,Y)}),Me=[];return S.forEach((_e,de)=>{if(g||!c.some(ce=>ce.route.id===_e.routeId)||x.has(de))return;let ne=i.fetchers.get(de),Z=ne&&ne.state!=="idle"&&ne.data===void 0,H=ka(C,_e.path,U??"/",!1,M);if(!H){if(L&&Z)return;Me.push({key:de,routeId:_e.routeId,path:_e.path,matches:null,match:null,request:null,controller:null});return}if(E.has(de))return;let N=ad(H,_e.path),W=new AbortController,ue=Es(s,_e.path,W.signal),be=null;if(w.has(de))w.delete(de),be=Ls(a,o,ue,_e.path,H,N,f,t);else if(Z)b&&(be=Ls(a,o,ue,_e.path,H,N,f,t));else{let ce;typeof Y=="boolean"?ce=Y:Ee?ce=!1:ce=b;let pe={...ye,defaultShouldRevalidate:ce};al(N,pe)&&(be=Ls(a,o,ue,_e.path,H,N,f,t,pe))}be&&Me.push({key:de,routeId:_e.routeId,path:_e.path,matches:be,match:N,request:ue,controller:W})}),{dsMatches:Se,revalidatingFetchers:Me}}function mh(e){return e.loader!=null||e.middleware!=null&&e.middleware.length>0}function Nk(e,t,a){if(e.lazy)return{shouldLoad:!0,renderFallback:!0};if(!mh(e))return{shouldLoad:!1,renderFallback:!1};let o=t!=null&&e.id in t,s=a!=null&&a[e.id]!==void 0;if(!o&&s)return{shouldLoad:!1,renderFallback:!1};if(typeof e.loader=="function"&&e.loader.hydrate===!0)return{shouldLoad:!0,renderFallback:!o};let i=!o&&!s;return{shouldLoad:i,renderFallback:i}}function wT(e,t,a){let o=!t||a.route.id!==t.route.id,s=!e.hasOwnProperty(a.route.id);return o||s}function xT(e,t){let a=e.route.path;return e.pathname!==t.pathname||a!=null&&a.endsWith("*")&&e.params["*"]!==t.params["*"]}function al(e,t){if(e.route.shouldRevalidate){let a=e.route.shouldRevalidate(t);if(typeof a=="boolean")return a}return t.defaultShouldRevalidate}function pb(e,t,a,o,s,i){let c;if(e){let f=o[e];Xe(f,`No route found to patch children into: routeId = ${e}`),f.children||(f.children=[]),c=f.children}else c=a.activeRoutes;let u=[],m=[];if(t.forEach(f=>{let g=c.find(b=>Dk(f,b));g?m.push({existingRoute:g,newRoute:f}):u.push(f)}),u.length>0){let f=ll(u,s,[e||"_","patch",String(c?.length||"0")],o);c.push(...f)}if(i&&m.length>0)for(let f=0;f<m.length;f++){let{existingRoute:g,newRoute:b}=m[f],w=g,[x]=ll([b],s,[],{},!0);Object.assign(w,{element:x.element?x.element:w.element,errorElement:x.errorElement?x.errorElement:w.errorElement,hydrateFallbackElement:x.hydrateFallbackElement?x.hydrateFallbackElement:w.hydrateFallbackElement})}a.hasHMRRoutes||a.setRoutes([...a.activeRoutes])}function Dk(e,t){return"id"in e&&"id"in t&&e.id===t.id?!0:e.index===t.index&&e.path===t.path&&e.caseSensitive===t.caseSensitive?(!e.children||e.children.length===0)&&(!t.children||t.children.length===0)?!0:e.children?.every((a,o)=>t.children?.some(s=>Dk(a,s)))??!1:!1}var mb=new WeakMap,Ok=({key:e,route:t,manifest:a,mapRouteProperties:o})=>{let s=a[t.id];if(Xe(s,"No route found in manifest"),!s.lazy||typeof s.lazy!="object")return;let i=s.lazy[e];if(!i)return;let c=mb.get(s);c||(c={},mb.set(s,c));let u=c[e];if(u)return u;let m=(async()=>{let f=jC(e),b=s[e]!==void 0&&e!=="hasErrorBoundary";if(f)Dt(!f,"Route property "+e+" is not a supported lazy route property. This property will be ignored."),c[e]=Promise.resolve();else if(b)Dt(!1,`Route "${s.id}" has a static property "${e}" defined. The lazy property will be ignored.`);else{let w=await i();w!=null&&(Object.assign(s,{[e]:w}),Object.assign(s,o(s)))}typeof s.lazy=="object"&&(s.lazy[e]=void 0,Object.values(s.lazy).every(w=>w===void 0)&&(s.lazy=void 0))})();return c[e]=m,m},hb=new WeakMap;function ST(e,t,a,o,s){let i=a[e.id];if(Xe(i,"No route found in manifest"),!e.lazy)return{lazyRoutePromise:void 0,lazyHandlerPromise:void 0};if(typeof e.lazy=="function"){let g=hb.get(i);if(g)return{lazyRoutePromise:g,lazyHandlerPromise:g};let b=(async()=>{Xe(typeof e.lazy=="function","No lazy route function found");let w=await e.lazy(),x={};for(let S in w){let E=w[S];if(E===void 0)continue;let C=HC(S),L=i[S]!==void 0&&S!=="hasErrorBoundary";C?Dt(!C,"Route property "+S+" is not a supported property to be returned from a lazy route function. This property will be ignored."):L?Dt(!L,`Route "${i.id}" has a static property "${S}" defined but its lazy function is also returning a value for this property. The lazy route property "${S}" will be ignored.`):x[S]=E}Object.assign(i,x),Object.assign(i,{...o(i),lazy:void 0})})();return hb.set(i,b),b.catch(()=>{}),{lazyRoutePromise:b,lazyHandlerPromise:b}}let c=Object.keys(e.lazy),u=[],m;for(let g of c){if(s&&s.includes(g))continue;let b=Ok({key:g,route:e,manifest:a,mapRouteProperties:o});b&&(u.push(b),g===t&&(m=b))}let f=u.length>0?Promise.all(u).then(()=>{}):void 0;return f?.catch(()=>{}),m?.catch(()=>{}),{lazyRoutePromise:f,lazyHandlerPromise:m}}async function fb(e){let t=e.matches.filter(s=>s.shouldLoad),a={};return(await Promise.all(t.map(s=>s.resolve()))).forEach((s,i)=>{a[t[i].route.id]=s}),a}async function CT(e){return e.matches.some(t=>t.route.middleware)?Lk(e,()=>fb(e)):fb(e)}function Lk(e,t){return TT(e,t,o=>{if(HT(o))throw o;return o},MT,a);function a(o,s,i){if(i)return Promise.resolve(Object.assign(i.value,{[s]:{type:"error",result:o}}));{let{matches:c}=e,u=Math.min(Math.max(c.findIndex(f=>f.route.id===s),0),Math.max(c.findIndex(f=>f.shouldCallHandler()),0)),m=qr(c,c[u].route.id).route.id;return Promise.resolve({[m]:{type:"error",result:o}})}}}async function TT(e,t,a,o,s){let{matches:i,...c}=e,u=i.flatMap(f=>f.route.middleware?f.route.middleware.map(g=>[f.route.id,g]):[]);return await Mk(c,u,t,a,o,s)}async function Mk(e,t,a,o,s,i,c=0){let{request:u}=e;if(u.signal.aborted)throw u.signal.reason??new Error(`Request aborted: ${u.method} ${u.url}`);let m=t[c];if(!m)return await a();let[f,g]=m,b,w=async()=>{if(b)throw new Error("You may only call `next()` once per middleware");try{return b={value:await Mk(e,t,a,o,s,i,c+1)},b.value}catch(x){return b={value:await i(x,f,b)},b.value}};try{let x=await g(e,w),S=x!=null?o(x):void 0;return s(S)?S:b?S??b.value:(b={value:await w()},b.value)}catch(x){return await i(x,f,b)}}function zk(e,t,a,o,s){let i=Ok({key:"middleware",route:o.route,manifest:t,mapRouteProperties:e}),c=ST(o.route,fn(a.method)?"action":"loader",t,e,s);return{middleware:i,route:c.lazyRoutePromise,handler:c.lazyHandlerPromise}}function Tm(e,t,a,o,s,i,c,u,m,f=null,g){let b=!1,w=zk(e,t,a,i,c);return{...i,_lazyPromises:w,shouldLoad:m,shouldRevalidateArgs:f,shouldCallHandler(x){return b=!0,f?typeof g=="boolean"?al(i,{...f,defaultShouldRevalidate:g}):typeof x=="boolean"?al(i,{...f,defaultShouldRevalidate:x}):al(i,f):m},resolve(x){let{lazy:S,loader:E,middleware:C}=i.route,U=b||m||x&&!fn(a.method)&&(S||E),L=C&&C.length>0&&!E&&!S;return U&&(fn(a.method)||!L)?AT({request:a,path:o,pattern:s,match:i,lazyHandlerPromise:w?.handler,lazyRoutePromise:w?.route,handlerOverride:x,scopedContext:u}):Promise.resolve({type:"data",result:void 0})}}}function Ls(e,t,a,o,s,i,c,u,m=null){return s.map(f=>f.route.id!==i.route.id?{...f,shouldLoad:!1,shouldRevalidateArgs:m,shouldCallHandler:()=>!1,_lazyPromises:zk(e,t,a,f,c),resolve:()=>Promise.resolve({type:"data",result:void 0})}:Tm(e,t,a,o,xl(s),f,c,u,!0,m))}async function ET(e,t,a,o,s,i,c){o.some(g=>g._lazyPromises?.middleware)&&await Promise.all(o.map(g=>g._lazyPromises?.middleware));let u={request:t,url:jk(t,a),pattern:xl(o),params:o[0].params,context:i,matches:o},f=await e({...u,fetcherKey:s,runClientMiddleware:g=>{let b=u;return Lk(b,()=>g({...b,fetcherKey:s,runClientMiddleware:()=>{throw new Error("Cannot call `runClientMiddleware()` from within an `runClientMiddleware` handler")}}))}});try{await Promise.all(o.flatMap(g=>[g._lazyPromises?.handler,g._lazyPromises?.route]))}catch{}return f}async function AT({request:e,path:t,pattern:a,match:o,lazyHandlerPromise:s,lazyRoutePromise:i,handlerOverride:c,scopedContext:u}){let m,f,g=fn(e.method),b=g?"action":"loader",w=x=>{let S,E=new Promise((L,M)=>S=M);f=()=>S(),e.signal.addEventListener("abort",f);let C=L=>typeof x!="function"?Promise.reject(new Error(`You cannot call the handler for a route which defines a boolean "${b}" [routeId: ${o.route.id}]`)):x({request:e,url:jk(e,t),pattern:a,params:o.params,context:u},...L!==void 0?[L]:[]),U=(async()=>{try{return{type:"data",result:await(c?c(M=>C(M)):C())}}catch(L){return{type:"error",result:L}}})();return Promise.race([U,E])};try{let x=g?o.route.action:o.route.loader;if(s||i)if(x){let S,[E]=await Promise.all([w(x).catch(C=>{S=C}),s,i]);if(S!==void 0)throw S;m=E}else{await s;let S=g?o.route.action:o.route.loader;if(S)[m]=await Promise.all([w(S),i]);else if(b==="action"){let E=new URL(e.url),C=E.pathname+E.search;throw aa(405,{method:e.method,pathname:C,routeId:o.route.id})}else return{type:"data",result:void 0}}else if(x)m=await w(x);else{let S=new URL(e.url),E=S.pathname+S.search;throw aa(404,{pathname:E})}}catch(x){return{type:"error",result:x}}finally{f&&e.signal.removeEventListener("abort",f)}return m}async function PT(e){let t=e.headers.get("Content-Type");return t&&/\bapplication\/json\b/.test(t)?e.body==null?null:e.json():e.text()}async function RT(e){let{result:t,type:a}=e;if(hh(t)){let o;try{o=await PT(t)}catch(s){return{type:"error",error:s}}return a==="error"?{type:"error",error:new wl(t.status,t.statusText,o),statusCode:t.status,headers:t.headers}:{type:"data",data:o,statusCode:t.status,headers:t.headers}}return a==="error"?vb(t)?t.data instanceof Error?{type:"error",error:t.data,statusCode:t.init?.status,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:"error",error:LT(t),statusCode:cl(t)?t.status:void 0,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:"error",error:t,statusCode:cl(t)?t.status:void 0}:vb(t)?{type:"data",data:t.data,statusCode:t.init?.status,headers:t.init?.headers?new Headers(t.init.headers):void 0}:{type:"data",data:t}}function IT(e,t,a,o,s){let i=e.headers.get("Location");if(Xe(i,"Redirects returned/thrown from loaders/actions must have a Location header"),!dh(i)){let c=o.slice(0,o.findIndex(u=>u.route.id===a)+1);i=Cm(new URL(t.url),c,s,i),e.headers.set("Location",i)}return e}var NT=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];function Em(e){try{return NT.includes(new URL(e).protocol)}catch{return!1}}function gb(e,t,a,o){if(dh(e)){let s=e,i=Ud.test(s)?new URL(_k(s,t.protocol)):new URL(s);if(Em(i.toString()))throw new Error("Invalid redirect location");let c=ia(i.pathname,a)!=null;if(i.origin===t.origin&&c)return uh(i.pathname)+i.search+i.hash}try{let s=o.createURL(e);if(Em(s.toString()))throw new Error("Invalid redirect location")}catch{}return e}function Es(e,t,a,o){let s=e.createURL(Uk(t)).toString(),i={signal:a};if(o&&fn(o.formMethod)){let{formMethod:c,formEncType:u}=o;i.method=c.toUpperCase(),u==="application/json"?(i.headers=new Headers({"Content-Type":u}),i.body=JSON.stringify(o.json)):u==="text/plain"?i.body=o.text:u==="application/x-www-form-urlencoded"&&o.formData?i.body=Am(o.formData):i.body=o.formData}return new Request(s,i)}function jk(e,t){let a=new URL(e.url),o=typeof t=="string"?Fa(t):t;if(a.pathname=o.pathname||"/",o.search){let s=new URLSearchParams(o.search),i=s.getAll("index");s.delete("index");for(let c of i.filter(Boolean))s.append("index",c);a.search=s.size?`?${s.toString()}`:""}else a.search="";return a.hash=o.hash||"",a}function Am(e){let t=new URLSearchParams;for(let[a,o]of e.entries())t.append(a,typeof o=="string"?o:o.name);return t}function _b(e){let t=new FormData;for(let[a,o]of e.entries())t.append(a,o);return t}function DT(e,t,a,o=!1,s=!1){let i={},c=null,u,m=!1,f={},g=a&&qn(a[1])?a[1].error:void 0;return e.forEach(b=>{if(!(b.route.id in t))return;let w=b.route.id,x=t[w];if(Xe(!Eo(x),"Cannot handle redirect results in processLoaderData"),qn(x)){let S=x.error;if(g!==void 0&&(S=g,g=void 0),c=c||{},s)c[w]=S;else{let E=qr(e,w);c[E.route.id]==null&&(c[E.route.id]=S)}o||(i[w]=Ik),m||(m=!0,u=cl(x.error)?x.error.status:500),x.headers&&(f[w]=x.headers)}else i[w]=x.data,x.statusCode&&x.statusCode!==200&&!m&&(u=x.statusCode),x.headers&&(f[w]=x.headers)}),g!==void 0&&a&&(c={[a[0]]:g},a[2]&&(i[a[2]]=void 0)),{loaderData:i,errors:c,statusCode:u||200,loaderHeaders:f}}function bb(e,t,a,o,s,i,c){let{loaderData:u,errors:m}=DT(t,a,o);return s.filter(f=>!f.matches||f.matches.some(g=>g.shouldLoad)).forEach(f=>{let{key:g,match:b,controller:w}=f;if(w&&w.signal.aborted)return;let x=i[g];if(Xe(x,"Did not find corresponding fetcher result"),qn(x)){let S=qr(e.matches,b?.route.id);m&&m[S.route.id]||(m={...m,[S.route.id]:x.error}),c.delete(g)}else if(Eo(x))Xe(!1,"Unhandled fetcher revalidation redirect");else{let S=Na(x.data);c.set(g,S)}}),{loaderData:u,errors:m}}function yb(e,t,a,o){let s=Object.entries(t).filter(([,i])=>i!==Ik).reduce((i,[c,u])=>(i[c]=u,i),{});for(let i of a){let c=i.route.id;if(!t.hasOwnProperty(c)&&e.hasOwnProperty(c)&&i.route.loader&&(s[c]=e[c]),o&&o.hasOwnProperty(c))break}return s}function kb(e){return e?qn(e[1])?{actionData:{}}:{actionData:{[e[0]]:e[1].data}}:{}}function qr(e,t){return(t?e.slice(0,e.findIndex(o=>o.route.id===t)+1):[...e]).reverse().find(o=>o.route.hasErrorBoundary===!0)||e[0]}function Uc(e){let t=e.length===1?e[0]:e.find(a=>a.index||!a.path||a.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function aa(e,{pathname:t,routeId:a,method:o,type:s,message:i}={}){let c="Unknown Server Error",u="Unknown @remix-run/router error";return e===400?(c="Bad Request",o&&t&&a?u=`You made a ${o} request to "${t}" but did not provide a \`loader\` for route "${a}", so there is no way to handle the request.`:s==="invalid-body"&&(u="Unable to encode submission body")):e===403?(c="Forbidden",u=`Route "${a}" does not match URL "${t}"`):e===404?(c="Not Found",u=`No route matches URL "${t}"`):e===405&&(c="Method Not Allowed",o&&t&&a?u=`You made a ${o.toUpperCase()} request to "${t}" but did not provide an \`action\` for route "${a}", so there is no way to handle the request.`:o&&(u=`Invalid request method "${o.toUpperCase()}"`)),new wl(e||500,c,new Error(u),!0)}function Hc(e){let t=Object.entries(e);for(let a=t.length-1;a>=0;a--){let[o,s]=t[a];if(Eo(s))return{key:o,result:s}}}function Uk(e){let t=typeof e=="string"?Fa(e):e;return Cn({...t,hash:""})}function OT(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function LT(e){return new wl(e.init?.status??500,e.init?.statusText??"Internal Server Error",e.data)}function MT(e){return e!=null&&typeof e=="object"&&Object.entries(e).every(([t,a])=>typeof t=="string"&&zT(a))}function zT(e){return e!=null&&typeof e=="object"&&"type"in e&&"result"in e&&(e.type==="data"||e.type==="error")}function jT(e){return hh(e.result)&&Pk.has(e.result.status)}function qn(e){return e.type==="error"}function Eo(e){return(e&&e.type)==="redirect"}function vb(e){return typeof e=="object"&&e!=null&&"type"in e&&"data"in e&&"init"in e&&e.type==="DataWithResponseInit"}function hh(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function UT(e){return Pk.has(e)}function HT(e){return hh(e)&&UT(e.status)&&e.headers.has("Location")}function FT(e){return fT.has(e.toUpperCase())}function fn(e){return mT.has(e.toUpperCase())}function fh(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function ad(e,t){let a=typeof t=="string"?Fa(t).search:t.search;if(e[e.length-1].route.index&&fh(a||""))return e[e.length-1];let o=Sk(e);return o[o.length-1]}function wb(e){let{formMethod:t,formAction:a,formEncType:o,text:s,formData:i,json:c}=e;if(!(!t||!a||!o)){if(s!=null)return{formMethod:t,formAction:a,formEncType:o,formData:void 0,json:void 0,text:s};if(i!=null)return{formMethod:t,formAction:a,formEncType:o,formData:i,json:void 0,text:void 0};if(c!==void 0)return{formMethod:t,formAction:a,formEncType:o,formData:void 0,json:c,text:void 0}}}function Vp(e,t,a,o){return o?{state:"loading",location:e,matches:t,historyAction:a,formMethod:o.formMethod,formAction:o.formAction,formEncType:o.formEncType,formData:o.formData,json:o.json,text:o.text}:{state:"loading",location:e,matches:t,historyAction:a,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function BT(e,t,a,o){return{state:"submitting",location:e,matches:t,historyAction:a,formMethod:o.formMethod,formAction:o.formAction,formEncType:o.formEncType,formData:o.formData,json:o.json,text:o.text}}function qi(e,t){return e?{state:"loading",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:t}}function GT(e,t){return{state:"submitting",formMethod:e.formMethod,formAction:e.formAction,formEncType:e.formEncType,formData:e.formData,json:e.json,text:e.text,data:t?t.data:void 0}}function Na(e){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:e}}function $T(e,t){try{let a=e.sessionStorage.getItem(Rk);if(a){let o=JSON.parse(a);for(let[s,i]of Object.entries(o||{}))i&&Array.isArray(i)&&t.set(s,new Set(i||[]))}}catch{}}function qT(e,t){if(t.size>0){let a={};for(let[o,s]of t)a[o]=[...s];try{e.sessionStorage.setItem(Rk,JSON.stringify(a))}catch(o){Dt(!1,`Failed to save applied view transitions in sessionStorage (${o}).`)}}}function xb(){let e,t,a=new Promise((o,s)=>{e=async i=>{o(i);try{await a}catch{}},t=async i=>{s(i);try{await a}catch{}}});return{promise:a,resolve:e,reject:t}}var Go=k.createContext(null);Go.displayName="DataRouter";var Sl=k.createContext(null);Sl.displayName="DataRouterState";var Hk=k.createContext(!1);function Fk(){return k.useContext(Hk)}var gh=k.createContext({isTransitioning:!1});gh.displayName="ViewTransition";var Bk=k.createContext(new Map);Bk.displayName="Fetchers";var KT=k.createContext(null);KT.displayName="Await";var Vn=k.createContext(null);Vn.displayName="Navigation";var Fd=k.createContext(null);Fd.displayName="Location";var Ba=k.createContext({outlet:null,matches:[],isDataRoute:!1});Ba.displayName="Route";var _h=k.createContext(null);_h.displayName="RouteError";var Gk="REACT_ROUTER_ERROR",VT="REDIRECT",WT="ROUTE_ERROR_RESPONSE";function YT(e){if(e.startsWith(`${Gk}:${VT}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t=="object"&&t&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.location=="string"&&typeof t.reloadDocument=="boolean"&&typeof t.replace=="boolean")return t}catch{}}function ZT(e){if(e.startsWith(`${Gk}:${WT}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t=="object"&&t&&typeof t.status=="number"&&typeof t.statusText=="string")return new wl(t.status,t.statusText,t.data)}catch{}}function QT(e,{relative:t}={}){Xe(Ys(),"useHref() may be used only in the context of a <Router> component.");let{basename:a,navigator:o}=k.useContext(Vn),{hash:s,pathname:i,search:c}=Cl(e,{relative:t}),u=i;return a!=="/"&&(u=i==="/"?a:oa([a,i])),o.createHref({pathname:u,search:c,hash:s})}function Ys(){return k.useContext(Fd)!=null}function An(){return Xe(Ys(),"useLocation() may be used only in the context of a <Router> component."),k.useContext(Fd).location}var $k="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function qk(e){k.useContext(Vn).static||k.useLayoutEffect(e)}function Xr(){let{isDataRoute:e}=k.useContext(Ba);return e?dE():JT()}function JT(){Xe(Ys(),"useNavigate() may be used only in the context of a <Router> component.");let e=k.useContext(Go),{basename:t,navigator:a}=k.useContext(Vn),{matches:o}=k.useContext(Ba),{pathname:s}=An(),i=JSON.stringify(Hd(o)),c=k.useRef(!1);return qk(()=>{c.current=!0}),k.useCallback((m,f={})=>{if(Dt(c.current,$k),!c.current)return;if(typeof m=="number"){a.go(m);return}let g=vl(m,JSON.parse(i),s,f.relative==="path");e==null&&t!=="/"&&(g.pathname=g.pathname==="/"?t:oa([t,g.pathname])),Os(typeof m=="string"?m:Cn(m),a.createHref(g),ph(a),"reject"),(f.replace?a.replace:a.push)(g,f.state,f)},[t,a,i,s,e])}k.createContext(null);function Cl(e,{relative:t}={}){let{matches:a}=k.useContext(Ba),{pathname:o}=An(),s=JSON.stringify(Hd(a));return k.useMemo(()=>vl(e,JSON.parse(s),o,t==="path"),[e,s,o,t])}function XT(e,t,a){Xe(Ys(),"useRoutes() may be used only in the context of a <Router> component.");let{navigator:o}=k.useContext(Vn),{matches:s}=k.useContext(Ba),i=s[s.length-1],c=i?i.params:{},u=i?i.pathname:"/",m=i?i.pathnameBase:"/",f=i&&i.route;{let C=f&&f.path||"";Vk(u,!f||C.endsWith("*")||C.endsWith("*?"),`You rendered descendant <Routes> (or called \`useRoutes()\`) at "${u}" (under <Route path="${C}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
11
-
12
- Please change the parent <Route path="${C}"> to <Route path="${C==="/"?"*":`${C}/*`}">.`)}let g=An(),b;b=g;let w=b.pathname||"/",x=w;if(m!=="/"){let C=m.replace(/^\//,"").split("/");x="/"+w.replace(/^\//,"").split("/").slice(C.length).join("/")}let S=a&&a.state.matches.length?a.state.matches.map(C=>Object.assign(C,{route:a.manifest[C.route.id]||C.route})):yk(e,{pathname:x});return Dt(f||S!=null,`No routes matched location "${b.pathname}${b.search}${b.hash}" `),Dt(S==null||S[S.length-1].route.element!==void 0||S[S.length-1].route.Component!==void 0||S[S.length-1].route.lazy!==void 0,`Matched leaf route at location "${b.pathname}${b.search}${b.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.`),rE(S&&S.map(C=>Object.assign({},C,{params:Object.assign({},c,C.params),pathname:oa([m,o.encodeLocation?o.encodeLocation(C.pathname.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:C.pathname]),pathnameBase:C.pathnameBase==="/"?m:oa([m,o.encodeLocation?o.encodeLocation(C.pathnameBase.replace(/%/g,"%25").replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:C.pathnameBase])})),s,a)}function eE(){let e=cE(),t=cl(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),a=e instanceof Error?e.stack:null,o="rgba(200,200,200, 0.5)",s={padding:"0.5rem",backgroundColor:o},i={padding:"2px 4px",backgroundColor:o},c=null;return console.error("Error handled by React Router default ErrorBoundary:",e),c=k.createElement(k.Fragment,null,k.createElement("p",null,"💿 Hey developer 👋"),k.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",k.createElement("code",{style:i},"ErrorBoundary")," or"," ",k.createElement("code",{style:i},"errorElement")," prop on your route.")),k.createElement(k.Fragment,null,k.createElement("h2",null,"Unexpected Application Error!"),k.createElement("h3",{style:{fontStyle:"italic"}},t),a?k.createElement("pre",{style:s},a):null,c)}var tE=k.createElement(eE,null),Kk=class extends k.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!=="idle"&&e.revalidation==="idle"?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error!==void 0?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error("React Router caught the following error during render",e)}render(){let e=this.state.error;if(this.context&&typeof e=="object"&&e&&"digest"in e&&typeof e.digest=="string"){const a=ZT(e.digest);a&&(e=a)}let t=e!==void 0?k.createElement(Ba.Provider,{value:this.props.routeContext},k.createElement(_h.Provider,{value:e,children:this.props.component})):this.props.children;return this.context?k.createElement(nE,{error:e},t):t}};Kk.contextType=Hk;var Wp=new WeakMap;function nE({children:e,error:t}){let{basename:a,navigator:o}=k.useContext(Vn);if(typeof t=="object"&&t&&"digest"in t&&typeof t.digest=="string"){let s=YT(t.digest);if(s){let i=Wp.get(t);if(i)throw i;let c=Tk(s.location,a),u=c.absoluteURL||c.to;if(Os(s.location,u,ph(o),"allow-explicit"),Em(u))throw new Error("Invalid redirect location");if(Ck&&!Wp.get(t))if(c.isExternal||s.reloadDocument)window.location.href=u;else{const m=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(c.to,{replace:s.replace}));throw Wp.set(t,m),m}return k.createElement("meta",{httpEquiv:"refresh",content:`0;url=${u}`})}}return e}function aE({routeContext:e,match:t,children:a}){let o=k.useContext(Go);return o&&o.static&&o.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(o.staticContext._deepestRenderedBoundaryId=t.route.id),k.createElement(Ba.Provider,{value:e},a)}function rE(e,t=[],a){let o=a?.state;if(e==null){if(!o)return null;if(o.errors)e=o.matches;else if(t.length===0&&!o.initialized&&o.matches.length>0)e=o.matches;else return null}let s=e,i=o?.errors;if(i!=null){let g=s.findIndex(b=>b.route.id&&i?.[b.route.id]!==void 0);Xe(g>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(i).join(",")}`),s=s.slice(0,Math.min(s.length,g+1))}let c=!1,u=-1;if(a&&o){c=o.renderFallback;for(let g=0;g<s.length;g++){let b=s[g];if((b.route.HydrateFallback||b.route.hydrateFallbackElement)&&(u=g),b.route.id){let{loaderData:w,errors:x}=o,S=b.route.loader&&!w.hasOwnProperty(b.route.id)&&(!x||x[b.route.id]===void 0);if(b.route.lazy||S){a.isStatic&&(c=!0),u>=0?s=s.slice(0,u+1):s=[s[0]];break}}}}let m=a?.onError,f=o&&m?(g,b)=>{m(g,{location:o.location,params:o.matches?.[0]?.params??{},pattern:xl(o.matches),errorInfo:b})}:void 0;return s.reduceRight((g,b,w)=>{let x,S=!1,E=null,C=null;o&&(x=i&&b.route.id?i[b.route.id]:void 0,E=b.route.errorElement||tE,c&&(u<0&&w===0?(Vk("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),S=!0,C=null):u===w&&(S=!0,C=b.route.hydrateFallbackElement||null)));let U=t.concat(s.slice(0,w+1)),L=()=>{let M;return x?M=E:S?M=C:b.route.Component?M=k.createElement(b.route.Component,null):b.route.element?M=b.route.element:M=g,k.createElement(aE,{match:b,routeContext:{outlet:g,matches:U,isDataRoute:o!=null},children:M})};return o&&(b.route.ErrorBoundary||b.route.errorElement||w===0)?k.createElement(Kk,{location:o.location,revalidation:o.revalidation,component:E,error:x,children:L(),routeContext:{outlet:null,matches:U,isDataRoute:!0},onError:f}):L()},null)}function bh(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function oE(e){let t=k.useContext(Go);return Xe(t,bh(e)),t}function sE(e){let t=k.useContext(Sl);return Xe(t,bh(e)),t}function iE(e){let t=k.useContext(Ba);return Xe(t,bh(e)),t}function yh(e){let t=iE(e),a=t.matches[t.matches.length-1];return Xe(a.route.id,`${e} can only be used on routes that contain a unique "id"`),a.route.id}function lE(){return yh("useRouteId")}function cE(){let e=k.useContext(_h),t=sE("useRouteError"),a=yh("useRouteError");return e!==void 0?e:t.errors?.[a]}function dE(){let{router:e}=oE("useNavigate"),t=yh("useNavigate"),a=k.useRef(!1);return qk(()=>{a.current=!0}),k.useCallback(async(s,i={})=>{Dt(a.current,$k),a.current&&(typeof s=="number"?await e.navigate(s):await e.navigate(s,{fromRouteId:t,...i}))},[e,t])}var Sb={};function Vk(e,t,a){!t&&!Sb[e]&&(Sb[e]=!0,Dt(!1,a))}var Cb={};function Tb(e,t){!e&&!Cb[t]&&(Cb[t]=!0,console.warn(t))}var uE="useOptimistic",Eb=mk[uE],pE=()=>{};function mE(e){return Eb?Eb(e):[e,pE]}function hE(e){let t={hasErrorBoundary:e.hasErrorBoundary||e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&(e.element&&Dt(!1,"You should not include both `Component` and `element` on your route - `Component` will be used."),Object.assign(t,{element:k.createElement(e.Component),Component:void 0})),e.HydrateFallback&&(e.hydrateFallbackElement&&Dt(!1,"You should not include both `HydrateFallback` and `hydrateFallbackElement` on your route - `HydrateFallback` will be used."),Object.assign(t,{hydrateFallbackElement:k.createElement(e.HydrateFallback),HydrateFallback:void 0})),e.ErrorBoundary&&(e.errorElement&&Dt(!1,"You should not include both `ErrorBoundary` and `errorElement` on your route - `ErrorBoundary` will be used."),Object.assign(t,{errorElement:k.createElement(e.ErrorBoundary),ErrorBoundary:void 0})),t}var fE=["HydrateFallback","hydrateFallbackElement"],gE=class{constructor(){this.status="pending",this.promise=new Promise((e,t)=>{this.resolve=a=>{this.status==="pending"&&(this.status="resolved",e(a))},this.reject=a=>{this.status==="pending"&&(this.status="rejected",t(a))}})}};function _E({router:e,flushSync:t,onError:a,useTransitions:o}){o=Fk()||o;let[i,c]=k.useState(e.state),[u,m]=mE(i),[f,g]=k.useState(),[b,w]=k.useState({isTransitioning:!1}),[x,S]=k.useState(),[E,C]=k.useState(),[U,L]=k.useState(),M=k.useRef(new Map),D=k.useCallback((T,{deletedFetchers:$,newErrors:ae,flushSync:Ee,viewTransitionOpts:ye})=>{ae&&a&&Object.values(ae).forEach(Se=>a(Se,{location:T.location,params:T.matches[0]?.params??{},pattern:xl(T.matches)})),T.fetchers.forEach((Se,Me)=>{Se.data!==void 0&&M.current.set(Me,Se.data)}),$.forEach(Se=>M.current.delete(Se)),Tb(Ee===!1||t!=null,'You provided the `flushSync` option to a router update, but you are not using the `<RouterProvider>` from `react-router/dom` so `ReactDOM.flushSync()` is unavailable. Please update your app to `import { RouterProvider } from "react-router/dom"` and ensure you have `react-dom` installed as a dependency to use the `flushSync` option.');let ze=e.window!=null&&e.window.document!=null&&typeof e.window.document.startViewTransition=="function";if(Tb(ye==null||ze,"You provided the `viewTransition` option to a router update, but you do not appear to be running in a DOM environment as `window.startViewTransition` is not available."),!ye||!ze){t&&Ee?t(()=>c(T)):o===!1?c(T):k.startTransition(()=>{o===!0&&m(Se=>Ab(Se,T)),c(T)});return}if(t&&Ee){t(()=>{E&&(x?.resolve(),E.skipTransition()),w({isTransitioning:!0,flushSync:!0,currentLocation:ye.currentLocation,nextLocation:ye.nextLocation})});let Se=e.window.document.startViewTransition(()=>{t(()=>c(T))});Se.finished.finally(()=>{t(()=>{S(void 0),C(void 0),g(void 0),w({isTransitioning:!1})})}),t(()=>C(Se));return}E?(x?.resolve(),E.skipTransition(),L({state:T,currentLocation:ye.currentLocation,nextLocation:ye.nextLocation})):(g(T),w({isTransitioning:!0,flushSync:!1,currentLocation:ye.currentLocation,nextLocation:ye.nextLocation}))},[e.window,t,E,x,o,m,a]);k.useLayoutEffect(()=>e.subscribe(D),[e,D]),k.useEffect(()=>{b.isTransitioning&&!b.flushSync&&S(new gE)},[b]),k.useEffect(()=>{if(x&&f&&e.window){let T=f,$=x.promise,ae=e.window.document.startViewTransition(async()=>{o===!1?c(T):k.startTransition(()=>{o===!0&&m(Ee=>Ab(Ee,T)),c(T)}),await $});ae.finished.finally(()=>{S(void 0),C(void 0),g(void 0),w({isTransitioning:!1})}),C(ae)}},[f,x,e.window,o,m]),k.useEffect(()=>{x&&f&&u.location.key===f.location.key&&x.resolve()},[x,E,u.location,f]),k.useEffect(()=>{!b.isTransitioning&&U&&(g(U.state),w({isTransitioning:!0,flushSync:!1,currentLocation:U.currentLocation,nextLocation:U.nextLocation}),L(void 0))},[b.isTransitioning,U]);let Y=k.useMemo(()=>({createHref:e.createHref,createURL:e.createURL,encodeLocation:e.encodeLocation,go:T=>e.navigate(T),push:(T,$,ae)=>e.navigate(T,{state:$,preventScrollReset:ae?.preventScrollReset}),replace:(T,$,ae)=>e.navigate(T,{replace:!0,state:$,preventScrollReset:ae?.preventScrollReset})}),[e]),J=e.basename||"/",Q=k.useMemo(()=>({router:e,navigator:Y,static:!1,basename:J,onError:a}),[e,Y,J,a]);return k.createElement(k.Fragment,null,k.createElement(Go.Provider,{value:Q},k.createElement(Sl.Provider,{value:u},k.createElement(Bk.Provider,{value:M.current},k.createElement(gh.Provider,{value:b},k.createElement(vE,{basename:J,location:u.location,navigationType:u.historyAction,navigator:Y,useTransitions:o},k.createElement(bE,{routes:e.routes,manifest:e.manifest,future:e.future,state:u,isStatic:!1,onError:a})))))),null)}function Ab(e,t){return{...e,navigation:t.navigation.state!=="idle"?t.navigation:e.navigation,revalidation:t.revalidation!=="idle"?t.revalidation:e.revalidation,actionData:t.navigation.state!=="submitting"?t.actionData:e.actionData,fetchers:t.fetchers}}var bE=k.memo(yE);function yE({routes:e,manifest:t,future:a,state:o,isStatic:s,onError:i}){return XT(e,void 0,{manifest:t,state:o,isStatic:s,onError:i})}function kE({to:e,replace:t,state:a,relative:o}){Xe(Ys(),"<Navigate> may be used only in the context of a <Router> component.");let{static:s,navigator:i}=k.useContext(Vn);Dt(!s,"<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.");let{matches:c}=k.useContext(Ba),{pathname:u}=An(),m=Xr(),f=vl(e,Hd(c),u,o==="path");Os(typeof e=="string"?e:Cn(e),i.createHref(f),ph(i),"reject");let g=JSON.stringify(f);return k.useEffect(()=>{m(JSON.parse(g),{replace:t,state:a,relative:o})},[m,g,o,t,a]),null}function vE({basename:e="/",children:t=null,location:a,navigationType:o="POP",navigator:s,static:i=!1,useTransitions:c}){Xe(!Ys(),"You cannot render a <Router> inside another <Router>. You should never have more than one in your app.");let u=e.replace(/^\/*/,"/"),m=k.useMemo(()=>({basename:u,navigator:s,static:i,useTransitions:c,future:{}}),[u,s,i,c]);typeof a=="string"&&(a=Fa(a));let{pathname:f="/",search:g="",hash:b="",state:w=null,key:x="default",mask:S}=a,E=k.useMemo(()=>{let C=ia(f,u);return C==null?null:{location:{pathname:C,search:g,hash:b,state:w,key:x,mask:S},navigationType:o}},[u,f,g,b,w,x,o,S]);return Dt(E!=null,`<Router basename="${u}"> is not able to match the URL "${f}${g}${b}" because it does not start with the basename, so the <Router> won't render anything.`),E==null?null:k.createElement(Vn.Provider,{value:m},k.createElement(Fd.Provider,{children:t,value:E}))}var rd="get",od="application/x-www-form-urlencoded";function Bd(e){return typeof HTMLElement<"u"&&e instanceof HTMLElement}function wE(e){return Bd(e)&&e.tagName.toLowerCase()==="button"}function xE(e){return Bd(e)&&e.tagName.toLowerCase()==="form"}function SE(e){return Bd(e)&&e.tagName.toLowerCase()==="input"}function CE(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function TE(e,t){return e.button===0&&(!t||t==="_self")&&!CE(e)}function Pm(e=""){return new URLSearchParams(typeof e=="string"||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,a)=>{let o=e[a];return t.concat(Array.isArray(o)?o.map(s=>[a,s]):[[a,o]])},[]))}function EE(e,t){let a=Pm(e);return t&&t.forEach((o,s)=>{a.has(s)||t.getAll(s).forEach(i=>{a.append(s,i)})}),a}var Fc=null;function AE(){if(Fc===null)try{new FormData(document.createElement("form"),0),Fc=!1}catch{Fc=!0}return Fc}var PE=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Yp(e){return e!=null&&!PE.has(e)?(Dt(!1,`"${e}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${od}"`),null):e}function RE(e,t){let a,o,s,i,c;if(xE(e)){let u=e.getAttribute("action");o=u?ia(u,t):null,a=e.getAttribute("method")||rd,s=Yp(e.getAttribute("enctype"))||od,i=new FormData(e)}else if(wE(e)||SE(e)&&(e.type==="submit"||e.type==="image")){let u=e.form;if(u==null)throw new Error('Cannot submit a <button> or <input type="submit"> without a <form>');let m=e.getAttribute("formaction")||u.getAttribute("action");if(o=m?ia(m,t):null,a=e.getAttribute("formmethod")||u.getAttribute("method")||rd,s=Yp(e.getAttribute("formenctype"))||Yp(u.getAttribute("enctype"))||od,i=new FormData(u,e),!AE()){let{name:f,type:g,value:b}=e;if(g==="image"){let w=f?`${f}.`:"";i.append(`${w}x`,"0"),i.append(`${w}y`,"0")}else f&&i.append(f,b)}}else{if(Bd(e))throw new Error('Cannot submit element that is not <form>, <button>, or <input type="submit|image">');a=rd,o=null,s=od,c=e}return i&&s==="text/plain"&&(c=i,i=void 0),{action:o,method:a.toLowerCase(),encType:s,formData:i,body:c}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function kh(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function Wk(e,t,a,o){let s=typeof e=="string"?new URL(e,typeof window>"u"?"server://singlefetch/":window.location.origin):e;return a?s.pathname.endsWith("/")?s.pathname=`${s.pathname}_.${o}`:s.pathname=`${s.pathname}.${o}`:s.pathname==="/"?s.pathname=`_root.${o}`:t&&ia(s.pathname,t)==="/"?s.pathname=`${Fs(t)}/_root.${o}`:s.pathname=`${Fs(s.pathname)}.${o}`,s}async function IE(e,t){if(e.id in t)return t[e.id];try{let a=await import(e.module);return t[e.id]=a,a}catch(a){return console.error(`Error loading route module \`${e.module}\`, reloading page...`),console.error(a),window.__reactRouterContext&&window.__reactRouterContext.isSpaMode,window.location.reload(),new Promise(()=>{})}}function NE(e){return e==null?!1:e.href==null?e.rel==="preload"&&typeof e.imageSrcSet=="string"&&typeof e.imageSizes=="string":typeof e.rel=="string"&&typeof e.href=="string"}async function DE(e,t,a){let o=await Promise.all(e.map(async s=>{let i=t.routes[s.route.id];if(i){let c=await IE(i,a);return c.links?c.links():[]}return[]}));return zE(o.flat(1).filter(NE).filter(s=>s.rel==="stylesheet"||s.rel==="preload").map(s=>s.rel==="stylesheet"?{...s,rel:"prefetch",as:"style"}:{...s,rel:"prefetch"}))}function Pb(e,t,a,o,s,i){let c=(m,f)=>a[f]?m.route.id!==a[f].route.id:!0,u=(m,f)=>a[f].pathname!==m.pathname||a[f].route.path?.endsWith("*")&&a[f].params["*"]!==m.params["*"];return i==="assets"?t.filter((m,f)=>c(m,f)||u(m,f)):i==="data"?t.filter((m,f)=>{let g=o.routes[m.route.id];if(!g||!g.hasLoader)return!1;if(c(m,f)||u(m,f))return!0;if(m.route.shouldRevalidate){let b=m.route.shouldRevalidate({currentUrl:new URL(s.pathname+s.search+s.hash,window.origin),currentParams:a[0]?.params||{},nextUrl:new URL(e,window.origin),nextParams:m.params,defaultShouldRevalidate:!0});if(typeof b=="boolean")return b}return!0}):[]}function OE(e,t,{includeHydrateFallback:a}={}){return LE(e.map(o=>{let s=t.routes[o.route.id];if(!s)return[];let i=[s.module];return s.clientActionModule&&(i=i.concat(s.clientActionModule)),s.clientLoaderModule&&(i=i.concat(s.clientLoaderModule)),a&&s.hydrateFallbackModule&&(i=i.concat(s.hydrateFallbackModule)),s.imports&&(i=i.concat(s.imports)),i}).flat(1))}function LE(e){return[...new Set(e)]}function ME(e){let t={},a=Object.keys(e).sort();for(let o of a)t[o]=e[o];return t}function zE(e,t){let a=new Set;return new Set(t),e.reduce((o,s)=>{let i=JSON.stringify(ME(s));return a.has(i)||(a.add(i),o.push({key:i,link:s})),o},[])}function vh(){let e=k.useContext(Go);return kh(e,"You must render this element inside a <DataRouterContext.Provider> element"),e}function jE(){let e=k.useContext(Sl);return kh(e,"You must render this element inside a <DataRouterStateContext.Provider> element"),e}var wh=k.createContext(void 0);wh.displayName="FrameworkContext";function Gd(){let e=k.useContext(wh);return kh(e,"You must render this element inside a <HydratedRouter> element"),e}function UE(e,t){let a=k.useContext(wh),[o,s]=k.useState(!1),[i,c]=k.useState(!1),{onFocus:u,onBlur:m,onMouseEnter:f,onMouseLeave:g,onTouchStart:b}=t,w=k.useRef(null);k.useEffect(()=>{if(e==="render"&&c(!0),e==="viewport"){let E=U=>{U.forEach(L=>{c(L.isIntersecting)})},C=new IntersectionObserver(E,{threshold:.5});return w.current&&C.observe(w.current),()=>{C.disconnect()}}},[e]),k.useEffect(()=>{if(o){let E=setTimeout(()=>{c(!0)},100);return()=>{clearTimeout(E)}}},[o]);let x=()=>{s(!0)},S=()=>{s(!1),c(!1)};return a?e!=="intent"?[i,w,{}]:[i,w,{onFocus:Ki(u,x),onBlur:Ki(m,S),onMouseEnter:Ki(f,x),onMouseLeave:Ki(g,S),onTouchStart:Ki(b,x)}]:[!1,w,{}]}function Ki(e,t){return a=>{e&&e(a),a.defaultPrevented||t(a)}}function HE({page:e,...t}){let a=Fk(),{nonce:o}=Gd(),{router:s}=vh(),i=k.useMemo(()=>yk(s.routes,e,s.basename),[s.routes,e,s.basename]);return i?(t.nonce==null&&o&&(t={...t,nonce:o}),a?k.createElement(BE,{page:e,matches:i,...t}):k.createElement(GE,{page:e,matches:i,...t})):null}function FE(e){let{manifest:t,routeModules:a}=Gd(),[o,s]=k.useState([]);return k.useEffect(()=>{let i=!1;return DE(e,t,a).then(c=>{i||s(c)}),()=>{i=!0}},[e,t,a]),o}function BE({page:e,matches:t,...a}){let o=An(),{future:s}=Gd(),{basename:i}=vh(),c=k.useMemo(()=>{if(e===o.pathname+o.search+o.hash)return[];let u=Wk(e,i,s.v8_trailingSlashAwareDataRequests,"rsc"),m=!1,f=[];for(let g of t)typeof g.route.shouldRevalidate=="function"?m=!0:f.push(g.route.id);return m&&f.length>0&&u.searchParams.set("_routes",f.join(",")),[u.pathname+u.search]},[i,s.v8_trailingSlashAwareDataRequests,e,o,t]);return k.createElement(k.Fragment,null,c.map(u=>k.createElement("link",{key:u,rel:"prefetch",as:"fetch",href:u,...a})))}function GE({page:e,matches:t,...a}){let o=An(),{future:s,manifest:i,routeModules:c}=Gd(),{basename:u}=vh(),{loaderData:m,matches:f}=jE(),g=k.useMemo(()=>Pb(e,t,f,i,o,"data"),[e,t,f,i,o]),b=k.useMemo(()=>Pb(e,t,f,i,o,"assets"),[e,t,f,i,o]),w=k.useMemo(()=>{if(e===o.pathname+o.search+o.hash)return[];let E=new Set,C=!1;if(t.forEach(L=>{let M=i.routes[L.route.id];!M||!M.hasLoader||(!g.some(D=>D.route.id===L.route.id)&&L.route.id in m&&c[L.route.id]?.shouldRevalidate||M.hasClientLoader?C=!0:E.add(L.route.id))}),E.size===0)return[];let U=Wk(e,u,s.v8_trailingSlashAwareDataRequests,"data");return C&&E.size>0&&U.searchParams.set("_routes",t.filter(L=>E.has(L.route.id)).map(L=>L.route.id).join(",")),[U.pathname+U.search]},[u,s.v8_trailingSlashAwareDataRequests,m,o,i,g,t,e,c]),x=k.useMemo(()=>OE(b,i),[b,i]),S=FE(b);return k.createElement(k.Fragment,null,w.map(E=>k.createElement("link",{key:E,rel:"prefetch",as:"fetch",href:E,...a})),x.map(E=>k.createElement("link",{key:E,rel:"modulepreload",href:E,...a})),S.map(({key:E,link:C})=>k.createElement("link",{key:E,nonce:a.nonce,...C,crossOrigin:C.crossOrigin??a.crossOrigin})))}function $E(...e){return t=>{e.forEach(a=>{typeof a=="function"?a(t):a!=null&&(a.current=t)})}}var qE=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";try{qE&&(window.__reactRouterVersion="7.18.4")}catch{}function KE(e,t){return kT({basename:t?.basename,getContext:t?.getContext,future:t?.future,history:OC({window:t?.window}),hydrationData:VE(),routes:e,mapRouteProperties:hE,hydrationRouteProperties:fE,dataStrategy:t?.dataStrategy,patchRoutesOnNavigation:t?.patchRoutesOnNavigation,window:t?.window,instrumentations:t?.instrumentations}).initialize()}function VE(){let e=window?.__staticRouterHydrationData;return e&&e.errors&&(e={...e,errors:WE(e.errors)}),e}function WE(e){if(!e)return null;let t=Object.entries(e),a={};for(let[o,s]of t)if(s&&s.__type==="RouteErrorResponse")a[o]=new wl(s.status,s.statusText,s.data,s.internal===!0);else if(s&&s.__type==="Error"){if(typeof s.__subType=="string"&&oT.includes(s.__subType)){let i=window[s.__subType];if(typeof i=="function")try{let c=new i(s.message);c.stack="",a[o]=c}catch{}}if(a[o]==null){let i=new Error(s.message);i.stack="",a[o]=i}}else a[o]=s;return a}var Qr=k.forwardRef(function({onClick:t,discover:a="render",prefetch:o="none",relative:s,reloadDocument:i,replace:c,mask:u,state:m,target:f,to:g,preventScrollReset:b,viewTransition:w,defaultShouldRevalidate:x,...S},E){let{basename:C,navigator:U,useTransitions:L}=k.useContext(Vn),M=typeof g=="string"&&jd.test(g),D=Tk(g,C);g=D.to;let Y=QT(g,{relative:s}),J=An(),Q=null;if(u){let Me=vl(u,[],J.mask?J.mask.pathname:"/",!0);C!=="/"&&(Me.pathname=Me.pathname==="/"?C:oa([C,Me.pathname])),Q=U.createHref(Me)}let[T,$,ae]=UE(o,S),Ee=JE(g,{replace:c,mask:u,state:m,target:f,preventScrollReset:b,relative:s,viewTransition:w,defaultShouldRevalidate:x,useTransitions:L});function ye(Me){t&&t(Me),Me.defaultPrevented||Ee(Me)}let ze=!(D.isExternal||i),Se=k.createElement("a",{...S,...ae,href:(ze?Q:void 0)||D.absoluteURL||Y,onClick:ze?ye:t,ref:$E(E,$),target:f,"data-discover":!M&&a==="render"?"true":void 0});return T&&!M?k.createElement(k.Fragment,null,Se,k.createElement(HE,{page:Y})):Se});Qr.displayName="Link";var YE=k.forwardRef(function({"aria-current":t="page",caseSensitive:a=!1,className:o="",end:s=!1,style:i,to:c,viewTransition:u,children:m,...f},g){let b=Cl(c,{relative:f.relative}),w=An(),x=k.useContext(Sl),{navigator:S,basename:E}=k.useContext(Vn),C=x!=null&&a1(b)&&u===!0,U=S.encodeLocation?S.encodeLocation(b).pathname:b.pathname,L=w.pathname,M=x&&x.navigation&&x.navigation.location?x.navigation.location.pathname:null;a||(L=L.toLowerCase(),M=M?M.toLowerCase():null,U=U.toLowerCase()),M&&E&&(M=ia(M,E)||M);const D=U!=="/"&&U.endsWith("/")?U.length-1:U.length;let Y=L===U||!s&&L.startsWith(U)&&L.charAt(D)==="/",J=M!=null&&(M===U||!s&&M.startsWith(U)&&M.charAt(U.length)==="/"),Q={isActive:Y,isPending:J,isTransitioning:C},T=Y?t:void 0,$;typeof o=="function"?$=o(Q):$=[o,Y?"active":null,J?"pending":null,C?"transitioning":null].filter(Boolean).join(" ");let ae=typeof i=="function"?i(Q):i;return k.createElement(Qr,{...f,"aria-current":T,className:$,ref:g,style:ae,to:c,viewTransition:u},typeof m=="function"?m(Q):m)});YE.displayName="NavLink";var ZE=k.forwardRef(({discover:e="render",fetcherKey:t,navigate:a,reloadDocument:o,replace:s,state:i,method:c=rd,action:u,onSubmit:m,relative:f,preventScrollReset:g,viewTransition:b,defaultShouldRevalidate:w,...x},S)=>{let{useTransitions:E}=k.useContext(Vn),C=t1(),U=n1(u,{relative:f}),L=c.toLowerCase()==="get"?"get":"post",M=typeof u=="string"&&jd.test(u),D=Y=>{if(m&&m(Y),Y.defaultPrevented)return;Y.preventDefault();let J=Y.nativeEvent.submitter,Q=J?.getAttribute("formmethod")||c,T=()=>C(J||Y.currentTarget,{fetcherKey:t,method:Q,navigate:a,replace:s,state:i,relative:f,preventScrollReset:g,viewTransition:b,defaultShouldRevalidate:w});E&&a!==!1?k.startTransition(()=>T()):T()};return k.createElement("form",{ref:S,method:L,action:U,onSubmit:o?m:D,...x,"data-discover":!M&&e==="render"?"true":void 0})});ZE.displayName="Form";function QE(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Yk(e){let t=k.useContext(Go);return Xe(t,QE(e)),t}function JE(e,{target:t,replace:a,mask:o,state:s,preventScrollReset:i,relative:c,viewTransition:u,defaultShouldRevalidate:m,useTransitions:f}={}){let g=Xr(),b=An(),w=Cl(e,{relative:c});return k.useCallback(x=>{if(TE(x,t)){x.preventDefault();let S=a!==void 0?a:Cn(b)===Cn(w),E=()=>g(e,{replace:S,mask:o,state:s,preventScrollReset:i,relative:c,viewTransition:u,defaultShouldRevalidate:m});f?k.startTransition(()=>E()):E()}},[b,g,w,a,o,s,t,e,i,c,u,m,f])}function g3(e){Dt(typeof URLSearchParams<"u","You cannot use the `useSearchParams` hook in a browser that does not support the URLSearchParams API. If you need to support Internet Explorer 11, we recommend you load a polyfill such as https://github.com/ungap/url-search-params.");let t=k.useRef(Pm(e)),a=k.useRef(!1),o=An(),s=k.useMemo(()=>EE(o.search,a.current?null:t.current),[o.search]),i=Xr(),c=k.useCallback((u,m)=>{const f=Pm(typeof u=="function"?u(new URLSearchParams(s)):u);a.current=!0,i("?"+f,m)},[i,s]);return[s,c]}var XE=0,e1=()=>`__${String(++XE)}__`;function t1(){let{router:e}=Yk("useSubmit"),{basename:t}=k.useContext(Vn),a=lE(),o=e.fetch,s=e.navigate;return k.useCallback(async(i,c={})=>{let{action:u,method:m,encType:f,formData:g,body:b}=RE(i,t);if(c.navigate===!1){let w=c.fetcherKey||e1();await o(w,a,c.action||u,{defaultShouldRevalidate:c.defaultShouldRevalidate,preventScrollReset:c.preventScrollReset,formData:g,body:b,formMethod:c.method||m,formEncType:c.encType||f,flushSync:c.flushSync})}else await s(c.action||u,{defaultShouldRevalidate:c.defaultShouldRevalidate,preventScrollReset:c.preventScrollReset,formData:g,body:b,formMethod:c.method||m,formEncType:c.encType||f,replace:c.replace,state:c.state,fromRouteId:a,flushSync:c.flushSync,viewTransition:c.viewTransition})},[o,s,t,a])}function n1(e,{relative:t}={}){let{basename:a}=k.useContext(Vn),o=k.useContext(Ba);Xe(o,"useFormAction must be used inside a RouteContext");let[s]=o.matches.slice(-1),i={...Cl(e||".",{relative:t})},c=An();if(e==null){i.search=c.search;let u=new URLSearchParams(i.search),m=u.getAll("index");if(m.some(g=>g==="")){u.delete("index"),m.filter(b=>b).forEach(b=>u.append("index",b));let g=u.toString();i.search=g?`?${g}`:""}}return(!e||e===".")&&s.route.index&&(i.search=i.search?i.search.replace(/^\?/,"?index&"):"?index"),a!=="/"&&(i.pathname=i.pathname==="/"?a:oa([a,i.pathname])),Cn(i)}function a1(e,{relative:t}={}){let a=k.useContext(gh);Xe(a!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`. Did you accidentally import `RouterProvider` from `react-router`?");let{basename:o}=Yk("useViewTransitionState"),s=Cl(e,{relative:t});if(!a.isTransitioning)return!1;let i=ia(a.currentLocation.pathname,o)||a.currentLocation.pathname,c=ia(a.nextLocation.pathname,o)||a.nextLocation.pathname;return md(s.pathname,c)!=null||md(s.pathname,i)!=null}var $o=hk();function r1(e){return k.createElement(_E,{flushSync:$o.flushSync,...e})}const o1="modulepreload",s1=function(e){return"/"+e},Rb={},mt=function(t,a,o){let s=Promise.resolve();if(a&&a.length>0){let m=function(f){return Promise.all(f.map(g=>Promise.resolve(g).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};document.getElementsByTagName("link");const c=document.querySelector("meta[property=csp-nonce]"),u=c?.nonce||c?.getAttribute("nonce");s=m(a.map(f=>{if(f=s1(f),f in Rb)return;Rb[f]=!0;const g=f.endsWith(".css"),b=g?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${f}"]${b}`))return;const w=document.createElement("link");if(w.rel=g?"stylesheet":o1,g||(w.as="script"),w.crossOrigin="",w.href=f,u&&w.setAttribute("nonce",u),document.head.appendChild(w),g)return new Promise((x,S)=>{w.addEventListener("load",x),w.addEventListener("error",()=>S(new Error(`Unable to preload CSS for ${f}`)))})}))}function i(c){const u=new Event("vite:preloadError",{cancelable:!0});if(u.payload=c,window.dispatchEvent(u),!u.defaultPrevented)throw c}return s.then(c=>{for(const u of c||[])u.status==="rejected"&&i(u.reason);return t().catch(i)})};var ct;(function(e){e.assertEqual=s=>{};function t(s){}e.assertIs=t;function a(s){throw new Error}e.assertNever=a,e.arrayToEnum=s=>{const i={};for(const c of s)i[c]=c;return i},e.getValidEnumValues=s=>{const i=e.objectKeys(s).filter(u=>typeof s[s[u]]!="number"),c={};for(const u of i)c[u]=s[u];return e.objectValues(c)},e.objectValues=s=>e.objectKeys(s).map(function(i){return s[i]}),e.objectKeys=typeof Object.keys=="function"?s=>Object.keys(s):s=>{const i=[];for(const c in s)Object.prototype.hasOwnProperty.call(s,c)&&i.push(c);return i},e.find=(s,i)=>{for(const c of s)if(i(c))return c},e.isInteger=typeof Number.isInteger=="function"?s=>Number.isInteger(s):s=>typeof s=="number"&&Number.isFinite(s)&&Math.floor(s)===s;function o(s,i=" | "){return s.map(c=>typeof c=="string"?`'${c}'`:c).join(i)}e.joinValues=o,e.jsonStringifyReplacer=(s,i)=>typeof i=="bigint"?i.toString():i})(ct||(ct={}));var Ib;(function(e){e.mergeShapes=(t,a)=>({...t,...a})})(Ib||(Ib={}));const xe=ct.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),$r=e=>{switch(typeof e){case"undefined":return xe.undefined;case"string":return xe.string;case"number":return Number.isNaN(e)?xe.nan:xe.number;case"boolean":return xe.boolean;case"function":return xe.function;case"bigint":return xe.bigint;case"symbol":return xe.symbol;case"object":return Array.isArray(e)?xe.array:e===null?xe.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?xe.promise:typeof Map<"u"&&e instanceof Map?xe.map:typeof Set<"u"&&e instanceof Set?xe.set:typeof Date<"u"&&e instanceof Date?xe.date:xe.object;default:return xe.unknown}},oe=ct.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]);class lr extends Error{get errors(){return this.issues}constructor(t){super(),this.issues=[],this.addIssue=o=>{this.issues=[...this.issues,o]},this.addIssues=(o=[])=>{this.issues=[...this.issues,...o]};const a=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,a):this.__proto__=a,this.name="ZodError",this.issues=t}format(t){const a=t||function(i){return i.message},o={_errors:[]},s=i=>{for(const c of i.issues)if(c.code==="invalid_union")c.unionErrors.map(s);else if(c.code==="invalid_return_type")s(c.returnTypeError);else if(c.code==="invalid_arguments")s(c.argumentsError);else if(c.path.length===0)o._errors.push(a(c));else{let u=o,m=0;for(;m<c.path.length;){const f=c.path[m];m===c.path.length-1?(u[f]=u[f]||{_errors:[]},u[f]._errors.push(a(c))):u[f]=u[f]||{_errors:[]},u=u[f],m++}}};return s(this),o}static assert(t){if(!(t instanceof lr))throw new Error(`Not a ZodError: ${t}`)}toString(){return this.message}get message(){return JSON.stringify(this.issues,ct.jsonStringifyReplacer,2)}get isEmpty(){return this.issues.length===0}flatten(t=a=>a.message){const a={},o=[];for(const s of this.issues)if(s.path.length>0){const i=s.path[0];a[i]=a[i]||[],a[i].push(t(s))}else o.push(t(s));return{formErrors:o,fieldErrors:a}}get formErrors(){return this.flatten()}}lr.create=e=>new lr(e);const Rm=(e,t)=>{let a;switch(e.code){case oe.invalid_type:e.received===xe.undefined?a="Required":a=`Expected ${e.expected}, received ${e.received}`;break;case oe.invalid_literal:a=`Invalid literal value, expected ${JSON.stringify(e.expected,ct.jsonStringifyReplacer)}`;break;case oe.unrecognized_keys:a=`Unrecognized key(s) in object: ${ct.joinValues(e.keys,", ")}`;break;case oe.invalid_union:a="Invalid input";break;case oe.invalid_union_discriminator:a=`Invalid discriminator value. Expected ${ct.joinValues(e.options)}`;break;case oe.invalid_enum_value:a=`Invalid enum value. Expected ${ct.joinValues(e.options)}, received '${e.received}'`;break;case oe.invalid_arguments:a="Invalid function arguments";break;case oe.invalid_return_type:a="Invalid function return type";break;case oe.invalid_date:a="Invalid date";break;case oe.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(a=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(a=`${a} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?a=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?a=`Invalid input: must end with "${e.validation.endsWith}"`:ct.assertNever(e.validation):e.validation!=="regex"?a=`Invalid ${e.validation}`:a="Invalid";break;case oe.too_small:e.type==="array"?a=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?a=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?a=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="bigint"?a=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?a=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:a="Invalid input";break;case oe.too_big:e.type==="array"?a=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?a=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?a=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?a=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?a=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:a="Invalid input";break;case oe.custom:a="Invalid input";break;case oe.invalid_intersection_types:a="Intersection results could not be merged";break;case oe.not_multiple_of:a=`Number must be a multiple of ${e.multipleOf}`;break;case oe.not_finite:a="Number must be finite";break;default:a=t.defaultError,ct.assertNever(e)}return{message:a}};let i1=Rm;function l1(){return i1}const c1=e=>{const{data:t,path:a,errorMaps:o,issueData:s}=e,i=[...a,...s.path||[]],c={...s,path:i};if(s.message!==void 0)return{...s,path:i,message:s.message};let u="";const m=o.filter(f=>!!f).slice().reverse();for(const f of m)u=f(c,{data:t,defaultError:u}).message;return{...s,path:i,message:u}};function me(e,t){const a=l1(),o=c1({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,a,a===Rm?void 0:Rm].filter(s=>!!s)});e.common.issues.push(o)}class En{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,a){const o=[];for(const s of a){if(s.status==="aborted")return qe;s.status==="dirty"&&t.dirty(),o.push(s.value)}return{status:t.value,value:o}}static async mergeObjectAsync(t,a){const o=[];for(const s of a){const i=await s.key,c=await s.value;o.push({key:i,value:c})}return En.mergeObjectSync(t,o)}static mergeObjectSync(t,a){const o={};for(const s of a){const{key:i,value:c}=s;if(i.status==="aborted"||c.status==="aborted")return qe;i.status==="dirty"&&t.dirty(),c.status==="dirty"&&t.dirty(),i.value!=="__proto__"&&(typeof c.value<"u"||s.alwaysSet)&&(o[i.value]=c.value)}return{status:t.value,value:o}}}const qe=Object.freeze({status:"aborted"}),Ji=e=>({status:"dirty",value:e}),la=e=>({status:"valid",value:e}),Nb=e=>e.status==="aborted",Db=e=>e.status==="dirty",Bs=e=>e.status==="valid",hd=e=>typeof Promise<"u"&&e instanceof Promise;var Re;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t?.message})(Re||(Re={}));class Ua{constructor(t,a,o,s){this._cachedPath=[],this.parent=t,this.data=a,this._path=o,this._key=s}get path(){return this._cachedPath.length||(Array.isArray(this._key)?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const Ob=(e,t)=>{if(Bs(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const a=new lr(e.common.issues);return this._error=a,this._error}}};function Qe(e){if(!e)return{};const{errorMap:t,invalid_type_error:a,required_error:o,description:s}=e;if(t&&(a||o))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:s}:{errorMap:(c,u)=>{const{message:m}=e;return c.code==="invalid_enum_value"?{message:m??u.defaultError}:typeof u.data>"u"?{message:m??o??u.defaultError}:c.code!=="invalid_type"?{message:u.defaultError}:{message:m??a??u.defaultError}},description:s}}class ot{get description(){return this._def.description}_getType(t){return $r(t.data)}_getOrReturnCtx(t,a){return a||{common:t.parent.common,data:t.data,parsedType:$r(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new En,ctx:{common:t.parent.common,data:t.data,parsedType:$r(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const a=this._parse(t);if(hd(a))throw new Error("Synchronous parse encountered promise.");return a}_parseAsync(t){const a=this._parse(t);return Promise.resolve(a)}parse(t,a){const o=this.safeParse(t,a);if(o.success)return o.data;throw o.error}safeParse(t,a){const o={common:{issues:[],async:a?.async??!1,contextualErrorMap:a?.errorMap},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:$r(t)},s=this._parseSync({data:t,path:o.path,parent:o});return Ob(o,s)}"~validate"(t){const a={common:{issues:[],async:!!this["~standard"].async},path:[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:$r(t)};if(!this["~standard"].async)try{const o=this._parseSync({data:t,path:[],parent:a});return Bs(o)?{value:o.value}:{issues:a.common.issues}}catch(o){o?.message?.toLowerCase()?.includes("encountered")&&(this["~standard"].async=!0),a.common={issues:[],async:!0}}return this._parseAsync({data:t,path:[],parent:a}).then(o=>Bs(o)?{value:o.value}:{issues:a.common.issues})}async parseAsync(t,a){const o=await this.safeParseAsync(t,a);if(o.success)return o.data;throw o.error}async safeParseAsync(t,a){const o={common:{issues:[],contextualErrorMap:a?.errorMap,async:!0},path:a?.path||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:$r(t)},s=this._parse({data:t,path:o.path,parent:o}),i=await(hd(s)?s:Promise.resolve(s));return Ob(o,i)}refine(t,a){const o=s=>typeof a=="string"||typeof a>"u"?{message:a}:typeof a=="function"?a(s):a;return this._refinement((s,i)=>{const c=t(s),u=()=>i.addIssue({code:oe.custom,...o(s)});return typeof Promise<"u"&&c instanceof Promise?c.then(m=>m?!0:(u(),!1)):c?!0:(u(),!1)})}refinement(t,a){return this._refinement((o,s)=>t(o)?!0:(s.addIssue(typeof a=="function"?a(o,s):a),!1))}_refinement(t){return new zo({schema:this,typeName:Ke.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.readonly=this.readonly.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this),this["~standard"]={version:1,vendor:"zod",validate:a=>this["~validate"](a)}}optional(){return ir.create(this,this._def)}nullable(){return jo.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Ma.create(this)}promise(){return vd.create(this,this._def)}or(t){return _d.create([this,t],this._def)}and(t){return bd.create(this,t,this._def)}transform(t){return new zo({...Qe(this._def),schema:this,typeName:Ke.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const a=typeof t=="function"?t:()=>t;return new wd({...Qe(this._def),innerType:this,defaultValue:a,typeName:Ke.ZodDefault})}brand(){return new Xk({typeName:Ke.ZodBranded,type:this,...Qe(this._def)})}catch(t){const a=typeof t=="function"?t:()=>t;return new xd({...Qe(this._def),innerType:this,catchValue:a,typeName:Ke.ZodCatch})}describe(t){const a=this.constructor;return new a({...this._def,description:t})}pipe(t){return Sh.create(this,t)}readonly(){return Sd.create(this)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const d1=/^c[^\s-]{8,}$/i,u1=/^[0-9a-z]+$/,p1=/^[0-9A-HJKMNP-TV-Z]{26}$/i,m1=/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/i,h1=/^[a-z0-9_-]{21}$/i,f1=/^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/,g1=/^[-+]?P(?!$)(?:(?:[-+]?\d+Y)|(?:[-+]?\d+[.,]\d+Y$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:(?:[-+]?\d+W)|(?:[-+]?\d+[.,]\d+W$))?(?:(?:[-+]?\d+D)|(?:[-+]?\d+[.,]\d+D$))?(?:T(?=[\d+-])(?:(?:[-+]?\d+H)|(?:[-+]?\d+[.,]\d+H$))?(?:(?:[-+]?\d+M)|(?:[-+]?\d+[.,]\d+M$))?(?:[-+]?\d+(?:[.,]\d+)?S)?)??$/,_1=/^(?!\.)(?!.*\.\.)([A-Z0-9_'+\-\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\-]*\.)+[A-Z]{2,}$/i,b1="^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$";let Zp;const y1=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,k1=/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,v1=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,w1=/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,x1=/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,S1=/^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,Zk="((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))",C1=new RegExp(`^${Zk}$`);function Qk(e){let t="[0-5]\\d";e.precision?t=`${t}\\.\\d{${e.precision}}`:e.precision==null&&(t=`${t}(\\.\\d+)?`);const a=e.precision?"+":"?";return`([01]\\d|2[0-3]):[0-5]\\d(:${t})${a}`}function T1(e){return new RegExp(`^${Qk(e)}$`)}function E1(e){let t=`${Zk}T${Qk(e)}`;const a=[];return a.push(e.local?"Z?":"Z"),e.offset&&a.push("([+-]\\d{2}:?\\d{2})"),t=`${t}(${a.join("|")})`,new RegExp(`^${t}$`)}function A1(e,t){return!!((t==="v4"||!t)&&y1.test(e)||(t==="v6"||!t)&&v1.test(e))}function P1(e,t){if(!f1.test(e))return!1;try{const[a]=e.split(".");if(!a)return!1;const o=a.replace(/-/g,"+").replace(/_/g,"/").padEnd(a.length+(4-a.length%4)%4,"="),s=JSON.parse(atob(o));return!(typeof s!="object"||s===null||"typ"in s&&s?.typ!=="JWT"||!s.alg||t&&s.alg!==t)}catch{return!1}}function R1(e,t){return!!((t==="v4"||!t)&&k1.test(e)||(t==="v6"||!t)&&w1.test(e))}class Oa extends ot{_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==xe.string){const i=this._getOrReturnCtx(t);return me(i,{code:oe.invalid_type,expected:xe.string,received:i.parsedType}),qe}const o=new En;let s;for(const i of this._def.checks)if(i.kind==="min")t.data.length<i.value&&(s=this._getOrReturnCtx(t,s),me(s,{code:oe.too_small,minimum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),o.dirty());else if(i.kind==="max")t.data.length>i.value&&(s=this._getOrReturnCtx(t,s),me(s,{code:oe.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!1,message:i.message}),o.dirty());else if(i.kind==="length"){const c=t.data.length>i.value,u=t.data.length<i.value;(c||u)&&(s=this._getOrReturnCtx(t,s),c?me(s,{code:oe.too_big,maximum:i.value,type:"string",inclusive:!0,exact:!0,message:i.message}):u&&me(s,{code:oe.too_small,minimum:i.value,type:"string",inclusive:!0,exact:!0,message:i.message}),o.dirty())}else if(i.kind==="email")_1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"email",code:oe.invalid_string,message:i.message}),o.dirty());else if(i.kind==="emoji")Zp||(Zp=new RegExp(b1,"u")),Zp.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"emoji",code:oe.invalid_string,message:i.message}),o.dirty());else if(i.kind==="uuid")m1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"uuid",code:oe.invalid_string,message:i.message}),o.dirty());else if(i.kind==="nanoid")h1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"nanoid",code:oe.invalid_string,message:i.message}),o.dirty());else if(i.kind==="cuid")d1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"cuid",code:oe.invalid_string,message:i.message}),o.dirty());else if(i.kind==="cuid2")u1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"cuid2",code:oe.invalid_string,message:i.message}),o.dirty());else if(i.kind==="ulid")p1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"ulid",code:oe.invalid_string,message:i.message}),o.dirty());else if(i.kind==="url")try{new URL(t.data)}catch{s=this._getOrReturnCtx(t,s),me(s,{validation:"url",code:oe.invalid_string,message:i.message}),o.dirty()}else i.kind==="regex"?(i.regex.lastIndex=0,i.regex.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"regex",code:oe.invalid_string,message:i.message}),o.dirty())):i.kind==="trim"?t.data=t.data.trim():i.kind==="includes"?t.data.includes(i.value,i.position)||(s=this._getOrReturnCtx(t,s),me(s,{code:oe.invalid_string,validation:{includes:i.value,position:i.position},message:i.message}),o.dirty()):i.kind==="toLowerCase"?t.data=t.data.toLowerCase():i.kind==="toUpperCase"?t.data=t.data.toUpperCase():i.kind==="startsWith"?t.data.startsWith(i.value)||(s=this._getOrReturnCtx(t,s),me(s,{code:oe.invalid_string,validation:{startsWith:i.value},message:i.message}),o.dirty()):i.kind==="endsWith"?t.data.endsWith(i.value)||(s=this._getOrReturnCtx(t,s),me(s,{code:oe.invalid_string,validation:{endsWith:i.value},message:i.message}),o.dirty()):i.kind==="datetime"?E1(i).test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{code:oe.invalid_string,validation:"datetime",message:i.message}),o.dirty()):i.kind==="date"?C1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{code:oe.invalid_string,validation:"date",message:i.message}),o.dirty()):i.kind==="time"?T1(i).test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{code:oe.invalid_string,validation:"time",message:i.message}),o.dirty()):i.kind==="duration"?g1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"duration",code:oe.invalid_string,message:i.message}),o.dirty()):i.kind==="ip"?A1(t.data,i.version)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"ip",code:oe.invalid_string,message:i.message}),o.dirty()):i.kind==="jwt"?P1(t.data,i.alg)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"jwt",code:oe.invalid_string,message:i.message}),o.dirty()):i.kind==="cidr"?R1(t.data,i.version)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"cidr",code:oe.invalid_string,message:i.message}),o.dirty()):i.kind==="base64"?x1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"base64",code:oe.invalid_string,message:i.message}),o.dirty()):i.kind==="base64url"?S1.test(t.data)||(s=this._getOrReturnCtx(t,s),me(s,{validation:"base64url",code:oe.invalid_string,message:i.message}),o.dirty()):ct.assertNever(i);return{status:o.value,value:t.data}}_regex(t,a,o){return this.refinement(s=>t.test(s),{validation:a,code:oe.invalid_string,...Re.errToObj(o)})}_addCheck(t){return new Oa({...this._def,checks:[...this._def.checks,t]})}email(t){return this._addCheck({kind:"email",...Re.errToObj(t)})}url(t){return this._addCheck({kind:"url",...Re.errToObj(t)})}emoji(t){return this._addCheck({kind:"emoji",...Re.errToObj(t)})}uuid(t){return this._addCheck({kind:"uuid",...Re.errToObj(t)})}nanoid(t){return this._addCheck({kind:"nanoid",...Re.errToObj(t)})}cuid(t){return this._addCheck({kind:"cuid",...Re.errToObj(t)})}cuid2(t){return this._addCheck({kind:"cuid2",...Re.errToObj(t)})}ulid(t){return this._addCheck({kind:"ulid",...Re.errToObj(t)})}base64(t){return this._addCheck({kind:"base64",...Re.errToObj(t)})}base64url(t){return this._addCheck({kind:"base64url",...Re.errToObj(t)})}jwt(t){return this._addCheck({kind:"jwt",...Re.errToObj(t)})}ip(t){return this._addCheck({kind:"ip",...Re.errToObj(t)})}cidr(t){return this._addCheck({kind:"cidr",...Re.errToObj(t)})}datetime(t){return typeof t=="string"?this._addCheck({kind:"datetime",precision:null,offset:!1,local:!1,message:t}):this._addCheck({kind:"datetime",precision:typeof t?.precision>"u"?null:t?.precision,offset:t?.offset??!1,local:t?.local??!1,...Re.errToObj(t?.message)})}date(t){return this._addCheck({kind:"date",message:t})}time(t){return typeof t=="string"?this._addCheck({kind:"time",precision:null,message:t}):this._addCheck({kind:"time",precision:typeof t?.precision>"u"?null:t?.precision,...Re.errToObj(t?.message)})}duration(t){return this._addCheck({kind:"duration",...Re.errToObj(t)})}regex(t,a){return this._addCheck({kind:"regex",regex:t,...Re.errToObj(a)})}includes(t,a){return this._addCheck({kind:"includes",value:t,position:a?.position,...Re.errToObj(a?.message)})}startsWith(t,a){return this._addCheck({kind:"startsWith",value:t,...Re.errToObj(a)})}endsWith(t,a){return this._addCheck({kind:"endsWith",value:t,...Re.errToObj(a)})}min(t,a){return this._addCheck({kind:"min",value:t,...Re.errToObj(a)})}max(t,a){return this._addCheck({kind:"max",value:t,...Re.errToObj(a)})}length(t,a){return this._addCheck({kind:"length",value:t,...Re.errToObj(a)})}nonempty(t){return this.min(1,Re.errToObj(t))}trim(){return new Oa({...this._def,checks:[...this._def.checks,{kind:"trim"}]})}toLowerCase(){return new Oa({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]})}toUpperCase(){return new Oa({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isDate(){return!!this._def.checks.find(t=>t.kind==="date")}get isTime(){return!!this._def.checks.find(t=>t.kind==="time")}get isDuration(){return!!this._def.checks.find(t=>t.kind==="duration")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isNANOID(){return!!this._def.checks.find(t=>t.kind==="nanoid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get isCIDR(){return!!this._def.checks.find(t=>t.kind==="cidr")}get isBase64(){return!!this._def.checks.find(t=>t.kind==="base64")}get isBase64url(){return!!this._def.checks.find(t=>t.kind==="base64url")}get minLength(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t}get maxLength(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t}}Oa.create=e=>new Oa({checks:[],typeName:Ke.ZodString,coerce:e?.coerce??!1,...Qe(e)});function I1(e,t){const a=(e.toString().split(".")[1]||"").length,o=(t.toString().split(".")[1]||"").length,s=a>o?a:o,i=Number.parseInt(e.toFixed(s).replace(".","")),c=Number.parseInt(t.toFixed(s).replace(".",""));return i%c/10**s}class Do extends ot{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==xe.number){const i=this._getOrReturnCtx(t);return me(i,{code:oe.invalid_type,expected:xe.number,received:i.parsedType}),qe}let o;const s=new En;for(const i of this._def.checks)i.kind==="int"?ct.isInteger(t.data)||(o=this._getOrReturnCtx(t,o),me(o,{code:oe.invalid_type,expected:"integer",received:"float",message:i.message}),s.dirty()):i.kind==="min"?(i.inclusive?t.data<i.value:t.data<=i.value)&&(o=this._getOrReturnCtx(t,o),me(o,{code:oe.too_small,minimum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),s.dirty()):i.kind==="max"?(i.inclusive?t.data>i.value:t.data>=i.value)&&(o=this._getOrReturnCtx(t,o),me(o,{code:oe.too_big,maximum:i.value,type:"number",inclusive:i.inclusive,exact:!1,message:i.message}),s.dirty()):i.kind==="multipleOf"?I1(t.data,i.value)!==0&&(o=this._getOrReturnCtx(t,o),me(o,{code:oe.not_multiple_of,multipleOf:i.value,message:i.message}),s.dirty()):i.kind==="finite"?Number.isFinite(t.data)||(o=this._getOrReturnCtx(t,o),me(o,{code:oe.not_finite,message:i.message}),s.dirty()):ct.assertNever(i);return{status:s.value,value:t.data}}gte(t,a){return this.setLimit("min",t,!0,Re.toString(a))}gt(t,a){return this.setLimit("min",t,!1,Re.toString(a))}lte(t,a){return this.setLimit("max",t,!0,Re.toString(a))}lt(t,a){return this.setLimit("max",t,!1,Re.toString(a))}setLimit(t,a,o,s){return new Do({...this._def,checks:[...this._def.checks,{kind:t,value:a,inclusive:o,message:Re.toString(s)}]})}_addCheck(t){return new Do({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:Re.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:Re.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:Re.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:Re.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:Re.toString(t)})}multipleOf(t,a){return this._addCheck({kind:"multipleOf",value:t,message:Re.toString(a)})}finite(t){return this._addCheck({kind:"finite",message:Re.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:Re.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:Re.toString(t)})}get minValue(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t}get maxValue(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t}get isInt(){return!!this._def.checks.find(t=>t.kind==="int"||t.kind==="multipleOf"&&ct.isInteger(t.value))}get isFinite(){let t=null,a=null;for(const o of this._def.checks){if(o.kind==="finite"||o.kind==="int"||o.kind==="multipleOf")return!0;o.kind==="min"?(a===null||o.value>a)&&(a=o.value):o.kind==="max"&&(t===null||o.value<t)&&(t=o.value)}return Number.isFinite(a)&&Number.isFinite(t)}}Do.create=e=>new Do({checks:[],typeName:Ke.ZodNumber,coerce:e?.coerce||!1,...Qe(e)});class Oo extends ot{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce)try{t.data=BigInt(t.data)}catch{return this._getInvalidInput(t)}if(this._getType(t)!==xe.bigint)return this._getInvalidInput(t);let o;const s=new En;for(const i of this._def.checks)i.kind==="min"?(i.inclusive?t.data<i.value:t.data<=i.value)&&(o=this._getOrReturnCtx(t,o),me(o,{code:oe.too_small,type:"bigint",minimum:i.value,inclusive:i.inclusive,message:i.message}),s.dirty()):i.kind==="max"?(i.inclusive?t.data>i.value:t.data>=i.value)&&(o=this._getOrReturnCtx(t,o),me(o,{code:oe.too_big,type:"bigint",maximum:i.value,inclusive:i.inclusive,message:i.message}),s.dirty()):i.kind==="multipleOf"?t.data%i.value!==BigInt(0)&&(o=this._getOrReturnCtx(t,o),me(o,{code:oe.not_multiple_of,multipleOf:i.value,message:i.message}),s.dirty()):ct.assertNever(i);return{status:s.value,value:t.data}}_getInvalidInput(t){const a=this._getOrReturnCtx(t);return me(a,{code:oe.invalid_type,expected:xe.bigint,received:a.parsedType}),qe}gte(t,a){return this.setLimit("min",t,!0,Re.toString(a))}gt(t,a){return this.setLimit("min",t,!1,Re.toString(a))}lte(t,a){return this.setLimit("max",t,!0,Re.toString(a))}lt(t,a){return this.setLimit("max",t,!1,Re.toString(a))}setLimit(t,a,o,s){return new Oo({...this._def,checks:[...this._def.checks,{kind:t,value:a,inclusive:o,message:Re.toString(s)}]})}_addCheck(t){return new Oo({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:Re.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:Re.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:Re.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:Re.toString(t)})}multipleOf(t,a){return this._addCheck({kind:"multipleOf",value:t,message:Re.toString(a)})}get minValue(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t}get maxValue(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t}}Oo.create=e=>new Oo({checks:[],typeName:Ke.ZodBigInt,coerce:e?.coerce??!1,...Qe(e)});class fd extends ot{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==xe.boolean){const o=this._getOrReturnCtx(t);return me(o,{code:oe.invalid_type,expected:xe.boolean,received:o.parsedType}),qe}return la(t.data)}}fd.create=e=>new fd({typeName:Ke.ZodBoolean,coerce:e?.coerce||!1,...Qe(e)});class Gs extends ot{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==xe.date){const i=this._getOrReturnCtx(t);return me(i,{code:oe.invalid_type,expected:xe.date,received:i.parsedType}),qe}if(Number.isNaN(t.data.getTime())){const i=this._getOrReturnCtx(t);return me(i,{code:oe.invalid_date}),qe}const o=new En;let s;for(const i of this._def.checks)i.kind==="min"?t.data.getTime()<i.value&&(s=this._getOrReturnCtx(t,s),me(s,{code:oe.too_small,message:i.message,inclusive:!0,exact:!1,minimum:i.value,type:"date"}),o.dirty()):i.kind==="max"?t.data.getTime()>i.value&&(s=this._getOrReturnCtx(t,s),me(s,{code:oe.too_big,message:i.message,inclusive:!0,exact:!1,maximum:i.value,type:"date"}),o.dirty()):ct.assertNever(i);return{status:o.value,value:new Date(t.data.getTime())}}_addCheck(t){return new Gs({...this._def,checks:[...this._def.checks,t]})}min(t,a){return this._addCheck({kind:"min",value:t.getTime(),message:Re.toString(a)})}max(t,a){return this._addCheck({kind:"max",value:t.getTime(),message:Re.toString(a)})}get minDate(){let t=null;for(const a of this._def.checks)a.kind==="min"&&(t===null||a.value>t)&&(t=a.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const a of this._def.checks)a.kind==="max"&&(t===null||a.value<t)&&(t=a.value);return t!=null?new Date(t):null}}Gs.create=e=>new Gs({checks:[],coerce:e?.coerce||!1,typeName:Ke.ZodDate,...Qe(e)});class Lb extends ot{_parse(t){if(this._getType(t)!==xe.symbol){const o=this._getOrReturnCtx(t);return me(o,{code:oe.invalid_type,expected:xe.symbol,received:o.parsedType}),qe}return la(t.data)}}Lb.create=e=>new Lb({typeName:Ke.ZodSymbol,...Qe(e)});class Im extends ot{_parse(t){if(this._getType(t)!==xe.undefined){const o=this._getOrReturnCtx(t);return me(o,{code:oe.invalid_type,expected:xe.undefined,received:o.parsedType}),qe}return la(t.data)}}Im.create=e=>new Im({typeName:Ke.ZodUndefined,...Qe(e)});class gd extends ot{_parse(t){if(this._getType(t)!==xe.null){const o=this._getOrReturnCtx(t);return me(o,{code:oe.invalid_type,expected:xe.null,received:o.parsedType}),qe}return la(t.data)}}gd.create=e=>new gd({typeName:Ke.ZodNull,...Qe(e)});class Mb extends ot{constructor(){super(...arguments),this._any=!0}_parse(t){return la(t.data)}}Mb.create=e=>new Mb({typeName:Ke.ZodAny,...Qe(e)});class Nm extends ot{constructor(){super(...arguments),this._unknown=!0}_parse(t){return la(t.data)}}Nm.create=e=>new Nm({typeName:Ke.ZodUnknown,...Qe(e)});class Jr extends ot{_parse(t){const a=this._getOrReturnCtx(t);return me(a,{code:oe.invalid_type,expected:xe.never,received:a.parsedType}),qe}}Jr.create=e=>new Jr({typeName:Ke.ZodNever,...Qe(e)});class zb extends ot{_parse(t){if(this._getType(t)!==xe.undefined){const o=this._getOrReturnCtx(t);return me(o,{code:oe.invalid_type,expected:xe.void,received:o.parsedType}),qe}return la(t.data)}}zb.create=e=>new zb({typeName:Ke.ZodVoid,...Qe(e)});class Ma extends ot{_parse(t){const{ctx:a,status:o}=this._processInputParams(t),s=this._def;if(a.parsedType!==xe.array)return me(a,{code:oe.invalid_type,expected:xe.array,received:a.parsedType}),qe;if(s.exactLength!==null){const c=a.data.length>s.exactLength.value,u=a.data.length<s.exactLength.value;(c||u)&&(me(a,{code:c?oe.too_big:oe.too_small,minimum:u?s.exactLength.value:void 0,maximum:c?s.exactLength.value:void 0,type:"array",inclusive:!0,exact:!0,message:s.exactLength.message}),o.dirty())}if(s.minLength!==null&&a.data.length<s.minLength.value&&(me(a,{code:oe.too_small,minimum:s.minLength.value,type:"array",inclusive:!0,exact:!1,message:s.minLength.message}),o.dirty()),s.maxLength!==null&&a.data.length>s.maxLength.value&&(me(a,{code:oe.too_big,maximum:s.maxLength.value,type:"array",inclusive:!0,exact:!1,message:s.maxLength.message}),o.dirty()),a.common.async)return Promise.all([...a.data].map((c,u)=>s.type._parseAsync(new Ua(a,c,a.path,u)))).then(c=>En.mergeArray(o,c));const i=[...a.data].map((c,u)=>s.type._parseSync(new Ua(a,c,a.path,u)));return En.mergeArray(o,i)}get element(){return this._def.type}min(t,a){return new Ma({...this._def,minLength:{value:t,message:Re.toString(a)}})}max(t,a){return new Ma({...this._def,maxLength:{value:t,message:Re.toString(a)}})}length(t,a){return new Ma({...this._def,exactLength:{value:t,message:Re.toString(a)}})}nonempty(t){return this.min(1,t)}}Ma.create=(e,t)=>new Ma({type:e,minLength:null,maxLength:null,exactLength:null,typeName:Ke.ZodArray,...Qe(t)});function As(e){if(e instanceof Bt){const t={};for(const a in e.shape){const o=e.shape[a];t[a]=ir.create(As(o))}return new Bt({...e._def,shape:()=>t})}else return e instanceof Ma?new Ma({...e._def,type:As(e.element)}):e instanceof ir?ir.create(As(e.unwrap())):e instanceof jo?jo.create(As(e.unwrap())):e instanceof Lo?Lo.create(e.items.map(t=>As(t))):e}class Bt extends ot{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),a=ct.objectKeys(t);return this._cached={shape:t,keys:a},this._cached}_parse(t){if(this._getType(t)!==xe.object){const f=this._getOrReturnCtx(t);return me(f,{code:oe.invalid_type,expected:xe.object,received:f.parsedType}),qe}const{status:o,ctx:s}=this._processInputParams(t),{shape:i,keys:c}=this._getCached(),u=[];if(!(this._def.catchall instanceof Jr&&this._def.unknownKeys==="strip"))for(const f in s.data)c.includes(f)||u.push(f);const m=[];for(const f of c){const g=i[f],b=s.data[f];m.push({key:{status:"valid",value:f},value:g._parse(new Ua(s,b,s.path,f)),alwaysSet:f in s.data})}if(this._def.catchall instanceof Jr){const f=this._def.unknownKeys;if(f==="passthrough")for(const g of u)m.push({key:{status:"valid",value:g},value:{status:"valid",value:s.data[g]}});else if(f==="strict")u.length>0&&(me(s,{code:oe.unrecognized_keys,keys:u}),o.dirty());else if(f!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const f=this._def.catchall;for(const g of u){const b=s.data[g];m.push({key:{status:"valid",value:g},value:f._parse(new Ua(s,b,s.path,g)),alwaysSet:g in s.data})}}return s.common.async?Promise.resolve().then(async()=>{const f=[];for(const g of m){const b=await g.key,w=await g.value;f.push({key:b,value:w,alwaysSet:g.alwaysSet})}return f}).then(f=>En.mergeObjectSync(o,f)):En.mergeObjectSync(o,m)}get shape(){return this._def.shape()}strict(t){return Re.errToObj,new Bt({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(a,o)=>{const s=this._def.errorMap?.(a,o).message??o.defaultError;return a.code==="unrecognized_keys"?{message:Re.errToObj(t).message??s}:{message:s}}}:{}})}strip(){return new Bt({...this._def,unknownKeys:"strip"})}passthrough(){return new Bt({...this._def,unknownKeys:"passthrough"})}extend(t){return new Bt({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new Bt({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:Ke.ZodObject})}setKey(t,a){return this.augment({[t]:a})}catchall(t){return new Bt({...this._def,catchall:t})}pick(t){const a={};for(const o of ct.objectKeys(t))t[o]&&this.shape[o]&&(a[o]=this.shape[o]);return new Bt({...this._def,shape:()=>a})}omit(t){const a={};for(const o of ct.objectKeys(this.shape))t[o]||(a[o]=this.shape[o]);return new Bt({...this._def,shape:()=>a})}deepPartial(){return As(this)}partial(t){const a={};for(const o of ct.objectKeys(this.shape)){const s=this.shape[o];t&&!t[o]?a[o]=s:a[o]=s.optional()}return new Bt({...this._def,shape:()=>a})}required(t){const a={};for(const o of ct.objectKeys(this.shape))if(t&&!t[o])a[o]=this.shape[o];else{let i=this.shape[o];for(;i instanceof ir;)i=i._def.innerType;a[o]=i}return new Bt({...this._def,shape:()=>a})}keyof(){return Jk(ct.objectKeys(this.shape))}}Bt.create=(e,t)=>new Bt({shape:()=>e,unknownKeys:"strip",catchall:Jr.create(),typeName:Ke.ZodObject,...Qe(t)});Bt.strictCreate=(e,t)=>new Bt({shape:()=>e,unknownKeys:"strict",catchall:Jr.create(),typeName:Ke.ZodObject,...Qe(t)});Bt.lazycreate=(e,t)=>new Bt({shape:e,unknownKeys:"strip",catchall:Jr.create(),typeName:Ke.ZodObject,...Qe(t)});class _d extends ot{_parse(t){const{ctx:a}=this._processInputParams(t),o=this._def.options;function s(i){for(const u of i)if(u.result.status==="valid")return u.result;for(const u of i)if(u.result.status==="dirty")return a.common.issues.push(...u.ctx.common.issues),u.result;const c=i.map(u=>new lr(u.ctx.common.issues));return me(a,{code:oe.invalid_union,unionErrors:c}),qe}if(a.common.async)return Promise.all(o.map(async i=>{const c={...a,common:{...a.common,issues:[]},parent:null};return{result:await i._parseAsync({data:a.data,path:a.path,parent:c}),ctx:c}})).then(s);{let i;const c=[];for(const m of o){const f={...a,common:{...a.common,issues:[]},parent:null},g=m._parseSync({data:a.data,path:a.path,parent:f});if(g.status==="valid")return g;g.status==="dirty"&&!i&&(i={result:g,ctx:f}),f.common.issues.length&&c.push(f.common.issues)}if(i)return a.common.issues.push(...i.ctx.common.issues),i.result;const u=c.map(m=>new lr(m));return me(a,{code:oe.invalid_union,unionErrors:u}),qe}}get options(){return this._def.options}}_d.create=(e,t)=>new _d({options:e,typeName:Ke.ZodUnion,...Qe(t)});const or=e=>e instanceof Om?or(e.schema):e instanceof zo?or(e.innerType()):e instanceof kd?[e.value]:e instanceof Mo?e.options:e instanceof Lm?ct.objectValues(e.enum):e instanceof wd?or(e._def.innerType):e instanceof Im?[void 0]:e instanceof gd?[null]:e instanceof ir?[void 0,...or(e.unwrap())]:e instanceof jo?[null,...or(e.unwrap())]:e instanceof Xk||e instanceof Sd?or(e.unwrap()):e instanceof xd?or(e._def.innerType):[];class xh extends ot{_parse(t){const{ctx:a}=this._processInputParams(t);if(a.parsedType!==xe.object)return me(a,{code:oe.invalid_type,expected:xe.object,received:a.parsedType}),qe;const o=this.discriminator,s=a.data[o],i=this.optionsMap.get(s);return i?a.common.async?i._parseAsync({data:a.data,path:a.path,parent:a}):i._parseSync({data:a.data,path:a.path,parent:a}):(me(a,{code:oe.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[o]}),qe)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,a,o){const s=new Map;for(const i of a){const c=or(i.shape[t]);if(!c.length)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const u of c){if(s.has(u))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(u)}`);s.set(u,i)}}return new xh({typeName:Ke.ZodDiscriminatedUnion,discriminator:t,options:a,optionsMap:s,...Qe(o)})}}function Dm(e,t){const a=$r(e),o=$r(t);if(e===t)return{valid:!0,data:e};if(a===xe.object&&o===xe.object){const s=ct.objectKeys(t),i=ct.objectKeys(e).filter(u=>s.indexOf(u)!==-1),c={...e,...t};for(const u of i){const m=Dm(e[u],t[u]);if(!m.valid)return{valid:!1};c[u]=m.data}return{valid:!0,data:c}}else if(a===xe.array&&o===xe.array){if(e.length!==t.length)return{valid:!1};const s=[];for(let i=0;i<e.length;i++){const c=e[i],u=t[i],m=Dm(c,u);if(!m.valid)return{valid:!1};s.push(m.data)}return{valid:!0,data:s}}else return a===xe.date&&o===xe.date&&+e==+t?{valid:!0,data:e}:{valid:!1}}class bd extends ot{_parse(t){const{status:a,ctx:o}=this._processInputParams(t),s=(i,c)=>{if(Nb(i)||Nb(c))return qe;const u=Dm(i.value,c.value);return u.valid?((Db(i)||Db(c))&&a.dirty(),{status:a.value,value:u.data}):(me(o,{code:oe.invalid_intersection_types}),qe)};return o.common.async?Promise.all([this._def.left._parseAsync({data:o.data,path:o.path,parent:o}),this._def.right._parseAsync({data:o.data,path:o.path,parent:o})]).then(([i,c])=>s(i,c)):s(this._def.left._parseSync({data:o.data,path:o.path,parent:o}),this._def.right._parseSync({data:o.data,path:o.path,parent:o}))}}bd.create=(e,t,a)=>new bd({left:e,right:t,typeName:Ke.ZodIntersection,...Qe(a)});class Lo extends ot{_parse(t){const{status:a,ctx:o}=this._processInputParams(t);if(o.parsedType!==xe.array)return me(o,{code:oe.invalid_type,expected:xe.array,received:o.parsedType}),qe;if(o.data.length<this._def.items.length)return me(o,{code:oe.too_small,minimum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),qe;!this._def.rest&&o.data.length>this._def.items.length&&(me(o,{code:oe.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),a.dirty());const i=[...o.data].map((c,u)=>{const m=this._def.items[u]||this._def.rest;return m?m._parse(new Ua(o,c,o.path,u)):null}).filter(c=>!!c);return o.common.async?Promise.all(i).then(c=>En.mergeArray(a,c)):En.mergeArray(a,i)}get items(){return this._def.items}rest(t){return new Lo({...this._def,rest:t})}}Lo.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new Lo({items:e,typeName:Ke.ZodTuple,rest:null,...Qe(t)})};class yd extends ot{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:a,ctx:o}=this._processInputParams(t);if(o.parsedType!==xe.object)return me(o,{code:oe.invalid_type,expected:xe.object,received:o.parsedType}),qe;const s=[],i=this._def.keyType,c=this._def.valueType;for(const u in o.data)s.push({key:i._parse(new Ua(o,u,o.path,u)),value:c._parse(new Ua(o,o.data[u],o.path,u)),alwaysSet:u in o.data});return o.common.async?En.mergeObjectAsync(a,s):En.mergeObjectSync(a,s)}get element(){return this._def.valueType}static create(t,a,o){return a instanceof ot?new yd({keyType:t,valueType:a,typeName:Ke.ZodRecord,...Qe(o)}):new yd({keyType:Oa.create(),valueType:t,typeName:Ke.ZodRecord,...Qe(a)})}}class jb extends ot{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:a,ctx:o}=this._processInputParams(t);if(o.parsedType!==xe.map)return me(o,{code:oe.invalid_type,expected:xe.map,received:o.parsedType}),qe;const s=this._def.keyType,i=this._def.valueType,c=[...o.data.entries()].map(([u,m],f)=>({key:s._parse(new Ua(o,u,o.path,[f,"key"])),value:i._parse(new Ua(o,m,o.path,[f,"value"]))}));if(o.common.async){const u=new Map;return Promise.resolve().then(async()=>{for(const m of c){const f=await m.key,g=await m.value;if(f.status==="aborted"||g.status==="aborted")return qe;(f.status==="dirty"||g.status==="dirty")&&a.dirty(),u.set(f.value,g.value)}return{status:a.value,value:u}})}else{const u=new Map;for(const m of c){const f=m.key,g=m.value;if(f.status==="aborted"||g.status==="aborted")return qe;(f.status==="dirty"||g.status==="dirty")&&a.dirty(),u.set(f.value,g.value)}return{status:a.value,value:u}}}}jb.create=(e,t,a)=>new jb({valueType:t,keyType:e,typeName:Ke.ZodMap,...Qe(a)});class dl extends ot{_parse(t){const{status:a,ctx:o}=this._processInputParams(t);if(o.parsedType!==xe.set)return me(o,{code:oe.invalid_type,expected:xe.set,received:o.parsedType}),qe;const s=this._def;s.minSize!==null&&o.data.size<s.minSize.value&&(me(o,{code:oe.too_small,minimum:s.minSize.value,type:"set",inclusive:!0,exact:!1,message:s.minSize.message}),a.dirty()),s.maxSize!==null&&o.data.size>s.maxSize.value&&(me(o,{code:oe.too_big,maximum:s.maxSize.value,type:"set",inclusive:!0,exact:!1,message:s.maxSize.message}),a.dirty());const i=this._def.valueType;function c(m){const f=new Set;for(const g of m){if(g.status==="aborted")return qe;g.status==="dirty"&&a.dirty(),f.add(g.value)}return{status:a.value,value:f}}const u=[...o.data.values()].map((m,f)=>i._parse(new Ua(o,m,o.path,f)));return o.common.async?Promise.all(u).then(m=>c(m)):c(u)}min(t,a){return new dl({...this._def,minSize:{value:t,message:Re.toString(a)}})}max(t,a){return new dl({...this._def,maxSize:{value:t,message:Re.toString(a)}})}size(t,a){return this.min(t,a).max(t,a)}nonempty(t){return this.min(1,t)}}dl.create=(e,t)=>new dl({valueType:e,minSize:null,maxSize:null,typeName:Ke.ZodSet,...Qe(t)});class Om extends ot{get schema(){return this._def.getter()}_parse(t){const{ctx:a}=this._processInputParams(t);return this._def.getter()._parse({data:a.data,path:a.path,parent:a})}}Om.create=(e,t)=>new Om({getter:e,typeName:Ke.ZodLazy,...Qe(t)});class kd extends ot{_parse(t){if(t.data!==this._def.value){const a=this._getOrReturnCtx(t);return me(a,{received:a.data,code:oe.invalid_literal,expected:this._def.value}),qe}return{status:"valid",value:t.data}}get value(){return this._def.value}}kd.create=(e,t)=>new kd({value:e,typeName:Ke.ZodLiteral,...Qe(t)});function Jk(e,t){return new Mo({values:e,typeName:Ke.ZodEnum,...Qe(t)})}class Mo extends ot{_parse(t){if(typeof t.data!="string"){const a=this._getOrReturnCtx(t),o=this._def.values;return me(a,{expected:ct.joinValues(o),received:a.parsedType,code:oe.invalid_type}),qe}if(this._cache||(this._cache=new Set(this._def.values)),!this._cache.has(t.data)){const a=this._getOrReturnCtx(t),o=this._def.values;return me(a,{received:a.data,code:oe.invalid_enum_value,options:o}),qe}return la(t.data)}get options(){return this._def.values}get enum(){const t={};for(const a of this._def.values)t[a]=a;return t}get Values(){const t={};for(const a of this._def.values)t[a]=a;return t}get Enum(){const t={};for(const a of this._def.values)t[a]=a;return t}extract(t,a=this._def){return Mo.create(t,{...this._def,...a})}exclude(t,a=this._def){return Mo.create(this.options.filter(o=>!t.includes(o)),{...this._def,...a})}}Mo.create=Jk;class Lm extends ot{_parse(t){const a=ct.getValidEnumValues(this._def.values),o=this._getOrReturnCtx(t);if(o.parsedType!==xe.string&&o.parsedType!==xe.number){const s=ct.objectValues(a);return me(o,{expected:ct.joinValues(s),received:o.parsedType,code:oe.invalid_type}),qe}if(this._cache||(this._cache=new Set(ct.getValidEnumValues(this._def.values))),!this._cache.has(t.data)){const s=ct.objectValues(a);return me(o,{received:o.data,code:oe.invalid_enum_value,options:s}),qe}return la(t.data)}get enum(){return this._def.values}}Lm.create=(e,t)=>new Lm({values:e,typeName:Ke.ZodNativeEnum,...Qe(t)});class vd extends ot{unwrap(){return this._def.type}_parse(t){const{ctx:a}=this._processInputParams(t);if(a.parsedType!==xe.promise&&a.common.async===!1)return me(a,{code:oe.invalid_type,expected:xe.promise,received:a.parsedType}),qe;const o=a.parsedType===xe.promise?a.data:Promise.resolve(a.data);return la(o.then(s=>this._def.type.parseAsync(s,{path:a.path,errorMap:a.common.contextualErrorMap})))}}vd.create=(e,t)=>new vd({type:e,typeName:Ke.ZodPromise,...Qe(t)});class zo extends ot{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===Ke.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:a,ctx:o}=this._processInputParams(t),s=this._def.effect||null,i={addIssue:c=>{me(o,c),c.fatal?a.abort():a.dirty()},get path(){return o.path}};if(i.addIssue=i.addIssue.bind(i),s.type==="preprocess"){const c=s.transform(o.data,i);if(o.common.async)return Promise.resolve(c).then(async u=>{if(a.value==="aborted")return qe;const m=await this._def.schema._parseAsync({data:u,path:o.path,parent:o});return m.status==="aborted"?qe:m.status==="dirty"||a.value==="dirty"?Ji(m.value):m});{if(a.value==="aborted")return qe;const u=this._def.schema._parseSync({data:c,path:o.path,parent:o});return u.status==="aborted"?qe:u.status==="dirty"||a.value==="dirty"?Ji(u.value):u}}if(s.type==="refinement"){const c=u=>{const m=s.refinement(u,i);if(o.common.async)return Promise.resolve(m);if(m instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return u};if(o.common.async===!1){const u=this._def.schema._parseSync({data:o.data,path:o.path,parent:o});return u.status==="aborted"?qe:(u.status==="dirty"&&a.dirty(),c(u.value),{status:a.value,value:u.value})}else return this._def.schema._parseAsync({data:o.data,path:o.path,parent:o}).then(u=>u.status==="aborted"?qe:(u.status==="dirty"&&a.dirty(),c(u.value).then(()=>({status:a.value,value:u.value}))))}if(s.type==="transform")if(o.common.async===!1){const c=this._def.schema._parseSync({data:o.data,path:o.path,parent:o});if(!Bs(c))return qe;const u=s.transform(c.value,i);if(u instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:a.value,value:u}}else return this._def.schema._parseAsync({data:o.data,path:o.path,parent:o}).then(c=>Bs(c)?Promise.resolve(s.transform(c.value,i)).then(u=>({status:a.value,value:u})):qe);ct.assertNever(s)}}zo.create=(e,t,a)=>new zo({schema:e,typeName:Ke.ZodEffects,effect:t,...Qe(a)});zo.createWithPreprocess=(e,t,a)=>new zo({schema:t,effect:{type:"preprocess",transform:e},typeName:Ke.ZodEffects,...Qe(a)});class ir extends ot{_parse(t){return this._getType(t)===xe.undefined?la(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}ir.create=(e,t)=>new ir({innerType:e,typeName:Ke.ZodOptional,...Qe(t)});class jo extends ot{_parse(t){return this._getType(t)===xe.null?la(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}jo.create=(e,t)=>new jo({innerType:e,typeName:Ke.ZodNullable,...Qe(t)});class wd extends ot{_parse(t){const{ctx:a}=this._processInputParams(t);let o=a.data;return a.parsedType===xe.undefined&&(o=this._def.defaultValue()),this._def.innerType._parse({data:o,path:a.path,parent:a})}removeDefault(){return this._def.innerType}}wd.create=(e,t)=>new wd({innerType:e,typeName:Ke.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...Qe(t)});class xd extends ot{_parse(t){const{ctx:a}=this._processInputParams(t),o={...a,common:{...a.common,issues:[]}},s=this._def.innerType._parse({data:o.data,path:o.path,parent:{...o}});return hd(s)?s.then(i=>({status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new lr(o.common.issues)},input:o.data})})):{status:"valid",value:s.status==="valid"?s.value:this._def.catchValue({get error(){return new lr(o.common.issues)},input:o.data})}}removeCatch(){return this._def.innerType}}xd.create=(e,t)=>new xd({innerType:e,typeName:Ke.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...Qe(t)});class Ub extends ot{_parse(t){if(this._getType(t)!==xe.nan){const o=this._getOrReturnCtx(t);return me(o,{code:oe.invalid_type,expected:xe.nan,received:o.parsedType}),qe}return{status:"valid",value:t.data}}}Ub.create=e=>new Ub({typeName:Ke.ZodNaN,...Qe(e)});class Xk extends ot{_parse(t){const{ctx:a}=this._processInputParams(t),o=a.data;return this._def.type._parse({data:o,path:a.path,parent:a})}unwrap(){return this._def.type}}class Sh extends ot{_parse(t){const{status:a,ctx:o}=this._processInputParams(t);if(o.common.async)return(async()=>{const i=await this._def.in._parseAsync({data:o.data,path:o.path,parent:o});return i.status==="aborted"?qe:i.status==="dirty"?(a.dirty(),Ji(i.value)):this._def.out._parseAsync({data:i.value,path:o.path,parent:o})})();{const s=this._def.in._parseSync({data:o.data,path:o.path,parent:o});return s.status==="aborted"?qe:s.status==="dirty"?(a.dirty(),{status:"dirty",value:s.value}):this._def.out._parseSync({data:s.value,path:o.path,parent:o})}}static create(t,a){return new Sh({in:t,out:a,typeName:Ke.ZodPipeline})}}class Sd extends ot{_parse(t){const a=this._def.innerType._parse(t),o=s=>(Bs(s)&&(s.value=Object.freeze(s.value)),s);return hd(a)?a.then(s=>o(s)):o(a)}unwrap(){return this._def.innerType}}Sd.create=(e,t)=>new Sd({innerType:e,typeName:Ke.ZodReadonly,...Qe(t)});var Ke;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline",e.ZodReadonly="ZodReadonly"})(Ke||(Ke={}));const p=Oa.create,j=Do.create;Oo.create;const le=fd.create,ev=Gs.create,N1=gd.create,on=Nm.create;Jr.create;const V=Ma.create,y=Bt.create,en=_d.create,Ch=xh.create;bd.create;Lo.create;const Ve=yd.create,Fe=kd.create,he=Mo.create;vd.create;ir.create;jo.create;const _n={string:(e=>Oa.create({...e,coerce:!0})),number:(e=>Do.create({...e,coerce:!0})),boolean:(e=>fd.create({...e,coerce:!0})),bigint:(e=>Oo.create({...e,coerce:!0})),date:(e=>Gs.create({...e,coerce:!0}))};var Da;(function(e){e.STRING="string",e.DATE="date",e.DATETIME="datetime",e.INTEGER="integer",e.FLOAT="float",e.BOOLEAN="boolean",e.UUID="uuid",e.JSON="json"})(Da||(Da={}));const D1=he(["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"]),O1=he(["CASCADE","SET NULL","SET DEFAULT","RESTRICT","NO ACTION"]),L1=he([Da.STRING,Da.DATE,Da.DATETIME,Da.INTEGER,Da.FLOAT,Da.BOOLEAN,Da.UUID,Da.JSON]),M1=y({sourceColumn:p().min(1,"Source column cannot be empty"),referenceColumn:p().min(1,"Reference column cannot be empty")}),Th=y({constraintName:p().optional(),referenceTable:p().min(1,"Target table cannot be empty"),referenceColumns:V(M1).min(1,"At least one column mapping is required"),onDelete:O1,onUpdate:D1}),tv=y({columnName:p().min(1,"Column name cannot be empty").max(64,"Column name must be less than 64 characters"),type:en([L1,p()]),defaultValue:p().optional(),isPrimaryKey:le().optional(),isNullable:le(),isUnique:le()}),nv=y({schemaName:p().optional(),tableName:p().min(1,"Table name cannot be empty").max(64,"Table name must be less than 64 characters"),columns:V(tv).min(1,"At least one column is required"),foreignKeys:V(Th).optional(),recordCount:j().optional(),createdAt:p().optional(),updatedAt:p().optional()}),z1=y({name:p(),isProtected:le()}),j1=y({functionName:p(),functionDef:p(),kind:p()}),U1=y({tableName:p(),indexName:p(),indexDef:p(),isUnique:le().nullable(),isPrimary:le().nullable()}),H1=y({tableName:p(),policyName:p(),cmd:p(),roles:V(p()),qual:p().nullable(),withCheck:p().nullable()}),F1=y({tableName:p(),triggerName:p(),actionTiming:p(),eventManipulation:p(),actionOrientation:p(),actionCondition:p().nullable(),actionStatement:p()}),av=y({version:p().regex(/^\d{1,64}$/,"Migration version must be a numeric string of at most 64 digits (e.g. 0001 or 20260418091500)."),name:p().min(1),statements:V(p()).min(1),createdAt:p()}),B1=y({id:p(),name:p().nullable(),triggerSource:he(["manual","scheduled"]),status:he(["running","completed","failed"]),sizeBytes:j().nullable(),errorMessage:p().nullable(),createdAt:p(),completedAt:p().nullable(),createdBy:p().nullable()});nv.pick({tableName:!0,columns:!0,foreignKeys:!0}).extend({rlsEnabled:le().default(!0)});nv.pick({schemaName:!0,tableName:!0,columns:!0}).extend({message:p(),autoFields:V(p()),nextActions:p()});y({addColumns:V(tv).optional(),dropColumns:V(p()).optional(),updateColumns:V(y({columnName:p(),defaultValue:p().optional(),newColumnName:p().min(1,"New column name cannot be empty").max(64,"New column name must be less than 64 characters").optional()})).optional(),addForeignKeys:V(Th).optional(),dropForeignKeys:V(p()).optional(),renameTable:y({newTableName:p().min(1,"New table name cannot be empty").max(64,"New table name must be less than 64 characters")}).optional()});y({schemaName:p().optional(),message:p(),tableName:p(),operations:V(p())});y({schemaName:p().optional(),message:p(),tableName:p(),nextActions:p()});y({query:p().min(1,"Query is required"),params:V(on()).optional(),explain:le().optional()});y({rows:V(Ve(p(),on())),rowCount:j().nullable(),fields:V(y({name:p(),dataTypeID:j()})).optional()});y({tables:V(p()).optional(),format:he(["sql","json"]).default("sql"),includeData:le().default(!0),includeFunctions:le().default(!1),includeSequences:le().default(!1),includeViews:le().default(!1),rowLimit:j().int().positive().max(1e4).default(1e3)});const G1=y({timestamp:p(),tables:Ve(p(),y({schema:V(y({columnName:p(),dataType:p(),characterMaximumLength:j().nullable(),isNullable:p(),columnDefault:p().nullable()})),indexes:V(y({indexname:p(),indexdef:p(),isUnique:le().nullable(),isPrimary:le().nullable()})),foreignKeys:V(Th),rlsEnabled:le().optional(),policies:V(y({policyname:p(),cmd:p(),roles:V(p()),qual:p().nullable(),withCheck:p().nullable()})),triggers:V(y({triggerName:p(),actionTiming:p(),eventManipulation:p(),actionOrientation:p(),actionCondition:p().nullable(),actionStatement:p(),newTable:p().nullable(),oldTable:p().nullable()})),rows:V(Ve(p(),on())).optional(),recordCount:j().optional()})),functions:V(y({functionName:p(),functionDef:p(),kind:p()})),sequences:V(y({sequenceName:p(),startValue:p(),increment:p(),minValue:p().nullable(),maxValue:p().nullable(),cycle:p()})),views:V(y({viewName:p(),definition:p()}))});y({format:he(["sql","json"]),data:en([p(),G1]),timestamp:p()});y({truncate:en([le(),p().transform(e=>{if(e==="true")return!0;if(e==="false")return!1;throw new Error("Invalid boolean string")})]).default(!1)});y({success:le(),message:p(),filename:p(),tables:V(p()),rowsImported:j(),fileSize:j()});y({schema:p().default("public"),table:p().min(1,"Table name is required"),upsertKey:p().optional()});y({success:le(),message:p(),table:p(),rowsAffected:j(),totalRecords:j(),filename:p()});const Tl=Ve(p(),on());y({columnName:p().trim().min(1,"Column name is required"),direction:he(["asc","desc"])});y({limit:_n.number().int().min(1).max(500).default(50),offset:_n.number().int().min(0).default(0),search:p().trim().optional(),sort:p().trim().optional(),filterColumn:p().trim().optional(),filterValue:p().optional()}).refine(e=>e.filterColumn===void 0&&e.filterValue===void 0||e.filterColumn!==void 0&&e.filterValue!==void 0,{message:"filterColumn and filterValue must be provided together.",path:["filterColumn"]});y({column:en([p().trim().min(1),V(p().trim().min(1)).min(1)]),value:en([p(),V(p()).min(1)])}).refine(e=>{const t=Array.isArray(e.column)?e.column:[e.column],a=Array.isArray(e.value)?e.value:[e.value];return t.length===a.length},{message:"column and value must have the same number of entries",path:["value"]});V(Tl).min(1,"At least one record is required");const $1=en([p(),j(),le(),N1()]),rv=Ve(p().trim().min(1,"Primary key column is required"),$1).refine(e=>Object.keys(e).length>0,{message:"Primary key must include at least one column."}),q1=Tl.refine(e=>Object.keys(e).length>0,{message:"At least one field is required."});y({pkKeys:rv,data:q1});y({pkKeys:V(rv).min(1,"At least one primary key is required")});Tl.nullable();V(Tl);y({data:V(Tl),pagination:y({offset:j().int().min(0),limit:j().int().min(1),total:j().int().min(0)})});y({deletedCount:j().int().min(0)});y({version:p().regex(/^\d{1,64}$/,"Migration version must be a numeric string of at most 64 digits (e.g. 0001 or 20260418091500)."),name:p().trim().min(1,"Migration name is required").refine(e=>e.length===0||/^[a-z0-9-]+$/.test(e),{message:"Use lowercase letters, numbers, and hyphens only."}),sql:p().trim().min(1,"Migration SQL is required")});av.extend({message:p()});y({functions:V(j1)});y({schemas:V(z1)});y({indexes:V(U1)});y({policies:V(H1)});y({triggers:V(F1)});y({migrations:V(av)});y({name:p().trim().min(1,"Backup name cannot be empty").max(64,"Backup name must be less than 64 characters").optional()});y({name:p().trim().min(1,"Backup name cannot be empty").max(64,"Backup name must be less than 64 characters").nullable()});y({backups:V(B1)});y({message:p()});y({message:p()});const K1=y({id:p(),key:p(),isActive:le(),isReserved:le(),lastUsedAt:p().nullable(),expiresAt:p().nullable(),createdAt:p(),updatedAt:p()});y({secrets:V(K1)});y({key:p(),value:p()});y({key:p().regex(/^[A-Z0-9_]+$/,"Use uppercase letters, numbers, and underscores only"),value:p().min(1,"Value is required")});y({success:Fe(!0),message:p(),id:p()});y({success:Fe(!0),message:p()});y({success:Fe(!0),message:p()});y({gracePeriodHours:_n.number().int().nonnegative().max(168).optional()});y({success:Fe(!0),message:p(),apiKey:p(),oldKeyExpiresAt:p()});y({gracePeriodHours:_n.number().int().nonnegative().max(720).optional()});y({success:Fe(!0),message:p(),anonKey:p(),oldKeyExpiresAt:p()});const V1=y({key:p(),bucket:p(),size:j(),mimeType:p().optional(),uploadedAt:p(),url:p()}),W1=y({name:p(),public:le(),createdAt:p()});y({id:p().uuid(),maxFileSizeMb:j().int().positive(),createdAt:p(),updatedAt:p()});y({bucketName:p().min(1,"Bucket name cannot be empty"),isPublic:le().default(!0)});y({isPublic:le()});y({objects:V(V1),pagination:y({offset:j(),limit:j(),total:j()})});y({keys:V(p().min(1,"Object key cannot be empty")).min(1,"At least one object key is required").max(1e3,"Cannot delete more than 1000 objects at once")});const Y1=y({key:p(),status:he(["deleted","notFound","failed"]),message:p().optional()});y({results:V(Y1)});y({filename:p().min(1,"Filename cannot be empty"),contentType:p().optional(),size:j().optional()});y({method:he(["presigned","direct"]),uploadUrl:p(),fields:Ve(p()).optional(),key:p(),confirmRequired:le(),confirmUrl:p().optional(),expiresAt:ev().optional()});y({method:he(["presigned","direct"]),url:p(),expiresAt:ev().optional(),headers:Ve(p()).optional()});y({size:j(),contentType:p().optional(),etag:p().optional()});y({maxFileSizeMb:j().int().min(1,"Must be at least 1 MB").max(200,"Must be at most 200 MB")});const Z1=y({id:p().uuid(),accessKeyId:p().regex(/^INSF[A-Z0-9]{16}$/,"Invalid access key id format"),description:p().nullable(),createdAt:p(),lastUsedAt:p().nullable()});Z1.extend({secretAccessKey:p().length(40,"Secret must be 40 characters")});y({description:p().max(200).optional()});y({endpoint:p(),region:p()});const Eh=p().uuid("Invalid user ID format"),Ha=p().email("Invalid email format").toLowerCase().trim(),$d=p(),Q1=p().min(1,"Name is required").max(100,"Name must be less than 100 characters").trim(),J1=p().trim().min(1,"Username is required").max(100,"Username must be at most 100 characters"),X1=he(["anon","authenticated","project_admin"]),Hb=he(["code","link"]),ov=y({name:p().optional(),avatar_url:p().url().optional()}).passthrough(),Zs=y({id:Eh,email:Ha,emailVerified:le(),providers:V(p()).optional(),createdAt:p(),updatedAt:p(),profile:ov.nullable(),metadata:Ve(on()).nullable()}),sv=y({sub:p().min(1)}),qd=he(["google","github","discord","linkedin","facebook","instagram","tiktok","apple","x","spotify","microsoft"]);y({provider:qd,redirectUri:p().url().optional()});const Ah=y({id:p().uuid(),provider:qd,clientId:p().optional(),scopes:V(p()).optional(),redirectUri:p().optional(),useSharedKey:le(),createdAt:p(),updatedAt:p()}),eA=/^(?:(?:https?:\/\/)(?:(?=[^\s/:?#]*[a-zA-Z0-9])(?:(?:\*\.)?[^\s/:?#*[\]]*(?:\*[^\s/:?#*[\]]*)*|(?:\*\.)?[^\s/:?#]+)|\[[0-9A-Fa-f:.]+\])(?::\d+)?(?:\/[^\s]*)?|(?!(?:https?|javascript|data|file|vbscript):)[a-zA-Z][a-zA-Z0-9+.-]*:(?:\/\/[^\s/]+(?:\/[^\s]*)?|\/[^\s]*))$/i,iv=y({id:p().uuid(),requireEmailVerification:le(),passwordMinLength:j().min(4).max(128),requireNumber:le(),requireLowercase:le(),requireUppercase:le(),requireSpecialChar:le(),verifyEmailMethod:Hb,resetPasswordMethod:Hb,allowedRedirectUrls:V(p().regex(eA,{message:"Invalid URL or wildcard URL"})).optional().nullable(),disableSignup:le(),createdAt:p(),updatedAt:p()}),tA=y({id:p().uuid(),enabled:le(),host:p(),port:j().int(),username:p(),hasPassword:le(),senderEmail:p(),senderName:p(),minIntervalSeconds:j().int().min(0),createdAt:p(),updatedAt:p()}),nA=y({id:p().uuid(),templateType:p(),subject:p(),bodyHtml:p(),createdAt:p(),updatedAt:p()});y({sub:p().min(1),email:Ha.optional(),role:X1,iat:j().optional(),exp:j().optional()});const lv=p().min(1).max(64).regex(/^[a-z0-9_-]+$/,"Key must contain only lowercase letters, numbers, hyphens, and underscores"),Ph=y({id:p().uuid(),key:lv,name:p().min(1),discoveryEndpoint:p().url(),clientId:p().min(1),createdAt:p(),updatedAt:p()}),aA=y({limit:p().optional(),offset:p().optional()});y({email:Ha,password:$d,name:Q1.optional(),redirectTo:p().url().optional(),autoConfirm:le().optional()});y({email:Ha,password:$d});y({username:J1,password:$d});y({refreshToken:p().min(1,"refreshToken is required")});y({code:p()});aA.extend({search:p().optional()}).optional();y({userIds:V(Eh).min(1,"At least one user ID is required")});y({profile:Ve(on())});y({email:Ha,redirectTo:p().url().optional()});y({email:Ha,otp:p().regex(/^\d{6}$/,"OTP code must be a 6-digit numeric code")});y({email:Ha,redirectTo:p().url().optional()});y({email:Ha,code:p().regex(/^\d{6}$/,"Reset password code must be a 6-digit numeric code")});y({newPassword:$d,otp:p().min(1,"OTP/token is required")});y({user:Zs.optional(),accessToken:p().nullable(),requireEmailVerification:le().optional(),csrfToken:p().nullable().optional(),refreshToken:p().optional()});y({user:Zs,accessToken:p(),csrfToken:p().nullable().optional(),refreshToken:p().optional()});y({user:Zs,accessToken:p(),csrfToken:p().nullable().optional(),refreshToken:p().optional()});y({accessToken:p(),user:Zs,csrfToken:p().optional(),refreshToken:p().optional()});y({token:p(),expiresAt:p().datetime()});y({message:p()});y({admin:sv,accessToken:p(),csrfToken:p().nullable().optional(),refreshToken:p().optional()});y({user:Zs});y({admin:sv});y({id:Eh,profile:ov.nullable()});y({data:V(Zs),pagination:y({offset:j(),limit:j(),total:j()})});y({message:p(),deletedCount:j().int().nonnegative()});y({authUrl:p().url()});Ah.omit({id:!0,createdAt:!0,updatedAt:!0}).extend({clientSecret:p().optional()});Ah.omit({id:!0,provider:!0,createdAt:!0,updatedAt:!0}).extend({clientSecret:p().optional()}).partial();const cv=/^[A-Za-z0-9._~-]+$/;y({redirect_uri:p({required_error:"Redirect URI is required"}).url(),code_challenge:p().min(43,"Code challenge must be at least 43 characters").max(128,"Code challenge must be at most 128 characters").regex(cv,"Code challenge must be base64url encoded")}).catchall(p());y({code:p().min(1,"Exchange code is required"),code_verifier:p().min(43,"Code verifier must be at least 43 characters").max(128,"Code verifier must be at most 128 characters").regex(cv,"Code verifier must be base64url encoded")});y({data:V(Ah),count:j()});iv.omit({id:!0,createdAt:!0,updatedAt:!0}).partial();const rA=tA.omit({id:!0,createdAt:!0,updatedAt:!0}),dv=y({oAuthProviders:V(qd),customOAuthProviders:V(lv),smtpConfig:rA,...iv.omit({id:!0,updatedAt:!0,createdAt:!0}).shape});dv.omit({allowedRedirectUrls:!0,smtpConfig:!0});y({enabled:le(),host:p().default(""),port:en([Fe(25),Fe(465),Fe(587),Fe(2525)],{errorMap:()=>({message:"Port must be one of: 25, 465, 587, 2525"})}),username:p().default(""),password:p().min(1,"SMTP password is required").optional(),senderEmail:p().default(""),senderName:p().default(""),minIntervalSeconds:j().int().min(0).default(60)}).superRefine((e,t)=>{e.enabled&&(e.host.length<1&&t.addIssue({code:oe.custom,path:["host"],message:"SMTP host is required"}),e.username.length<1&&t.addIssue({code:oe.custom,path:["username"],message:"SMTP username is required"}),p().email().safeParse(e.senderEmail).success||t.addIssue({code:oe.custom,path:["senderEmail"],message:"Invalid sender email"}),e.senderName.length<1&&t.addIssue({code:oe.custom,path:["senderName"],message:"Sender name is required"}))});y({subject:p().min(1,"Subject is required"),bodyHtml:p().min(1,"Template body is required")});y({data:V(nA)});y({error:p(),message:p(),statusCode:j().int(),nextActions:p().optional()});Ph.omit({id:!0,createdAt:!0,updatedAt:!0}).extend({clientSecret:p().min(1,"Client secret is required")});Ph.omit({id:!0,key:!0,createdAt:!0,updatedAt:!0}).extend({clientSecret:p().min(1).optional()}).partial();y({data:V(Ph),count:j()});const uv=he(["system","user"]),pv=y({id:p().uuid(),pattern:p().min(1),description:p().nullable(),webhookUrls:V(p().url()).nullable(),enabled:le(),createdAt:p().datetime(),updatedAt:p().datetime()}),oA=y({id:p().uuid(),eventName:p().min(1),channelId:p().uuid().nullable(),channelName:p().min(1),payload:Ve(p(),on()),senderType:uv,senderId:p().uuid().nullable(),wsAudienceCount:j().int().min(0),whAudienceCount:j().int().min(0),whDeliveredCount:j().int().min(0),createdAt:p().datetime()}),sA=y({retentionDays:j().int().positive().nullable()});y({channel:p().min(1)});y({channel:p().min(1)});y({channel:p().min(1),event:p().min(1),payload:Ve(p(),on())});he(["user","anonymous"]);const mv=y({presenceId:p().min(1),joinedAt:p().datetime()}),iA=mv.extend({type:Fe("user")}),lA=mv.extend({type:Fe("anonymous")}),Rh=Ch("type",[iA,lA]),cA=y({members:V(Rh)});Ch("ok",[y({ok:Fe(!0),channel:p().min(1),presence:cA}),y({ok:Fe(!1),channel:p().min(1),error:y({code:p().min(1),message:p().min(1)})})]);y({channel:p().optional(),code:p().min(1),message:p().min(1)});y({messageId:p().uuid(),channel:p().min(1),eventName:p().min(1),payload:Ve(p(),on())});const dA=y({channel:p().optional(),messageId:p().uuid(),senderType:uv,senderId:p().uuid().optional(),timestamp:p().datetime()}),hv=y({meta:dA}).passthrough();hv.extend({member:Rh});hv.extend({member:Rh});y({pattern:p().min(1,"Channel pattern is required"),description:p().optional(),webhookUrls:V(p().url()).optional(),enabled:le().optional().default(!0)});y({pattern:p().min(1).optional(),description:p().optional(),webhookUrls:V(p().url()).optional(),enabled:le().optional()});V(pv);y({message:p()});y({channelId:p().uuid().optional(),eventName:p().optional(),limit:_n.number().int().min(1).max(1e3).optional().default(100),offset:_n.number().int().min(0).optional().default(0)});V(oA);y({deleted:j().int().min(0)});y({channelId:p().uuid().optional(),since:_n.date().optional()});y({totalMessages:j().int().min(0),whDeliveryRate:j().min(0).max(1),topEvents:V(y({eventName:p(),count:j().int().min(0)})),retentionDays:sA.shape.retentionDays});const Fb=y({policyName:p(),tableName:p(),command:p(),roles:V(p()),using:p().nullable(),withCheck:p().nullable()}),uA=y({subscribe:y({policies:V(Fb)}),publish:y({policies:V(Fb)})}),pA=dv,mA=y({tables:V(y({tableName:p(),recordCount:j()})),totalSizeInGB:j(),hint:p().optional()}),hA=W1.extend({objectCount:j().optional()}),fA=y({buckets:V(hA),totalSizeInGB:j()}),gA=y({slug:p(),name:p(),description:p().nullable(),status:p()}),_A=y({channels:V(pv),permissions:uA}),bA=y({customSlug:p().nullable()});y({auth:pA,database:mA,storage:fA,functions:V(gA),realtime:_A.optional(),deployments:bA.optional(),version:p().optional()});const yA=y({host:p(),port:j(),database:p(),user:p(),password:p(),sslmode:p()});y({connectionURL:p(),parameters:yA});y({databasePassword:p()});y({apiKey:p()});y({anonKey:p()});y({projectId:p().nullable()});const Bb=p().min(1);var Qp={};const kA=16384,vA=()=>{if(typeof process<"u"&&Qp&&Qp.MAX_COMPLETION_TOKENS){const e=Number(Qp.MAX_COMPLETION_TOKENS);if(Number.isInteger(e)&&e>0)return e}return kA},wA=y({type:Fe("text"),text:p()}),xA=y({type:Fe("image_url"),image_url:y({url:p(),detail:he(["auto","low","high"]).optional()})}),SA=y({type:Fe("input_audio"),input_audio:y({data:p(),format:he(["wav","mp3","aiff","aac","ogg","flac","m4a"])})}),CA=y({type:Fe("file"),file:y({filename:p(),file_data:p()})}),TA=en([wA,xA,SA,CA]),EA=y({name:p(),description:p().optional(),parameters:Ve(on()).optional()}),AA=y({type:Fe("function"),function:EA}),PA=en([he(["auto","none","required"]),y({type:Fe("function"),function:y({name:p()})})]),fv=y({id:p(),type:Fe("function"),function:y({name:p(),arguments:p()})}),RA=y({role:he(["user","assistant","system","tool"]),content:en([p(),V(TA)]).nullable(),images:V(y({url:p()})).optional(),tool_calls:V(fv).optional(),tool_call_id:p().optional()}),IA=y({enabled:le(),engine:he(["native","exa"]).optional(),maxResults:j().min(1).max(10).optional(),searchPrompt:p().optional()}),NA=y({enabled:le(),pdf:y({engine:he(["pdf-text","mistral-ocr","native"]).optional()}).optional()});y({model:p(),messages:V(RA),temperature:j().min(0).max(2).optional(),maxTokens:j().int().positive().optional().refine(e=>e===void 0||e<=vA(),{message:"Exceeds configured maximum token cap."}),topP:j().min(0).max(1).optional(),stream:le().optional(),webSearch:IA.optional(),fileParser:NA.optional(),thinking:le().optional(),tools:V(AA).optional(),toolChoice:PA.optional(),parallelToolCalls:le().optional()});const DA=y({type:Fe("url_citation"),urlCitation:y({url:p(),title:p().optional(),content:p().optional(),startIndex:j().optional(),endIndex:j().optional()})}),OA=y({type:Fe("file"),file:y({filename:p(),parsedContent:p().optional(),metadata:Ve(on()).optional()})}),LA=en([DA,OA]);y({text:p(),tool_calls:V(fv).optional(),annotations:V(LA).optional(),metadata:y({model:p(),usage:y({promptTokens:j().optional(),completionTokens:j().optional(),totalTokens:j().optional()}).optional()}).optional()});y({model:p(),input:en([p(),V(p())]),encoding_format:he(["float","base64"]).optional(),dimensions:j().int().min(0).optional()});const MA=y({object:Fe("embedding"),embedding:en([V(j()),p()]),index:j()});y({object:Fe("list"),data:V(MA),metadata:y({model:p(),usage:y({promptTokens:j().optional(),totalTokens:j().optional()}).optional()}).optional()});y({model:p(),prompt:p(),images:V(y({url:p()})).optional()});y({text:p().optional(),images:V(y({type:Fe("imageUrl"),imageUrl:p()})),metadata:y({model:p(),usage:y({promptTokens:j().optional(),completionTokens:j().optional(),totalTokens:j().optional()}).optional()}).optional()});y({id:p(),created:j().optional(),inputModality:V(Bb).min(1),outputModality:V(Bb).min(1),provider:p(),modelId:p(),inputPrice:j().min(0).optional(),outputPrice:j().min(0).optional(),inputPriceLabel:p().optional(),outputPriceLabel:p().optional()});const Jp=y({label:p(),value:j()});y({key:y({label:p().optional(),limit:j().nullable(),limitRemaining:j().nullable(),limitReset:p().nullable().optional(),usage:j(),usageDaily:j(),usageWeekly:j(),usageMonthly:j(),isFreeTier:le().optional(),observabilityAvailable:le(),observabilityError:p().optional()}),charts:y({spend:V(Jp),requests:V(Jp),tokens:V(Jp)})});y({apiKey:p(),maskedKey:p()});const gv=y({id:p(),actor:p(),action:p(),module:p(),details:Ve(on()).nullable(),ipAddress:p().nullable(),createdAt:p(),updatedAt:p()});y({id:p(),name:p(),token:p()});const zA=y({id:p(),eventMessage:p(),timestamp:p(),body:Ve(p(),on()),source:p().optional()});y({source:p(),count:j(),lastActivity:p()});const jA=y({level:p(),message:p()});y({deploymentId:p(),status:he(["pending","success","failed"]),logs:V(jA),createdAt:p()});y({limit:j().default(100),offset:j().default(0),actor:p().optional(),action:p().optional(),module:p().optional(),startDate:p().optional(),endDate:p().optional()});y({data:V(gv),pagination:y({limit:j(),offset:j(),total:j()})});y({days:j().default(7)});y({totalLogs:j(),uniqueActors:j(),uniqueModules:j(),actionsByModule:Ve(j()),recentActivity:V(gv)});y({daysToKeep:j().default(90)});y({message:p(),deleted:j()});y({logs:V(zA),total:j()});const _v=y({id:p(),slug:p(),name:p(),description:p().nullable(),code:p(),status:he(["draft","active","error"]),createdAt:p(),updatedAt:p(),deployedAt:p().nullable()});y({name:p().min(1,"Name is required"),slug:p().regex(/^[a-zA-Z0-9_-]+$/,"Invalid slug format - must be alphanumeric with hyphens or underscores only").optional(),code:p().min(1),description:p().optional(),status:he(["draft","active"]).optional().default("active")});y({name:p().optional(),code:p().optional(),description:p().optional(),status:he(["draft","active"]).optional()});y({functions:V(_v),runtime:y({status:he(["running","unavailable"])}),deploymentUrl:p().nullable().optional()});const UA=y({id:p(),status:he(["success","failed"]),url:p().nullable(),buildLogs:V(p()).optional()});y({success:le(),function:_v,deployment:UA.nullable().optional()});const HA=y({type:Fe("APP_ROUTE_CHANGE"),path:p()}),FA=y({type:Fe("AUTH_SUCCESS")}),BA=y({type:Fe("AUTH_ERROR"),message:p()}),GA=y({type:Fe("MCP_CONNECTION_STATUS"),connected:le(),toolName:p(),timestamp:en([j(),p()])}),$A=y({type:Fe("SHOW_ONBOARDING_OVERLAY")}),qA=y({type:Fe("SHOW_SETTINGS_OVERLAY")}),KA=y({type:Fe("ONBOARDING_SUCCESS")}),VA=y({type:Fe("NAVIGATE_TO_USAGE")}),WA=y({type:Fe("SHOW_CONTACT_MODAL")}),YA=y({type:Fe("SHOW_CONNECT_OVERLAY")}),ZA=y({type:Fe("SHOW_PLAN_MODAL")}),QA=y({type:Fe("AUTHORIZATION_CODE"),code:p()}),JA=y({type:Fe("ROUTE_CHANGE"),path:p()}),XA=y({type:Fe("REQUEST_PROJECT_INFO")}),eP=y({type:Fe("PROJECT_INFO"),name:p(),instanceType:p(),region:p(),latestVersion:p().optional(),isBranch:le().optional()}),tP=y({type:Fe("REQUEST_INSTANCE_INFO")}),nP=y({type:Fe("INSTANCE_INFO"),currentInstanceType:p(),planName:p(),computeCredits:j(),currentOrgComputeCost:j(),instanceTypes:V(y({id:p(),name:p(),cpu:p(),ram:p(),pricePerHour:j(),pricePerMonth:j()})),projects:V(y({name:p(),instanceType:p(),monthlyCost:j(),isCurrent:le(),status:p()}))}),aP=y({type:Fe("REQUEST_INSTANCE_TYPE_CHANGE"),instanceType:p()}),rP=y({type:Fe("INSTANCE_TYPE_CHANGE_RESULT"),success:le(),instanceType:p().optional(),error:p().optional()}),oP=y({type:Fe("POSTHOG_CONNECTION_STATUS"),status:he(["connected","error","cancelled"]),reason:p().optional(),timestamp:j()}),sP=y({type:Fe("POSTHOG_CONNECT_REQUEST"),projectId:p(),timestamp:j()});Ch("type",[HA,FA,BA,GA,$A,qA,KA,VA,WA,YA,ZA,QA,JA,XA,eP,tP,nP,aP,rP,oP,sP]);he(["db","storage","functions","auth","ai","realtime","payments"]).describe(`
13
- SDK feature categories:
14
-
15
- - "db" - Database operations
16
- - "storage" - File storage
17
- - "functions" - Edge functions
18
- - "auth" - User authentication
19
- - "ai" - AI features
20
- - "realtime" - Real-time WebSockets
21
- - "payments" - Stripe Checkout, Billing Portal, Razorpay Checkout, and webhooks
22
- `);he(["typescript","swift","kotlin","rest-api"]).describe(`
23
- SDK languages:
24
-
25
- - "typescript" - JavaScript/TypeScript SDK
26
- - "swift" - Swift SDK
27
- - "kotlin" - Kotlin SDK
28
- - "rest-api" - REST API
29
- `);he(["instructions","auth-sdk","db-sdk","storage-sdk","functions-sdk","ai-integration-sdk","real-time","deployment","payments"]).describe(`
30
- Documentation type:
31
- "instructions" (essential backend setup - use FIRST),
32
- "db-sdk" (database operations),
33
- "storage-sdk" (file storage),
34
- "functions-sdk" (edge functions),
35
- "auth-sdk" (direct SDK methods for custom auth flows),
36
- "ai-integration-sdk" (AI features),
37
- "real-time" (real-time pub/sub through WebSockets),
38
- "deployment" (deploy frontend applications via MCP tool),
39
- "payments" (Stripe Checkout, Billing Portal, Razorpay Checkout, and webhook-based fulfillment)
40
- `);const Xp=en([Ha,V(Ha).min(1,"At least one email is required").max(50,"Maximum 50 recipients allowed")]);y({to:Xp,subject:p().trim().min(1,"Subject is required").max(500,"Subject too long"),html:p().trim().min(1,"HTML content is required"),cc:Xp.optional(),bcc:Xp.optional(),from:p().trim().max(100,"From name too long").optional(),replyTo:p().email("Reply-To must be a valid email").optional()});y({});const iP=he(["WAITING","UPLOADING","QUEUED","BUILDING","READY","ERROR","CANCELED"]),bv=y({id:p().uuid(),providerDeploymentId:p().nullable(),provider:p(),status:iP,url:p().nullable(),metadata:Ve(on()).nullable(),createdAt:p().datetime(),updatedAt:p().datetime()}),lP=y({buildCommand:p().nullable().optional(),outputDirectory:p().nullable().optional(),installCommand:p().nullable().optional(),devCommand:p().nullable().optional(),rootDirectory:p().nullable().optional()}),cP=y({key:p(),value:p()}),dP=p().min(1,"path is required").max(2048,"path is too long").refine(e=>!e.includes("\0"),"path cannot contain null bytes").refine(e=>!e.includes("\\"),"path must use forward slashes").refine(e=>!e.startsWith("/"),"path must be relative").refine(e=>e.split("/").every(t=>t!==""&&t!=="."&&t!==".."),"path cannot contain empty, current, or parent directory segments"),yv=y({path:dP,sha:p().regex(/^[a-f0-9]{40}$/i,"sha must be a SHA-1 hex digest"),size:j().int().nonnegative()}),kv=yv.extend({fileId:p().uuid(),uploadedAt:p().datetime().nullable()});y({id:p().uuid(),uploadUrl:p().url(),uploadFields:Ve(p())});y({files:V(yv).min(1)}).superRefine(({files:e},t)=>{const a=new Map;e.forEach((o,s)=>{if(a.get(o.path)!==void 0){t.addIssue({code:oe.custom,message:"duplicate file path",path:["files",s,"path"]});return}a.set(o.path,s)})});y({id:p().uuid(),status:bv.shape.status,files:V(kv)});kv.extend({uploadedAt:p().datetime()});y({projectSettings:lP.optional(),envVars:V(cP).optional(),meta:Ve(p()).optional()});y({data:V(bv),pagination:y({limit:j(),offset:j(),total:j()})});const uP=y({id:p(),key:p(),type:he(["plain","encrypted","secret","sensitive","system"]),updatedAt:j().optional()}),pP=y({id:p(),key:p(),value:p(),type:he(["plain","encrypted","secret","sensitive","system"]),updatedAt:j().optional()});y({envVars:V(uP)});y({envVar:pP});const mP=y({key:p().trim().min(1,"key is required"),value:p()});y({envVars:V(mP).min(1)}).superRefine(({envVars:e},t)=>{const a=new Map;e.forEach((o,s)=>{if(a.get(o.key)!==void 0){t.addIssue({code:oe.custom,message:"duplicate environment variable key",path:["envVars",s,"key"]});return}a.set(o.key,s)})});y({success:Fe(!0),message:p()});y({success:Fe(!0),message:p(),count:j().int().positive()});y({success:Fe(!0),message:p()});y({slug:p().trim().min(3,"slug must be at least 3 characters").max(63,"slug must be at most 63 characters").regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,"slug must be lowercase alphanumeric with hyphens, not starting or ending with hyphen").nullable()});y({success:le(),slug:p().nullable(),domain:p().nullable()});y({currentDeploymentId:p().uuid().nullable(),defaultDomainUrl:p().nullable(),customDomainUrl:p().nullable()});const hP=y({type:p(),domain:p(),value:p()}),fP=y({domain:p(),apexDomain:p(),verified:le(),misconfigured:le(),verification:V(hP),cnameTarget:p().nullable(),aRecordValue:p().nullable()});y({domain:p().trim().min(1,"Domain is required").regex(/^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i,"Invalid domain format (e.g. myapp.com or www.myapp.com)").refine(e=>!e.toLowerCase().endsWith(".insforge.site"),{message:"Domains ending with .insforge.site are reserved by InsForge"})});y({domains:V(fP)});const gP=y({id:p().uuid(),name:p(),cronSchedule:p(),functionUrl:p().url(),httpMethod:he(["GET","POST","PUT","PATCH","DELETE"]),headers:Ve(p()).nullable(),body:en([p(),Ve(on())]).nullable(),cronJobId:p().nullable(),lastExecutedAt:p().datetime().nullable(),isActive:le().default(!0),nextRun:p().datetime().nullable(),createdAt:p().datetime(),updatedAt:p().datetime()}),_P=y({id:p().uuid(),scheduleId:p().uuid(),executedAt:p().datetime(),statusCode:j().int(),success:le(),durationMs:j().int(),message:p().nullable()});y({retentionDays:j().int().positive().nullable()});const bP=/^\s*([1-9]|[1-5]\d)\s+seconds?\s*$/i,vv=p().refine(e=>bP.test(e)?!0:e.trim().split(/\s+/).length===5,{message:'Invalid cron schedule. Use 5-field cron (e.g., "*/5 * * * *") or sub-minute interval form (1–59 seconds, e.g., "30 seconds").'});y({name:p().min(3,"Schedule name must be at least 3 characters long"),cronSchedule:vv,functionUrl:p().url("The function URL must be a valid URL."),httpMethod:he(["GET","POST","PUT","PATCH","DELETE"]),headers:Ve(p()).optional().describe("Header values can reference secrets using ${{secrets.KEY_NAME}} syntax."),body:Ve(on()).optional().describe("The JSON body to send with the request.")});y({name:p().min(3,"Schedule name must be at least 3 characters long").optional(),cronSchedule:vv.optional(),functionUrl:p().url("The function URL must be a valid URL.").optional(),httpMethod:he(["GET","POST","PUT","PATCH","DELETE"]).optional(),headers:Ve(p()).optional().describe("Header values can reference secrets using ${{secrets.KEY_NAME}} syntax."),body:Ve(on()).optional().describe("The JSON body to send with the request."),isActive:le().optional().describe("Enable or disable the schedule.")});V(gP);const yP=_P;y({logs:V(yP),totalCount:j().int().nonnegative(),limit:j().int().positive(),offset:j().int().nonnegative()});y({id:p().uuid(),cronJobId:p(),message:p()});y({id:p().uuid(),cronJobId:p().optional(),message:p()});y({message:p()});const eo=he(["test","live"]),At=eo,Gt=eo,kP=he(["unconfigured","connected","error"]),vP=he(["succeeded","failed"]),Ih=y({environment:At,status:kP,accountId:p().nullable(),accountEmail:p().nullable(),accountLivemode:le().nullable(),webhookEndpointId:p().nullable(),webhookEndpointUrl:p().nullable(),webhookConfiguredAt:p().nullable(),maskedKey:p().nullable(),lastSyncedAt:p().nullable(),lastSyncStatus:vP.nullable(),lastSyncError:p().nullable(),lastSyncCounts:Ve(j())}),wv=he(["stripe","razorpay"]),Kd=y({environment:At,productId:p(),name:p(),description:p().nullable(),active:le(),defaultPriceId:p().nullable(),metadata:Ve(p()),syncedAt:p()}),Qs=y({environment:At,priceId:p(),productId:p().nullable(),active:le(),currency:p(),unitAmount:j().nullable(),unitAmountDecimal:p().nullable(),type:p(),lookupKey:p().nullable(),billingScheme:p().nullable(),taxBehavior:p().nullable(),recurringInterval:p().nullable(),recurringIntervalCount:j().nullable(),metadata:Ve(p()),syncedAt:p()}),wP=y({environment:eo,provider:wv,providerCustomerId:p(),email:p().nullable(),name:p().nullable(),phone:p().nullable(),deleted:le(),metadata:Ve(p()),providerCreatedAt:p().nullable(),syncedAt:p()}),xP=wP.extend({paymentsCount:j().int().nonnegative(),lastPaymentAt:p().nullable(),totalSpend:j().int().nonnegative().nullable(),totalSpendCurrency:p().nullable(),paymentMethodBrand:p().nullable(),paymentMethodLast4:p().nullable(),countryCode:p().trim().length(2).nullable()}),Vd=y({type:p().trim().min(1).max(100),id:p().trim().min(1).max(255)}).strict(),xv=he(["payment","subscription"]),SP=he(["initialized","open","completed","expired","failed"]),CP=he(["paid","unpaid","no_payment_required"]),TP=y({id:p(),environment:At,mode:xv,status:SP,paymentStatus:CP.nullable(),subjectType:p().nullable(),subjectId:p().nullable(),customerEmail:p().nullable(),checkoutSessionId:p().nullable(),customerId:p().nullable(),paymentIntentId:p().nullable(),subscriptionId:p().nullable(),url:p().nullable(),lastError:p().nullable(),createdAt:p(),updatedAt:p()}),EP=he(["initialized","created","attempted","paid","failed"]),Sv=y({id:p(),environment:Gt,status:EP,subjectType:p().nullable(),subjectId:p().nullable(),customerName:p().nullable(),customerEmail:p().nullable(),customerContact:p().nullable(),orderId:p().nullable(),receipt:p().nullable(),amount:j(),amountPaid:j().nullable(),amountDue:j().nullable(),currency:p(),attempts:j().int().nonnegative().nullable(),verifiedPaymentId:p().nullable(),verifiedAt:p().nullable(),notes:Ve(p()),lastError:p().nullable(),createdAt:p(),updatedAt:p()}),AP=he(["initialized","created","failed"]),PP=y({id:p(),environment:At,status:AP,subjectType:p(),subjectId:p(),customerId:p().nullable(),returnUrl:p().nullable(),configuration:p().nullable(),url:p().nullable(),lastError:p().nullable(),createdAt:p(),updatedAt:p()}),RP=he(["one_time_payment","subscription_invoice","refund","failed_payment"]),IP=he(["succeeded","failed","pending","refunded","partially_refunded"]),NP=y({environment:eo,provider:wv,type:RP,status:IP,subjectType:p().nullable(),subjectId:p().nullable(),providerCustomerId:p().nullable(),customerEmailSnapshot:p().nullable(),providerReferenceId:p().nullable(),providerReferenceType:p().nullable(),amount:j().nullable(),amountRefunded:j().nullable(),currency:p().nullable(),description:p().nullable(),paidAt:p().nullable(),failedAt:p().nullable(),refundedAt:p().nullable(),providerCreatedAt:p().nullable(),createdAt:p(),updatedAt:p()}),DP=he(["incomplete","incomplete_expired","trialing","active","past_due","canceled","unpaid","paused"]),OP=y({environment:At,subscriptionItemId:p(),subscriptionId:p(),productId:p().nullable(),priceId:p().nullable(),quantity:j().nullable(),metadata:Ve(p()),createdAt:p(),updatedAt:p()}),LP=y({environment:At,subscriptionId:p(),customerId:p().nullable(),subjectType:p().nullable(),subjectId:p().nullable(),status:DP,currentPeriodStart:p().nullable(),currentPeriodEnd:p().nullable(),cancelAtPeriodEnd:le(),cancelAt:p().nullable(),canceledAt:p().nullable(),trialStart:p().nullable(),trialEnd:p().nullable(),latestInvoiceId:p().nullable(),metadata:Ve(p()),syncedAt:p(),createdAt:p(),updatedAt:p(),items:V(OP)}),MP=he(["created","authenticated","active","pending","halted","cancelled","completed","expired","paused"]),Js=y({environment:Gt,subscriptionId:p(),planId:p(),customerId:p().nullable(),subjectType:p().nullable(),subjectId:p().nullable(),status:MP,currentStart:p().nullable(),currentEnd:p().nullable(),endedAt:p().nullable(),quantity:j().nullable(),chargeAt:p().nullable(),startAt:p().nullable(),endAt:p().nullable(),totalCount:j().nullable(),authAttempts:j().nullable(),paidCount:j().nullable(),remainingCount:j().nullable(),shortUrl:p().nullable(),hasScheduledChanges:le(),changeScheduledAt:p().nullable(),offerId:p().nullable(),authorizationPaymentId:p().nullable(),authorizationVerifiedAt:p().nullable(),notes:Ve(p()),providerCreatedAt:p().nullable(),syncedAt:p(),createdAt:p(),updatedAt:p()}),zP=he(["pending","processed","failed","ignored"]),jP=y({environment:At,eventId:p(),eventType:p(),livemode:le(),accountId:p().nullable(),objectType:p().nullable(),objectId:p().nullable(),processingStatus:zP,attemptCount:j(),lastError:p().nullable(),receivedAt:p(),processedAt:p().nullable(),createdAt:p(),updatedAt:p()}),UP=he(["unconfigured","connected","error"]),HP=he(["succeeded","failed"]),Nh=y({environment:Gt,status:UP,accountId:p().nullable(),merchantName:p().nullable(),accountLivemode:le().nullable(),webhookEndpointId:p().nullable(),webhookEndpointUrl:p().nullable(),webhookConfiguredAt:p().nullable(),maskedKey:p().nullable(),lastSyncedAt:p().nullable(),lastSyncStatus:HP.nullable(),lastSyncError:p().nullable(),lastSyncCounts:Ve(j())}),Cv=y({environment:Gt,itemId:p(),name:p(),description:p().nullable(),active:le(),amount:j().nullable(),unitAmount:j().nullable().describe("Razorpay per-unit amount mirror; usually equals amount for catalog items."),currency:p(),type:p().nullable(),providerCreatedAt:p().nullable(),syncedAt:p()}),Tv=y({environment:Gt,planId:p(),itemId:p(),period:p(),interval:j(),amount:j().nullable(),unitAmount:j().nullable().describe("Razorpay nested item per-unit amount mirror; usually equals amount."),currency:p(),active:le(),notes:Ve(p()),providerCreatedAt:p().nullable(),syncedAt:p()});y({environment:en([At,Fe("all")]).default("all")});y({environment:en([Gt,Fe("all")]).default("all")});y({environment:eo}).strict();y({environment:At.optional()});y({environment:eo}).strict();y({}).strict();y({}).strict();y({environment:At,productId:p().trim().min(1,"Stripe product id is required").optional()}).strict();y({productId:p().trim().min(1,"Stripe product id is required").optional()}).strict();y({productId:p().trim().min(1,"Stripe product id is required")});y({priceId:p().trim().min(1,"Stripe price id is required")});y({environment:At});y({environment:Gt}).strict();y({environment:Gt,subscriptionId:p().trim().min(1,"Razorpay subscription id is required")}).strict();const FP=he(["day","week","month","year"]),Ev=he(["exclusive","inclusive","unspecified"]),Dh=p().trim().min(1,"Idempotency key is required").max(200,"Idempotency key must be 200 characters or fewer");function Av(e){return!Object.keys(e??{}).some(t=>t.startsWith("insforge_"))}function Xs(e){return!Object.keys(e??{}).some(t=>t.startsWith("insforge_"))}const Wd=p().trim().length(3,"Currency must be a three-letter ISO currency code").transform(e=>e.toUpperCase()),BP=y({name:p().trim().min(1).max(255).nullable().optional(),email:p().trim().email().nullable().optional(),contact:p().trim().min(1).max(32).nullable().optional()}).strict(),Pv=y({key:p(),name:p().nullable().optional(),description:p().nullable().optional(),prefill:BP,callback_url:p().nullable().optional()}).strict(),GP=y({name:p().trim().min(1,"Product name is required"),description:p().trim().max(5e3).nullable().optional(),active:le().optional(),metadata:Ve(p()).optional(),idempotencyKey:Dh.optional()}).strict();y({environment:At,...GP.shape}).strict();const Rv={name:p().trim().min(1,"Product name is required").optional(),description:p().trim().max(5e3).nullable().optional(),active:le().optional(),metadata:Ve(p()).optional()};function ei(e){return Object.keys(e).length>0}y(Rv).strict().refine(ei,{message:"At least one product field is required"});y({environment:At,...Rv}).strict().refine(({environment:e,...t})=>ei(t),{message:"At least one product field is required"});const $P=y({productId:p().trim().min(1,"Stripe product id is required"),currency:p().trim().length(3,"Currency must be a three-letter ISO currency code").transform(e=>e.toLowerCase()),unitAmount:j().int().nonnegative(),lookupKey:p().trim().min(1).max(200).nullable().optional(),active:le().optional(),recurring:y({interval:FP,intervalCount:j().int().positive().optional()}).strict().optional(),taxBehavior:Ev.optional(),metadata:Ve(p()).optional(),idempotencyKey:Dh.optional()}).strict();y({environment:At,...$P.shape}).strict();const Iv={active:le().optional(),lookupKey:p().trim().min(1).max(200).nullable().optional(),taxBehavior:Ev.optional(),metadata:Ve(p()).optional()};y(Iv).strict().refine(ei,{message:"At least one price field is required"});y({environment:At,...Iv}).strict().refine(({environment:e,...t})=>ei(t),{message:"At least one price field is required"});y({connections:V(Ih)});y({products:V(Kd),prices:V(Qs)});y({items:V(Cv),plans:V(Tv)});const qP=y({limit:_n.number().int().min(1).max(100).default(50)}).strict();y({environment:eo,...qP.shape}).strict();y({customers:V(xP)});y({products:V(Kd)});y({prices:V(Qs)});y({product:Kd,prices:V(Qs)});y({price:Qs});y({product:Kd});y({price:Qs});y({price:Qs,archived:le()});y({productId:p(),deleted:le()});y({itemId:p().trim().min(1,"Razorpay item id is required")});const KP=he(["daily","weekly","monthly","yearly"]),Nv={name:p().trim().min(1,"Item name is required").max(255),description:p().trim().max(2048).nullable().optional(),amount:j().int().positive(),currency:Wd};y(Nv).strict();y({environment:Gt,...Nv}).strict();const Dv={name:p().trim().min(1,"Item name is required").max(255).optional(),description:p().trim().max(2048).nullable().optional(),amount:j().int().positive().optional(),currency:Wd.optional(),active:le().optional()};y(Dv).strict().refine(ei,{message:"At least one item field is required"});y({environment:Gt,...Dv}).strict().refine(({environment:e,...t})=>ei(t),{message:"At least one item field is required"});const Ov={period:KP,interval:j().int().positive(),item:y({name:p().trim().min(1,"Plan item name is required").max(255),description:p().trim().max(2048).nullable().optional(),amount:j().int().positive(),currency:Wd}).strict(),notes:Ve(p()).optional()};y(Ov).strict().refine(e=>Xs(e.notes),{path:["notes"],message:"Notes keys starting with insforge_ are reserved"});y({environment:Gt,...Ov}).strict().refine(e=>Xs(e.notes),{path:["notes"],message:"Notes keys starting with insforge_ are reserved"});y({item:Cv});y({plan:Tv});const VP=y({priceId:p().trim().min(1,"Stripe price id is required"),quantity:j().int().positive().max(999).default(1)}).strict(),Lv={mode:xv,lineItems:V(VP).min(1).max(100),successUrl:p().trim().url("Success URL must be a valid URL"),cancelUrl:p().trim().url("Cancel URL must be a valid URL"),subject:Vd.optional(),customerEmail:p().trim().email().nullable().optional(),metadata:Ve(p()).optional(),idempotencyKey:Dh.optional()};y(Lv).strict().refine(e=>e.mode!=="subscription"||e.subject!==void 0,{path:["subject"],message:"Subscription checkout requires a billing subject"}).refine(e=>Av(e.metadata),{path:["metadata"],message:"Metadata keys starting with insforge_ are reserved"});y({environment:At,...Lv}).strict().refine(e=>e.mode!=="subscription"||e.subject!==void 0,{path:["subject"],message:"Subscription checkout requires a billing subject"}).refine(e=>Av(e.metadata),{path:["metadata"],message:"Metadata keys starting with insforge_ are reserved"});y({checkoutSession:TP});const Mv={amount:j().int().positive(),currency:Wd,receipt:p().trim().min(1).max(40).nullable().optional(),description:p().trim().max(2048).nullable().optional(),subject:Vd.optional(),customerName:p().trim().min(1).max(255).nullable().optional(),customerEmail:p().trim().email().nullable().optional(),customerContact:p().trim().min(1).max(32).nullable().optional(),callbackUrl:p().trim().url("Callback URL must be a valid URL").nullable().optional(),notes:Ve(p()).optional()};y(Mv).strict().refine(e=>Xs(e.notes),{path:["notes"],message:"Notes keys starting with insforge_ are reserved"});y({environment:Gt,...Mv}).strict().refine(e=>Xs(e.notes),{path:["notes"],message:"Notes keys starting with insforge_ are reserved"});y({order:Sv,checkoutOptions:Pv.extend({amount:j().int().positive(),currency:p(),order_id:p()})});const zv={orderId:p().trim().min(1,"Razorpay order id is required"),paymentId:p().trim().min(1,"Razorpay payment id is required"),signature:p().trim().min(1,"Razorpay signature is required")};y(zv).strict();y({environment:Gt,...zv}).strict();y({verified:le(),order:Sv});const jv={planId:p().trim().min(1,"Razorpay plan id is required"),totalCount:j().int().positive().optional(),endAt:j().int().positive().optional(),quantity:j().int().positive().optional(),startAt:j().int().positive().optional(),expireBy:j().int().positive().optional(),customerNotify:le().optional(),offerId:p().trim().min(1).max(255).nullable().optional(),description:p().trim().max(2048).nullable().optional(),subject:Vd,customerName:p().trim().min(1).max(255).nullable().optional(),customerEmail:p().trim().email().nullable().optional(),customerContact:p().trim().min(1).max(32).nullable().optional(),callbackUrl:p().trim().url("Callback URL must be a valid URL").nullable().optional(),notes:Ve(p()).optional()};function Uv(e){return e.totalCount!==void 0||e.endAt!==void 0}y(jv).strict().refine(Uv,{message:"Either totalCount or endAt is required"}).refine(e=>Xs(e.notes),{path:["notes"],message:"Notes keys starting with insforge_ are reserved"});y({environment:Gt,...jv}).strict().refine(Uv,{message:"Either totalCount or endAt is required"}).refine(e=>Xs(e.notes),{path:["notes"],message:"Notes keys starting with insforge_ are reserved"});y({subscription:Js,checkoutOptions:Pv.extend({subscription_id:p()})});const Hv={subscriptionId:p().trim().min(1,"Razorpay subscription id is required"),paymentId:p().trim().min(1,"Razorpay payment id is required"),signature:p().trim().min(1,"Razorpay signature is required")};y(Hv).strict();y({environment:Gt,...Hv}).strict();y({verified:le(),subscription:Js});const WP=y({cancelAtCycleEnd:le().default(!1)}).strict();y({environment:Gt,subscriptionId:p().trim().min(1,"Razorpay subscription id is required"),...WP.shape}).strict();y({subscription:Js});y({}).strict();y({subscription:Js});y({}).strict();y({subscription:Js});const YP=y({subject:Vd,returnUrl:p().trim().url("Return URL must be a valid URL").optional(),configuration:p().trim().min(1).max(255).optional()}).strict();y({environment:At,...YP.shape}).strict();y({customerPortalSession:PP});const ti={subjectType:p().trim().min(1).max(100).optional(),subjectId:p().trim().min(1).max(255).optional()};function ni(e){return e.subjectType===void 0==(e.subjectId===void 0)}y({...ti,environment:eo,limit:_n.number().int().min(1).max(100).default(50)}).strict().refine(ni,{message:"subjectType and subjectId must be provided together"});y({...ti,limit:_n.number().int().min(1).max(100).default(50)}).strict().refine(ni,{message:"subjectType and subjectId must be provided together"});y({...ti,environment:At,limit:_n.number().int().min(1).max(100).default(50)}).strict().refine(ni,{message:"subjectType and subjectId must be provided together"});y({...ti,limit:_n.number().int().min(1).max(100).default(50)}).strict().refine(ni,{message:"subjectType and subjectId must be provided together"});y({...ti,environment:Gt,limit:_n.number().int().min(1).max(100).default(50)}).strict().refine(ni,{message:"subjectType and subjectId must be provided together"});y({...ti,limit:_n.number().int().min(1).max(100).default(50)}).strict().refine(ni,{message:"subjectType and subjectId must be provided together"});y({transactions:V(NP)});y({subscriptions:V(LP)});y({subscriptions:V(Js)});const ZP=y({environment:At,synced:j().int().nonnegative(),unmapped:j().int().nonnegative(),deleted:j().int().nonnegative()}),QP=y({environment:At,connection:Ih,subscriptions:ZP.nullable()});y({results:V(QP)});y({connection:Ih});y({received:le(),handled:le(),event:jP.optional()});const JP=y({environment:At,value:p().nullable()}),XP=y({environment:Gt,keyType:he(["api_key","api_secret","webhook_secret"]),value:p().nullable()});y({keys:V(JP)});y({razorpayConnections:V(Nh)});y({keys:V(XP)});const eR=y({plans:j().int().nonnegative(),items:j().int().nonnegative(),customers:j().int().nonnegative(),subscriptions:j().int().nonnegative(),invoices:j().int().nonnegative(),payments:j().int().nonnegative()}).strict(),tR=y({environment:Gt,status:he(["succeeded","failed"]),connection:Nh,syncCounts:eR,error:p().nullable()}).strict();y({results:V(tR)});const nR=y({secretKey:p().trim().min(1,"Stripe secret key is required")}).strict();y({environment:At,...nR.shape}).strict();const aR=y({keyId:p().trim().min(1,"Razorpay key ID is required"),keySecret:p().trim().min(1,"Razorpay key secret is required"),webhookSecret:p().trim().optional()}).strict();y({environment:Gt,...aR.shape}).strict();y({connection:Nh,webhookUrl:p().trim().min(1),webhookSecret:p().trim().min(1)});y({received:le(),handled:le()});const rR=he(["creating","deploying","running","stopped","failed","destroying"]),oR=/^(shared|performance)-[1-9]\d*x$/,Oh=p().regex(oR,"cpu must match `<shared|performance>-<N>x`, e.g. shared-2x or performance-8x"),sR=y({id:p().uuid(),projectId:p(),name:p(),imageUrl:p(),port:j(),cpu:Oh,memory:j(),region:p(),protocol:he(["http","tcp"]),scaleToZero:le(),flyAppId:p().nullable(),flyMachineId:p().nullable(),status:rR,endpointUrl:p().nullable(),createdAt:p(),updatedAt:p()}),sd=/^[A-Z_][A-Z0-9_]*$/;y({name:p().min(1).max(63).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/,{message:"Name must be DNS-safe: lowercase letters, numbers, and dashes only, must start with a letter or number"}),imageUrl:p().min(1).optional(),port:j().min(1).max(65535),cpu:Oh.default("shared-1x"),memory:_n.number().refine(e=>[256,512,1024,2048,4096,8192].includes(e),{message:"Memory must be one of: 256, 512, 1024, 2048, 4096, 8192"}).default(512),envVars:Ve(p().regex(sd,{message:"Env var keys must match [A-Z_][A-Z0-9_]*"}),p().max(4096)).optional(),region:p().default("iad"),protocol:he(["http","tcp"]).optional(),scaleToZero:le().optional()});y({imageUrl:p().min(1).optional(),port:j().min(1).max(65535).optional(),cpu:Oh.optional(),memory:_n.number().refine(e=>[256,512,1024,2048,4096,8192].includes(e),{message:"Memory must be one of: 256, 512, 1024, 2048, 4096, 8192"}).optional(),envVars:Ve(p().regex(sd,{message:"Env var keys must match [A-Z_][A-Z0-9_]*"}),p().max(4096)).optional(),envVarsPatch:y({set:Ve(p().regex(sd,{message:"Env var keys must match [A-Z_][A-Z0-9_]*"}),p().max(4096)).optional(),unset:V(p().regex(sd,{message:"Env var keys must match [A-Z_][A-Z0-9_]*"})).optional()}).refine(e=>e.set&&Object.keys(e.set).length>0||e.unset&&e.unset.length>0,{message:"envVarsPatch must specify at least one key in set or unset"}).optional(),region:p().optional(),protocol:he(["http","tcp"]).optional(),scaleToZero:le().optional()}).refine(e=>!(e.envVars!==void 0&&e.envVarsPatch!==void 0),{message:"envVars and envVarsPatch are mutually exclusive — pick one (envVars replaces wholesale, envVarsPatch merges)",path:["envVarsPatch"]});y({services:V(sR)});const iR=y({timestamp:j(),message:p(),instance:p().optional(),region:p().optional()});y({lines:V(iR),nextToken:p().nullable()});const Fv=he(["active","degraded","revoked"]),lR=y({posthogProjectId:p(),organizationName:p().nullable(),projectName:p(),region:he(["US","EU"]),host:p().url(),apiKey:p(),status:Fv,createdAt:p()}),cR=y({id:j(),name:p(),description:p().optional(),pinned:le().optional(),lastModifiedAt:p().optional(),url:p().url()});y({dashboards:V(cR),count:j()});y({todayEvents:j(),dau24h:j(),totalEvents7d:j(),topEvents:V(y({event:p(),count:j()}))});const dR=y({id:p(),event:p(),distinctId:p(),timestamp:p()});y({events:V(dR),next:p().nullable()});he(["24h","7d","30d","3m"]);he(["Page","Country","DeviceType"]);he(["visitors","views","bounce_rate"]);const uR=y({key:p(),value:j().nullable(),previous:j().nullable(),changeFromPreviousPct:j().nullable(),isIncreaseBad:le().nullable().optional()});y({items:V(uR)});const pR=y({breakdownValue:p().nullable(),visitors:j(),views:j(),uiFillFraction:j()});y({rows:V(pR)});const mR=y({date:p(),count:j()});y({series:V(mR)});const hR=y({date:p(),label:p(),values:V(y({count:j().nullable()}))});y({rows:V(hR)});const fR=y({id:p(),distinctId:p(),durationSeconds:j(),startTime:p(),endTime:p(),startUrl:p().nullable(),clickCount:j(),consoleErrorCount:j()});y({items:V(fR)});const gR=/^https:\/\/([a-z0-9-]+\.)*posthog\.com(?::\d+)?(\/|$)/i;y({embedUrl:p().url().refine(e=>gR.test(e),{message:"embedUrl must be an https://*.posthog.com URL"})});y({apiKey:p().min(1,"API key is required"),region:he(["US","EU"]),host:p().url().optional()});lR.extend({message:p()});y({status:Fv});y({message:p()});const Lh=he(["fact","decision","preference","reference"]);y({scope:p().min(1).default("default"),source:p().optional(),kind:Lh.optional(),title:p().min(1).max(2e3).optional(),content:p().min(1).max(2e4).optional(),transcript:p().min(1).max(5e4).optional()}).refine(e=>!!e.transcript||!!(e.title&&e.content),{message:"Provide either { transcript } or { title, content }"});const _R=he(["ADD","UPDATE","NOOP"]),bR=y({action:_R,id:p().uuid().optional(),title:p()});y({results:V(bR)});y({scope:p().min(1).default("default"),query:p().min(1).max(4e3),limit:j().int().positive().max(50).default(5),threshold:j().min(0).max(1).optional()});const yR=y({id:p().uuid(),kind:Lh,title:p(),content:p(),similarity:j(),updated_at:p()});y({memories:V(yR)});y({scope:p().min(1).default("default")});const kR=y({id:p().uuid(),kind:Lh,title:p(),updated_at:p()});y({entries:V(kR)});const vR=["AUTH_INVALID_EMAIL","AUTH_WEAK_PASSWORD","AUTH_INVALID_CREDENTIALS","AUTH_INVALID_API_KEY","AUTH_EMAIL_EXISTS","AUTH_USER_NOT_FOUND","AUTH_OAUTH_CONFIG_ALREADY_EXISTS","AUTH_OAUTH_CONFIG_ERROR","AUTH_OAUTH_CONFIG_NOT_FOUND","AUTH_UNSUPPORTED_PROVIDER","AUTH_TOKEN_EXPIRED","AUTH_UNAUTHORIZED","AUTH_NEED_VERIFICATION","AUTH_SIGNUP_DISABLED"],wR=["DATABASE_INVALID_PARAMETER","DATABASE_VALIDATION_ERROR","DATABASE_CONSTRAINT_VIOLATION","DATABASE_NOT_FOUND","DATABASE_DUPLICATE","DATABASE_MIGRATION_ALREADY_EXISTS","DATABASE_PERMISSION_DENIED","DATABASE_INTERNAL_ERROR","DATABASE_FORBIDDEN"],xR=["STORAGE_ALREADY_EXISTS","STORAGE_INVALID_PARAMETER","STORAGE_INVALID_FILE_TYPE","STORAGE_INSUFFICIENT_QUOTA","STORAGE_NOT_FOUND","STORAGE_PERMISSION_DENIED","S3_ACCESS_KEY_LIMIT_EXCEEDED","S3_ACCESS_KEY_NOT_FOUND","S3_PROTOCOL_UNAVAILABLE"],SR=["REALTIME_CHANNEL_NOT_FOUND","REALTIME_CONNECTION_FAILED","REALTIME_INVALID_CHANNEL_REQUEST","REALTIME_INVALID_CHANNEL_PATTERN","REALTIME_INVALID_EVENT","REALTIME_NOT_SUBSCRIBED","REALTIME_UNAUTHORIZED"],CR=["AI_INVALID_API_KEY","AI_INVALID_MODEL","AI_UPSTREAM_UNAVAILABLE"],TR=["ANALYTICS_NOT_CONNECTED","ANALYTICS_UNAVAILABLE"],ER=["LOGS_AWS_NOT_CONFIGURED","LOG_NOT_FOUND"],AR=["COMPUTE_CLOUD_UNAVAILABLE","COMPUTE_NOT_CONFIGURED","COMPUTE_PROVIDER_ERROR","COMPUTE_SERVICE_NOT_FOUND","COMPUTE_MACHINE_NOT_FOUND","COMPUTE_SERVICE_NOT_CONFIGURED","COMPUTE_SERVICE_DEPLOY_FAILED","COMPUTE_SERVICE_ALREADY_EXISTS","COMPUTE_SERVICE_START_FAILED","COMPUTE_SERVICE_STOP_FAILED","COMPUTE_SERVICE_DELETE_FAILED","COMPUTE_REGION_CHANGE_NOT_SUPPORTED","COMPUTE_QUOTA_EXCEEDED"],PR=["BILLING_INSUFFICIENT_BALANCE"],RR=["EMAIL_SMTP_CONNECTION_FAILED","EMAIL_SMTP_SEND_FAILED","EMAIL_TEMPLATE_NOT_FOUND"],IR=["DEPLOYMENT_ALREADY_EXISTS","DEPLOYMENT_INVALID_FILE","DEPLOYMENT_NOT_FOUND","DEPLOYMENT_UPLOAD_CANCELED","DOMAIN_ALREADY_EXISTS","DOMAIN_INVALID","DOMAIN_NOT_FOUND","ENVIRONMENT_VARIABLE_NOT_FOUND"],NR=["DOCS_NOT_FOUND"],DR=["FUNCTION_ALREADY_EXISTS","FUNCTION_DEPLOYMENT_NOT_FOUND","FUNCTION_NOT_FOUND"],OR=["SCHEDULE_INVALID_CRON","SCHEDULE_NOT_FOUND"],LR=["PAYMENT_CHECKOUT_ALREADY_EXISTS","PAYMENT_CONFIG_INVALID","PAYMENT_CONFIG_NOT_FOUND","PAYMENT_NOT_FOUND","PAYMENT_METHOD_DECLINED","PAYMENT_PRICE_NOT_FOUND","PAYMENT_PRODUCT_NOT_FOUND"],MR=["SECRET_ALREADY_EXISTS","SECRET_NOT_FOUND"],zR=["MISSING_FIELD","ALREADY_EXISTS","INVALID_INPUT","NOT_FOUND","UNKNOWN_ERROR","INTERNAL_ERROR","TOO_MANY_REQUESTS","FORBIDDEN","RATE_LIMITED","NOT_IMPLEMENTED","UPSTREAM_FAILURE"],jR=[...vR,...wR,...xR,...SR,...CR,...TR,...ER,...AR,...PR,...RR,...IR,...NR,...DR,...OR,...LR,...MR,...zR],UR=he(jR),em=UR.enum;var Xt={},ys={},ks={},vs={},ws={},xs={},HR=function(){if(typeof self<"u")return self;if(typeof window<"u")return window;if(typeof global<"u")return global;throw new Error("unable to locate global object")},$s=HR();const FR=$s.fetch,BR=$s.fetch.bind($s),GR=$s.Headers,$R=$s.Request,qR=$s.Response,KR=Object.freeze(Object.defineProperty({__proto__:null,Headers:GR,Request:$R,Response:qR,default:BR,fetch:FR},Symbol.toStringTag,{value:"Module"})),VR=CC(KR);var Bc={},Gb;function Bv(){if(Gb)return Bc;Gb=1,Object.defineProperty(Bc,"__esModule",{value:!0});class e extends Error{constructor(a){super(a.message),this.name="PostgrestError",this.details=a.details,this.hint=a.hint,this.code=a.code}}return Bc.default=e,Bc}var $b;function Gv(){if($b)return xs;$b=1;var e=xs&&xs.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(xs,"__esModule",{value:!0});const t=e(VR),a=e(Bv());class o{constructor(i){var c,u;this.shouldThrowOnError=!1,this.method=i.method,this.url=i.url,this.headers=new Headers(i.headers),this.schema=i.schema,this.body=i.body,this.shouldThrowOnError=(c=i.shouldThrowOnError)!==null&&c!==void 0?c:!1,this.signal=i.signal,this.isMaybeSingle=(u=i.isMaybeSingle)!==null&&u!==void 0?u:!1,i.fetch?this.fetch=i.fetch:typeof fetch>"u"?this.fetch=t.default:this.fetch=fetch}throwOnError(){return this.shouldThrowOnError=!0,this}setHeader(i,c){return this.headers=new Headers(this.headers),this.headers.set(i,c),this}then(i,c){this.schema===void 0||(["GET","HEAD"].includes(this.method)?this.headers.set("Accept-Profile",this.schema):this.headers.set("Content-Profile",this.schema)),this.method!=="GET"&&this.method!=="HEAD"&&this.headers.set("Content-Type","application/json");const u=this.fetch;let m=u(this.url.toString(),{method:this.method,headers:this.headers,body:JSON.stringify(this.body),signal:this.signal}).then(async f=>{var g,b,w,x;let S=null,E=null,C=null,U=f.status,L=f.statusText;if(f.ok){if(this.method!=="HEAD"){const J=await f.text();J===""||(this.headers.get("Accept")==="text/csv"||this.headers.get("Accept")&&(!((g=this.headers.get("Accept"))===null||g===void 0)&&g.includes("application/vnd.pgrst.plan+text"))?E=J:E=JSON.parse(J))}const D=(b=this.headers.get("Prefer"))===null||b===void 0?void 0:b.match(/count=(exact|planned|estimated)/),Y=(w=f.headers.get("content-range"))===null||w===void 0?void 0:w.split("/");D&&Y&&Y.length>1&&(C=parseInt(Y[1])),this.isMaybeSingle&&this.method==="GET"&&Array.isArray(E)&&(E.length>1?(S={code:"PGRST116",details:`Results contain ${E.length} rows, application/vnd.pgrst.object+json requires 1 row`,hint:null,message:"JSON object requested, multiple (or no) rows returned"},E=null,C=null,U=406,L="Not Acceptable"):E.length===1?E=E[0]:E=null)}else{const D=await f.text();try{S=JSON.parse(D),Array.isArray(S)&&f.status===404&&(E=[],S=null,U=200,L="OK")}catch{f.status===404&&D===""?(U=204,L="No Content"):S={message:D}}if(S&&this.isMaybeSingle&&(!((x=S?.details)===null||x===void 0)&&x.includes("0 rows"))&&(S=null,U=200,L="OK"),S&&this.shouldThrowOnError)throw new a.default(S)}return{error:S,data:E,count:C,status:U,statusText:L}});return this.shouldThrowOnError||(m=m.catch(f=>{var g,b,w;return{error:{message:`${(g=f?.name)!==null&&g!==void 0?g:"FetchError"}: ${f?.message}`,details:`${(b=f?.stack)!==null&&b!==void 0?b:""}`,hint:"",code:`${(w=f?.code)!==null&&w!==void 0?w:""}`},data:null,count:null,status:0,statusText:""}})),m.then(i,c)}returns(){return this}overrideTypes(){return this}}return xs.default=o,xs}var qb;function $v(){if(qb)return ws;qb=1;var e=ws&&ws.__importDefault||function(o){return o&&o.__esModule?o:{default:o}};Object.defineProperty(ws,"__esModule",{value:!0});const t=e(Gv());class a extends t.default{select(s){let i=!1;const c=(s??"*").split("").map(u=>/\s/.test(u)&&!i?"":(u==='"'&&(i=!i),u)).join("");return this.url.searchParams.set("select",c),this.headers.append("Prefer","return=representation"),this}order(s,{ascending:i=!0,nullsFirst:c,foreignTable:u,referencedTable:m=u}={}){const f=m?`${m}.order`:"order",g=this.url.searchParams.get(f);return this.url.searchParams.set(f,`${g?`${g},`:""}${s}.${i?"asc":"desc"}${c===void 0?"":c?".nullsfirst":".nullslast"}`),this}limit(s,{foreignTable:i,referencedTable:c=i}={}){const u=typeof c>"u"?"limit":`${c}.limit`;return this.url.searchParams.set(u,`${s}`),this}range(s,i,{foreignTable:c,referencedTable:u=c}={}){const m=typeof u>"u"?"offset":`${u}.offset`,f=typeof u>"u"?"limit":`${u}.limit`;return this.url.searchParams.set(m,`${s}`),this.url.searchParams.set(f,`${i-s+1}`),this}abortSignal(s){return this.signal=s,this}single(){return this.headers.set("Accept","application/vnd.pgrst.object+json"),this}maybeSingle(){return this.method==="GET"?this.headers.set("Accept","application/json"):this.headers.set("Accept","application/vnd.pgrst.object+json"),this.isMaybeSingle=!0,this}csv(){return this.headers.set("Accept","text/csv"),this}geojson(){return this.headers.set("Accept","application/geo+json"),this}explain({analyze:s=!1,verbose:i=!1,settings:c=!1,buffers:u=!1,wal:m=!1,format:f="text"}={}){var g;const b=[s?"analyze":null,i?"verbose":null,c?"settings":null,u?"buffers":null,m?"wal":null].filter(Boolean).join("|"),w=(g=this.headers.get("Accept"))!==null&&g!==void 0?g:"application/json";return this.headers.set("Accept",`application/vnd.pgrst.plan+${f}; for="${w}"; options=${b};`),f==="json"?this:this}rollback(){return this.headers.append("Prefer","tx=rollback"),this}returns(){return this}maxAffected(s){return this.headers.append("Prefer","handling=strict"),this.headers.append("Prefer",`max-affected=${s}`),this}}return ws.default=a,ws}var Kb;function Mh(){if(Kb)return vs;Kb=1;var e=vs&&vs.__importDefault||function(o){return o&&o.__esModule?o:{default:o}};Object.defineProperty(vs,"__esModule",{value:!0});const t=e($v());class a extends t.default{eq(s,i){return this.url.searchParams.append(s,`eq.${i}`),this}neq(s,i){return this.url.searchParams.append(s,`neq.${i}`),this}gt(s,i){return this.url.searchParams.append(s,`gt.${i}`),this}gte(s,i){return this.url.searchParams.append(s,`gte.${i}`),this}lt(s,i){return this.url.searchParams.append(s,`lt.${i}`),this}lte(s,i){return this.url.searchParams.append(s,`lte.${i}`),this}like(s,i){return this.url.searchParams.append(s,`like.${i}`),this}likeAllOf(s,i){return this.url.searchParams.append(s,`like(all).{${i.join(",")}}`),this}likeAnyOf(s,i){return this.url.searchParams.append(s,`like(any).{${i.join(",")}}`),this}ilike(s,i){return this.url.searchParams.append(s,`ilike.${i}`),this}ilikeAllOf(s,i){return this.url.searchParams.append(s,`ilike(all).{${i.join(",")}}`),this}ilikeAnyOf(s,i){return this.url.searchParams.append(s,`ilike(any).{${i.join(",")}}`),this}is(s,i){return this.url.searchParams.append(s,`is.${i}`),this}in(s,i){const c=Array.from(new Set(i)).map(u=>typeof u=="string"&&new RegExp("[,()]").test(u)?`"${u}"`:`${u}`).join(",");return this.url.searchParams.append(s,`in.(${c})`),this}contains(s,i){return typeof i=="string"?this.url.searchParams.append(s,`cs.${i}`):Array.isArray(i)?this.url.searchParams.append(s,`cs.{${i.join(",")}}`):this.url.searchParams.append(s,`cs.${JSON.stringify(i)}`),this}containedBy(s,i){return typeof i=="string"?this.url.searchParams.append(s,`cd.${i}`):Array.isArray(i)?this.url.searchParams.append(s,`cd.{${i.join(",")}}`):this.url.searchParams.append(s,`cd.${JSON.stringify(i)}`),this}rangeGt(s,i){return this.url.searchParams.append(s,`sr.${i}`),this}rangeGte(s,i){return this.url.searchParams.append(s,`nxl.${i}`),this}rangeLt(s,i){return this.url.searchParams.append(s,`sl.${i}`),this}rangeLte(s,i){return this.url.searchParams.append(s,`nxr.${i}`),this}rangeAdjacent(s,i){return this.url.searchParams.append(s,`adj.${i}`),this}overlaps(s,i){return typeof i=="string"?this.url.searchParams.append(s,`ov.${i}`):this.url.searchParams.append(s,`ov.{${i.join(",")}}`),this}textSearch(s,i,{config:c,type:u}={}){let m="";u==="plain"?m="pl":u==="phrase"?m="ph":u==="websearch"&&(m="w");const f=c===void 0?"":`(${c})`;return this.url.searchParams.append(s,`${m}fts${f}.${i}`),this}match(s){return Object.entries(s).forEach(([i,c])=>{this.url.searchParams.append(i,`eq.${c}`)}),this}not(s,i,c){return this.url.searchParams.append(s,`not.${i}.${c}`),this}or(s,{foreignTable:i,referencedTable:c=i}={}){const u=c?`${c}.or`:"or";return this.url.searchParams.append(u,`(${s})`),this}filter(s,i,c){return this.url.searchParams.append(s,`${i}.${c}`),this}}return vs.default=a,vs}var Vb;function qv(){if(Vb)return ks;Vb=1;var e=ks&&ks.__importDefault||function(o){return o&&o.__esModule?o:{default:o}};Object.defineProperty(ks,"__esModule",{value:!0});const t=e(Mh());class a{constructor(s,{headers:i={},schema:c,fetch:u}){this.url=s,this.headers=new Headers(i),this.schema=c,this.fetch=u}select(s,{head:i=!1,count:c}={}){const u=i?"HEAD":"GET";let m=!1;const f=(s??"*").split("").map(g=>/\s/.test(g)&&!m?"":(g==='"'&&(m=!m),g)).join("");return this.url.searchParams.set("select",f),c&&this.headers.append("Prefer",`count=${c}`),new t.default({method:u,url:this.url,headers:this.headers,schema:this.schema,fetch:this.fetch})}insert(s,{count:i,defaultToNull:c=!0}={}){var u;const m="POST";if(i&&this.headers.append("Prefer",`count=${i}`),c||this.headers.append("Prefer","missing=default"),Array.isArray(s)){const f=s.reduce((g,b)=>g.concat(Object.keys(b)),[]);if(f.length>0){const g=[...new Set(f)].map(b=>`"${b}"`);this.url.searchParams.set("columns",g.join(","))}}return new t.default({method:m,url:this.url,headers:this.headers,schema:this.schema,body:s,fetch:(u=this.fetch)!==null&&u!==void 0?u:fetch})}upsert(s,{onConflict:i,ignoreDuplicates:c=!1,count:u,defaultToNull:m=!0}={}){var f;const g="POST";if(this.headers.append("Prefer",`resolution=${c?"ignore":"merge"}-duplicates`),i!==void 0&&this.url.searchParams.set("on_conflict",i),u&&this.headers.append("Prefer",`count=${u}`),m||this.headers.append("Prefer","missing=default"),Array.isArray(s)){const b=s.reduce((w,x)=>w.concat(Object.keys(x)),[]);if(b.length>0){const w=[...new Set(b)].map(x=>`"${x}"`);this.url.searchParams.set("columns",w.join(","))}}return new t.default({method:g,url:this.url,headers:this.headers,schema:this.schema,body:s,fetch:(f=this.fetch)!==null&&f!==void 0?f:fetch})}update(s,{count:i}={}){var c;const u="PATCH";return i&&this.headers.append("Prefer",`count=${i}`),new t.default({method:u,url:this.url,headers:this.headers,schema:this.schema,body:s,fetch:(c=this.fetch)!==null&&c!==void 0?c:fetch})}delete({count:s}={}){var i;const c="DELETE";return s&&this.headers.append("Prefer",`count=${s}`),new t.default({method:c,url:this.url,headers:this.headers,schema:this.schema,fetch:(i=this.fetch)!==null&&i!==void 0?i:fetch})}}return ks.default=a,ks}var Wb;function WR(){if(Wb)return ys;Wb=1;var e=ys&&ys.__importDefault||function(s){return s&&s.__esModule?s:{default:s}};Object.defineProperty(ys,"__esModule",{value:!0});const t=e(qv()),a=e(Mh());class o{constructor(i,{headers:c={},schema:u,fetch:m}={}){this.url=i,this.headers=new Headers(c),this.schemaName=u,this.fetch=m}from(i){const c=new URL(`${this.url}/${i}`);return new t.default(c,{headers:new Headers(this.headers),schema:this.schemaName,fetch:this.fetch})}schema(i){return new o(this.url,{headers:this.headers,schema:i,fetch:this.fetch})}rpc(i,c={},{head:u=!1,get:m=!1,count:f}={}){var g;let b;const w=new URL(`${this.url}/rpc/${i}`);let x;u||m?(b=u?"HEAD":"GET",Object.entries(c).filter(([E,C])=>C!==void 0).map(([E,C])=>[E,Array.isArray(C)?`{${C.join(",")}}`:`${C}`]).forEach(([E,C])=>{w.searchParams.append(E,C)})):(b="POST",x=c);const S=new Headers(this.headers);return f&&S.set("Prefer",`count=${f}`),new a.default({method:b,url:w,headers:S,schema:this.schemaName,body:x,fetch:(g=this.fetch)!==null&&g!==void 0?g:fetch})}}return ys.default=o,ys}var Yb;function YR(){if(Yb)return Xt;Yb=1;var e=Xt&&Xt.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(Xt,"__esModule",{value:!0}),Xt.PostgrestError=Xt.PostgrestBuilder=Xt.PostgrestTransformBuilder=Xt.PostgrestFilterBuilder=Xt.PostgrestQueryBuilder=Xt.PostgrestClient=void 0;const t=e(WR());Xt.PostgrestClient=t.default;const a=e(qv());Xt.PostgrestQueryBuilder=a.default;const o=e(Mh());Xt.PostgrestFilterBuilder=o.default;const s=e($v());Xt.PostgrestTransformBuilder=s.default;const i=e(Gv());Xt.PostgrestBuilder=i.default;const c=e(Bv());return Xt.PostgrestError=c.default,Xt.default={PostgrestClient:t.default,PostgrestQueryBuilder:a.default,PostgrestFilterBuilder:o.default,PostgrestTransformBuilder:s.default,PostgrestBuilder:i.default,PostgrestError:c.default},Xt}var ZR=YR();const QR=pk(ZR),{PostgrestClient:JR,PostgrestQueryBuilder:_3,PostgrestFilterBuilder:b3,PostgrestTransformBuilder:y3,PostgrestBuilder:k3,PostgrestError:v3}=QR;var Le=class Kv extends Error{constructor(t,a,o,s){super(t),this.name="InsForgeError",this.statusCode=a,this.error=o,this.nextActions=s}static fromApiError(t){return new Kv(t.message,t.statusCode,t.error,t.nextActions)}},XR=["authorization","x-api-key","cookie","set-cookie"],eI=["password","token","accesstoken","refreshtoken","authorization","secret","apikey","api_key","email","ssn","creditcard","credit_card"];function tI(e){const t={};for(const[a,o]of Object.entries(e))XR.includes(a.toLowerCase())?t[a]="***REDACTED***":t[a]=o;return t}function rl(e){if(e==null)return e;if(typeof e=="string")try{const t=JSON.parse(e);return rl(t)}catch{return e}if(Array.isArray(e))return e.map(rl);if(typeof e=="object"){const t={};for(const[a,o]of Object.entries(e))eI.includes(a.toLowerCase().replace(/[-_]/g,""))?t[a]="***REDACTED***":t[a]=rl(o);return t}return e}function Zb(e){if(e==null)return"";if(typeof e=="string")try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}if(typeof FormData<"u"&&e instanceof FormData)return"[FormData]";try{return JSON.stringify(e,null,2)}catch{return"[Unserializable body]"}}var Vv=class{constructor(e){typeof e=="function"?(this.enabled=!0,this.customLog=e):(this.enabled=!!e,this.customLog=null)}log(e,...t){if(!this.enabled)return;const a=`[InsForge Debug] ${e}`;this.customLog?this.customLog(a,...t):console.log(a,...t)}warn(e,...t){if(!this.enabled)return;const a=`[InsForge Debug] ${e}`;this.customLog?this.customLog(a,...t):console.warn(a,...t)}error(e,...t){if(!this.enabled)return;const a=`[InsForge Debug] ${e}`;this.customLog?this.customLog(a,...t):console.error(a,...t)}logRequest(e,t,a,o){if(!this.enabled)return;const s=[`→ ${e} ${t}`];a&&Object.keys(a).length>0&&s.push(` Headers: ${JSON.stringify(tI(a))}`);const i=Zb(rl(o));if(i){const c=i.length>1e3?i.slice(0,1e3)+"... [truncated]":i;s.push(` Body: ${c}`)}this.log(s.join(`
41
- `))}logResponse(e,t,a,o,s){if(!this.enabled)return;const i=[`← ${e} ${t} ${a} (${o}ms)`],c=Zb(rl(s));if(c){const u=c.length>1e3?c.slice(0,1e3)+"... [truncated]":c;i.push(` Body: ${u}`)}a>=400?this.error(i.join(`
42
- `)):this.log(i.join(`
43
- `))}},Yr={SIGNED_IN:"signedIn",SIGNED_OUT:"signedOut",TOKEN_REFRESHED:"tokenRefreshed"},zh="insforge_csrf_token";function Mm(){if(typeof document>"u")return null;const e=document.cookie.split(";").find(t=>t.trim().startsWith(`${zh}=`));return e&&e.split("=")[1]||null}function Wv(e){if(typeof document>"u")return;const t=10080*60,a=typeof window<"u"&&window.location.protocol==="https:"?"; Secure":"";document.cookie=`${zh}=${encodeURIComponent(e)}; path=/; max-age=${t}; SameSite=Lax${a}`}function Yv(){if(typeof document>"u")return;const e=typeof window<"u"&&window.location.protocol==="https:"?"; Secure":"";document.cookie=`${zh}=; path=/; max-age=0; SameSite=Lax${e}`}var Zv=class{constructor(){this.accessToken=null,this.user=null,this.authStateChangeCallbacks=new Map}saveSession(e,t=Yr.SIGNED_IN){const a=e.accessToken!==this.accessToken;this.accessToken=e.accessToken,this.user=e.user,a&&this.notifyAuthStateChange(t)}getSession(){return!this.accessToken||!this.user?null:{accessToken:this.accessToken,user:this.user}}getAccessToken(){return this.accessToken}setAccessToken(e,t=Yr.SIGNED_IN){const a=e!==this.accessToken;this.accessToken=e,a&&this.notifyAuthStateChange(t)}getUser(){return this.user}setUser(e){this.user=e}clearSession(){const e=this.accessToken!==null;this.accessToken=null,this.user=null,e&&this.notifyAuthStateChange(Yr.SIGNED_OUT)}onAuthStateChange(e){const t=Symbol("auth-state-change");return this.authStateChangeCallbacks.set(t,e),()=>this.authStateChangeCallbacks.delete(t)}notifyAuthStateChange(e){for(const t of this.authStateChangeCallbacks.values())try{t(e)}catch(a){console.error("Error in auth state change callback:",a)}}};function nI(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),a=t.padEnd(t.length+(4-t.length%4)%4,"="),o=atob(a),s=Uint8Array.from(o,i=>i.charCodeAt(0));return new TextDecoder().decode(s)}function aI(e){if(!e)return null;const[,t]=e.split(".");if(!t)return null;try{const a=JSON.parse(nI(t));return typeof a.exp!="number"||!Number.isFinite(a.exp)?null:new Date(a.exp*1e3)}catch{return null}}function rI(e,t=60){if(!e)return!1;const a=aI(e);return a?a.getTime()<=Date.now()+t*1e3:!0}var oI=new Set([500,502,503,504]),Qb=new Set(["GET","HEAD","PUT","DELETE","OPTIONS"]),sI=new Set(["AUTH_UNAUTHORIZED","PGRST301"]);function Qv(e,t,a){if(t!==void 0&&!(e==="GET"||e==="HEAD"))return typeof FormData<"u"&&t instanceof FormData?t:(a["Content-Type"]="application/json;charset=UTF-8",JSON.stringify(t))}async function Jv(e){if(e.status===204)return;let t;const a=e.headers.get("content-type");try{a?.includes("json")?t=await e.json():t=await e.text()}catch(o){throw new Le(`Failed to parse response body: ${o?.message||"Unknown error"}`,e.status,e.ok?"PARSE_ERROR":"REQUEST_FAILED")}if(!e.ok){if(t&&typeof t=="object"&&"error"in t){t.statusCode??(t.statusCode=t.status??e.status);const o=Le.fromApiError(t);throw Object.keys(t).forEach(s=>{s!=="error"&&s!=="message"&&s!=="statusCode"&&(o[s]=t[s])}),o}throw new Le(`Request failed: ${e.statusText}`,e.status,"REQUEST_FAILED")}return t}var iI=class{constructor(e,t,a){if(this.userToken=null,this.isRefreshing=!1,this.refreshPromise=null,this.refreshToken=null,this.config=e,this.baseUrl=e.baseUrl||"http://localhost:7130",this.fetch=e.fetch||(globalThis.fetch?globalThis.fetch.bind(globalThis):void 0),this.anonKey=e.anonKey,this.defaultHeaders={...e.headers},this.tokenManager=t??new Zv,this.logger=a||new Vv(!1),this.timeout=e.timeout??3e4,this.retryCount=e.retryCount??3,this.retryDelay=e.retryDelay??500,!this.fetch)throw new Error("Fetch is not available. Please provide a fetch implementation in the config.")}buildUrl(e,t){const a=new URL(e,this.baseUrl);return t&&Object.entries(t).forEach(([o,s])=>{if(o==="select"){let i=s.replace(/\s+/g," ").trim();i=i.replace(/\s*\(\s*/g,"(").replace(/\s*\)\s*/g,")").replace(/\(\s+/g,"(").replace(/\s+\)/g,")").replace(/,\s+(?=[^()]*\))/g,","),a.searchParams.append(o,i)}else a.searchParams.append(o,s)}),a.toString()}isRetryableStatus(e){return oI.has(e)}computeRetryDelay(e){const a=this.retryDelay*Math.pow(2,e-1)*(.85+Math.random()*.3);return Math.round(a)}shouldRefreshAccessToken(e,t,a,o={}){return e===401&&sI.has(t??"")&&!this.config.isServerMode&&!this.config.accessToken&&!this.config.edgeFunctionToken&&!o.skipAuthRefresh&&a!==null}async fetchWithRetry(e){const{method:t,url:a,headers:o,body:s,fetchOptions:i,callerSignal:c,maxAttempts:u}=e;let m;for(let f=0;f<=u;f++){if(f>0){const w=this.computeRetryDelay(f);if(this.logger.warn(`Retry ${f}/${u} for ${t} ${a} in ${w}ms`),c?.aborted)throw c.reason;await new Promise((x,S)=>{const E=()=>{clearTimeout(C),S(c.reason)},C=setTimeout(()=>{c&&c.removeEventListener("abort",E),x()},w);c&&c.addEventListener("abort",E,{once:!0})})}let g,b;if((this.timeout>0||c)&&(g=new AbortController,this.timeout>0&&(b=setTimeout(()=>g.abort(),this.timeout)),c))if(c.aborted)g.abort(c.reason);else{const w=()=>g.abort(c.reason);c.addEventListener("abort",w,{once:!0}),g.signal.addEventListener("abort",()=>{c.removeEventListener("abort",w)},{once:!0})}try{const w=await this.fetch(a,{method:t,headers:o,body:s,...i,...g?{signal:g.signal}:{}});if(this.isRetryableStatus(w.status)&&f<u){b!==void 0&&clearTimeout(b),await w.body?.cancel(),m=new Le(`Server error: ${w.status} ${w.statusText}`,w.status,"SERVER_ERROR");continue}return b!==void 0&&clearTimeout(b),w}catch(w){if(b!==void 0&&clearTimeout(b),w?.name==="AbortError")throw g&&g.signal.aborted&&this.timeout>0&&!c?.aborted?new Le(`Request timed out after ${this.timeout}ms`,408,"REQUEST_TIMEOUT"):w;if(f<u){m=w;continue}throw new Le(`Network request failed: ${w?.message||"Unknown error"}`,0,"NETWORK_ERROR")}}throw m||new Le("Request failed after all retry attempts",0,"NETWORK_ERROR")}async handleRequest(e,t,a={},o){const{params:s,headers:i={},body:c,skipAuthRefresh:u,signal:m,...f}=a,g=this.buildUrl(t,s),b=Date.now(),x=Qb.has(e.toUpperCase())||a.idempotent===!0?this.retryCount:0,S={...this.defaultHeaders},E=o??this.userToken??this.anonKey;E&&(S.Authorization=`Bearer ${E}`);const C=Qv(e,c,S),U=(D,Y)=>{if(D.toLowerCase()==="authorization"){delete S.Authorization,delete S.authorization,S.Authorization=Y;return}S[D]=Y};i instanceof Headers?i.forEach((D,Y)=>{U(Y,D)}):Array.isArray(i)?i.forEach(([D,Y])=>{U(D,Y)}):Object.entries(i).forEach(([D,Y])=>{U(D,Y)}),this.logger.logRequest(e,g,S,C);const L=await this.fetchWithRetry({method:e,url:g,headers:S,body:C,fetchOptions:f,callerSignal:m,maxAttempts:x});let M;try{M=await Jv(L)}catch(D){throw D instanceof Le&&this.logger.logResponse(e,g,D.statusCode||L.status,Date.now()-b,D),D}return this.logger.logResponse(e,g,L.status,Date.now()-b,M),M}async request(e,t,a={}){const o=this.userToken;try{return await this.handleRequest(e,t,{...a},o)}catch(s){if(!(s instanceof Le)||!this.shouldRefreshAccessToken(s.statusCode,s.error,o,a))throw s;if(o!==this.userToken){if(this.userToken===null)throw s;return await this.handleRequest(e,t,{...a,skipAuthRefresh:!0},this.userToken)}try{await this.refreshAndSaveSession()}catch(i){throw i instanceof Le&&(i.statusCode===401||i.statusCode===403)&&this.clearAuthSession(),i}return await this.handleRequest(e,t,{...a,skipAuthRefresh:!0})}}async rawFetch(e,t,a={}){const o=typeof Request<"u"&&e instanceof Request?e:void 0,{method:s,headers:i,body:c,signal:u,...m}=t??{},f=s??o?.method??"GET",g=o?.url??e.toString(),b=Date.now(),w=this.userToken,x=new Headers({...this.defaultHeaders}),S=w??this.anonKey;S&&x.set("Authorization",`Bearer ${S}`),o?.headers.forEach(($,ae)=>{x.set(ae,$)}),new Headers(i).forEach(($,ae)=>{x.set(ae,$)});const E={};x.forEach(($,ae)=>{E[ae]=$});const C=c??o?.body??void 0;let U=C,L=t;typeof ReadableStream<"u"&&C instanceof ReadableStream&&(U=await new Response(C).arrayBuffer(),L={...t??{},body:U});const M=u??o?.signal,D=Qb.has(f.toUpperCase())?this.retryCount:0;this.logger.logRequest(f,g,E,U);const Y=await this.fetchWithRetry({method:f,url:g,headers:E,body:U,fetchOptions:m,callerSignal:M,maxAttempts:D});this.logger.logResponse(f,g,Y.status,Date.now()-b);let J=null;if(Y.status===401)try{const $=await Y.clone().json();if($&&typeof $=="object"){const ae=$.error??$.code;typeof ae=="string"&&(J=ae)}}catch{}if(!this.shouldRefreshAccessToken(Y.status,J,w,a))return Y;if(w!==this.userToken){if(this.userToken===null)return Y;const $=new Headers(i);return $.set("Authorization",`Bearer ${this.userToken}`),await this.rawFetch(e,{...L,headers:$},{skipAuthRefresh:!0})}let Q;try{Q=await this.refreshAndSaveSession()}catch($){throw $ instanceof Le&&($.statusCode===401||$.statusCode===403)&&this.clearAuthSession(),$}const T=new Headers(i);return T.set("Authorization",`Bearer ${Q.accessToken}`),await this.rawFetch(e,{...L,headers:T},{skipAuthRefresh:!0})}get(e,t){return this.request("GET",e,t)}post(e,t,a){return this.request("POST",e,{...a,body:t})}put(e,t,a){return this.request("PUT",e,{...a,body:t})}patch(e,t,a){return this.request("PATCH",e,{...a,body:t})}delete(e,t){return this.request("DELETE",e,t)}setAuthToken(e){this.userToken=e}setRefreshToken(e){this.refreshToken=e}getHeaders(){const e={...this.defaultHeaders},t=this.userToken||this.anonKey;return t&&(e.Authorization=`Bearer ${t}`),e}async refreshAccessToken(){return this.isRefreshing?this.refreshPromise:(this.isRefreshing=!0,this.refreshPromise=(async()=>{try{const e=Mm(),t=this.refreshToken?{refreshToken:this.refreshToken}:void 0;return await this.handleRequest("POST",this.refreshToken?"/api/auth/refresh?client_type=mobile":"/api/auth/refresh",{body:t,headers:e?{"X-CSRF-Token":e}:{},credentials:"include"})}finally{this.isRefreshing=!1,this.refreshPromise=null}})(),this.refreshPromise)}async getValidAccessToken(e=60){const t=this.tokenManager.getAccessToken()??this.userToken;if(!t||!rI(t,e)||!(!this.config.isServerMode&&!this.config.accessToken&&!this.config.edgeFunctionToken&&this.userToken!==null))return t;try{return(await this.refreshAndSaveSession()).accessToken}catch(o){throw o instanceof Le&&(o.statusCode===401||o.statusCode===403)&&this.userToken===t&&this.clearAuthSession(),o}}async refreshAndSaveSession(){const e=await this.refreshAccessToken();return this.setAuthToken(e.accessToken),this.tokenManager.saveSession(e,Yr.TOKEN_REFRESHED),e.csrfToken&&Wv(e.csrfToken),e.refreshToken&&this.setRefreshToken(e.refreshToken),e}clearAuthSession(){this.tokenManager.clearSession(),this.userToken=null,this.refreshToken=null,Yv()}},zm="insforge_pkce_verifier";async function Xv(){const e=globalThis.crypto;if(typeof e?.getRandomValues=="function"&&e.subtle)return e;if(typeof process<"u"&&process.versions?.node){const{webcrypto:t}=await mt(async()=>{const{webcrypto:a}=await Promise.resolve().then(()=>f3);return{webcrypto:a}},[]);return t}throw new Error("Web Crypto API is not available in this environment")}function ew(e){return btoa(String.fromCharCode(...e)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function lI(){const e=await Xv(),t=new Uint8Array(32);return e.getRandomValues(t),ew(t)}async function cI(e){const t=await Xv(),o=new TextEncoder().encode(e),s=await t.subtle.digest("SHA-256",o);return ew(new Uint8Array(s))}function dI(e){typeof sessionStorage<"u"&&sessionStorage.setItem(zm,e)}function uI(){if(typeof sessionStorage>"u")return null;const e=sessionStorage.getItem(zm);return e&&sessionStorage.removeItem(zm),e}function It(e,t){return e instanceof Le?{data:null,error:e}:{data:null,error:new Le(e instanceof Error?e.message:t,500,"UNEXPECTED_ERROR")}}function Jb(...e){if(typeof window>"u")return;const t=new URL(window.location.href);e.forEach(a=>t.searchParams.delete(a)),window.history.replaceState({},document.title,t.toString())}var pI=class{constructor(e,t,a={}){this.http=e,this.tokenManager=t,this.options=a,this.authCallbackHandled=a.detectOAuthCallback===!1?Promise.resolve():this.detectAuthCallback()}isServerMode(){return!!this.options.isServerMode}onAuthStateChange(e){return this.tokenManager.onAuthStateChange(e)}saveSessionFromResponse(e,t=Yr.SIGNED_IN){if(!e.accessToken||!e.user)return!1;const a={accessToken:e.accessToken,user:e.user};return!this.isServerMode()&&e.csrfToken&&Wv(e.csrfToken),this.isServerMode()||this.tokenManager.saveSession(a,t),this.http.setAuthToken(e.accessToken),this.http.setRefreshToken(e.refreshToken??null),!0}async detectAuthCallback(){if(!(this.isServerMode()||typeof window>"u"))try{const e=new URLSearchParams(window.location.search),t=e.get("error");if(t){Jb("error"),console.debug("OAuth callback error:",t);return}const a=e.get("insforge_code");if(a){Jb("insforge_code");const{error:o}=await this.exchangeOAuthCode(a);o&&console.debug("OAuth code exchange failed:",o.message);return}}catch(e){console.debug("OAuth callback detection skipped:",e)}}async signUp(e){try{const t=await this.http.post(this.isServerMode()?"/api/auth/users?client_type=mobile":"/api/auth/users",e,{credentials:"include",skipAuthRefresh:!0});return t.accessToken&&t.user&&this.saveSessionFromResponse(t),t.refreshToken&&this.http.setRefreshToken(t.refreshToken),{data:t,error:null}}catch(t){return It(t,"An unexpected error occurred during sign up")}}async signInWithPassword(e){try{const t=await this.http.post(this.isServerMode()?"/api/auth/sessions?client_type=mobile":"/api/auth/sessions",e,{credentials:"include",skipAuthRefresh:!0});return this.saveSessionFromResponse(t),t.refreshToken&&this.http.setRefreshToken(t.refreshToken),{data:t,error:null}}catch(t){return It(t,"An unexpected error occurred during sign in")}}async signOut(){try{try{const e=this.isServerMode(),t=e?null:Mm();await this.http.post(e?"/api/auth/logout?client_type=mobile":"/api/auth/logout",void 0,{credentials:"include",skipAuthRefresh:!0,...t?{headers:{"X-CSRF-Token":t}}:{}})}catch{}return this.tokenManager.clearSession(),this.http.setAuthToken(null),this.http.setRefreshToken(null),this.isServerMode()||Yv(),{error:null}}catch{return{error:new Le("Failed to sign out",500,"SIGNOUT_ERROR")}}}async signInWithOAuth(e,t){try{let a;if(typeof e=="object")a=e;else if(t)a={provider:e,...t};else return{data:{},error:new Le("OAuth sign-in options are required",400,em.INVALID_INPUT)};if(!a||!a.redirectTo)return{data:{},error:new Le("Redirect URI is required",400,em.INVALID_INPUT)};const{provider:o}=a,s=encodeURIComponent(o.toLowerCase()),i=await lI(),c=await cI(i);dI(i);const u={...a.additionalParams??{},redirect_uri:a.redirectTo,code_challenge:c},f=qd.options.includes(s)?`/api/auth/oauth/${s}`:`/api/auth/oauth/custom/${s}`,g=await this.http.get(f,{params:u,skipAuthRefresh:!0});return!this.isServerMode()&&typeof window<"u"&&!a.skipBrowserRedirect?(window.location.href=g.authUrl,{data:{},error:null}):{data:{url:g.authUrl,provider:s,codeVerifier:i},error:null}}catch(a){return a instanceof Le?{data:{},error:a}:{data:{},error:new Le("An unexpected error occurred during OAuth initialization",500,"UNEXPECTED_ERROR")}}}async exchangeOAuthCode(e,t){try{const a=t??uI();if(!a)return{data:null,error:new Le("PKCE code verifier not found. Ensure signInWithOAuth was called in the same browser session.",400,"PKCE_VERIFIER_MISSING")};const o={code:e,code_verifier:a},s=await this.http.post(this.isServerMode()?"/api/auth/oauth/exchange?client_type=mobile":"/api/auth/oauth/exchange",o,{credentials:"include",skipAuthRefresh:!0});return this.saveSessionFromResponse(s),{data:s,error:null}}catch(a){return It(a,"An unexpected error occurred during OAuth code exchange")}}async signInWithIdToken(e){try{const{provider:t,token:a}=e,o=await this.http.post("/api/auth/id-token?client_type=mobile",{provider:t,token:a},{credentials:"include",skipAuthRefresh:!0});return this.saveSessionFromResponse(o),o.refreshToken&&this.http.setRefreshToken(o.refreshToken),{data:o,error:null}}catch(t){return It(t,"An unexpected error occurred during ID token sign in")}}async refreshSession(e){try{if(this.isServerMode()&&!e?.refreshToken)return{data:null,error:new Le("refreshToken is required when refreshing session in server mode",400,em.AUTH_UNAUTHORIZED)};const t=this.isServerMode()?null:Mm(),a=await this.http.post(this.isServerMode()?"/api/auth/refresh?client_type=mobile":"/api/auth/refresh",this.isServerMode()?{refresh_token:e?.refreshToken}:void 0,{headers:t?{"X-CSRF-Token":t}:{},credentials:"include",skipAuthRefresh:!0});return a.accessToken&&this.saveSessionFromResponse(a,Yr.TOKEN_REFRESHED),{data:a,error:null}}catch(t){return It(t,"An unexpected error occurred during session refresh")}}async getCurrentUser(){await this.authCallbackHandled;try{if(this.isServerMode()){const t=this.tokenManager.getAccessToken();return t?(this.http.setAuthToken(t),{data:{user:(await this.http.get("/api/auth/sessions/current")).user??null},error:null}):{data:{user:null},error:null}}const e=this.tokenManager.getSession();if(e)return this.http.setAuthToken(e.accessToken),{data:{user:e.user},error:null};if(typeof window<"u"){const{data:t,error:a}=await this.refreshSession();if(a)return{data:{user:null},error:a};if(t?.accessToken)return{data:{user:t.user??null},error:null}}return{data:{user:null},error:null}}catch(e){return e instanceof Le?{data:{user:null},error:e}:{data:{user:null},error:new Le("An unexpected error occurred while getting user",500,"UNEXPECTED_ERROR")}}}async getProfile(e){try{return{data:await this.http.get(`/api/auth/profiles/${e}`),error:null}}catch(t){return It(t,"An unexpected error occurred while fetching user profile")}}async setProfile(e){try{const t=await this.http.patch("/api/auth/profiles/current",{profile:e}),a=this.tokenManager.getUser();return!this.isServerMode()&&a&&t.profile!==void 0&&this.tokenManager.setUser({...a,profile:t.profile}),{data:t,error:null}}catch(t){return It(t,"An unexpected error occurred while updating user profile")}}async resendVerificationEmail(e){try{return{data:await this.http.post("/api/auth/email/send-verification",e,{skipAuthRefresh:!0}),error:null}}catch(t){return It(t,"An unexpected error occurred while sending verification email")}}async verifyEmail(e){try{const t=await this.http.post(this.isServerMode()?"/api/auth/email/verify?client_type=mobile":"/api/auth/email/verify",e,{credentials:"include",skipAuthRefresh:!0});return this.saveSessionFromResponse(t),t.refreshToken&&this.http.setRefreshToken(t.refreshToken),{data:t,error:null}}catch(t){return It(t,"An unexpected error occurred while verifying email")}}async sendResetPasswordEmail(e){try{return{data:await this.http.post("/api/auth/email/send-reset-password",e,{skipAuthRefresh:!0}),error:null}}catch(t){return It(t,"An unexpected error occurred while sending password reset email")}}async exchangeResetPasswordToken(e){try{return{data:await this.http.post("/api/auth/email/exchange-reset-password-token",e,{skipAuthRefresh:!0}),error:null}}catch(t){return It(t,"An unexpected error occurred while verifying reset code")}}async resetPassword(e){try{return{data:await this.http.post("/api/auth/email/reset-password",e,{skipAuthRefresh:!0}),error:null}}catch(t){return It(t,"An unexpected error occurred while resetting password")}}async getPublicAuthConfig(){try{return{data:await this.http.get("/api/auth/public-config",{skipAuthRefresh:!0}),error:null}}catch(e){return It(e,"An unexpected error occurred while fetching auth configuration")}}};function mI(e){return async(t,a)=>{const o=typeof t=="string"?t:t.toString(),s=new URL(o),i=s.pathname.slice(1),c=i.match(/^rpc\/(.+)$/),u=c?`/api/database/rpc/${c[1]}`:`/api/database/records/${i}`,m=`${e.baseUrl}${u}${s.search}`,f=new Headers(e.getHeaders());return new Headers(a?.headers).forEach((b,w)=>{f.set(w,b)}),await e.rawFetch(m,{...a,headers:f})}}var hI=class{constructor(e,t){this.postgrest=new JR("http://dummy",{fetch:mI(e),headers:{},...t?{schema:t}:{}})}schema(e){return this.postgrest.schema(e)}from(e){return this.postgrest.from(e)}rpc(e,t,a){return this.postgrest.rpc(e,t,a)}},fI=class{constructor(e,t){this.bucketName=e,this.http=t}async upload(e,t){try{const a=await this.http.post(`/api/storage/buckets/${this.bucketName}/upload-strategy`,{filename:e,contentType:t.type||"application/octet-stream",size:t.size});if(a.method==="presigned")return await this.uploadWithPresignedUrl(a,t);if(a.method==="direct"){const o=new FormData;return o.append("file",t),{data:await this.http.request("PUT",`/api/storage/buckets/${this.bucketName}/objects/${encodeURIComponent(e)}`,{body:o,headers:{}}),error:null}}throw new Le(`Unsupported upload method: ${a.method}`,500,"STORAGE_ERROR")}catch(a){return{data:null,error:a instanceof Le?a:new Le("Upload failed",500,"STORAGE_ERROR")}}}async uploadAuto(e){try{const t=e instanceof File?e.name:"file",a=await this.http.post(`/api/storage/buckets/${this.bucketName}/upload-strategy`,{filename:t,contentType:e.type||"application/octet-stream",size:e.size});if(a.method==="presigned")return await this.uploadWithPresignedUrl(a,e);if(a.method==="direct"){const o=new FormData;return o.append("file",e),{data:await this.http.request("POST",`/api/storage/buckets/${this.bucketName}/objects`,{body:o,headers:{}}),error:null}}throw new Le(`Unsupported upload method: ${a.method}`,500,"STORAGE_ERROR")}catch(t){return{data:null,error:t instanceof Le?t:new Le("Upload failed",500,"STORAGE_ERROR")}}}async uploadWithPresignedUrl(e,t){try{const a=new FormData;e.fields&&Object.entries(e.fields).forEach(([s,i])=>{a.append(s,i)}),a.append("file",t);const o=await fetch(e.uploadUrl,{method:"POST",body:a});if(!o.ok)throw new Le(`Upload to storage failed: ${o.statusText}`,o.status,"STORAGE_ERROR");return e.confirmRequired&&e.confirmUrl?{data:await this.http.post(e.confirmUrl,{size:t.size,contentType:t.type||"application/octet-stream"}),error:null}:{data:{key:e.key,bucket:this.bucketName,size:t.size,mimeType:t.type||"application/octet-stream",uploadedAt:new Date().toISOString(),url:this.getPublicUrl(e.key).data.publicUrl},error:null}}catch(a){throw a instanceof Le?a:new Le("Presigned upload failed",500,"STORAGE_ERROR")}}async download(e){try{const t=encodeURIComponent(e);let a;try{a=await this.http.get(`/api/storage/buckets/${this.bucketName}/download-strategy/objects/${t}`)}catch(u){const m=u instanceof Le?u.statusCode:void 0;if(m===404||m===405)a=await this.http.post(`/api/storage/buckets/${this.bucketName}/objects/${t}/download-strategy`,{});else throw u}const o=a.url,s={};a.method==="direct"&&Object.assign(s,this.http.getHeaders());const i=await fetch(o,{method:"GET",headers:s});if(!i.ok)try{const u=await i.json();throw Le.fromApiError(u)}catch{throw new Le(`Download failed: ${i.statusText}`,i.status,"STORAGE_ERROR")}return{data:await i.blob(),error:null}}catch(t){return{data:null,error:t instanceof Le?t:new Le("Download failed",500,"STORAGE_ERROR")}}}getPublicUrl(e){return{data:{publicUrl:`${this.http.baseUrl}/api/storage/buckets/${this.bucketName}/objects/${encodeURIComponent(e)}`},error:null}}async requestDownloadStrategy(e,t){const a=encodeURIComponent(e);try{return await this.http.get(`/api/storage/buckets/${this.bucketName}/download-strategy/objects/${a}`,{params:{expiresIn:t.toString()}})}catch(o){const s=o instanceof Le?o.statusCode:void 0;if(!((s===404||s===405)&&!(o instanceof Le&&o.error==="STORAGE_NOT_FOUND")))throw o;return await this.http.post(`/api/storage/buckets/${this.bucketName}/objects/${a}/download-strategy`,{expiresIn:t})}}async createSignedUrl(e,t=3600){try{const a=await this.requestDownloadStrategy(e,t);return{data:{signedUrl:a.url,expiresAt:a.expiresAt?new Date(a.expiresAt).toISOString():null},error:null}}catch(a){return{data:null,error:a instanceof Le?a:new Le("Failed to create signed URL",500,"STORAGE_ERROR")}}}async createSignedUrls(e,t=3600){try{return{data:await Promise.all(e.map(async o=>{const{data:s,error:i}=await this.createSignedUrl(o,t);return{path:o,signedUrl:s?.signedUrl??null,error:i?i.message:null}})),error:null}}catch(a){return{data:null,error:a instanceof Le?a:new Le("Failed to create signed URLs",500,"STORAGE_ERROR")}}}async list(e){try{const t={};return e?.prefix&&(t.prefix=e.prefix),e?.search&&(t.search=e.search),e?.limit&&(t.limit=e.limit.toString()),e?.offset&&(t.offset=e.offset.toString()),{data:await this.http.get(`/api/storage/buckets/${this.bucketName}/objects`,{params:t}),error:null}}catch(t){return{data:null,error:t instanceof Le?t:new Le("List failed",500,"STORAGE_ERROR")}}}async remove(e){try{return{data:await this.http.delete(`/api/storage/buckets/${this.bucketName}/objects/${encodeURIComponent(e)}`),error:null}}catch(t){return{data:null,error:t instanceof Le?t:new Le("Delete failed",500,"STORAGE_ERROR")}}}},gI=class{constructor(e){this.http=e}from(e){return new fI(e,this.http)}},_I=class{constructor(e){this.http=e,this.chat=new bI(e),this.images=new vI(e),this.embeddings=new kI(e)}},bI=class{constructor(e){this.completions=new yI(e)}},yI=class{constructor(e){this.http=e}async create(e){const t={model:e.model,messages:e.messages,temperature:e.temperature,maxTokens:e.maxTokens,topP:e.topP,stream:e.stream,webSearch:e.webSearch,fileParser:e.fileParser,thinking:e.thinking,tools:e.tools,toolChoice:e.toolChoice,parallelToolCalls:e.parallelToolCalls};if(e.stream){const s=this.http.getHeaders();s["Content-Type"]="application/json";const i=await this.http.fetch(`${this.http.baseUrl}/api/ai/chat/completion`,{method:"POST",headers:s,body:JSON.stringify(t)});if(!i.ok){const c=await i.json();throw new Error(c.error||"Stream request failed")}return this.parseSSEStream(i,e.model)}const a=await this.http.post("/api/ai/chat/completion",t),o=a.text||"";return{id:`chatcmpl-${Date.now()}`,object:"chat.completion",created:Math.floor(Date.now()/1e3),model:a.metadata?.model,choices:[{index:0,message:{role:"assistant",content:o,...a.tool_calls?.length&&{tool_calls:a.tool_calls},...a.annotations?.length&&{annotations:a.annotations}},finish_reason:a.tool_calls?.length?"tool_calls":"stop"}],usage:a.metadata?.usage||{prompt_tokens:0,completion_tokens:0,total_tokens:0}}}async*parseSSEStream(e,t){const a=e.body.getReader(),o=new TextDecoder;let s="";try{for(;;){const{done:i,value:c}=await a.read();if(i)break;s+=o.decode(c,{stream:!0});const u=s.split(`
44
- `);s=u.pop()||"";for(const m of u)if(m.startsWith("data: ")){const f=m.slice(6).trim();if(f)try{const g=JSON.parse(f);if((g.chunk||g.content)&&(yield{id:`chatcmpl-${Date.now()}`,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:t,choices:[{index:0,delta:{content:g.chunk||g.content},finish_reason:null}]}),g.tool_calls?.length&&(yield{id:`chatcmpl-${Date.now()}`,object:"chat.completion.chunk",created:Math.floor(Date.now()/1e3),model:t,choices:[{index:0,delta:{tool_calls:g.tool_calls},finish_reason:"tool_calls"}]}),g.done){a.releaseLock();return}}catch{console.warn("Failed to parse SSE data:",f)}}}}finally{a.releaseLock()}}},kI=class{constructor(e){this.http=e}async create(e){const t=await this.http.post("/api/ai/embeddings",e);return{object:t.object,data:t.data,model:t.metadata?.model,usage:t.metadata?.usage?{prompt_tokens:t.metadata.usage.promptTokens||0,total_tokens:t.metadata.usage.totalTokens||0}:{prompt_tokens:0,total_tokens:0}}}},vI=class{constructor(e){this.http=e}async generate(e){const t=await this.http.post("/api/ai/image/generation",e);let a=[];return t.images&&t.images.length>0?a=t.images.map(o=>({b64_json:o.imageUrl.replace(/^data:image\/\w+;base64,/,""),content:t.text})):t.text&&(a=[{content:t.text}]),{created:Math.floor(Date.now()/1e3),data:a,...t.metadata?.usage&&{usage:{total_tokens:t.metadata.usage.totalTokens||0,input_tokens:t.metadata.usage.promptTokens||0,output_tokens:t.metadata.usage.completionTokens||0}}}}},wI=class jm{constructor(t,a){this.http=t,this.functionsUrl=a||jm.deriveSubhostingUrl(t.baseUrl)}static deriveSubhostingUrl(t){try{const{hostname:a}=new URL(t);return a.endsWith(".insforge.app")?`https://${a.split(".")[0]}.functions.insforge.app`:void 0}catch{return}}buildInProcessRequest(t,a,o,s){const i=new URL("/"+t,"http://insforge.local").toString(),c={...this.http.getHeaders()},u=Qv(a,o,c);return Object.assign(c,s),new Request(i,{method:a,headers:c,body:u})}async invoke(t,a={}){const{method:o="POST",body:s,headers:i={}}=a,c=globalThis.__insforge_dispatch__,u=jm.deriveSubhostingUrl(this.http.baseUrl);if(typeof c=="function"&&u&&this.functionsUrl===u)try{const m=this.buildInProcessRequest(t,o,s,i),f=await c(m);return{data:await Jv(f),error:null}}catch(m){if(m instanceof Error&&m.name==="AbortError")throw m;return{data:null,error:m instanceof Le?m:new Le(m instanceof Error?m.message:"Function invocation failed",500,"FUNCTION_ERROR")}}if(this.functionsUrl)try{return{data:await this.http.request(o,`${this.functionsUrl}/${t}`,{body:s,headers:i}),error:null}}catch(m){if(m instanceof Error&&m.name==="AbortError")throw m;if(!(m instanceof Le&&m.statusCode===404))return{data:null,error:m instanceof Le?m:new Le(m instanceof Error?m.message:"Function invocation failed",500,"FUNCTION_ERROR")}}try{const m=`/functions/${t}`;return{data:await this.http.request(o,m,{body:s,headers:i}),error:null}}catch(m){if(m instanceof Error&&m.name==="AbortError")throw m;return{data:null,error:m instanceof Le?m:new Le(m instanceof Error?m.message:"Function invocation failed",500,"FUNCTION_ERROR")}}}},Xb=1e4,xI=1e4,SI=class{constructor(e,t,a,o=async()=>t.getAccessToken()){this.baseUrl=e,this.tokenManager=t,this.anonKey=a,this.getValidAccessToken=o,this.socket=null,this.connectPromise=null,this.connectionAttempt=null,this.nextConnectionAttemptId=0,this.subscriptions=new Map,this.eventListeners=new Map,this.tokenManager.onAuthStateChange(s=>{s!==Yr.TOKEN_REFRESHED&&this.reconnectForAuthChange()})}notifyListeners(e,t){for(const a of this.eventListeners.get(e)??[])try{a(t)}catch(o){console.error(`Error in ${e} callback:`,o)}}async getHandshakeToken(){return await this.getValidAccessToken()??this.anonKey??null}connect(){if(this.socket?.connected)return Promise.resolve();if(this.connectPromise)return this.connectPromise;const e=++this.nextConnectionAttemptId,a=(async()=>{const{io:o}=await mt(async()=>{const{io:s}=await import("./index-hKOAzfwu.js");return{io:s}},[]);if(e!==this.nextConnectionAttemptId)throw new Error("Connection cancelled");await new Promise((s,i)=>{const c=o(this.baseUrl,{transports:["websocket"],auth:U=>{this.getHandshakeToken().then(L=>U(L?{token:L}:{}),()=>U({}))}});this.socket=c;let u=!0,m=null;const f=()=>{m&&(clearTimeout(m),m=null)},g=()=>{f(),c.off("connect",w),c.off("connect_error",x),c.off("disconnect",S),c.off("realtime:error",E),c.offAny(C),c.disconnect(),this.socket===c&&(this.socket=null),this.connectionAttempt?.id===e&&(this.connectionAttempt=null)},b=U=>{u&&(u=!1,g(),i(U))},w=()=>{this.socket===c&&(f(),this.resubscribeChannels(),this.notifyListeners("connect"),u&&(u=!1,this.connectionAttempt?.id===e&&(this.connectionAttempt=null),s()))},x=U=>{f(),this.notifyListeners("connect_error",U),u&&b(U)},S=U=>{this.handleDisconnect(U)},E=U=>{this.notifyListeners("error",U)},C=(U,L)=>{U!=="realtime:error"&&(this.applyPresenceEvent(U,L),this.notifyListeners(U,L))};this.connectionAttempt={id:e,socket:c,cancel:b},c.on("connect",w),c.on("connect_error",x),c.on("disconnect",S),c.on("realtime:error",E),c.onAny(C),m=setTimeout(()=>b(new Error(`Connection timeout after ${Xb}ms`)),Xb)})})().finally(()=>{this.connectPromise===a&&(this.connectPromise=null)});return this.connectPromise=a,a}disconnect(){this.nextConnectionAttemptId++,this.connectionAttempt?.cancel(new Error("Disconnected")),this.socket?.disconnect(),this.socket=null,this.connectPromise=null;for(const e of this.subscriptions.values())this.settleSubscription(e,{ok:!1,channel:e.channel,error:{code:"DISCONNECTED",message:"Disconnected"}},!1);this.subscriptions.clear()}reconnectForAuthChange(){for(const e of this.subscriptions.values())e.status==="rejected"&&(e.status="pending");this.socket&&(this.socket.disconnect(),this.socket.connect())}handleDisconnect(e){for(const t of this.subscriptions.values())t.status!=="rejected"&&(t.status="pending",this.settleSubscription(t,{ok:!1,channel:t.channel,error:{code:"DISCONNECTED",message:"Connection lost before subscription completed"}},!0));this.notifyListeners("disconnect",e)}resubscribeChannels(){for(const[e,t]of this.subscriptions)t.status==="pending"&&this.requestSubscription(e,t)}requestSubscription(e,t){if(t.pending)return t.pending;const a=this.socket;if(!a?.connected)return Promise.resolve({ok:!1,channel:e,error:{code:"CONNECTION_FAILED",message:"Not connected to realtime server"}});t.status="pending";const o=++t.epoch;let s;return t.pending=new Promise(i=>{t.settlePending=c=>{s&&clearTimeout(s),t.pending=void 0,t.settlePending=void 0,i(c)},s=setTimeout(()=>{this.subscriptions.get(e)===t&&t.epoch===o&&this.settleSubscription(t,{ok:!1,channel:e,error:{code:"SUBSCRIBE_TIMEOUT",message:"Subscription acknowledgement timed out"}},!0)},xI),a.emit("realtime:subscribe",{channel:e},c=>{this.subscriptions.get(e)!==t||t.epoch!==o||(c.ok?(t.status="subscribed",t.members=new Map(c.presence.members.map(u=>[u.presenceId,u]))):(t.status="rejected",t.members.clear()),this.settleSubscription(t,c,!1))})}),t.pending}settleSubscription(e,t,a){a&&e.epoch++,e.settlePending?.(t)}applyPresenceEvent(e,t){if(e!=="presence:join"&&e!=="presence:leave")return;const a=t,o=a.meta?.channel,s=a.member;if(!o||!s)return;const i=this.subscriptions.get(o);i&&(e==="presence:join"?i.members.set(s.presenceId,s):i.members.delete(s.presenceId))}get isConnected(){return this.socket?.connected??!1}get connectionState(){return this.socket?this.socket.connected?"connected":"connecting":"disconnected"}get socketId(){return this.socket?.id}async subscribe(e){let t=this.subscriptions.get(e);if(t){if(t.pending)return t.pending;if(t.status==="subscribed")return{ok:!0,channel:e,presence:{members:[...t.members.values()]}}}else t={channel:e,epoch:0,status:"pending",members:new Map},this.subscriptions.set(e,t);if(!this.socket?.connected)try{await this.connect()}catch(a){this.subscriptions.get(e)===t&&this.subscriptions.delete(e);const o=a instanceof Error?a.message:"Connection failed";return{ok:!1,channel:e,error:{code:"CONNECTION_FAILED",message:o}}}return t.pending??this.requestSubscription(e,t)}unsubscribe(e){const t=this.subscriptions.get(e);t&&(this.subscriptions.delete(e),this.settleSubscription(t,{ok:!1,channel:e,error:{code:"SUBSCRIPTION_CANCELLED",message:"Subscription cancelled"}},!0),this.socket?.connected&&this.socket.emit("realtime:unsubscribe",{channel:e}))}async publish(e,t,a){if(!this.socket?.connected)throw new Error("Not connected to realtime server. Call connect() first.");this.socket.emit("realtime:publish",{channel:e,event:t,payload:a})}on(e,t){const a=this.eventListeners.get(e)??new Set;a.add(t),this.eventListeners.set(e,a)}off(e,t){const a=this.eventListeners.get(e);a?.delete(t),a?.size===0&&this.eventListeners.delete(e)}once(e,t){const a=o=>{this.off(e,a),t(o)};this.on(e,a)}getSubscribedChannels(){return[...this.subscriptions.values()].filter(e=>e.status==="subscribed").map(e=>e.channel)}getPresenceState(e){return[...this.subscriptions.get(e)?.members.values()??[]]}},CI=class{constructor(e){this.http=e}async send(e){try{return{data:await this.http.post("/api/email/send-raw",e),error:null}}catch(t){if(t instanceof Error&&t.name==="AbortError")throw t;return{data:null,error:t instanceof Le?t:new Le(t instanceof Error?t.message:"Email send failed",500,"EMAIL_ERROR")}}}};function sr(e,t){return`/api/payments/${e}/${encodeURIComponent(t)}`}var TI=class{constructor(e){this.http=e}async createCheckoutSession(e,t){try{return{data:await this.http.post(`${sr("stripe",e)}/checkout-sessions`,t,{idempotent:!!t.idempotencyKey}),error:null}}catch(a){return It(a,"Stripe checkout session creation failed")}}async createCustomerPortalSession(e,t){try{return{data:await this.http.post(`${sr("stripe",e)}/customer-portal-sessions`,t),error:null}}catch(a){return It(a,"Stripe customer portal session creation failed")}}},EI=class{constructor(e){this.http=e}async createOrder(e,t){try{return{data:await this.http.post(`${sr("razorpay",e)}/orders`,t),error:null}}catch(a){return It(a,"Razorpay order creation failed")}}async verifyOrder(e,t){try{return{data:await this.http.post(`${sr("razorpay",e)}/orders/verify`,t),error:null}}catch(a){return It(a,"Razorpay order verification failed")}}async createSubscription(e,t){try{return{data:await this.http.post(`${sr("razorpay",e)}/subscriptions`,t),error:null}}catch(a){return It(a,"Razorpay subscription creation failed")}}async verifySubscription(e,t){try{return{data:await this.http.post(`${sr("razorpay",e)}/subscriptions/verify`,t),error:null}}catch(a){return It(a,"Razorpay subscription verification failed")}}async cancelSubscription(e,t,a={}){try{return{data:await this.http.post(`${sr("razorpay",e)}/subscriptions/${encodeURIComponent(t)}/cancel`,a),error:null}}catch(o){return It(o,"Razorpay subscription cancellation failed")}}async pauseSubscription(e,t){try{return{data:await this.http.post(`${sr("razorpay",e)}/subscriptions/${encodeURIComponent(t)}/pause`,{}),error:null}}catch(a){return It(a,"Razorpay subscription pause failed")}}async resumeSubscription(e,t){try{return{data:await this.http.post(`${sr("razorpay",e)}/subscriptions/${encodeURIComponent(t)}/resume`,{}),error:null}}catch(a){return It(a,"Razorpay subscription resume failed")}}},AI=class{constructor(e){this.stripe=new TI(e),this.razorpay=new EI(e)}},PI=class{constructor(e={}){const t=new Vv(e.debug);this.tokenManager=new Zv,this.http=new iI(e,this.tokenManager,t);const a=e.accessToken??e.edgeFunctionToken;a&&(this.http.setAuthToken(a),this.tokenManager.setAccessToken(a)),this.auth=new pI(this.http,this.tokenManager,{isServerMode:e.isServerMode??!!a,detectOAuthCallback:e.auth?.detectOAuthCallback}),this.database=new hI(this.http,e.db?.schema),this.storage=new gI(this.http),this.ai=new _I(this.http),this.functions=new wI(this.http,e.functionsUrl),this.realtime=new SI(this.http.baseUrl,this.tokenManager,e.anonKey,()=>this.http.getValidAccessToken()),this.emails=new CI(this.http),this.payments=new AI(this.http)}getHttpClient(){return this.http}setAccessToken(e,t=Yr.SIGNED_IN){this.http.setAuthToken(e),e===null?this.tokenManager.clearSession():this.tokenManager.setAccessToken(e,t)}};function RI(e={}){return new PI(e)}const tw="https://srctyff5.us-east.insforge.app",nw="https://srctyff5.function2.insforge.app";function El(e,t){const a=String(e||"").trim().replace(/\/$/,"");return a===tw?`${nw}/${t}`:`${a}/functions/${t}`}async function Yd(e,t={},a=fetch){const o=await a(e,t),s=String(t.method||"GET").toUpperCase(),i=new URL(String(e));if(o.status===404&&(s==="GET"||s==="HEAD")&&i.origin===nw){const c=new URL(`${tw}/functions${i.pathname}`);return c.search=i.search,a(c.toString(),t)}return o}const II="https://srctyff5.us-east.insforge.app";function NI(e){if(typeof e!="string"||!e.trim())return!1;const t=e.trim();if(t.startsWith("ik_"))return!1;if(/^anon_(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(t))return!0;try{const a=t.split(".");return a.length!==3||a.some(s=>!/^[A-Za-z0-9_-]+$/.test(s))?!1:JSON.parse(atob(a[1].replace(/-/g,"+").replace(/_/g,"/"))).role==="anon"}catch{return!1}}function ey({baseUrl:e,anonKey:t,strictPair:a=!1,defaultBaseUrl:o=II,defaultAnonKey:s=""}={}){const i=typeof e=="string"?e.trim():"",c=typeof t=="string"?t.trim():"";let u;try{const g=new URL(i||o);if(g.username||g.password||g.search||g.hash||g.protocol!=="https:"&&!(g.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(g.hostname)))throw new Error;u=g.toString().replace(/\/+$/,"")}catch{return{baseUrl:"",anonKey:"",errorCode:"invalid_backend_url"}}const m=u!==o.replace(/\/+$/,"");if((m||a)&&!c)return{baseUrl:"",anonKey:"",errorCode:"missing_backend_anon_key"};if(m&&s&&c===s)return{baseUrl:"",anonKey:"",errorCode:"missing_backend_anon_key"};const f=c||s;return f&&!NI(f)?{baseUrl:"",anonKey:"",errorCode:"invalid_backend_anon_key"}:{baseUrl:u,anonKey:f,errorCode:null}}const DI={VITE_INSFORGE_ANON_KEY:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3OC0xMjM0LTU2NzgtOTBhYi1jZGVmMTIzNDU2NzgiLCJlbWFpbCI6ImFub25AaW5zZm9yZ2UuY29tIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODExNDU5NDd9.T0auta_IrVIh0uXW1bob5QSnzvsnJmN28r5XkSGEuQY",VITE_INSFORGE_BASE_URL:"https://srctyff5.us-east.insforge.app"},ul="https://srctyff5.us-east.insforge.app",ty="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3OC0xMjM0LTU2NzgtOTBhYi1jZGVmMTIzNDU2NzgiLCJlbWFpbCI6ImFub25AaW5zZm9yZ2UuY29tIiwicm9sZSI6ImFub24iLCJpYXQiOjE3ODExNDU5NDd9.T0auta_IrVIh0uXW1bob5QSnzvsnJmN28r5XkSGEuQY",pl="tt.insforgeInstanceChanged",ny="tt.insforge.instance";function ay(){return typeof window<"u"&&["localhost","127.0.0.1"].includes(window.location.hostname)}function to(){const e=typeof window>"u"?void 0:window.__TOKENTRACKER_RUNTIME_CONFIG__;if(e!==void 0)return!e||e.configurationError||!e.baseUrl?{baseUrl:"",anonKey:"",errorCode:"runtime_configuration_error",source:"runtime"}:{...ey({baseUrl:e.baseUrl,anonKey:e.anonKey,strictPair:!0,defaultBaseUrl:ul,defaultAnonKey:ty}),source:"runtime"};const t=typeof import.meta<"u"?DI:void 0;return{...ey({baseUrl:t?.VITE_INSFORGE_BASE_URL||t?.VITE_TOKENTRACKER_BACKEND_BASE_URL,anonKey:t?.VITE_INSFORGE_ANON_KEY||t?.VITE_TOKENTRACKER_BACKEND_ANON_KEY,defaultBaseUrl:ul,defaultAnonKey:ty}),source:"build"}}function aw(){return to().errorCode}function Wt(){return to().baseUrl}function Uo(){return to().anonKey}function tm(){return!aw()}function ml(){return to().baseUrl}function rw(){return to().baseUrl===ul}function ry(){const e=to();return e.errorCode||e.baseUrl===ul?null:new URL(e.baseUrl).host}let Kr=null,Ns="",jh=!1;function OI(){if(!(typeof window>"u"))for(const e of["localStorage","sessionStorage"])try{const t=window[e],a=Array.from({length:t.length},(o,s)=>t.key(s));for(const o of a)o&&(/^insforge(?:[_:.-]|$)/i.test(o)||o==="tt.cloud.return")&&t.removeItem(o)}catch{}}function oy(){Kr?.tokenManager?.clearSession?.(),Kr=null,Ns="",jh=!0,OI(),typeof window<"u"&&window.dispatchEvent(new Event(pl))}function LI(){return!jh}function sy(){jh=!1}function hn(e){const t=to();return!t.errorCode&&e===Kr&&Ns===`${t.baseUrl}\0${t.anonKey}`}function MI(){const e=to();if(e.errorCode)return Kr&&oy(),null;const t=`${e.baseUrl}\0${e.anonKey}`;if(Kr&&Ns===t)return Kr;let a="";try{a=localStorage.getItem(ny)||""}catch{}const o=!!(Ns&&Ns!==t||a&&a!==e.baseUrl||!a&&e.baseUrl!==ul);o&&oy();try{localStorage.setItem(ny,e.baseUrl)}catch{}const s=e.baseUrl,i=e.source==="runtime"&&ay();return Kr=RI({baseUrl:ay()?window.location.origin:e.baseUrl,functionsUrl:El(e.baseUrl,"").replace(/\/$/,""),anonKey:e.anonKey,auth:{detectOAuthCallback:!o},...i?{fetch:(c,u)=>{if(new URL(typeof c=="string"?c:c instanceof URL?c.toString():c.url,window.location.origin).origin!==window.location.origin)return fetch(c,u);const f=new Headers(u?.headers||(c instanceof Request?c.headers:void 0));return f.set("x-tokentracker-instance",s),fetch(c,{...u,headers:f})}}:{}}),Ns=t,Kr}const ow="tokentracker_cloud_sync_enabled",Um="tokentracker_cloud_sync_changed_at_ms",zI="tokentracker_cloud_device_session_v1",Uh="tokentracker_cloud_device_id_v1",Hh="tokentracker_cloud_last_sync_ts",Hm="tokentracker_cloud_usage_ready_v1",Fm="tt.cloudUsageSynced",w3="tt.cloudLeaderboardRefreshed";let qs=null,Cd=0,nm=Promise.resolve();function Fh(){try{localStorage.removeItem(zI)}catch{}}function hl(){if(typeof window>"u")return!1;const e=window.location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"||e==="[::1]"}function za(){try{const e=localStorage.getItem(ow);return e==="1"||e==="true"}catch{return!1}}function jI(e){try{localStorage.setItem(Um,String(Math.max(Date.now(),Number(localStorage.getItem(Um)||0)+1))),localStorage.setItem(ow,e?"1":"0")}catch{}e||(fl(),Zd(!1)),sw(e);try{typeof window<"u"&&window.dispatchEvent(new Event("tt.cloudSyncChanged"))}catch{}}function sw(e){if(!hl())return Promise.resolve();let t=0;try{t=Number(localStorage.getItem(Um)||0)}catch{}return nm=nm.then(()=>UI(e,t)),nm}async function UI(e,t){const a=new AbortController,o=setTimeout(()=>a.abort(),5e3);try{const{getLocalApiAuthHeaders:s}=await mt(async()=>{const{getLocalApiAuthHeaders:c}=await Promise.resolve().then(()=>Tw);return{getLocalApiAuthHeaders:c}},void 0),i=await s((c,u)=>fetch(c,{...u,signal:a.signal}));await fetch("/functions/tokentracker-cloud-sync-pref",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",...i},cache:"no-store",signal:a.signal,body:JSON.stringify({enabled:e,changedAtMs:t})})}catch{}finally{clearTimeout(o)}}function iw(){return sw(za())}function lw(){return Fh(),qs}function x3(){if(qs?.deviceId)return qs.deviceId;try{return String(localStorage.getItem(Uh)||"").trim()}catch{return""}}function cw(){return Cd}function HI(e,t=Cd){if(t!==Cd)return!1;qs={...e,generation:t};try{e.deviceId&&localStorage.setItem(Uh,e.deviceId)}catch{}return Fh(),!0}function fl(){const e=qs?.localSessionId;e&&hl()&&mt(()=>Promise.resolve().then(()=>Tw),void 0).then(async({getLocalApiAuthHeaders:t})=>{const a=await t();await fetch("/functions/tokentracker-cloud-session",{method:"POST",headers:{"Content-Type":"application/json",...a},body:JSON.stringify({clear:!0,session_id:e})})}).catch(()=>{}),Cd+=1,qs=null,Zd(!1);try{localStorage.removeItem(Hh),localStorage.removeItem(Uh)}catch{}Fh()}function iy(){try{Zd(!0),typeof window<"u"&&window.dispatchEvent(new Event(Fm))}catch{}}function Bm(){try{return localStorage.getItem(Hm)==="1"}catch{return!1}}function Zd(e){try{e?localStorage.setItem(Hm,"1"):localStorage.removeItem(Hm)}catch{}}function dw(){try{const e=Number(localStorage.getItem(Hh));return Number.isFinite(e)?e:0}catch{return 0}}function Xi(e){try{localStorage.setItem(Hh,String(e))}catch{}}function Vr(e){if(typeof e!="string")return null;const t=e.trim();return t.length>0?t:null}function FI(e){const t=Vr(e);if(!t)return null;const a=t.split(".");if(a.length<2)return null;const o=a[1];try{const s=o.replace(/-/g,"+").replace(/_/g,"/").padEnd(o.length+(4-o.length%4)%4,"="),i=typeof atob=="function"?atob(s):Buffer.from(s,"base64").toString("utf8"),u=JSON.parse(i)?.exp;return typeof u!="number"||!Number.isFinite(u)||u<=0?null:Math.floor(u*1e3)}catch{return null}}function Al(e){const t=Vr(e);if(!t)return!1;const a=t.split(".");if(a.length!==3)return!1;try{for(let o=0;o<2;o++){const s=a[o];if(!/^[A-Za-z0-9_-]+$/.test(s))return!1;const i=s.replace(/-/g,"+").replace(/_/g,"/").padEnd(s.length+(4-s.length%4)%4,"="),c=typeof atob=="function"?atob(i):Buffer.from(i,"base64").toString("utf8");o===1&&JSON.parse(c)}return!0}catch{return!1}}function ly(e,t=3e4){const a=FI(e);return a?a<=Date.now()+Math.max(0,Number(t)||0):!1}async function Bh(e){if(!e)return null;if(typeof e=="string")return Vr(e);if(typeof e=="function")try{const t=await e();return Vr(t)}catch{return null}if(typeof e=="object"){if(typeof e.getAccessToken=="function"){try{const t=await e.getAccessToken(),a=Vr(t);if(a)return a}catch{}return Vr(e.accessToken)}return null}return Vr(e)}async function S3(e,t={}){const a=Math.max(1,Math.min(12,Math.floor(Number(t.maxAttempts)||8))),o=Math.max(20,Math.floor(Number(t.baseDelayMs)||50));for(let s=0;s<a;s++){const i=await Bh(e);if(i)return i;s<a-1&&await new Promise(c=>setTimeout(c,o*(s+1)))}return null}function C3(e){return typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1")||typeof e=="function"||e&&typeof e=="object"&&typeof e.getAccessToken=="function"?!0:!!Vr(e)}function T3(){if(typeof Intl>"u"||!Intl.DateTimeFormat)return null;try{return Intl.DateTimeFormat().resolvedOptions().timeZone||null}catch{return null}}function E3(e=new Date){const t=e instanceof Date?e:new Date(e);if(!Number.isFinite(t.getTime()))return 0;const a=t.getTimezoneOffset();return Number.isFinite(a)?-a:0}function uw(e){if(!Number.isFinite(e)||e===0)return"UTC";const t=e>=0?"+":"-",a=Math.abs(e),o=String(Math.floor(a/60)).padStart(2,"0"),s=String(a%60).padStart(2,"0");return`UTC${t}${o}:${s}`}function A3({timeZone:e,offsetMinutes:t}={}){const a=uw(t);return e&&e!=="UTC"?`${e} (${a})`:a}function P3({timeZone:e,offsetMinutes:t}={}){return Number.isFinite(t)?uw(t):e||"UTC"}function R3({timeZone:e,offsetMinutes:t,date:a=new Date}={}){const o=a instanceof Date?a:new Date(a);if(!Number.isFinite(o.getTime()))return"";if(e&&typeof Intl<"u"&&Intl.DateTimeFormat)try{const c=new Intl.DateTimeFormat("en-CA",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(o).reduce((g,b)=>(b.type&&b.value&&(g[b.type]=b.value),g),{}),u=c.year,m=c.month,f=c.day;if(u&&m&&f)return`${u}-${m}-${f}`}catch{}if(typeof t=="number"&&Number.isFinite(t)){const s=new Date(o.getTime()+t*6e4);return GI(s)}return $I(o)}function BI({timeZone:e,offsetMinutes:t,date:a=new Date}={}){const o=a instanceof Date?a:new Date(a);if(!Number.isFinite(o.getTime()))return null;if(e&&typeof Intl<"u"&&Intl.DateTimeFormat)try{const c=new Intl.DateTimeFormat("en-CA",{timeZone:e,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(o).reduce((g,b)=>(b.type&&b.value&&(g[b.type]=b.value),g),{}),u=Number(c.year),m=Number(c.month),f=Number(c.day);if(Number.isFinite(u)&&Number.isFinite(m)&&Number.isFinite(f))return{year:u,month:m,day:f}}catch{}if(typeof t=="number"&&Number.isFinite(t)){const s=new Date(o.getTime()+t*6e4);return{year:s.getUTCFullYear(),month:s.getUTCMonth()+1,day:s.getUTCDate()}}return{year:o.getFullYear(),month:o.getMonth()+1,day:o.getDate()}}function I3({timeZone:e,offsetMinutes:t}={}){return e?`tz:${e}`:typeof t=="number"&&Number.isFinite(t)?`offset:${Math.trunc(t)}`:"utc"}function GI(e){const t=e.getUTCFullYear(),a=String(e.getUTCMonth()+1).padStart(2,"0"),o=String(e.getUTCDate()).padStart(2,"0");return`${t}-${a}-${o}`}function $I(e){const t=e.getFullYear(),a=String(e.getMonth()+1).padStart(2,"0"),o=String(e.getDate()).padStart(2,"0");return`${t}-${a}-${o}`}function xt(e){return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate())).toISOString().slice(0,10)}function Ga(e){const t=e instanceof Date?e:new Date(e);if(!Number.isFinite(t.getTime()))return"";const a=t.getFullYear(),o=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0");return`${a}-${o}-${s}`}function qI(e){if(!e)return null;const t=String(e).trim(),a=t.split("-");if(a.length!==3)return null;const o=Number(a[0]),s=Number(a[1])-1,i=Number(a[2]);if(!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(i))return null;const c=new Date(Date.UTC(o,s,i));return Number.isFinite(c.getTime())&&xt(c)===t?c:null}function KI(e){if(!e)return"";const t=e.year,a=String(e.month).padStart(2,"0"),o=String(e.day).padStart(2,"0");return!t||!a||!o?"":`${t}-${a}-${o}`}function VI(e,{timeZone:t,offsetMinutes:a,now:o}={}){const s=o instanceof Date&&Number.isFinite(o.getTime())?o:new Date,i=BI({timeZone:t,offsetMinutes:a,date:s});if(!i){const m=Ga(new Date);return{from:m,to:m}}const c=KI(i),u=qI(c);if(!u)return{from:c,to:c};if(e==="day")return{from:c,to:c};if(e==="week"){const m=new Date(u),g=(m.getUTCDay()+6)%7;m.setUTCDate(m.getUTCDate()-g);const b=new Date(m);return b.setUTCDate(b.getUTCDate()+6),{from:xt(m),to:xt(b)}}if(e==="month"){const m=new Date(Date.UTC(u.getUTCFullYear(),u.getUTCMonth(),1)),f=new Date(Date.UTC(u.getUTCFullYear(),u.getUTCMonth()+1,0));return{from:xt(m),to:xt(f)}}if(e==="total"){const m=new Date(Date.UTC(u.getUTCFullYear(),u.getUTCMonth()-23,1));return{from:xt(m),to:c}}return VI("week")}function pw(){return typeof window>"u"?null:window.localStorage||null}function mw(){return typeof navigator>"u"?null:navigator.clipboard||null}function WI(){return typeof window>"u"?null:window.ClipboardItem||null}function ol(e,{storage:t}={}){const a=t??pw();if(!a||typeof a.getItem!="function")return null;try{return a.getItem(e)}catch{return null}}function sl(e,t,{storage:a}={}){const o=a??pw();if(!o||typeof o.setItem!="function")return!1;try{return o.setItem(e,t),!0}catch{return!1}}async function N3(e,{clipboard:t}={}){const a=t??mw();if(!a||typeof a.writeText!="function")return!1;try{return await a.writeText(e),!0}catch{return!1}}async function D3(e,{clipboard:t}={}){const a=t??mw(),o=WI();if(!e||!a||typeof a.write!="function"||!o)return!1;try{const s=e.type||"image/png",i=e.type&&e.type!==s?e.slice(0,e.size,s):e.type?e:e.slice(0,e.size,s),c=new o({[s]:i});return await a.write([c]),!0}catch{return!1}}const gl="USD",Gh=["USD","EUR","GBP","CNY","JPY","HKD"],hw={USD:{symbol:"$",labelKey:"settings.appearance.currency.opt.usd"},EUR:{symbol:"€",labelKey:"settings.appearance.currency.opt.eur"},GBP:{symbol:"£",labelKey:"settings.appearance.currency.opt.gbp"},CNY:{symbol:"¥",labelKey:"settings.appearance.currency.opt.cny"},JPY:{symbol:"¥",labelKey:"settings.appearance.currency.opt.jpy"},HKD:{symbol:"HK$",labelKey:"settings.appearance.currency.opt.hkd"}},$h={USD:1,EUR:.92,GBP:.79,CNY:7.2,JPY:155,HKD:7.8},fw="tokentracker-currency",gw="tokentracker-exchange-rates",_w="tokentracker-exchange-rate-source",bw="tokentracker-exchange-rate-fetched-at";function Td(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function qh(e){if(typeof e!="string")return gl;const t=e.trim().toUpperCase();return Gh.includes(t)?t:gl}function id(e){const t=typeof e=="string"?e.trim().toUpperCase():gl;return hw[t]?.symbol??"$"}function O3(){return Gh.map(e=>({code:e,...hw[e]}))}function YI(){return qh(ol(fw))}function ZI(e){return sl(fw,qh(e))}function yw(e){return e==="fetched"?"fetched":"default"}function QI(e){if(e==null)return null;try{const t=JSON.parse(String(e));if(!t||typeof t!="object")return null;const a={};for(const[o,s]of Object.entries(t)){const i=Number(s);Number.isFinite(i)&&i>0&&(a[o.toUpperCase()]=i)}return a}catch{return null}}function JI(){const e=QI(ol(gw)),t=ol(bw),a=t==null?NaN:Number(t),o=Number.isFinite(a)&&a>0?a:null,s=ol(_w),i=yw(s);return e&&Object.keys(e).length>0?{rates:{USD:1,...e},source:i,fetchedAt:o}:{rates:{...$h},source:"default",fetchedAt:null}}function XI(e){const{rates:t,source:a,fetchedAt:o}=e;if(!t||typeof t!="object")return!1;const s=sl(gw,JSON.stringify(t)),i=sl(_w,yw(a)),c=o?sl(bw,String(o)):!0;return s&&i&&c}function am(e,t){if(t===gl)return 1;const a=e?.[t];if(Td(a))return a;const o=$h[t];return Td(o)?o:1}function eN(e,t,a){const o=e.startsWith("-"),s=o?e.slice(1):e,i=[];for(let c=s.length;c>0;c-=t)i.unshift(s.slice(Math.max(0,c-t),c));return`${o?"-":""}${i.join(a)}`}function tN(e){if(e==null)return"-";try{if(typeof e=="bigint"||typeof e=="number")return new Intl.NumberFormat().format(e);const t=String(e).trim();return/^[0-9]+$/.test(t)?new Intl.NumberFormat().format(BigInt(t)):t}catch{return String(e)}}function nN(e,{groupSize:t=3}={}){if(!Number.isInteger(t)||t===3)return tN(e);if(e==null)return"-";try{let a=e;if(typeof e!="bigint"&&typeof e!="number"){const i=String(e).trim();if(!/^[0-9]+$/.test(i))return i;a=BigInt(i)}const o=new Intl.NumberFormat(void 0,{useGrouping:!1});if(t<=1||typeof a=="number"&&!Number.isFinite(a))return o.format(a);const s=new Intl.NumberFormat().formatToParts(1e4).find(i=>i.type==="group")?.value||",";return o.formatToParts(a).map(i=>i.type==="integer"?eN(i.value,t,s):i.value).join("")}catch{return String(e)}}function aN(e,{thousandSuffix:t="K",millionSuffix:a="M",billionSuffix:o="B",trillionSuffix:s="T",decimals:i=1}={}){const c=Number(String(e));if(!Number.isFinite(c))return"-";const u=c<0?"-":"",m=Math.abs(c),f=Math.max(0,Math.min(6,Math.floor(i)));if(m<1e3)return`${u}${String(m)}`;const g=(S,E)=>{const C=S.toFixed(f),U=Number(C).toString();return`${u}${U}${E}`},b=(S,E,C)=>{const U=S.toFixed(f),L=Number(U);return C&&L>=1e3?g(L/1e3,C):`${u}${L.toString()}${E}`};if(m>=1e12)return g(m/1e12,s);if(m>=1e9)return b(m/1e9,o,s);if(m>=1e6)return b(m/1e6,a,o);const w=m/1e3,x=Number(w.toFixed(f));return x>=1e3?g(x/1e3,a):g(x,t)}function rN(e,{decimals:t=1}={}){const a=Number(String(e));if(!Number.isFinite(a))return"-";const o=a<0?"-":"",s=Math.abs(a),i=Math.max(0,Math.min(6,Math.floor(t)));if(s<1e4)return`${o}${String(s)}`;const c=(f,g)=>{const b=f.toFixed(i),w=Number(b).toString();return`${o}${w}${g}`};if(s>=1e12)return c(s/1e12,"万亿");if(s>=1e8){const f=s/1e8,g=Number(f.toFixed(i));return g>=1e4?c(g/1e4,"万亿"):`${o}${g.toString()}亿`}const u=s/1e4,m=Number(u.toFixed(i));return m>=1e4?c(m/1e4,"亿"):c(m,"万")}function kw(e){const t=Number(String(e));return Number.isFinite(t)?t:null}function L3(e,t={}){const{decimals:a=2,currency:o="USD",rate:s=1}=t;if(e==null||typeof e=="string"&&e.trim()==="")return"-";let i;if(typeof e=="number")i=e;else if(typeof e=="bigint")i=Number(e);else{const C=String(e).trim(),U=Number(C);if(!Number.isFinite(U))return C;i=U}if(!Number.isFinite(i))return String(e);const c=id(o);o!=="USD"&&typeof s=="number"&&Number.isFinite(s)&&s>0&&(i=i*s);const m=i.toFixed(6).match(/^(-?\d+)(?:\.(\d+))?$/);if(!m)return`${c}${String(i)}`;const f=m[1],g=m[2]||"";let b=f;try{b=new Intl.NumberFormat().format(BigInt(f))}catch{b=f}const w=Math.max(0,Math.min(6,Math.floor(a))),x=w?g.slice(0,w).padEnd(w,"0"):"",S=f.startsWith("-")?"-":"",E=w?`${b.replace("-","")}.${x}`:b.replace("-","");return`${S}${c}${E}`}function Ed(e){if(typeof e!="string")return null;const t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e.trim());if(!t)return null;const a=Number(t[1]),o=Number(t[2])-1,s=Number(t[3]),i=new Date(Date.UTC(a,o,s));return Number.isFinite(i.getTime())&&xt(i)===e.trim()?i:null}function Ao(e,t){return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()+t))}function oN(e,t){const a=Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate())-Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate());return Math.floor(a/864e5)}function rm(e,t){if(!Array.isArray(e)||e.length===0)return 0;const a=e.length,o=(a-1)*t,s=Math.floor(o),i=o-s,c=e[s]??e[a-1],u=e[Math.min(a-1,s+1)]??e[a-1];return Math.round(c+(u-c)*i)}function sN(e){return e<=0?0:e>=4?4:e}function vw({weeks:e=52,now:t,weekStartsOn:a="sun"}={}){const o=t instanceof Date&&Number.isFinite(t.getTime())?t:new Date,s=Ga(o),i=Ed(s)||new Date(Date.UTC(o.getFullYear(),o.getMonth(),o.getDate())),c=a==="mon"?1:0,u=i.getUTCDay(),m=Ao(i,-((u-c+7)%7)),f=Ao(m,-7*(Math.max(1,e)-1));return{from:xt(f),to:s}}function iN({dailyRows:e,weeks:t=52,to:a,weekStartsOn:o="sun"}={}){const s=Ed(a)||new Date(Date.UTC(new Date().getFullYear(),new Date().getMonth(),new Date().getDate())),{from:i}=vw({weeks:t,now:s,weekStartsOn:o}),c=Ed(i)||Ao(s,-(t*7-1)),u=(()=>{const D=(c.getUTCDay()-(o==="mon"?1:0)+7)%7;return Ao(c,-D)})(),m=new Map;for(const L of Array.isArray(e)?e:[]){const M=typeof L?.day=="string"?L.day:null;if(!M)continue;const D=kw(L?.billable_total_tokens??L?.total_tokens)??0;m.set(M,{value:Math.max(0,D),models:L?.models||null})}const f=oN(u,s)+1,g=Math.ceil(f/7),b=[];for(let L=0;L<f;L++){const M=Ao(u,L),D=xt(M),Y=m.get(D),J=Y?Y.value:0;J>0&&b.push(J)}b.sort((L,M)=>L-M);const w=rm(b,.5),x=rm(b,.75),S=rm(b,.9);function E(L){return!L||L<=0?0:L<=w?1:L<=x?2:L<=S?3:4}const C=[];for(let L=0;L<g;L++){const M=[];for(let D=0;D<7;D++){const Y=L*7+D,J=Ao(u,Y);if(J.getTime()>s.getTime()){M.push(null);continue}const Q=xt(J),T=m.get(Q),$=T?T.value:0,ae=T?T.models:null;M.push({day:Q,value:$,level:sN(E($)),models:ae})}C.push(M)}const U=C.length>t?C.slice(C.length-t):C;return{from:i,to:xt(s),weeks:U,thresholds:{t1:w,t2:x,t3:S}}}function lN({dailyRows:e,to:t}={}){const a=Ed(t)||new Date(Date.UTC(new Date().getFullYear(),new Date().getMonth(),new Date().getDate())),o=new Map;for(const i of Array.isArray(e)?e:[]){const c=typeof i?.day=="string"?i.day:null;if(!c)continue;const u=kw(i?.billable_total_tokens??i?.total_tokens)??0;o.set(c,Math.max(0,u))}let s=0;for(let i=0;i<370;i++){const c=xt(Ao(a,-i));if((o.get(c)??0)>0){s+=1;continue}break}return s}const cN={};function Ot(){if(typeof window<"u"){const e=new URLSearchParams(window.location.search),t=String(e.get("mock")||"").toLowerCase();if(["0","false","off","no"].includes(t))return!1;if(["1","true","on","yes"].includes(t))return!0}if(typeof import.meta<"u"&&cN){const e="".toLowerCase();if(e==="1"||e==="true")return!0}return!1}const Kh={},ww="tokentracker",Gm=["tokentracker/tokentracker","spacedriveapp/spacedrive","acme/alpha","acme/beta","neo/nebula","signal/flux","matrix/terminal","orbit/atlas","lumen/core","delta/horizon"],cy=["NEO","TRINITY","MORPHEUS","ORACLE","CYPHER","SWITCH","APOC","TANK","SMITH","SERAPH","NIOBE","MOUSE","DOZER","LINK","BLADE"];function dN(){if(typeof import.meta<"u"&&Kh){const e="".trim();if(e)return e;const t="".trim();if(t)return t}if(typeof window<"u"){const e=new URLSearchParams(window.location.search),t=String(e.get("mock_now")||"").trim();if(t)return t;const a=String(e.get("mock_today")||"").trim();if(a)return a}return""}function uN(e){if(!e)return null;const t=String(e).trim();if(!t)return null;if(/^\d{4}-\d{2}-\d{2}$/.test(t)){const[o,s,i]=t.split("-").map(Number);if(!Number.isFinite(o)||!Number.isFinite(s)||!Number.isFinite(i))return null;const c=new Date(o,s-1,i,12,0,0);return Number.isFinite(c.getTime())?c:null}const a=new Date(t);return Number.isFinite(a.getTime())?a:null}function M3(){return Ot()?uN(dN()):null}function pN(){if(typeof import.meta<"u"&&Kh){const e="".trim();if(e)return e}if(typeof window<"u"){const e=new URLSearchParams(window.location.search),t=String(e.get("mock_seed")||"").trim();if(t)return t}return ww}function mN(){if(typeof import.meta<"u"&&Kh){const e="".trim(),t=Number(e);if(Number.isFinite(t)&&t>0)return Math.floor(t)}if(typeof window<"u"){const e=new URLSearchParams(window.location.search),t=String(e.get("mock_missing")||"").trim(),a=Number(t);if(Number.isFinite(a)&&a>0)return Math.floor(a)}return 0}function ai(e){return(e==null?pN():String(e)).trim()||ww}function Ho(e){let t=2166136261;for(let a=0;a<e.length;a+=1)t^=e.charCodeAt(a),t=Math.imul(t,16777619);return t>>>0}function Tn(e){if(typeof e!="string")return null;const t=/^(\d{4})-(\d{2})-(\d{2})$/.exec(e.trim());if(!t)return null;const a=Number(t[1]),o=Number(t[2])-1,s=Number(t[3]),i=new Date(Date.UTC(a,o,s));return Number.isFinite(i.getTime())&&xt(i)===e.trim()?i:null}function _l(e,t){return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()+t))}function xw(e,t){return new Date(Date.UTC(e.getUTCFullYear(),e.getUTCMonth()+t,1))}function hN(e){return`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,"0")}`}function Ks({from:e,to:t,seed:a}){const o=Tn(Ga(new Date))||new Date,s=Tn(e)||o,i=Tn(t)||s,c=[],u=ai(a),m=Math.floor((Date.UTC(i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate())-Date.UTC(s.getUTCFullYear(),s.getUTCMonth(),s.getUTCDate()))/864e5)+1;for(let f=0;f<m;f+=1){const g=_l(s,f),b=xt(g),w=Ho(`${u}:${b}`),x=w%1e3/1e3,S=.6+.4*Math.sin(f/6*Math.PI*.5),E=g.getUTCDay()===0||g.getUTCDay()===6?.65:1,C=18e3+Math.round(12e3*x),U=Math.max(0,Math.round(C*S*E)),L=Math.round(U*.46),M=Math.round(U*.34),D=Math.round(U*.14),Y=Math.max(0,U-L-M-D),J={};if(U>0){const Q=["gpt-4o","claude-3.5-sonnet","gemini-1.5-pro","deepseek-coder"],T=1+w%3;let $=U;for(let ae=0;ae<T;ae++){const Ee=Q[(w+ae)%Q.length];if(ae===T-1)J[Ee]=$;else{const ye=Math.round($*(.3+.4*((w+ae*17)%10)/10));J[Ee]=ye,$-=ye}}}c.push({day:b,total_tokens:U,billable_total_tokens:U,input_tokens:L,output_tokens:M,cached_input_tokens:D,reasoning_output_tokens:Y,conversation_count:1+w%5,models:J})}return c}function fN({day:e,seed:t}){const a=Tn(e)||Tn(Ga(new Date))||new Date,o=xt(a),s=ai(t),i=Array.from({length:48},(u,m)=>{const f=Math.floor(m/2),g=m%2===0?0:30,b=Ho(`${s}:${o}:${f}:${g}`),w=b%1e3/1e3,x=(f+g/60)/24,S=.4+.6*Math.sin(x*Math.PI*2),E=900+Math.round(700*w),C=Math.max(0,Math.round(E*S)),U=Math.round(C*.46),L=Math.round(C*.34),M=Math.round(C*.14),D=Math.max(0,C-U-L-M),Y={};if(C>0){const J=["gpt-4o","claude-3.5-sonnet","gemini-1.5-pro","deepseek-coder"],Q=1+b%2;let T=C;for(let $=0;$<Q;$++){const ae=J[(b+$)%J.length];if($===Q-1)Y[ae]=T;else{const Ee=Math.round(T*(.3+.4*((b+$*17)%10)/10));Y[ae]=Ee,T-=Ee}}}return{hour:`${o}T${String(f).padStart(2,"0")}:${String(g).padStart(2,"0")}:00`,total_tokens:C,billable_total_tokens:C,input_tokens:U,output_tokens:L,cached_input_tokens:M,reasoning_output_tokens:D,models:Y}}),c=Math.max(0,Math.min(48,mN()));if(c>0){const u=Date.now(),m=i.map((b,w)=>{const x=Date.parse(b.hour);return Number.isFinite(x)&&x<=u?{index:w,ts:x}:null}).filter(Boolean),f=Math.max(0,m.length-c),g=m.slice(f);for(const b of g){const w=i[b.index];w&&(i[b.index]={...w,missing:!0})}}return i}function gN({months:e=24,to:t,seed:a}){const o=Tn(t)||Tn(Ga(new Date))||new Date,s=new Date(Date.UTC(o.getUTCFullYear(),o.getUTCMonth(),1)),i=ai(a),c=[];for(let u=e-1;u>=0;u-=1){const m=xw(s,-u),f=hN(m),g=Ho(`${i}:${f}`),b=g%1e3/1e3,w=.7+.3*Math.sin(c.length/6*Math.PI*.5),x=36e4+Math.round(2e5*b),S=Math.max(0,Math.round(x*w)),E=Math.round(S*.46),C=Math.round(S*.34),U=Math.round(S*.14),L=Math.max(0,S-E-C-U),M={};if(S>0){const D=["gpt-4o","claude-3.5-sonnet","gemini-1.5-pro","deepseek-coder"],Y=1+g%3;let J=S;for(let Q=0;Q<Y;Q++){const T=D[(g+Q)%D.length];if(Q===Y-1)M[T]=J;else{const $=Math.round(J*(.3+.4*((g+Q*17)%10)/10));M[T]=$,J-=$}}}c.push({month:f,total_tokens:S,billable_total_tokens:S,input_tokens:E,output_tokens:C,cached_input_tokens:U,reasoning_output_tokens:L,models:M})}return c}function Vh(e){return e.reduce((t,a)=>(t.total_tokens+=Number(a.total_tokens||0),t.billable_total_tokens+=Number(a.billable_total_tokens||a.total_tokens||0),t.input_tokens+=Number(a.input_tokens||0),t.output_tokens+=Number(a.output_tokens||0),t.cached_input_tokens+=Number(a.cached_input_tokens||0),t.reasoning_output_tokens+=Number(a.reasoning_output_tokens||0),t.conversation_count+=Number(a.conversation_count||0),t),{total_tokens:0,billable_total_tokens:0,input_tokens:0,output_tokens:0,cached_input_tokens:0,reasoning_output_tokens:0,conversation_count:0})}function _N(e,t=1.75){const a=Number(e||0);return!Number.isFinite(a)||a<=0?"0.000000":(a*t/1e6).toFixed(6)}function dy(e,t){const a=Number.isFinite(t)?t:0;return{total_tokens:Math.max(0,Math.round(e.total_tokens*a)),billable_total_tokens:Math.max(0,Math.round((e.billable_total_tokens??e.total_tokens)*a)),input_tokens:Math.max(0,Math.round(e.input_tokens*a)),output_tokens:Math.max(0,Math.round(e.output_tokens*a)),cached_input_tokens:Math.max(0,Math.round(e.cached_input_tokens*a)),reasoning_output_tokens:Math.max(0,Math.round(e.reasoning_output_tokens*a))}}function $m(e){return{...e,total_cost_usd:_N(e.total_tokens)}}function bN({from:e,to:t,seed:a}={}){const o=Ks({from:e,to:t,seed:a});return{from:e,to:t,data:o}}function yN({day:e,seed:t}={}){const a=Tn(e)||new Date,o=xt(a),s=fN({day:o,seed:t});return{day:o,data:s}}function kN({months:e=24,to:t,seed:a}={}){const o=Tn(t)||Tn(Ga(new Date))||new Date,s=xt(o),i=gN({months:e,to:s,seed:a}),c=xw(new Date(Date.UTC(o.getUTCFullYear(),o.getUTCMonth(),1)),-(e-1));return{from:xt(c),to:s,months:e,data:i}}function vN({from:e,to:t,seed:a,rolling:o=!0}={}){const s=Ks({from:e,to:t,seed:a}),i=Vh(s),c=$m(i),u=o?wN({to:t,seed:a}):null;return{from:e,to:t,days:s.length,totals:c,...u?{rolling:u}:{}}}function wN({to:e,seed:t}={}){const a=Tn(e)||Tn(Ga(new Date))||new Date,o=xt(a),s=xt(_l(a,-6)),i=xt(_l(a,-29)),c=Ks({from:s,to:o,seed:t}),u=Ks({from:i,to:o,seed:t});return{last_7d:uy({rows:c,from:s,to:o}),last_30d:uy({rows:u,from:i,to:o})}}function uy({rows:e,from:t,to:a}={}){const o=Vh(e||[]),s=(e||[]).filter(c=>Number(c.billable_total_tokens??c.total_tokens)>0).length,i=s>0?Math.floor(o.billable_total_tokens/s):0;return{from:t,to:a,totals:{billable_total_tokens:o.billable_total_tokens,conversation_count:o.conversation_count},active_days:s,avg_per_active_day:i}}const py=["claude","codex","gemini","cursor","opencode","kilo"];function Sw(e,t,a){const o=Ho(`${a}:${e}`),s=12e4+o%9e5,i=t%4*4200,c=Math.max(0,s+i),u=Math.max(0,Math.round(c*.96)),m=1+o%4;let f=c;const g=Array.from({length:m},(S,E)=>{const U=E===m-1?f:Math.floor(f*(.4+(o>>E)%3*.1));return f-=U,{source:py[(o+E)%py.length],total_tokens:U}}).sort((S,E)=>E.total_tokens-S.total_tokens),b=Math.floor(c*.7),w=Math.floor(c*.12),x=Math.floor(c*.1);return{project_key:e,project_ref:`https://github.com/${e}`,total_tokens:String(c),billable_total_tokens:String(u),input_tokens:w,output_tokens:x,cached_input_tokens:b,cache_creation_input_tokens:Math.floor(c*.06),reasoning_output_tokens:Math.floor(c*.02),conversation_count:5+o%120,mockDayCount:1+o%14,sources:g}}function xN({seed:e,limit:t=3}={}){const a=ai(e),o=Gm.map((s,i)=>{const{mockDayCount:c,...u}=Sw(s,i,a);return u}).sort((s,i)=>Number(i.billable_total_tokens)-Number(s.billable_total_tokens)).slice(0,Math.max(1,Math.min(10,Math.floor(Number(t)||3))));return{generated_at:new Date().toISOString(),entries:o}}function SN({projectKey:e,from:t,to:a}={}){const o=typeof e=="string"&&e?e:Gm[0],s=Math.max(0,Gm.indexOf(o)),i=Sw(o,s,ai(o)),c=Number(i.total_tokens),u=i.mockDayCount,m=new Date,f=Array.from({length:u},(g,b)=>{const w=new Date(m.getTime()-(u-1-b)*864e5),x=Ho(`${o}:${b}`),S=Math.floor(c/u*(.4+x%120/100)),E=i.sources[0]?.source||"claude",C=i.sources[1]?.source,U={[E]:Math.floor(S*.8)};return C&&(U[C]=S-U[E]),{day:w.toISOString().slice(0,10),total_tokens:S,billable_total_tokens:S,input_tokens:Math.floor(S*.12),output_tokens:Math.floor(S*.1),cached_input_tokens:Math.floor(S*.7),cache_creation_input_tokens:Math.floor(S*.06),reasoning_output_tokens:Math.floor(S*.02),conversation_count:1+x%20,models:U}});return{generated_at:new Date().toISOString(),from:t||f[0]?.day||"",to:a||f[f.length-1]?.day||"",project_key:o,project_ref:i.project_ref,totals:{total_tokens:c,billable_total_tokens:Number(i.billable_total_tokens),input_tokens:i.input_tokens,output_tokens:i.output_tokens,cached_input_tokens:i.cached_input_tokens,cache_creation_input_tokens:i.cache_creation_input_tokens,reasoning_output_tokens:i.reasoning_output_tokens,conversation_count:i.conversation_count},days_active:u,range_total_tokens:c*3,daily:f,sources:i.sources.map((g,b)=>({source:g.source,total_tokens:g.total_tokens,conversation_count:1+Ho(`${o}:src:${b}`)%60,days_active:Math.max(1,u-b)}))}}function CN(e){const t=Tn(Ga(new Date))||new Date,a=String(e).trim().toLowerCase()||"week";if(a==="total")return{from:"1970-01-01",to:"9999-12-31"};if(a==="month"){const c=new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth(),1)),u=new Date(Date.UTC(t.getUTCFullYear(),t.getUTCMonth()+1,0));return{from:xt(c),to:xt(u)}}const o=t.getUTCDay(),s=xt(_l(t,-o)),i=xt(_l(t,-o+6));return{from:s,to:i}}const my=["token_titan","big_day","wordsmith","marathoner","streak","weekend_warrior","momentum","polyglot","trendsetter","multitool","podium","veteran"];function hy(e){const t=e%4,a=[];for(let o=0;o<t;o+=1){const s=my[(e*3+o*5)%my.length];a.some(i=>i.id===s)||a.push({id:s,tier:4-o>0?(e+o)%4+1:1})}return a.sort((o,s)=>s.tier-o.tier)}function Wh(){const e=Date.now(),t=o=>new Date(e-o*864e5).toISOString(),a=(o,s,i,c,u={})=>{const m=!["project_hopper","project_devotion","night_owl"].includes(o);return{id:o,tier:s,metric_value:i,thresholds:c,lower_is_better:o==="podium",next_threshold:s>=4?null:c[s],achieved:{bronze:s>=1?t(90):null,silver:s>=2?t(45):null,gold:s>=3?t(12):null,diamond:s>=4?t(2):null},serials:m?{bronze:s>=1?127+o.length:null,silver:s>=2?64+o.length:null,gold:s>=3?18+o.length:null,diamond:s>=4?3+o.length:null}:void 0,meta:u}};return{generated_at:new Date(e).toISOString(),achievements:[a("token_titan",3,245e8,[1e8,1e9,1e10,1e11]),a("big_day",1,92e6,[1e7,1e8,5e8,3e9],{date:t(12).slice(0,10)}),a("wordsmith",2,31e6,[5e6,25e6,1e8,3e8]),a("marathoner",2,61,[7,30,100,365]),a("streak",1,5,[3,7,30,100]),a("weekend_warrior",2,26,[5,20,50,100]),a("momentum",0,1.2,[2,6,15,40]),a("polyglot",1,11,[5,15,30,60],{favorite_model:"claude-opus-4-7"}),a("trendsetter",2,7,[2,5,10,20]),a("multitool",3,7,[2,4,6,10]),a("podium",1,42,[100,30,10,3]),a("veteran",2,132,[30,90,180,365],{first_day:t(132).slice(0,10)}),a("project_hopper",2,6,[3,5,10,20]),a("project_devotion",3,24e7,[1e6,1e7,1e8,1e9],{project_key:"mock"}),a("night_owl",1,9,[5,20,60,150])]}}function Cw({seed:e,period:t,metric:a,limit:o=20,offset:s=0}={}){const i=ai(e),c=Math.max(1,Math.min(100,Math.floor(Number(o)||20))),u=Math.max(0,Math.min(1e4,Math.floor(Number(s)||0))),m=String(a||"all").trim().toLowerCase()||"all",f=String(t||"week").trim().toLowerCase()||"week",g=f==="month"||f==="total"||f==="week"?f:"week",{from:b,to:w}=CN(g),x=250,S=x>0?Math.ceil(x/c):0,E=Math.floor(u/c)+1,C=Array.from({length:x},(Q,T)=>{const $=T+1,ae=`00000000-0000-0000-0000-${String($).padStart(12,"0")}`,Ee=cy[$%cy.length],ze=18e4+Ho(`${i}:${Ee}:${$}`)%9e5,Se=Math.max(0,ze+$*1200),Me=Math.floor(Se*.28),_e=Math.floor(Se*.18),de=Math.floor(Se*.1),ne=Math.floor(Se*.1),Z=Math.floor(Se*.08),H=Math.floor(Se*.03),N=Math.floor(Se*.02),W=Math.floor(Se*.04),ue=Math.floor(Se*.03),be=Math.max(0,Se-Me-_e-de-ne-Z-H-N-W-ue),ce=$%7!==0;return{id:$,user_id:ae,is_public:ce,is_me:!1,display_name:ce?Ee:"Anonymous",avatar_url:null,gpt_tokens:Me,claude_tokens:_e,gemini_tokens:de,cursor_tokens:ne,opencode_tokens:Z,openclaw_tokens:be,hermes_tokens:H,kiro_tokens:N,copilot_tokens:W,kimi_tokens:ue,other_tokens:0,total_tokens:Se}}),U=Math.max(0,Math.min(x-1,Math.floor(x*.8)));C[U]&&(C[U].is_me=!0);const L=m==="gpt"||m==="codex"?"gpt_tokens":m==="claude"?"claude_tokens":m==="gemini"?"gemini_tokens":m==="cursor"?"cursor_tokens":m==="opencode"?"opencode_tokens":m==="openclaw"?"openclaw_tokens":m==="hermes"?"hermes_tokens":m==="kiro"?"kiro_tokens":m==="copilot"?"copilot_tokens":m==="kimi"?"kimi_tokens":"total_tokens",M=C.slice().sort((Q,T)=>Number(T[L])-Number(Q[L])||Q.id-T.id).map((Q,T)=>({user_id:Q.is_public?Q.user_id:null,rank:T+1,is_me:!!Q.is_me,display_name:Q.display_name,avatar_url:Q.avatar_url,gpt_tokens:String(Q.gpt_tokens),claude_tokens:String(Q.claude_tokens),gemini_tokens:String(Q.gemini_tokens),cursor_tokens:String(Q.cursor_tokens),opencode_tokens:String(Q.opencode_tokens),openclaw_tokens:String(Q.openclaw_tokens),hermes_tokens:String(Q.hermes_tokens??0),kiro_tokens:String(Q.kiro_tokens??0),copilot_tokens:String(Q.copilot_tokens??0),kimi_tokens:String(Q.kimi_tokens??0),other_tokens:String(Q.other_tokens??0),total_tokens:String(Q.total_tokens),is_public:!!Q.is_public,github_url:Q.id%3===0?"https://github.com/xiufengsun/TokenTracker":null,badges:hy(Q.id),badge_count:hy(Q.id).length})),D=M.find(Q=>Q?.is_me)||null,Y=D?{rank:D.rank,gpt_tokens:D.gpt_tokens,claude_tokens:D.claude_tokens,gemini_tokens:D.gemini_tokens,cursor_tokens:D.cursor_tokens,opencode_tokens:D.opencode_tokens,openclaw_tokens:D.openclaw_tokens,hermes_tokens:D.hermes_tokens,kiro_tokens:D.kiro_tokens,copilot_tokens:D.copilot_tokens,kimi_tokens:D.kimi_tokens,other_tokens:D.other_tokens,total_tokens:D.total_tokens}:{rank:null,gpt_tokens:"0",claude_tokens:"0",gemini_tokens:"0",cursor_tokens:"0",opencode_tokens:"0",openclaw_tokens:"0",hermes_tokens:"0",kiro_tokens:"0",copilot_tokens:"0",kimi_tokens:"0",other_tokens:"0",total_tokens:"0"},J=M.slice(u,u+c);return{period:g,metric:m,from:b,to:w,generated_at:new Date().toISOString(),page:E,limit:c,offset:u,total_entries:x,total_pages:S,entries:J,me:Y}}function TN({weeks:e=52,to:t,weekStartsOn:a="sun",seed:o}={}){const s=vw({weeks:e,now:Tn(t)||Tn(Ga(new Date))||new Date,weekStartsOn:a}),i=Ks({from:s.from,to:s.to,seed:o});return{...iN({dailyRows:i,weeks:e,to:s.to,weekStartsOn:a}),week_starts_on:a,active_days:i.filter(u=>Number(u.billable_total_tokens??u.total_tokens)>0).length,streak_days:lN({dailyRows:i,to:s.to})}}function EN({from:e,to:t,seed:a}={}){const o=Ks({from:e,to:t,seed:a}),s=Vh(o),c=[{source:"codex",weight:.6,models:[{model:"gpt-5.2-codex",model_id:"gpt-5.2-codex",weight:.2},{model:"unknown",model_id:"unknown",weight:.8}]},{source:"claude",weight:.2,models:[{model:"claude-3.5",model_id:"claude-3.5",weight:.3},{model:"unknown",model_id:"unknown",weight:.7}]},{source:"claude-science",weight:.12,models:[{model:"claude-opus-4",model_id:"claude-opus-4",weight:1}]},{source:"every-code",weight:.08,models:[{model:"unknown",model_id:"unknown",weight:1}]}].map(u=>{const m=dy(s,u.weight),f=u.models.map(g=>{const b=dy(m,g.weight);return{model:g.model,model_id:g.model_id||g.model,totals:$m(b)}});return{source:u.source,totals:$m(m),models:f}});return{from:e,to:t,days:o.length,sources:c,pricing:{model:"mock",pricing_mode:"add",source:"mock",effective_from:Ga(new Date),rates_per_million_usd:{input:"1.750000",cached_input:"0.175000",output:"14.000000",reasoning_output:"14.000000"}}}}function AN({from:e,to:t,source:a="claude"}={}){if(a==="codex")return{from:e,to:t,source:"codex",scope:"supported",totals:{input_tokens:142e4,cached_input_tokens:588e4,cache_creation_input_tokens:92e4,output_tokens:256e4,reasoning_output_tokens:61e4,total_tokens:1078e4},session_count:188,message_count:5436,tool_calls_breakdown:{categories:[{name:"Execution",calls:742,totals:{input_tokens:32e4,cached_input_tokens:104e4,cache_creation_input_tokens:11e4,output_tokens:46e4,reasoning_output_tokens:12e4,total_tokens:193e4},tools:[{name:"exec_command",calls:510,totals:{input_tokens:25e4,cached_input_tokens:82e4,cache_creation_input_tokens:8e4,output_tokens:37e4,reasoning_output_tokens:9e4,total_tokens:152e4}},{name:"write_stdin",calls:232,totals:{input_tokens:7e4,cached_input_tokens:22e4,cache_creation_input_tokens:3e4,output_tokens:9e4,reasoning_output_tokens:3e4,total_tokens:41e4}}]},{name:"Browser",calls:406,totals:{input_tokens:21e4,cached_input_tokens:88e4,cache_creation_input_tokens:9e4,output_tokens:42e4,reasoning_output_tokens:1e5,total_tokens:17e5},tools:[{name:"take_snapshot",calls:180,totals:{input_tokens:1e5,cached_input_tokens:4e5,cache_creation_input_tokens:4e4,output_tokens:18e4,reasoning_output_tokens:4e4,total_tokens:76e4}},{name:"click",calls:126,totals:{input_tokens:6e4,cached_input_tokens:25e4,cache_creation_input_tokens:3e4,output_tokens:12e4,reasoning_output_tokens:35e3,total_tokens:495e3}},{name:"evaluate_script",calls:100,totals:{input_tokens:5e4,cached_input_tokens:23e4,cache_creation_input_tokens:2e4,output_tokens:12e4,reasoning_output_tokens:25e3,total_tokens:445e3}}]}],tools_total:363e4,privacy:{includes_inputs:!1,note:"Aggregated tool names only; no tool arguments or outputs are included."}},exec_command_breakdown:{by_type:[{name:"test",calls:168,failures:14,duration_ms:482e3,max_duration_ms:18400,output_chars:45e4,output_lines:8600,totals:{input_tokens:9e4,cached_input_tokens:32e4,output_tokens:16e4,reasoning_output_tokens:42e3,total_tokens:612e3}},{name:"build",calls:116,failures:9,duration_ms:392e3,max_duration_ms:22100,output_chars:31e4,output_lines:5200,totals:{input_tokens:7e4,cached_input_tokens:24e4,output_tokens:13e4,reasoning_output_tokens:3e4,total_tokens:47e4}}],by_exit:[{name:"completed:0",calls:438,failures:0,duration_ms:104e4,max_duration_ms:22100,output_chars:83e4,output_lines:13100,totals:{input_tokens:22e4,cached_input_tokens:78e4,output_tokens:35e4,reasoning_output_tokens:82e3,total_tokens:1432e3}},{name:"completed:1",calls:72,failures:72,duration_ms:155e3,max_duration_ms:11800,output_chars:12e4,output_lines:2300,totals:{input_tokens:3e4,cached_input_tokens:11e4,output_tokens:55e3,reasoning_output_tokens:8e3,total_tokens:195e3}}]}};if(a!=="claude")return{from:e,to:t,source:a,scope:"unsupported",totals:{input_tokens:0,cached_input_tokens:0,cache_creation_input_tokens:0,output_tokens:0,reasoning_output_tokens:0,total_tokens:0},categories:["system_prefix","conversation_history","user_input","tool_calls","subagents","reasoning","assistant_response"].map(c=>({key:c,totals:{input_tokens:0,cached_input_tokens:0,cache_creation_input_tokens:0,output_tokens:0,reasoning_output_tokens:0,total_tokens:0},percent:0})),session_count:0,message_count:0};const o=[{key:"system_prefix",total:12896539},{key:"conversation_history",total:320207200},{key:"user_input",total:998025},{key:"tool_calls",total:4808739},{key:"subagents",total:1022828},{key:"reasoning",total:11073118},{key:"assistant_response",total:1289174}],s=o.reduce((c,u)=>c+u.total,0),i=o.map(({key:c,total:u})=>({key:c,totals:{input_tokens:c==="user_input"?u:0,cached_input_tokens:c==="conversation_history"?Math.round(u*.95):0,cache_creation_input_tokens:c==="system_prefix"?u:c==="conversation_history"?Math.round(u*.05):0,output_tokens:["tool_calls","subagents","reasoning","assistant_response"].includes(c)?u:0,reasoning_output_tokens:c==="reasoning"?u:0,total_tokens:u},percent:Number((u/s*100).toFixed(2))}));return{from:e,to:t,source:"claude",scope:"supported",totals:{input_tokens:998025,cached_input_tokens:Math.round(320207200*.95),cache_creation_input_tokens:12896539+Math.round(320207200*.05),output_tokens:18193859,reasoning_output_tokens:11073118,total_tokens:s},categories:i,session_count:312,message_count:12046}}let ld=null;function qm(){ld=null}async function PN(e=fetch){if(ld)return ld;const t=await e("/api/local-auth",{method:"GET",headers:{Accept:"application/json"},cache:"no-store"});if(!t.ok)throw new Error(`Local auth request failed with HTTP ${t.status}`);const a=await t.json().catch(()=>null),o=typeof a?.token=="string"?a.token.trim():"";if(!o)throw new Error("Local auth token missing from response");return ld=o,o}async function Pl(e=fetch){return{"x-tokentracker-local-auth":await PN(e)}}const Tw=Object.freeze(Object.defineProperty({__proto__:null,clearLocalApiAuthToken:qm,getLocalApiAuthHeaders:Pl},Symbol.toStringTag,{value:"Module"}));function RN(e){const t=new Date(`${e}T00:00:00Z`);return t.setUTCDate(t.getUTCDate()+1),t.toISOString().slice(0,10)}const om=/^\d{4}-\d{2}-\d{2}$/,IN=735;function Ew(e){if(!e||typeof e!="object"||e.format!=="compact"||!Array.isArray(e.days)||!Array.isArray(e.model_names)||!om.test(String(e.from))||!om.test(String(e.to)))return e;const t=e.model_names,a=new Map;for(const f of e.days){if(!Array.isArray(f))continue;const[g,b,w]=f;if(!om.test(String(g)))continue;const x={};if(Array.isArray(w))for(let S=0;S+1<w.length;S+=2){const E=t[w[S]];typeof E=="string"&&(x[E]=Number(w[S+1])||0)}a.set(String(g),{total:Number(b)||0,models:x})}const o=Number(e.max_value)||0,s=f=>{if(f<=0)return 0;if(o===0)return 1;const g=f/o;return g<=.25?1:g<=.5?2:g<=.75?3:4},i=[],c=String(e.to);let u=String(e.from);for(;u<=c&&i.length<IN;){const f=a.get(u),g=f?f.total:0;i.push({day:u,total_tokens:g,billable_total_tokens:g,level:s(g),models:f?f.models:null}),u=RN(u)}const m=[];for(let f=0;f<i.length;f+=7)m.push(i.slice(f,f+7));return{from:e.from,to:e.to,week_starts_on:e.week_starts_on,active_days:e.active_days,streak_days:e.streak_days,weeks:m}}const fy=10080*60*1e3,NN=600*1e3,DN=1440*60*1e3,Aw=new Set(["sync","view","history","devices"]),ON=new Set(["cloud_membership_required","cloud_read_only_expired","cloud_history_window_exceeded","cloud_machine_limit","machine_limit_exceeded","cloud_machine_paused"]),Kn=new Map,el=new Set,Pw=new Map,tl=new WeakMap;let Ad=null,Rw=0;function gn(e){return`${encodeURIComponent(Wt()||"unconfigured")}.${e}`}function cr(){Rw+=1;for(const e of el)e()}function LN(e){return el.size===0&&typeof window<"u"&&window.addEventListener("storage",gy),el.add(e),()=>{el.delete(e),el.size===0&&typeof window<"u"&&window.removeEventListener("storage",gy)}}function gy(e){e.key?.startsWith("tt.cloud.prompt.")&&e.key!=="tt.cloud.prompt.storage-check"&&cr()}function MN(){return Rw}function zN(){Kn.clear(),Ad=null,cr()}function Iw(e){const t=Ad?.baseUrl===Wt()?Ad:null;return{...Kn.get(gn(e)),catalog:t?.value,catalogObservedAt:t?.at}}function Nw(e){try{const t=JSON.parse(atob(String(e).split(".")[1].replace(/-/g,"+").replace(/_/g,"/")));return typeof t.sub=="string"&&t.sub.length<=128?t.sub:null}catch{return null}}function Gc(e,t,a,o=Date.now()){if(e==="catalog"){Ad={value:t,at:o,baseUrl:Wt()},cr();return}if(!a||!t?.membership)return;const s=Kn.get(gn(a))||{};Kn.set(gn(a),{...s,membership:t.membership,subscriptions:t.subscriptions||s.subscriptions,paymentConflict:"conflict_orders"in t||"pending_orders"in t?[...t.conflict_orders||[],...t.pending_orders||[]].some(i=>i.retry_payment_conflict_at):!!(t.order?.retry_payment_conflict_at||s.paymentConflict),failure:t.membership.can_read_cloud&&t.membership.can_upload_cloud&&s.membership?.status!==t.membership.status?null:s.failure}),cr()}function z3(e,t){if(!e||!Aw.has(t))return;const a=Kn.get(gn(e))||{};Kn.set(gn(e),{...a,intent:t,failure:null}),cr()}function sm(e){Kn.has(gn(e))&&(Kn.set(gn(e),{...Kn.get(gn(e)),intent:null,failure:null}),cr())}function jN(e,t,a,o){if(!e||!ON.has(t))return;const s=Kn.get(gn(e))||{};Kn.set(gn(e),{...s,membership:a||s.membership,failure:{code:t,source:o}}),cr()}function UN(e,t){const a=Kn.get(gn(e));a?.failure?.source===t&&(Kn.set(gn(e),{...a,failure:null}),cr())}function Yh(){try{return typeof window>"u"?null:window.localStorage}catch{return null}}function Dw(e,t){const a=Pw.get(gn(e))||{scenes:{}};try{if(!t)return{...a,usable:!1};if(!tl.has(t))try{t.setItem("tt.cloud.prompt.storage-check","1"),t.removeItem("tt.cloud.prompt.storage-check"),tl.set(t,!0)}catch{tl.set(t,!1)}if(!tl.get(t))return{...a,usable:!1};const o=t.getItem(`tt.cloud.prompt.${gn(e)}`);if(!o)return{...a,usable:!0};const s=JSON.parse(o);if(s.version!==1||!s.scenes||typeof s.scenes!="object")return{...a,usable:!1};const i={...s.scenes};for(const[c,u]of Object.entries(a.scenes))i[c]=Math.max(Number(i[c])||0,Number(u)||0);return{...s,globalUntil:Math.max(s.globalUntil||0,a.globalUntil||0),scenes:i,usable:!0}}catch{return{...a,usable:!1}}}function HN(e,t,a=Date.now(),o=Yh()){if(!e||!t)return;const s=Dw(e,o),i={version:1,globalUntil:a+fy,scenes:{...s.scenes,[t]:a+fy}};Pw.set(gn(e),i);try{o?.setItem(`tt.cloud.prompt.${gn(e)}`,JSON.stringify(i))}catch{o&&tl.set(o,!1)}cr()}function cd(e,t,a,o,s){const i=Dw(e,s);return{usable:i.usable,hidden:Number(i.scenes[t])>o||a&&Number(i.globalUntil)>o}}function FN(e,t,a){const o=Date.parse(e?.policy?.launch_at||"");return e?.environment==="live"&&e?.policy?.phase==="active"&&Number.isFinite(o)&&o<=a&&e?.providers?.waffo===!0&&e.checkout_verified===!0&&Number.isFinite(t)&&a>=t&&a-t<=NN}function _y({userId:e,intentional:t=!1,scene:a,membership:o,failure:s,subscriptions:i=[],catalog:c,catalogObservedAt:u,paymentConflict:m=!1,now:f=Date.now(),storage:g=Yh()}){if(!e||!t||!Aw.has(a)||m||o?.status==="self_hosted"||o?.hosting_mode==="self_hosted"||c?.policy?.hosting_mode==="self_hosted")return null;const b=s?.code,w=["cloud_machine_limit","machine_limit_exceeded","cloud_machine_paused"].includes(b),x=b==="cloud_history_window_exceeded",S=w?"devices":x?"history":a,E=o?.can_read_cloud||o?.can_upload_cloud,C=o?.status==="active",U=w||x||["cloud_membership_required","cloud_read_only_expired"].includes(b);if(o&&!o.can_upload_cloud&&(a==="sync"||U)&&i.some(D=>["active","trialing","past_due","paused"].includes(D.status)&&!D.cancel_at_period_end))return cd(e,S,!1,f,g).hidden?null:{scene:S,kind:"operation",bodyKey:"cloud.prompt.billing_recovery",ctaKey:"cloud.action.view_bills",href:"/settings?section=cloud"};if(C||E&&a!=="sync"||w&&!o)return!w&&!x||cd(e,S,!1,f,g).hidden?null:{scene:S,kind:"operation",bodyKey:w?"cloud.prompt.devices_manage":"cloud.prompt.history_window",ctaKey:"cloud.action.manage_membership",href:"/settings?section=cloud"};if(o?.can_upload_cloud||a!=="sync"&&!U)return null;const L=cd(e,S,!0,f,g);if(L.hidden)return null;const M=L.usable&&o?.environment==="live"&&o?.phase==="active"&&FN(c,u,f);return{scene:S,kind:M?"promotion":"explanation",bodyKey:M?`cloud.prompt.${S}`:"cloud.prompt.unconfirmed",ctaKey:M?o?.trial_available?"cloud.prompt.try":"cloud.action.view_plans":"cloud.prompt.learn",href:M&&o?.trial_available?"/billing/checkout?intent=trial":"/cloud"}}function BN({userId:e,membership:t,subscriptions:a=[],now:o=Date.now(),storage:s=Yh()}){if(!e||!t)return null;const i=t.status;if(!["active","trial","transition"].includes(i)||i==="active"&&a.some(b=>["active","trialing"].includes(b.status)&&!b.cancel_at_period_end))return null;const c=i==="trial"?t.trial_ends_at:i==="transition"?t.transition_ends_at:t.expires_at,u=Date.parse(c||"")-o;if(!Number.isFinite(u)||u<=0||u>(i==="trial"?2:7)*DN)return null;const f=i==="active"&&t.access_source==="gift"?"deadline_gift":`deadline_${i}`,g=cd(e,f,!1,o,s);return g.hidden||!g.usable?null:{scene:f,kind:"deadline",bodyKey:`cloud.prompt.${f}`,date:c}}const $c=new Map,Co=new Map,GN=12e4,$N=3e5,qN=5*6e4,To=new Map,KN=5*6e4,VN=15*6e4,Ps=new Set;let dd=0;function Ms(e,t){if(!(e===Wt()&&t===Uo()))throw Object.assign(new Error("instance_changed"),{code:"instance_changed",status:409})}function Km(e){try{const t=JSON.parse(atob(e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/")));if(typeof t.exp=="number"&&t.exp*1e3<=Date.now()){const a=new Error("Account session expired");throw a.status=401,a}if(typeof t.sub=="string"&&t.sub)return t.sub}catch(t){if(t?.status===401)throw Zr(),t}return e}function Zh(e,t){const a=$c.get(e);if(a)return a;const o=t();$c.set(e,o);const s=()=>{$c.get(e)===o&&$c.delete(e)};return o.then(s,s),o}function Ow(e,t,a){const o=new URLSearchParams(e.searchParams);o.sort();const s=Uo(),i=Wt(),c=`${e.origin}${e.pathname}?${o}\0${Km(t)}\0${s}`,u=dd,m=Date.now(),f=Co.get(c),g=e.pathname.endsWith("tokentracker-account-summary")?GN:$N,b=`${e.origin}\0${t}\0${s}`,w=Ps.has(b);return w&&f&&m-f.fetchedAt<g?Promise.resolve(structuredClone(f.value)).then(x=>(Ms(i,s),x)):Zh(`${c}\0${u}\0${w?"verified":t}`,async()=>{try{const x=await a();if(Ms(i,s),u!==dd)return x;if(Ps.add(b),Ps.size>128&&Ps.delete(Ps.values().next().value),Co.set(c,{fetchedAt:Date.now(),value:structuredClone(x)}),Co.size>64){const S=Co.keys().next().value;S&&Co.delete(S)}return x}catch(x){Ms(i,s);const S=Number(x?.status)||0;if(S===401||S===403)throw Zr(),x;const E=Co.get(c);if(w&&u===dd&&E&&Date.now()-E.fetchedAt<qN&&(S===0||S>=500))return structuredClone(E.value);throw x}})}function Zr(){dd+=1,Co.clear(),Ps.clear()}function j3(){To.clear()}const bn={usageSummary:"tokentracker-usage-summary",usageDaily:"tokentracker-usage-daily",usageHourly:"tokentracker-usage-hourly",usageMonthly:"tokentracker-usage-monthly",usageHeatmap:"tokentracker-usage-heatmap",usageModelBreakdown:"tokentracker-usage-model-breakdown",usageCategoryBreakdown:"tokentracker-usage-category-breakdown",projectUsageSummary:"tokentracker-project-usage-summary",projectUsageDetail:"tokentracker-project-usage-detail",achievements:"tokentracker-achievements",userStatus:"tokentracker-user-status",localSync:"tokentracker-local-sync",usageLimits:"tokentracker-usage-limits",outcomes:"tokentracker-outcomes",sessionInsights:"tokentracker-session-insights",contextHealth:"tokentracker-context-health"},WN={"tokentracker-usage-summary":"tokentracker-account-summary","tokentracker-usage-daily":"tokentracker-account-daily","tokentracker-usage-hourly":"tokentracker-account-hourly","tokentracker-usage-monthly":"tokentracker-account-monthly","tokentracker-usage-heatmap":"tokentracker-account-heatmap","tokentracker-usage-model-breakdown":"tokentracker-account-model-breakdown"};function Vm(){return typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1")}async function Pn(e,t,a){const o=a?.accessToken,s=WN[e];if(!Vm()&&o&&s){const m=Wt().replace(/\/$/,""),f=new URL(El(m,s));if(t)for(const[w,x]of Object.entries(t))x!=null&&x!==""&&f.searchParams.set(w,String(x));s==="tokentracker-account-heatmap"&&f.searchParams.set("format","compact");const g={Accept:"application/json"},b=Uo();return b&&(g.apikey=b),Al(o)&&(g.Authorization=`Bearer ${o}`),Ow(f,o,async()=>{const w=await Yd(f.toString(),{headers:g,cache:"no-store"});if(!w.ok){const S=new Error(`Request failed with HTTP ${w.status}`);throw S.status=w.status,S}const x=await w.json();return s==="tokentracker-account-heatmap"?Ew(x):x})}if(!Vm()){const m=new Error("Local API is unavailable on this host");throw m.status=404,m.code="LOCAL_API_UNAVAILABLE",m}const i=new URL(`/functions/${e}`,window.location.origin);if(t)for(const[m,f]of Object.entries(t))f!=null&&f!==""&&i.searchParams.set(m,String(f));const{accessToken:c,...u}=a||{};return Zh(i.toString(),async()=>{const m=await fetch(i.toString(),{headers:{Accept:"application/json"},cache:"no-store",...u});if(!m.ok){const f=new Error(`Request failed with HTTP ${m.status}`);throw f.status=m.status,f}return m.json()})}function tn({timeZone:e,tzOffsetMinutes:t}={}){const a={},o=typeof e=="string"?e.trim():"";return o&&(a.tz=o),Number.isFinite(t)&&(a.tz_offset_minutes=String(Math.trunc(t))),a}function jn({source:e,model:t,device:a}={}){const o={},s=typeof e=="string"?e.trim().toLowerCase():"";s&&(o.source=s);const i=typeof t=="string"?t.trim():"";i&&(o.model=i);const c=typeof a=="string"?a.trim():"";return c&&(o.device_id=c),o}async function U3({from:e,to:t,source:a,model:o,device:s,timeZone:i,tzOffsetMinutes:c,rolling:u=!1,accessToken:m}={}){if(Ot())return vN({from:e,to:t,seed:m,rolling:u});const f=tn({timeZone:i,tzOffsetMinutes:c}),g=jn({source:a,model:o,device:s}),b=u?{rolling:"1"}:{};return Pn(bn.usageSummary,{from:e,to:t,...g,...f,...b},{accessToken:m})}async function H3({from:e,to:t,source:a,limit:o,timeZone:s,tzOffsetMinutes:i,accessToken:c}={}){if(Ot())return xN({seed:c,limit:o});const u=tn({timeZone:s,tzOffsetMinutes:i}),f={...jn({source:a}),...u};return e&&(f.from=e),t&&(f.to=t),o!=null&&(f.limit=String(o)),Pn(bn.projectUsageSummary,f)}async function F3({projectKey:e,from:t,to:a,timeZone:o,tzOffsetMinutes:s}={}){if(Ot())return SN({projectKey:e,from:t,to:a});const i=tn({timeZone:o,tzOffsetMinutes:s}),c={project_key:e,...i};return t&&(c.from=t),a&&(c.to=a),Pn(bn.projectUsageDetail,c)}async function B3({timeZone:e,tzOffsetMinutes:t}={}){return Ot()?Wh():Pn(bn.achievements,tn({timeZone:e,tzOffsetMinutes:t}))}async function mr(e,t={}){const a=Wt();if(!a)throw new Error("InsForge base URL not configured");const o=a.replace(/\/$/,""),s=new URL(El(o,e));if(t.params)for(const[f,g]of Object.entries(t.params))g!=null&&g!==""&&s.searchParams.set(f,String(g));const i={Accept:"application/json","Content-Type":"application/json"},c=Uo();c&&(i.apikey=c),t.accessToken&&Al(t.accessToken)&&(i.Authorization=`Bearer ${t.accessToken}`);const u=await Yd(s.toString(),{method:t.method||"GET",headers:i,cache:t.cache,...t.body!=null?{body:JSON.stringify(t.body)}:{}});if(Ms(a,c),!u.ok){const f=new Error(`Request failed with HTTP ${u.status}`);throw f.status=u.status,f}const m=await u.json();return Ms(a,c),m}async function YN({accessToken:e,userId:t,period:a,metric:o,limit:s,offset:i}={}){return Ot()?Cw({seed:e||t,period:a,metric:o,limit:s,offset:i}):mr("tokentracker-leaderboard",{cache:"no-store",params:{period:a,limit:s,offset:i,user_id:t}})}async function G3(){return Ot()?{top_models:[]}:mr("tokentracker-community-models",{})}async function by({accessToken:e}={}){return mr("tokentracker-public-visibility",{accessToken:e,method:"GET"})}async function $3({accessToken:e,enabled:t,anonymous:a,display_name:o,github_url:s,show_github_url:i}={}){const c={};return t!==void 0&&(c.enabled=!!t),a!==void 0&&(c.anonymous=!!a),o!==void 0&&(c.display_name=String(o)),s!==void 0&&(c.github_url=s===null?null:String(s)),i!==void 0&&(c.show_github_url=!!i),mr("tokentracker-public-visibility",{accessToken:e,method:"POST",body:c})}async function q3({accessToken:e,userId:t,period:a,timeZone:o,tzOffsetMinutes:s}={}){if(Ot()){const c=Cw({seed:e,period:a,metric:"all",limit:250,offset:0}),u=Array.isArray(c?.entries)?c.entries:[],m=u.find(x=>x?.user_id===t)||u[0]||null,f=Number(m?.total_tokens)||0,g=new Date,b=Array.from({length:365}).map((x,S)=>{const E=new Date(g);return E.setUTCDate(E.getUTCDate()-(364-S)),{date:E.toISOString().slice(0,10),total_tokens:S%7===0?Math.floor(f/365):0}}),w=b.slice(-7);return{user:{user_id:t,display_name:m?.display_name||"Mock User",avatar_url:m?.avatar_url||null,github_url:m?.github_url||null,is_anonymous:!1,rank:m?.rank??null},period:{kind:a||"week",from:c?.from??null,to:c?.to??null,generated_at:c?.generated_at??new Date().toISOString()},totals:{total_tokens:f,estimated_cost_usd:Number(m?.estimated_cost_usd)||0,active_days:53,avg_per_day_usd:0},streak:{current_days:3,longest_days:12},best_day:f?{date:g.toISOString().slice(0,10),total_tokens:Math.floor(f/30),estimated_cost_usd:0}:null,models:{count:5,favorite:{model_name:"claude-opus-4-7",total_tokens:Math.floor(f/2)}},by_provider:[],heatmap:b,daily_trend:w,badges:Wh().achievements.filter(x=>x.tier>=1&&!["project_hopper","project_devotion","night_owl"].includes(x.id)),badges_include_unearned:!1}}const i=tn({timeZone:o,tzOffsetMinutes:s});return mr("tokentracker-leaderboard-profile",{accessToken:e,params:{user_id:t,period:a,...i}})}async function K3({accessToken:e,userId:t}={}){return Ot()?{badges:Wh().achievements.filter(a=>!["project_hopper","project_devotion","night_owl"].includes(a.id)),badges_include_unearned:!0}:mr("tokentracker-leaderboard-profile",{accessToken:e,method:"GET",params:{user_id:t,view:"badges"}})}function Lw(e){if(!e)return 0;let t=0;for(let a=0;a<e.length;a++)t=e.charCodeAt(a)+((t<<5)-t);return Math.abs(t%165)+24}async function V3({userId:e,anonId:t,accessToken:a}={}){return Ot()?{count:Lw(e),liked:!1}:mr("tokentracker-profile-likes",{accessToken:a,params:{target_user_id:e,anon_id:t}})}async function W3({userId:e,action:t,anonId:a,accessToken:o}={}){if(Ot()){const s=t==="like";return{count:Math.max(0,Lw(e)+(s?1:0)),liked:s}}return mr("tokentracker-profile-likes",{accessToken:o,method:"POST",body:{target_user_id:e,action:t,anon_id:a}})}async function Y3(e={}){if(Ot()){const t=new Date().toISOString();return{user_id:"local-user",created_at:t,pro:{active:!1,sources:[],expires_at:null,partial:!1,as_of:t},subscriptions:{partial:!1,as_of:t,items:[]},install:{partial:!1,as_of:t,has_active_device_token:!1,has_active_device:!1,active_device_tokens:0,active_devices:0,latest_token_activity_at:null,latest_device_seen_at:null}}}return Pn(bn.userStatus)}async function Z3({signal:e,auto:t=!1,background:a=!1,allLocalSources:o=!1,drain:s=!1}={}){const i=await Pl(),c={};s?c.drain=!0:t&&(c.auto=!0,a&&(c.background=!0,o&&(c.allLocalSources=!0)));const u=await fetch(`/functions/${bn.localSync}`,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json",...i},body:JSON.stringify(c),cache:"no-store",signal:e}),m=await u.json().catch(()=>({ok:!1,error:`Local sync request failed with HTTP ${u.status}`}));if(!u.ok||m?.ok===!1){const f=m?.error||m?.message||`Local sync request failed with HTTP ${u.status}`,g=new Error(f);throw g.status=u.status,g}return m}async function Q3({from:e,to:t,source:a,device:o,timeZone:s,tzOffsetMinutes:i,accessToken:c}={}){if(Ot())return EN({from:e,to:t,seed:c});const u=tn({timeZone:s,tzOffsetMinutes:i}),m=jn({source:a,device:o});return Pn(bn.usageModelBreakdown,{from:e,to:t,...m,...u},{accessToken:c})}async function J3({from:e,to:t,source:a,device:o,accessToken:s}={}){if(Ot())return{available:!1,by_model:[],by_tool:[],totals:null};const i=jn({source:a,device:o});return Pn(bn.outcomes,{from:e,to:t,...i},{accessToken:s})}async function X3({from:e,to:t,refresh:a=!1}={}){if(Ot())return{available:!1,sessions:[],by_model:[],subagents:[]};const o=`${e||""}\0${t||""}`,s=To.get(o);return!a&&s&&Date.now()-s.fetchedAt<KN?s.value:Zh(`session-insights:${o}:${a?"refresh":"normal"}`,async()=>{try{const i=await Pn(bn.sessionInsights,{from:e,to:t,refresh:a?"1":""});if(To.set(o,{fetchedAt:Date.now(),value:i}),To.size>32){const c=To.keys().next().value;c&&To.delete(c)}return i}catch(i){const c=To.get(o);if(c&&Date.now()-c.fetchedAt<VN&&!a)return c.value;throw i}})}async function ej(){return Ot()?{estimated_fixed_tokens:0,severity:"low",breakdown:{},largest_items:[]}:Pn(bn.contextHealth)}async function tj({from:e,to:t,source:a="claude",timeZone:o,tzOffsetMinutes:s}={}){if(Ot())return AN({from:e,to:t,source:a});const i=tn({timeZone:o,tzOffsetMinutes:s});return Pn(bn.usageCategoryBreakdown,{from:e,to:t,source:a,...i})}async function nj({from:e,to:t,source:a,model:o,device:s,timeZone:i,tzOffsetMinutes:c,accessToken:u}={}){if(Ot())return bN({from:e,to:t,seed:u});const m=tn({timeZone:i,tzOffsetMinutes:c}),f=jn({source:a,model:o,device:s});return Pn(bn.usageDaily,{from:e,to:t,...f,...m},{accessToken:u})}async function aj({day:e,source:t,model:a,device:o,timeZone:s,tzOffsetMinutes:i,accessToken:c}={}){if(Ot())return yN({day:e,seed:c});const u=tn({timeZone:s,tzOffsetMinutes:i}),m=jn({source:t,model:a,device:o}),f=e?{day:e,...m,...u}:{...m,...u};return Pn(bn.usageHourly,f,{accessToken:c})}async function rj({months:e,to:t,source:a,model:o,device:s,timeZone:i,tzOffsetMinutes:c,accessToken:u}={}){if(Ot())return kN({months:e,to:t,seed:u});const m=tn({timeZone:i,tzOffsetMinutes:c}),f=jn({source:a,model:o,device:s});return Pn(bn.usageMonthly,{...e?{months:String(e)}:{},...t?{to:t}:{},...f,...m},{accessToken:u})}async function oj(e={}){const t=e?.refresh?{refresh:"1"}:{},a={};return e?.devinEnabled===!0&&Vm()&&(t.devin="1",a.headers={Accept:"application/json",...await Pl()}),Pn(bn.usageLimits,t,a)}async function sj({weeks:e,to:t,weekStartsOn:a,source:o,model:s,device:i,timeZone:c,tzOffsetMinutes:u,accessToken:m}={}){if(Ot())return TN({weeks:e,to:t,weekStartsOn:a,seed:m});const f=tn({timeZone:c,tzOffsetMinutes:u}),g=jn({source:o,model:s,device:i});return Pn(bn.usageHeatmap,{weeks:String(e),to:t,week_starts_on:a,...g,...f},{accessToken:m})}const dr={summary:"tokentracker-account-summary",daily:"tokentracker-account-daily",hourly:"tokentracker-account-hourly",monthly:"tokentracker-account-monthly",heatmap:"tokentracker-account-heatmap",modelBreakdown:"tokentracker-account-model-breakdown",devices:"tokentracker-account-devices"};async function qo(e,t,a){const o=Wt(),s=Uo(),i=()=>{Ms(o,s)},c=typeof a=="string"?a.trim():await Bh(a);if(i(),!c||!Al(c)){const b=new Error("Account view requires a signed-in user");throw b.status=401,b}if(!o){const b=new Error("InsForge base URL not configured");throw b.status=0,b}const u=o.replace(/\/$/,""),m=new URL(El(u,e));if(t)for(const[b,w]of Object.entries(t))w!=null&&w!==""&&m.searchParams.set(b,String(w));e===dr.heatmap&&m.searchParams.set("format","compact");const f={Accept:"application/json",Authorization:`Bearer ${c}`};s&&(f.apikey=s);const g=await Ow(m,c,async()=>{i();const b=await Yd(m.toString(),{method:"GET",headers:f,cache:"no-store"});if(i(),!b.ok){const x=new Error(`Request failed with HTTP ${b.status}`);x.status=b.status;const S=await b.json().catch(()=>null);throw i(),typeof S?.code=="string"&&(x.code=S.code,o===Wt()&&jN(Km(c),S.code,S.membership,e)),x}const w=await b.json();return i(),o===Wt()&&UN(Km(c),e),e===dr.heatmap?Ew(w):w});return i(),g}async function ij({from:e,to:t,source:a,model:o,device:s,timeZone:i,tzOffsetMinutes:c,rolling:u=!1,accessToken:m}={}){const f=tn({timeZone:i,tzOffsetMinutes:c}),g=jn({source:a,model:o,device:s}),b=u?{rolling:"1"}:{};return qo(dr.summary,{from:e,to:t,...g,...f,...b},m)}async function lj({from:e,to:t,source:a,model:o,device:s,timeZone:i,tzOffsetMinutes:c,accessToken:u}={}){const m=tn({timeZone:i,tzOffsetMinutes:c}),f=jn({source:a,model:o,device:s});return qo(dr.daily,{from:e,to:t,...f,...m},u)}async function cj({day:e,source:t,model:a,device:o,timeZone:s,tzOffsetMinutes:i,accessToken:c}={}){const u=tn({timeZone:s,tzOffsetMinutes:i}),m=jn({source:t,model:a,device:o}),f=e?{day:e,...m,...u}:{...m,...u};return qo(dr.hourly,f,c)}async function dj({months:e,to:t,source:a,model:o,device:s,timeZone:i,tzOffsetMinutes:c,accessToken:u}={}){const m=tn({timeZone:i,tzOffsetMinutes:c}),f=jn({source:a,model:o,device:s});return qo(dr.monthly,{...e?{months:String(e)}:{},...t?{to:t}:{},...f,...m},u)}async function uj({weeks:e,to:t,weekStartsOn:a,source:o,model:s,device:i,timeZone:c,tzOffsetMinutes:u,accessToken:m}={}){const f=tn({timeZone:c,tzOffsetMinutes:u}),g=jn({source:o,model:s,device:i});return qo(dr.heatmap,{weeks:String(e),to:t,week_starts_on:a,...g,...f},m)}async function pj({from:e,to:t,source:a,device:o,timeZone:s,tzOffsetMinutes:i,accessToken:c}={}){const u=tn({timeZone:s,tzOffsetMinutes:i}),m=jn({source:a,device:o});return qo(dr.modelBreakdown,{from:e,to:t,...m,...u},c)}async function mj({from:e,to:t,timeZone:a,tzOffsetMinutes:o,accessToken:s}={}){const i=tn({timeZone:a,tzOffsetMinutes:o});return qo(dr.devices,{from:e,to:t,...i},s)}async function hj({deviceId:e,name:t,accessToken:a}={}){if(!a||!Al(a)){const s=new Error("Account view requires a signed-in user");throw s.status=401,s}const o=await mr("tokentracker-device-rename",{accessToken:a,method:"POST",body:{device_id:e,device_name:t}});return Zr(),o}const yy={"header.auth.sign_in_aria":"Sign in","login.back_home":"Back to home","login.cloud_only":"Cloud sign-in is not configured. Use the local dashboard on localhost.","login.title":"Sign in","login.subtitle":"Choose email or a connected account.","login.dismiss":"Dismiss","login.verify_email_success":"Email verified. You can sign in below.","login.verify_email_pending":"Check your email to verify your account, then sign in.","login.oauth.continue":"Continue with {{provider}}","login.oauth.desktop_start_failed":"Could not start desktop sign-in. Please try again.","login.divider":"Or","login.tab.sign_in":"Sign in","login.tab.sign_up":"Create account","login.field.name":"Display name","login.field.name_placeholder":"Optional","login.field.email":"Email","login.field.password":"Password","login.forgot_password":"Forgot password?","login.password_hint":"At least {{min}} characters.","login.submit.sign_in":"Sign in with email","login.submit.sign_up":"Create account","reset_password.back_to_sign_in":"Back to sign in","reset_password.title":"Reset password","reset_password.subtitle":"Enter your email to receive a reset link.","reset_password.request.submit":"Send reset link","reset_password.request.sent":"Check email for reset link & code.","reset_password.field.code":"Reset code","reset_password.field.new_password":"New password","reset_password.field.confirm_password":"Confirm password","reset_password.reset.submit":"Reset password","reset_password.error.password_mismatch":"Passwords do not match.","reset_password.error.missing_token":"Reset token is missing. Request a new reset link.","reset_password.success":"Password updated. You can sign in with the new password.","reset_password.success_cta":"Return to sign in","login_modal.subtitle":"Sign in to join the leaderboard","login_modal.continue_email":"Continue with Email","login_modal.divider_email":"email","shared.placeholder.short":"--","shared.unit.percent":"%","shared.unit.thousand_abbrev":"K","shared.unit.million_abbrev":"M","shared.unit.billion_abbrev":"B","shared.unit.trillion_abbrev":"T","shared.data_source":"Data source: {{source}}","shared.error.prefix":"Error: {{error}}","shared.status.unsynced":"—","error.boundary.title":"Something went wrong","error.boundary.subtitle":"This view failed to render","error.boundary.hint":"Open the console, then reload the page","error.boundary.no_details":"No error details","error.boundary.action.reload":"Reload","landing.screenshot.alt":"TokenTracker dashboard screenshot","landing.nav.login":"LOGIN","landing.nav.signup":"SIGN UP","landing.install.command":"npx --yes tokentracker-cli","landing.install.action.copy":"COPY COMMAND","landing.install.action.copied":"COPIED","landing.meta.title":"Token Tracker — AI Token Usage & Cost Tracker for Coding CLIs","landing.meta.description":"Free, open-source, local-first tracker that monitors AI token usage and cost across Claude Code, Codex, Cursor, Gemini and 27 CLIs. One-command install, privacy-first.","landing.meta.og_site_name":"Token Tracker","landing.meta.og_type":"website","landing.meta.og_image":"https://www.tokentracker.cc/dashboard-dark.png","landing.meta.og_url":"https://www.tokentracker.cc/","landing.meta.twitter_card":"summary_large_image","share.meta.title":"Token Tracker Share","share.meta.description":"Share a Token Tracker dashboard snapshot with token usage insights across models, projects, and time windows.","share.meta.og_site_name":"Token Tracker","share.meta.og_type":"website","share.meta.og_image":"https://www.tokentracker.cc/dashboard-dark.png","share.meta.og_url":"https://www.tokentracker.cc/share","share.meta.twitter_card":"summary_large_image","landing.cta.primary":"View Dashboard","landing.cta.secondary":"GitHub","landing.v2.hero.title_line1":"TRACK EVERY","landing.v2.hero.title_line2":"AI TOKEN","landing.v2.install.mac_cta":"Download for macOS","landing.v2.install.win_cta":"Download for Windows","landing.v2.install.desktop_cta":"Download desktop app","landing.v2.install.os_macos":"macOS","landing.v2.install.os_windows":"Windows","landing.v2.install.availability":"Available for macOS and Windows","landing.v2.models.title":"SUPPORTED AI CLI TOOLS","landing.v2.distill.body":"100% local processing. No prompts or code are ever collected.","landing.v2.footer.line":"Token Tracker — Made for everyone working with AI.","landing.v2.nav.status":"Status","landing.v2.nav.github":"GitHub","landing.v2.nav.privacy":"Privacy","landing.v2.cta.primary":"Dashboard","landing.v2.hero.subtagline":"Automatically monitor token usage across Claude Code, Cursor, Codex, and more. Local-first, privacy-focused, and zero manual configuration.","landing.v3.hero.kicker":"Desktop pet · 4 widgets · Achievements","landing.v3.hero.subtitle":"A living desktop companion powered by real activity from 27 AI coding tools — local-first, open source, and private by design.","landing.v3.hero.stat_label":"Tokens tracked by the community","landing.v3.hero.scroll_hint":"Scroll","landing.v3.stats.devs_syncing":"{{count}} users syncing","landing.v3.stats.fallback_tokens":"2200000000000","landing.v3.stats.fallback_devs":"600","landing.v3.tools.count":"{{count}}+ AI coding agents supported out of the box.","landing.v3.how.kicker":"How it works","landing.v3.how.title":"From keystroke to dashboard in milliseconds.","landing.v3.how.subtitle":"No proxies. No API keys to paste. TokenTracker reads the usage your CLI already writes — entirely on your machine.","landing.v3.how.step1.title":"You run your agent","landing.v3.how.step1.body":"Claude Code, Codex, Cursor, Gemini — keep working exactly the way you already do.","landing.v3.how.step2.title":"A hook captures usage","landing.v3.how.step2.body":"Every turn's token counts are parsed straight from the CLI's own local session logs.","landing.v3.how.step3.title":"Queued on your machine","landing.v3.how.step3.body":"Counts are normalized into an append-only queue under ~/.tokentracker. Nothing leaves your disk.","landing.v3.how.step4.title":"Rendered live","landing.v3.how.step4.body":"The local dashboard aggregates every agent, model and hour the moment it lands.","landing.v3.cap.kicker":"Everything in view","landing.v3.cap.title":"One dashboard for every agent.","landing.v3.cap.subtitle":"Spend, limits, rhythm and models — the full picture of your AI usage, aggregated locally in real time.","landing.v3.cap.limits.title":"Usage-limit radar","landing.v3.cap.limits.body":"Watch 5-hour, weekly and monthly windows across providers — before you hit the wall mid-task.","landing.v3.cap.heatmap.title":"365-day activity heatmap","landing.v3.cap.heatmap.body":"Your coding rhythm at a glance, GitHub-style — every hour bucketed on your machine.","landing.v3.cap.devices.title":"Every device, one picture","landing.v3.cap.devices.body":"Menu bar on macOS, tray on Windows, CLI everywhere — optionally synced into a single account view.","landing.v3.privacy.kicker":"Local-first","landing.v3.privacy.title":"Your prompts never leave your machine.","landing.v3.privacy.p1":"Token counts only","landing.v3.privacy.p2":"No prompts. No code.","landing.v3.privacy.p3":"Open source on GitHub","landing.v3.leaderboard.panel_title":"Community rankings (global)","landing.v3.leaderboard.live":"Live","landing.v3.leaderboard.anonymous":"Anonymous","landing.v3.leaderboard.tokens_synced":"{{count}} tokens synced","landing.v3.download.title":"Start tracking in 30 seconds.","landing.v3.download.subtitle":"One command or one download. Free, open source, yours.","identity_card.rank_label":"Started","identity_card.streak_label":"Active days","identity_card.rank_placeholder":"—","identity_card.streak_value":"{{days}} DAY","dashboard.core_index.collapse_label":"▾","dashboard.core_index.expand_label":"▸","dashboard.core_index.collapse_aria":"Collapse model breakdown","dashboard.core_index.expand_aria":"Expand model breakdown","usage.summary.total":"Total tokens","usage.summary.toggle_aria":"Toggle compact number format","usage.metric.total":"Total","usage.metric.input":"Input","usage.metric.output":"Output","usage.metric.cached_input":"Cached input","usage.metric.reasoning_output":"Reasoning output","usage.button.refresh":"Refresh","dashboard.rolling.title":"Recent Activity","dashboard.rolling.last_7d":"Last 7 days","dashboard.rolling.last_30d":"Last 30 days","dashboard.rolling.avg_active_day":"Daily average","dashboard.projects.title":"Project Usage","dashboard.projects.limit_aria":"Select project limit","dashboard.projects.limit_top_3":"TOP 3","dashboard.projects.limit_top_6":"TOP 6","dashboard.projects.limit_top_10":"TOP 10","dashboard.projects.empty":"No project usage yet. Run a supported CLI inside a git repository and its usage lands here.","dashboard.projects.sources_more":"+{{n}}","dashboard.projects.detail.badge":"Project","dashboard.projects.detail.close_aria":"Close project details","dashboard.projects.detail.error":"Failed to load project details","dashboard.projects.detail.empty_range":"No usage in the selected range","dashboard.projects.detail.stat_total":"Total tokens","dashboard.projects.detail.stat_conversations":"Conversations","dashboard.projects.detail.stat_active_days":"Active days","dashboard.projects.detail.stat_avg_day":"Avg / active day","dashboard.projects.detail.stat_cache_hit":"Cache hit rate","dashboard.projects.detail.stat_share":"Usage share","dashboard.projects.detail.section_trend":"Daily activity","dashboard.projects.detail.section_composition":"Token composition","dashboard.projects.detail.section_sources":"By source","dashboard.projects.detail.comp_input":"Input","dashboard.projects.detail.comp_cached":"Cached input","dashboard.projects.detail.comp_cache_write":"Cache write","dashboard.projects.detail.comp_output":"Output","dashboard.projects.detail.comp_reasoning":"Reasoning","dashboard.projects.detail.source_days":"{{n}}d","dashboard.projects.detail.source_conv":"{{n}} conv","dashboard.widgets.title":"Desktop Widgets","dashboard.widgets.hint":'Right-click your desktop → Edit Widgets → search "TokenTracker"',"dashboard.widgets.dismiss_aria":"Dismiss widget intro","dashboard.linux_topbar.title":"Track usage in your top bar","dashboard.linux_topbar.hint":"On GNOME, the TokenTracker extension puts today's tokens and spend next to Clawd in the top bar, with a dropdown for limits and trends.","dashboard.linux_topbar.setup":"Set up","dashboard.linux_topbar.dismiss_aria":"Dismiss top bar tip","dashboard.linux_topbar.preview_readout":"8.2M · $12.40","widgets.page.title":"Menu Bar & Widgets","widgets.cta.open_gallery":"Open Widget Gallery","widgets.cta.download":"Download Mac App","widgets.cta.macos_only":"macOS only","widgets.menubar.section.title":"Menu Bar","widgets.gallery.section.title":"Desktop Widgets","widgets.summary.name":"Usage Summary","widgets.summary.description":"Today and seven-day usage with a compact sparkline.","widgets.heatmap.name":"Activity Heatmap","widgets.heatmap.description":"GitHub-style daily calendar. Spot streaks and quiet days at a glance.","widgets.topModels.name":"Top Models","widgets.topModels.description":"Your heaviest-used models ranked by token share.","widgets.limits.name":"Usage Limits","widgets.limits.description":"Live rate-limit progress for Claude, Codex, Cursor, Gemini and more.","dashboard.cost_breakdown.title":"Cost Breakdown","dashboard.cost_breakdown.total_label":"Estimated Total Cost","dashboard.cost_breakdown.close":"Close","trend.monitor.label":"Usage Trend","trend.monitor.predicted":"Estimated","trend.zoom.open_aria":"Expand to full screen","trend.zoom.close_aria":"Close","trend.zoom.badge":"Trend Insight","trend.zoom.desc":"Hover any bar to inspect tokens, cost and conversations. Switch granularity to drill from months down to half-hours.","trend.zoom.insight_badge":"Insight","trend.zoom.tooltip.cost":"cost","trend.zoom.tooltip.conversations":"conversations","trend.zoom.stats.tokens":"Total Tokens","trend.zoom.stats.cost":"Total Cost","trend.zoom.stats.conversations":"Conversations","trend.zoom.stats.peak":"Peak Bucket","trend.zoom.gran.aria":"Granularity","trend.zoom.gran.30min":"30 min","trend.zoom.gran.day":"Day","trend.zoom.gran.month":"Month","trend.zoom.prev_day":"Previous day","trend.zoom.next_day":"Next day","trend.zoom.loading":"Loading…","trend.zoom.pick_day":"Pick a day","trend.zoom.pick_range":"Pick a date range","trend.zoom.insight.empty":"A quiet stretch. Not a single token crossed the wire.","trend.zoom.insight.calm":"Light touch. The model mostly sat on standby, waking only when you reached for it.","trend.zoom.insight.steady":"A steady rhythm across {{active}} active stretches, cresting at {{peak}}. The kind of pace that ships things without drama.","trend.zoom.insight.heavy":"Heavy lifting: {{active}} stretches running hot, peaking at {{peak}}. This is output from someone who manufactures momentum instead of waiting for it.","trend.zoom.insight.massive":"Industrial scale. A {{peak}} peak and throughput that never cools. At this volume you are not using the model, you are running a foundry.","heatmap.title":"Activity Heatmap","heatmap.empty":"No activity data yet.","heatmap.legend.less":"Less","heatmap.legend.more":"More","heatmap.legend.utc":"UTC","heatmap.tooltip":"{{day}} • {{value}} {{unit}} • {{tz}}","heatmap.unit.tokens":"tokens","heatmap.iso.aria":"3D isometric activity heatmap","heatmap.view.2d":"2D","heatmap.view.3d":"3D","heatmap.month.jan":"Jan","heatmap.month.feb":"Feb","heatmap.month.mar":"Mar","heatmap.month.apr":"Apr","heatmap.month.may":"May","heatmap.month.jun":"Jun","heatmap.month.jul":"Jul","heatmap.month.aug":"Aug","heatmap.month.sep":"Sep","heatmap.month.oct":"Oct","heatmap.month.nov":"Nov","heatmap.month.dec":"Dec","heatmap.day.sun":"Sun","heatmap.day.mon":"Mon","heatmap.day.tue":"Tue","heatmap.day.wed":"Wed","heatmap.day.thu":"Thu","heatmap.day.fri":"Fri","heatmap.day.sat":"Sat","daily.sort.date.label":"Date","daily.sort.date.title":"Sort by Date","daily.sort.total.label":"Total","daily.sort.total.title":"Sort by Total","daily.sort.input.label":"Input","daily.sort.input.title":"Sort by Input","daily.sort.output.label":"Output","daily.sort.output.title":"Sort by Output","daily.sort.cached.label":"Cached","daily.sort.cached.title":"Sort by Cached input","daily.sort.reasoning.label":"Reasoning","daily.sort.reasoning.title":"Sort by Reasoning output","daily.sort.conversations.label":"Convs","daily.sort.conversations.title":"Sort by Conversations","details.pagination.prev":"Prev","details.pagination.next":"Next","leaderboard.profile.nav.back":"Leaderboard","leaderboard.profile.nav.download":"Download","leaderboard.profile.hero.rank_label":"Rank","leaderboard.title":"Leaderboard","leaderboard.horizontal_scroll":"Scroll leaderboard columns horizontally","limits.settings.enable_all":"Enable all","limits.settings.disable_all":"Disable all","limits.settings.bulk_visibility":"Provider visibility","limits.settings.enabled_count":"{{enabled}} / {{total}} providers enabled","limits.zcode.start_grants":"Start Plan","limits.zcode.grant_amount":"{{remaining}} / {{total}} tokens remaining","limits.zcode.reset_bank.title":"Quota resets","limits.zcode.reset_bank.count":"{{count}} available","limits.zcode.reset_bank.earliest":"Earliest expiry: {{time}}","leaderboard.range":"UTC {{period}} · {{from}} – {{to}}","leaderboard.range_loading":"UTC {{period}} · …","leaderboard.range.total":"All time","leaderboard.generated_at":"Updated {{ts}}","leaderboard.period.week":"Week","leaderboard.period.month":"Month","leaderboard.period.total":"All","leaderboard.me_label":"You","leaderboard.anon_label":"Anonymous","leaderboard.error.unknown":"Unknown error","leaderboard.loading":"Loading…","leaderboard.empty":"No data","leaderboard.column.rank":"Rank","leaderboard.column.user":"User","leaderboard.column.total":"Total","leaderboard.column.codex":"Codex","leaderboard.column.claude":"Claude","leaderboard.column.gemini":"Gemini","leaderboard.column.cursor":"Cursor","leaderboard.column.opencode":"OpenCode","leaderboard.column.openclaw":"OpenClaw","leaderboard.column.hermes":"Hermes","leaderboard.column.kiro":"Kiro","leaderboard.column.copilot":"GitHub Copilot","leaderboard.column.kimi":"Kimi Code","leaderboard.column.kilo-cli":"Kilo CLI","leaderboard.column.kilo-code":"Kilo Code","limits.copilot.otelHint.title":"Track Copilot token usage","limits.copilot.otelHint.body":"Limits load via your GitHub OAuth token. To also record per-token usage, enable Copilot's OpenTelemetry export and add these lines to your shell profile (~/.zshrc or ~/.bashrc):","limits.copilot.otelHint.copy":"Copy","limits.copilot.otelHint.copied":"Copied","leaderboard.column.supplemental":"Supplemental","leaderboard.pagination.prev":"Previous","leaderboard.pagination.next":"Next","leaderboard.pagination.ellipsis":"…","leaderboard.pagination.page_unknown":"Page {{page}}","dashboard.session_expired.copy_label":"run npx --yes tokentracker-cli init","dashboard.session_expired.copied":"copied","dashboard.install.prompt":"Install Node.js 18+ then run:","dashboard.install.cmd.init":"npx --yes tokentracker-cli init","dashboard.install.cmd.init_link_code":"npx --yes tokentracker-cli init --link-code {{link_code}}","dashboard.install.copy":"Copy install command","dashboard.install.copy_base":"Copy init command","dashboard.install.copied":"Copied to clipboard","dashboard.install.link_code.loading":"Generating private code...","dashboard.install.link_code.failed":"Private code unavailable","dashboard.install.cmd.sync":"npx --yes tokentracker-cli sync","dashboard.daily.title":"Daily Breakdown","dashboard.daily.empty":"No data yet. Use your AI CLI then run {{cmd}}.","dashboard.identity.title":"Your Profile","dashboard.identity.subtitle":"Track your coding journey","dashboard.identity.fallback":"Anonymous","dashboard.overview.layout.drag_handle":"Drag to reorder","dashboard.screenshot.twitter_text":"{{total_tokens}} tokens on the record.\\n{{model_name}} led with {{model_percent}}%.\\n\\nMy AI usage, unaudited →","nav.usage":"Tokens","nav.limits":"Limits","nav.widgets":"Menu Bar & Widgets","nav.leaderboard":"Leaderboard","nav.collapse":"Collapse sidebar","nav.expand":"Expand sidebar","nav.menu":"Open navigation menu","nav.close_menu":"Close navigation menu","nav.aside_label":"Main navigation","nav.nav_label":"Primary","limits.page.subtitle":"Rate limits and quota usage across your AI tools.","limits.settings.toggle_visible":"Toggle visibility","limits.settings.display_mode_label":"Usage Display","limits.settings.display_mode_used":"Used","limits.settings.display_mode_remaining":"Remaining","limits.page.openSettings":"Display settings","leaderboard.community.tokens_label":"Tokens tracked by the community","leaderboard.community.devs":"{{count}} users syncing","leaderboard.community.view_stats":"View global community stats","leaderboard.community.tokens_chip":"Community Tokens","leaderboard.community.devs_chip":"Users","leaderboard.community.modal.title":"Global Metrics","leaderboard.community.modal.description":"A privacy-safe view of how the community builds with AI.","leaderboard.community.modal.total_tokens":"Total Tokens","leaderboard.community.modal.active_devs":"Active users","leaderboard.community.modal.active_devs_detail":"{{count}} syncing","leaderboard.community.modal.global_spend":"Est. Spend","leaderboard.community.modal.global_spend_detail":"${{amount}} USD","leaderboard.community.modal.top_models":"Top Models","leaderboard.community.modal.all_time":"All time","leaderboard.community.modal.tokens_title":"{{count}} tokens","leaderboard.community.modal.no_data":"No aggregate data yet","leaderboard.community.modal.activity_chart":"Daily community token activity","leaderboard.community.modal.developers_short":"users","leaderboard.community.modal.daily_tokens":"Daily tokens","leaderboard.community.modal.seven_day_average":"7-day average","leaderboard.community.modal.composition":"Composition","leaderboard.community.modal.token_mix":"Token mix","leaderboard.community.modal.token_mix.input":"Input","leaderboard.community.modal.token_mix.cache_read":"Cache read","leaderboard.community.modal.token_mix.cache_write":"Cache write","leaderboard.community.modal.token_mix.output":"Output","leaderboard.community.modal.token_mix.reasoning":"Reasoning","leaderboard.community.modal.last_30_days":"Last 30 days","leaderboard.community.modal.daily_average":"Daily average","leaderboard.community.modal.peak_day":"Peak day","leaderboard.community.modal.community_activity":"Community activity","leaderboard.community.modal.utc_note":"Daily totals in UTC","leaderboard.community.modal.ecosystem":"Ecosystem","leaderboard.community.modal.provider_distribution":"Provider distribution","leaderboard.community.modal.rank":"Rank","leaderboard.community.modal.provider":"Provider","leaderboard.community.modal.usage_share":"Usage share","leaderboard.community.modal.developer_count":"{{count}} users","leaderboard.community.modal.participation":"Participation","leaderboard.community.modal.usage_distribution":"Lifetime usage bands","leaderboard.community.modal.band.lt_1m":"Under 1M","leaderboard.community.modal.band.1m_10m":"1M–10M","leaderboard.community.modal.band.10m_100m":"10M–100M","leaderboard.community.modal.band.100m_1b":"100M–1B","leaderboard.community.modal.band.1b_plus":"1B+","leaderboard.community.modal.developer_share_title":"{{share}} of contributors","leaderboard.community.modal.adoption":"Adoption","leaderboard.community.modal.platforms":"Platforms","leaderboard.community.modal.platform.darwin":"macOS","leaderboard.community.modal.platform.win32":"Windows","leaderboard.community.modal.platform.linux":"Linux","leaderboard.community.modal.machine_count":"{{count}} anonymous installs","leaderboard.community.modal.platform_privacy":"Platform adoption uses anonymous installation hashes. No location or account identity is collected for this view.","leaderboard.community.modal.model_landscape":"Model landscape","leaderboard.community.modal.eyebrow":"Community intelligence","leaderboard.community.modal.tokens_30d":"Tokens · 30d","leaderboard.community.modal.contributors":"Contributors","leaderboard.community.modal.with_usage":"With recorded usage","leaderboard.community.modal.active_30d":"Active · 30d","leaderboard.community.modal.vs_previous_week":"vs previous 7 days","leaderboard.community.modal.views":"Global metric views","leaderboard.community.modal.updated":"Updated {{time}}","leaderboard.community.modal.tab.overview":"Overview","leaderboard.community.modal.tab.providers":"Providers","leaderboard.community.modal.tab.community":"Community","leaderboard.community.modal.tab.models":"Models","leaderboard.community.modal.note":"Aggregates are refreshed hourly from canonical community rollups. No user-level rows are exposed.","shared.dialog.close":"Close dialog","nav.group.general":"General","nav.group.tools":"Tools","nav.group.account":"Account","nav.settings":"Settings","header.auth.open_settings":"Open settings","settings.page.title":"Settings","settings.page.subtitle":"Manage your account, appearance, and display preferences.","settings.nav.group.personal":"Personal","settings.nav.group.app":"App","settings.nav.group.developer":"Developer","settings.section.appearance":"Appearance","settings.section.appearance.description":"Theme, language, currency, and number formatting.","settings.section.account":"Account","settings.section.account.description":"Public profile and account details.","settings.section.cloud":"Cloud","settings.section.cloud.description":"Manage Cloud membership, billing, and device sync.","settings.section.limits":"Usage & Limits","settings.section.limits.description":"Choose how usage is shown and configure limit providers.","settings.section.network":"Network","settings.section.network.description":"Control the proxy used for cloud sync and diagnostics.","settings.network.mode.label":"Outbound proxy","settings.network.mode.hint":"Choose how Token Tracker reaches the internet for cloud sync. App updates always follow the system proxy.","settings.network.mode.system":"System","settings.network.mode.manual":"Manual","settings.network.mode.off":"Off","settings.network.protocol.label":"Protocol","settings.network.protocol.http":"HTTP","settings.network.protocol.https":"HTTPS","settings.network.protocol.socks5":"SOCKS5","settings.network.host.label":"Host","settings.network.host.placeholder":"127.0.0.1","settings.network.port.label":"Port","settings.network.port.placeholder":"7890","settings.network.test":"Test connection","settings.network.test.testing":"Testing…","settings.network.test.ok":"Reached the test URL (HTTP {{status}}).","settings.network.test.fail":"Could not connect: {{error}}","settings.network.save":"Save","settings.network.saving":"Saving…","settings.network.saved":"Proxy settings saved.","settings.network.error.host":"Enter a host without http:// or a path.","settings.network.error.port":"Enter a port between 1 and 65535.","settings.network.effective.manual":"Currently using the manual proxy.","settings.network.effective.env":"Currently using an environment-variable proxy.","settings.network.effective.system":"Currently using the system proxy.","settings.network.effective.none":"Currently connecting directly.","settings.network.effective.blocked":"Outbound traffic is blocked: the manual proxy could not be applied.","settings.network.apply_error":"The saved proxy could not be applied: {{error}}. The proxy is not in effect and outbound traffic is blocked. Check your proxy settings.","settings.network.save_error":"Could not save proxy settings: {{error}}","settings.network.save_error_unprotected":"Could not save proxy settings: {{error}}. Outbound traffic is currently unprotected — even blocking it failed.","settings.limits.providers":"Providers","settings.limits.showSubscriptions":"Show subscriptions in limits","settings.limits.showSubscriptionsHint":"Display your manual subscription renewal bars alongside the limits.","settings.labs.island.label":"Dynamic Island","settings.labs.island.hint":"Turn the MacBook notch into a Dynamic Island: today's tokens and spend at a glance, hover for spend and limit details.","settings.labs.island.aria":"Toggle Dynamic Island","settings.labs.island_hide_menubar.label":"Hide Menu Bar Item","settings.labs.island_hide_menubar.hint":"Hide top menu bar icon and use Dynamic Island exclusively.","settings.labs.island_hide_menubar.aria":"Toggle hide menu bar item","dashboard.island.title":"Meet the Dynamic Island","dashboard.island.hint":"Turn the MacBook notch into a live token meter — today's tokens and spend at a glance, hover for spend and limit details.","dashboard.island.enable":"Turn it on","dashboard.island.settings_link":"View in Settings","dashboard.island.enabled_toast":"Dynamic Island is on — look up at the notch","dashboard.island.dismiss_aria":"Dismiss Dynamic Island tip","dashboard.linux_pet.title":"Meet your desktop pet","dashboard.linux_pet.hint":"A small companion on your desktop — hover it for today's tokens, spend and limits, and drag it anywhere.","dashboard.linux_pet.show":"Show pet","dashboard.linux_pet.settings_link":"Pet settings","dashboard.linux_pet.dismiss_aria":"Dismiss desktop pet tip","settings.labs.qpd.label":"Analyze PR cost-efficiency","settings.labs.qpd.hint":"Analyze average delivery costs and effective Tokens per model from merged PRs and AI-attributed commits.","settings.labs.qpd.aria":"Toggle PR cost-efficiency analysis","settings.labs.sessions.label":"Session efficiency","settings.labs.sessions.hint":"Analyze metadata-only edit coverage, first-pass delivery, and cost per edit across Claude and Codex.","settings.labs.sessions.aria":"Toggle session efficiency analysis","settings.section.labs":"Labs","settings.section.labs.description":"Try experimental insights before they become standard features.","qpd.card.title":"Quality & Avg Cost/PR","qpd.card.badge":"BETA","qpd.card.subtitle":"Avg token cost per delivery, from merged PRs and AI-attributed commits.","qpd.card.updating":"Updating…","qpd.card.best_value":"Best Value","qpd.card.col_model":"Model","qpd.card.col_cost":"Spend","qpd.card.col_accepted":"PRs/Total","qpd.card.col_rate":"Rate","qpd.card.col_qpd":"Cost/PR","qpd.card.qpd_tooltip":"Average token cost per accepted outcome (Total Spend ÷ Accepted Outcomes)","qpd.card.totals":"Merged {{accepted}}/{{outcomes}} PRs · Cost {{cost}}","qpd.card.et":"Effective: {{tokens}} ({{rate}})","qpd.card.et_tooltip":"Effective Tokens — the share of tokens that produced accepted work vs rework","qpd.card.sparse_notice":"Tip: Sparse outcomes dataset might skew ratios. For precise metrics, select a narrower time window.","settings.appearance.theme.label":"Theme","settings.appearance.theme.hint":"Choose how Token Tracker looks across the dashboard.","settings.appearance.theme.light":"Light","settings.appearance.theme.dark":"Dark","settings.appearance.theme.system":"System","settings.appearance.currency.label":"Currency","settings.appearance.currency.hint":"Select the display currency for usage costs.","settings.appearance.token_format.label":"Token numbers","settings.appearance.token_format.hint":"Apply compact or full numbers everywhere. Hover compact values to see the exact number.","settings.appearance.token_format.compact":"Compact","settings.appearance.token_format.full":"Full","settings.appearance.token_unit.label":"Number units","settings.appearance.token_unit.hint":"Compact numbers use K/M/B or Wan/Yi units. Full numbers ignore units.","settings.appearance.token_unit.english":"K/M/B","settings.appearance.token_unit.chinese":"Wan/Yi","settings.appearance.token_grouping.label":"Number grouping","settings.appearance.token_grouping.hint":"Exact numbers use 3-digit or Chinese 4-digit grouping. Compact tooltips follow this setting.","settings.appearance.token_grouping.thousand":"3-digit","settings.appearance.token_grouping.wan":"4-digit","settings.appearance.currency.opt.usd":"USD ($)","settings.appearance.currency.opt.eur":"EUR (€)","settings.appearance.currency.opt.gbp":"GBP (£)","settings.appearance.currency.opt.cny":"CNY (¥)","settings.appearance.currency.opt.jpy":"JPY (¥)","settings.appearance.currency.opt.hkd":"HKD (HK$)","settings.appearance.currency.rate_source.default":"Bundled default rate","settings.appearance.currency.rate_source.fetched":"Source: open.er-api.com","settings.appearance.currency.rate_updated":"updated {{when}}","settings.appearance.currency.rate_never":"awaiting first refresh","settings.account.displayName":"Display name","settings.account.edit":"Edit","settings.account.save":"Save","settings.account.saving":"Saving...","settings.account.cancel":"Cancel","settings.account.userId":"User ID","settings.account.copyUserId":"Copy user ID","settings.account.copy":"Copy","settings.account.copied":"Copied","settings.account.cloudSync":"Cloud sync","settings.account.cloudSyncHint":"Sync usage metrics from this computer to view all your devices together. Prompts, code and provider credentials stay local.","settings.account.cloudSyncPending":"Trying to sync…","settings.account.cloudSyncError":"Sync could not complete. Check your connection, local service and sign-in, then retry. Local records are unaffected.","settings.account.publicProfile":"Public profile","settings.account.publicProfileHint":"Show your usage on the public leaderboard.","settings.account.displayNameAnonymousHint":"Anonymous — your name and avatar are hidden on the leaderboard","settings.account.displayNameDisabledWhileAnon":"Turn on the switch first to edit your name","settings.account.githubUrl":"GitHub profile","settings.account.githubUrlHint":"Show a GitHub link next to your name on the leaderboard.","settings.account.githubUrlPlaceholder":"username or https://github.com/username","settings.account.githubUrlInvalid":"Use a GitHub username or https://github.com/username URL.","leaderboard.github.aria":"Open GitHub profile","auth.callback.processing":"Processing…","auth.callback.success":"Signed in successfully","auth.callback.redirecting":"Returning to TokenTracker…","auth.callback.failed":"Sign-in incomplete. Please try again.","auth.callback.close":"Close this page","stats.period.last_7d":"7d","stats.period.last_30d":"30d","stats.period.avg":"avg","stats.period.convs":"convs","leaderboard.column.est_cost":"Est. Cost","leaderboard.signin_prompt":"Sign in to join the leaderboard","leaderboard.signin_button":"Sign In","leaderboard.sync_prompt":"Enable free community sync to appear in rankings.","leaderboard.sync_button.idle":"Enable free sync","leaderboard.sync_button.busy":"Syncing...","leaderboard.pagination.page_size_label":"Rows per page","leaderboard.github.tooltipAction":"Click to open GitHub profile","leaderboard.github.tooltipPrefix":"Set yours in","leaderboard.github.tooltipSettingsLink":"Settings","leaderboard.github.tooltipSuffix":"to appear here","leaderboard.pro.badge":"Pro","leaderboard.pro.badge_aria":"TokenTracker Pro member","leaderboard.pro.tooltip":"Pro member. Rankings stay based on usage.","leaderboard.summary.percentile":"Top {{p}}%","leaderboard.summary.jump_to_me":"Jump to my row","leaderboard.summary.view_profile":"View your profile","settings.account.signOut":"Sign out","settings.account.signIn":"Sign in","settings.account.signedOutHint":"Sign in to manage your public profile and account details.","settings.section.menubar":"App & Updates","settings.section.menubar.description":"Manage background sync, startup behavior, and app updates.","settings.menubar.showStats":"Show stats in menu bar","settings.menubar.showStatsHint":"Display today's token count and cost beside the menu bar icon.","pet.menubar.title":"Run in the menu bar","pet.menubar.hint":"Your pet replaces the menu bar icon and sprints while your AI tools burn tokens.","settings.menubar.iconStyle":"Menu bar icon","settings.menubar.iconStyleHint":"Choose who lives in the menu bar. The cat and your pet run faster while your AI tools are burning tokens.","settings.menubar.iconStyle.clawd":"Clawd","settings.menubar.iconStyle.bot":"Bot","settings.menubar.iconStyle.cat":"Cat","settings.menubar.iconStyle.pet":"My pet","settings.menubar.iconStyle.static":"Static","settings.menubar.toastOnReset":"Toast on limits reset","settings.menubar.toastOnResetHint":"Show a brief message when a usage limit resets.","settings.menubar.confettiOnReset":"Confetti on limits reset","settings.menubar.confettiOnResetHint":"Set off a fireworks celebration when a usage limit resets after you were near it.","settings.menubar.appearance":"Menu bar display & icon","settings.menubar.appearanceHint":"Stats, metric slots, and the animated icon live on the Menu Bar & Widgets page.","settings.menubar.appearanceLink":"Open","settings.menubar.launchAtLogin":"Launch at login","settings.menubar.launchAtLoginHint":"Start TokenTrackerBar automatically when you sign in to macOS.","settings.menubar.syncNow":"Sync now","settings.menubar.syncNowHint":"Trigger an immediate parse and upload of local AI tool logs.","settings.menubar.syncing":"Syncing…","settings.menubar.updates":"Updates","settings.menubar.autoUpdate":"Automatic updates","settings.menubar.autoUpdateHint":"Download and install new versions in the background. Manual checks stay available when this is off.","settings.menubar.checkUpdates":"Check for updates","settings.footer.statusPage":"System status","menubar.slot.primary":"Primary slot","menubar.slot.secondary":"Secondary slot","menubar.native_only":"Open TokenTrackerBar for macOS to edit the live menu bar display.","menubar.metric.today_tokens":"Today Tokens","menubar.metric.none":"None (hide slot)","menubar.metric.today_cost":"Today Cost","menubar.metric.last_7d_tokens":"Last 7 Days","menubar.metric.total_tokens":"Total Tokens","menubar.metric.total_cost":"Total Cost","menubar.metric.claude_5h":"Claude 5h Limit","menubar.metric.claude_7d":"Claude 7d Limit","menubar.metric.codex_5h":"Codex 5h Limit","menubar.metric.codex_7d":"Codex 7d Limit","menubar.metric.codex_credits":"Codex Credit Limit","menubar.metric.codex_spark_5h":"Codex Spark 5h Limit","menubar.metric.codex_spark_7d":"Codex Spark 7d Limit","share.modal.title":"Share your stats","share.modal.subtitle":"Generate a poster-style card and share anywhere.","share.modal.close":"Close","share.modal.action.x":"Share on X","share.modal.action.download":"Download","share.modal.action.copy":"Copy image","share.modal.hint.x":"Paste image in tweet","share.modal.hint.copy":"to clipboard","share.modal.name_label":"Display name","share.modal.name_placeholder":"Enter your name","share.modal.footer":"Your data stays local — images are generated in your browser and never uploaded.","share.button.label":"Share","share.button.aria":"Open share card","share.toast.copied":"Image copied to clipboard","share.toast.downloaded":"Image saved","share.toast.failed":"Couldn't generate image","share.toast.working":"Generating…","share.modal.style_label":"Style","share.variant.neon":"Neon","share.variant.broadsheet":"Broadsheet","share.date.month_year":"{{month}} {{year}}","share.issue.all_time":"ALL TIME","share.month_short.jan":"JAN","share.month_short.feb":"FEB","share.month_short.mar":"MAR","share.month_short.apr":"APR","share.month_short.may":"MAY","share.month_short.jun":"JUN","share.month_short.jul":"JUL","share.month_short.aug":"AUG","share.month_short.sep":"SEP","share.month_short.oct":"OCT","share.month_short.nov":"NOV","share.month_short.dec":"DEC","share.hook.top_loyal":"{{percent}}% loyal to {{name}}.","share.hook.days_record":"{{days}} days on the record.","share.hook.top_led":"Led by {{name}} ({{percent}}%).","share.hook.multi_models":"Across {{count}} models, {{days}} days.","share.hook.days_with_model":"{{days}} days with {{name}}.","share.hook.new_chapter":"The beginning of a new chapter.","share.card.broadsheet.issue":"Issue","share.card.broadsheet.by":"By","share.card.broadsheet.tracked_since":"Tracked since","share.card.broadsheet.total_tokens":"Total tokens","share.card.broadsheet.estimated_spend":"Estimated spend","share.card.broadsheet.billable_days":"{{days}} billable days","share.card.broadsheet.heatmap_title":"The Year in Print","share.card.broadsheet.heatmap_days_on_record":"{{active}} / {{total}} days on record","share.card.broadsheet.roster_title":"The Roster","share.card.broadsheet.roster_subtitle":"Models in regular rotation","share.card.broadsheet.empty":"An empty week — the press was quiet.","share.card.broadsheet.global_rank":"Global rank","share.card.broadsheet.active_days":"Active","share.card.broadsheet.days_count":"{{days}} days","share.card.broadsheet.track_yours":"Track yours","share.card.annual.report_title":"Token Report","share.card.annual.less":"Less","share.card.annual.more":"More","share.card.annual.heatmap_title":"TOKEN USAGE HEATMAP","share.card.annual.total_tokens":"Total Tokens","share.card.annual.estimated_cost":"Estimated Cost","share.card.annual.longest_streak":"Longest Streak","share.card.annual.days_count":"{{days}} days","share.card.annual.top_model":"Top Model","usage.period.day":"Day","usage.period.week":"Week","usage.period.month":"Month","usage.period.total":"Total","usage.period.custom":"Custom","usage.overview.tablist_aria":"Time period","usage.overview.cost_breakdown_aria":"View cost breakdown","usage.overview.distribution_aria":"Provider distribution: {{items}}","usage.overview.distribution_item":"{{label}} {{percent}}%","usage.overview.provider_card_aria":"{{provider}}: {{percent}}%, {{tokens}} tokens, {{cost}}. Click to {{action}} details","usage.overview.percent_below_threshold":"<0.01","usage.overview.expand":"expand","usage.overview.collapse":"collapse","usage.overview.model_count":"{{count}} models","usage.overview.model_details_aria":"{{provider}} model details","usage.overview.all_tools":"All","usage.overview.all_models":"All models","usage.overview.all_models_note":"Models with the same name are combined across tools and ranked by total usage.","usage.overview.all_tools_card_aria":"All tools: {{tokens}} tokens, {{cost}}, {{count}} models. Show combined model ranking","usage.overview.cache_hit_rate_label":"Cache hit rate","usage.overview.cache_hit_rate_detail":"{{reused}} reused / {{input}} input","usage.overview.antigravity_notice_title":"Token details","usage.overview.antigravity_notice_body":"Exact token usage and prompt-cache hits are parsed from Antigravity session metadata when available. Fallback transcripts without metadata are estimated from text length (~4 chars/token).","usage.overview.devin_notice_title":"Cost not estimated","usage.overview.devin_notice_body":"Devin reports real local token counts, but swe-2, swe-2-high and compactor have no pricing data in this build, so they are excluded from dollar estimates. A $0 figure does not mean the usage was free.","usage.overview.trae_notice_title":"TRAE cost is partial","usage.overview.trae_notice_body":"In multi-step turns, TRAE splits cached input for the final step, not the earlier ones. Input without a cache split counts toward token totals but not toward cost. Costs use model prices, not billed amounts.","usage.overview.week_cross_month_hint":"This week spans two calendar months, so its total is not directly comparable with a single month's usage","limits.panel.title":"Usage Limits","limits.panel.mode_separator":"·","limits.label.cursor_plan":"Plan","limits.label.cursor_auto":"Auto","limits.label.cursor_api":"API","limits.label.cursor_grok_bot":"Grok Bot","limits.label.kiro_month":"Month","limits.label.kiro_bonus":"Bonus","limits.label.kiro_tracked_credits":"Local usage: {{credits}} credits · {{count}} turns","limits.label.kimi_weekly":"Weekly","limits.label.kimi_5h":"5h","limits.label.kimi_total":"Total","limits.label.kimi_parallel":"Parallel: {{count}}","limits.explain.used":"{{label}}: {{used}}% used","limits.explain.on_track":"{{label}}: on track, ~{{pct}}% by reset","limits.explain.ahead_eta":"{{label}}: ahead of pace, ~{{eta}} to limit","limits.explain.ahead_pct":"{{label}}: ahead of pace, ~{{pct}}% by reset","limits.explain.body":"The mark is the even-pace point; fill past it means you're ahead.","limits.explain.remaining":"{{label}}: {{used}}% left","limits.explain.on_track_remaining":"{{label}}: on track, ~{{pct}}% left by reset","limits.explain.ahead_pct_remaining":"{{label}}: ahead of pace, ~{{pct}}% left by reset","limits.explain.body_remaining":"The mark is the even-pace point; fill short of it means you're ahead.","limits.hover.resets_at":"Resets {{time}}","limits.reset_bank.hover_detail":"Expires {{date}} · {{days}}d left","limits.reset_bank.hover_detail_today":"Expires {{date}} · today","limits.label.copilot_premium":"Premium","limits.label.copilot_chat":"Chat","limits.label.grok_month":"Month","limits.label.grok_week":"Weekly","limits.label.grok_day":"Daily","limits.label.grok_ondemand":"On-demand","limits.provider.claude":"Claude","limits.provider.codex":"Codex","limits.provider.cursor":"Cursor","limits.provider.gemini":"Gemini","limits.provider.kimi":"Kimi","limits.provider.kiro":"Kiro","limits.provider.grok":"Grok Build","limits.provider.copilot":"GitHub Copilot","limits.provider.antigravity":"Antigravity","limits.provider.zcode":"ZCode","provider.display.omp":"oh-my-pi","provider.display.omo":"OmO","provider.display.minimax_code":"MiniMax Code","provider.display.command_code":"Command Code","provider.display.deepseek_harness":"DeepSeek Harness","provider.display.trae":"TRAE","provider.display.trae_work_cn":"TRAE Work CN","provider.display.cline":"Cline","limits.label.zcode_glm52":"GLM-5.2","limits.label.zcode_glm5t":"GLM-5-Turbo","limits.label.zcode_5h":"5h","limits.label.zcode_weekly":"Weekly","limits.label.zcode_tools":"Tools","limits.label.claude_5h":"5h","limits.label.claude_7d":"7d","limits.label.claude_opus":"Opus","limits.label.codex_5h":"5h","limits.label.codex_7d":"7d","limits.label.codex_credits":"Credits","limits.label.codex_spark_5h":"Spark 5h","limits.label.codex_spark_7d":"Spark 7d","limits.codex_credits.detail":"{{used}} / {{limit}} credits used · {{remaining}} left","limits.codex_reset_bank.title":"Resets","limits.codex_reset_bank.row_label":"Reset {{index}}","limits.codex_reset_bank.count_only":"Reset Bank: {{count}} available · expiry unavailable","limits.label.gemini_pro":"Pro","limits.label.gemini_flash":"Flash","limits.label.gemini_lite":"Lite","limits.label.antigravity_claude_weekly":"Cl 7d","limits.label.antigravity_claude_5h":"Cl 5h","limits.label.antigravity_gemini_weekly":"Gm 7d","limits.label.antigravity_gemini_5h":"Gm 5h","limits.label.antigravity_live":"live","limits.label.antigravity_cached":"cached","limits.tooltip.antigravity_live":"Real-time limits retrieved from your Antigravity Google account.","limits.tooltip.antigravity_cached":"Cached limits. Refreshes from your Antigravity login; the app does not need to be open.","limits.tooltip.qoder_cached":"Cached limits. Run Qoder to refresh.","limits.bar.sub_one_percent":"<1","limits.status.not_connected":"Not connected","limits.status.no_data":"No live limit data returned","limits.opencodeGo.status.inactive":"OpenCode Go subscription is inactive","limits.status.all_hidden":"All limit providers are hidden. Open display settings to show them.","shared.time.now":"now","shared.time.m_ago":"{{n}}m","shared.time.h_ago":"{{n}}h","shared.time.d_ago":"{{n}}d","nav.ip_check":"Claude IP Check","nav.service_status":"Service Status","status.page.subtitle":"Live incident status from your AI providers' official status pages.","status.page.source_note":"Read directly from each provider's public status page in your browser. Auto-refreshes every minute.","status.state.checking":"Checking…","status.state.none":"Operational","status.state.minor":"Minor incident","status.state.major":"Major incident","status.state.critical":"Critical outage","status.state.unknown":"Unreachable","status.open_page":"Open {{provider}} status page","status.refresh":"Refresh","status.last_checked":"Checked at {{time}}","nav.skills":"Skills","nav.sessions":"Sessions","skills.page.title":"Skills","skills.tab.my":"My Skills","skills.tab.browse":"Browse","skills.action.refresh":"Refresh","skills.action.install":"Install","skills.action.choose_targets":"Choose targets","skills.target.menu_label":"Install to","skills.target.none":"no targets","skills.toast.installed":"Installed {{name}} to {{targets}}.","skills.action.remove":"Remove","skills.action.search":"Search","skills.action.search_aria":"Search skills","skills.action.search_clear":"Clear search","skills.target.synced_summary":"Synced to {{targets}}","skills.target.synced_none":"Not synced to any agent","skills.row.open_details":"Open details for {{name}}","skills.detail.close":"Close details","skills.detail.sync_section_title":"Sync to","skills.detail.remove_button":"Remove from all agents","skills.detail.remove_confirm_hint":"This unsyncs the skill from every agent and deletes its local copy.","skills.filter.agent_label":"Agent","skills.filter.agent_all":"All agents","skills.filter.clear":"Clear filters","skills.my.placeholder":"Filter installed skills…","skills.filter.result_count":"{{filtered}} of {{total}} skills","skills.filter.result_count_browse":"{{count}} results","skills.empty.no_match":"No skills match the current filters.","hint.dismiss":"Dismiss hint","hint.dismissible_aria":"Dismissible hint","skills.card.installed":"Installed","skills.card.manage":"Manage","skills.card.targets_prefix":"Will install to:","skills.card.targets_change":"Change","skills.card.installs":"{{count}} installs","skills.source.label":"Source","skills.source.all":"All repositories","skills.mode.repo":"Repositories","skills.mode.skillssh":"skills.sh","skills.browse.placeholder_all":"Search across enabled repositories…","skills.browse.placeholder_repo":"Search in {{repo}}…","skills.browse.placeholder_skillssh":"Search the skills.sh registry…","skills.browse.empty_sources":"Add a GitHub repository below to start browsing skills.","skills.browse.add_repo_hint":"Need more skills? Add a GitHub repository.","skills.browse.manage_sources":"Manage sources","skills.browse.hint_skillssh":"Type at least 2 characters to search skills.sh.","skills.browse.loading_hint":"Fetching skill metadata from GitHub. First load can take up to a minute; results are cached.","skills.error.generic":"Skill operation failed.","skills.confirm.remove_title":"Remove {{name}}?","skills.confirm.remove_managed":"This skill will be removed from every connected AI tool. You'll have a few seconds to undo.","skills.confirm.remove_local":"This will delete the skill folder on disk from every connected AI tool. This cannot be undone.","skills.toast.removed":"Removed {{name}}.","shared.action.undo":"Undo","shared.action.dismiss":"Dismiss","shared.action.cancel":"Cancel","shared.action.apply":"Apply","skills.empty.my":"No skills yet. Open Discover to search and install.","skills.empty.my_cta":"Browse","skills.empty.browse":"No skills found for this source.","skills.empty.search":"No results. Try a different query.","skills.repo.placeholder":"owner/repository","skills.repo.add":"Add repository","skills.repo.invalid":"Use owner/repository or a GitHub repository URL.","skills.repo.remove":"Remove repository","settings.appearance.language.label":"Language","settings.appearance.language.hint":"Use System to follow your computer language by default.","settings.appearance.language.system":"System","settings.appearance.language.english":"English","settings.appearance.language.chinese":"Simplified Chinese","settings.appearance.language.traditional_chinese":"Traditional Chinese","settings.appearance.language.japanese":"Japanese","settings.appearance.language.korean":"Korean","settings.appearance.language.german":"German","dashboard.context_breakdown.heading":"Context Breakdown","dashboard.context_breakdown.heading_claude":"Claude Context Breakdown","dashboard.context_breakdown.heading_codex":"Codex Context Breakdown","dashboard.context_breakdown.heading_grok":"Grok Context Breakdown","dashboard.context_breakdown.empty":"No Claude Code activity in the selected period.","dashboard.context_breakdown.empty_codex":"No Codex activity in the selected period.","dashboard.context_breakdown.error":"Couldn't read Claude Code logs for this view.","dashboard.context_breakdown.error_codex":"Couldn't read Codex logs for this view.","dashboard.context_breakdown.bar_aria":"Token distribution: {{summary}}","dashboard.context_breakdown.system_prefix_tooltip":"System prompt, tools schema, skills, rules, and MCP descriptions are cached together as one prefix and can't be separated from the logs.","dashboard.context_breakdown.footnote":"Approximate: cache reads accumulate across turns, so conversation history dominates over time. Only Claude Code logs expose the per-message detail this view requires.","dashboard.context_breakdown.footnote_codex":"Codex uses non-overlapping token buckets here. Tool and exec drill-downs are separate heuristic attributions over the same turns.","dashboard.context_breakdown.empty_grok":"No Grok Build activity in the selected period.","dashboard.context_breakdown.error_grok":"Couldn't read Grok Build logs for this view.","dashboard.context_breakdown.footnote_grok":"Grok uses non-overlapping token buckets here. Tool and exec drill-downs are separate heuristic attributions over the same turns, using turn_completed.usage as the authoritative total.","dashboard.context_breakdown.category.system_prompt":"System prompt","dashboard.context_breakdown.category.messages":"Messages","dashboard.context_breakdown.category.tool_calls":"Tool calls","dashboard.context_breakdown.category.mcp_servers":"MCP servers","dashboard.context_breakdown.category.custom_agents":"Custom agents","dashboard.context_breakdown.category.reasoning":"Reasoning","dashboard.context_breakdown.category.skills":"Skills","dashboard.context_breakdown.loading_aria":"Loading context breakdown","dashboard.context_breakdown.loading_hint":"Scanning session logs…","dashboard.context_breakdown.tool_details.total_column":"Total","dashboard.context_breakdown.tool_details.unavailable_codex":"Tool-level Codex details are unavailable for this period; showing queue totals only.","dashboard.context_breakdown.message_details.title":"Message details","dashboard.context_breakdown.message_details.note":"Aggregated only — message text is not stored.","dashboard.context_breakdown.message_details.category_column":"Category","dashboard.context_breakdown.message_details.user_input":"User input","dashboard.context_breakdown.message_details.conversation_history":"Conversation history","dashboard.context_breakdown.message_details.assistant_response":"Assistant response","dashboard.context_breakdown.exec_details.title":"Exec command details","dashboard.context_breakdown.exec_details.kind_column":"Type","dashboard.context_breakdown.exec_details.calls_column":"Calls","dashboard.context_breakdown.exec_details.failures_column":"Fail","dashboard.context_breakdown.exec_details.duration_column":"Duration","dashboard.context_breakdown.exec_details.max_duration_column":"Max","dashboard.context_breakdown.exec_details.output_column":"Lines","dashboard.context_breakdown.exec_details.group_by_type":"By type","dashboard.context_breakdown.exec_details.group_by_executable":"Executable","dashboard.context_breakdown.exec_details.group_by_command":"Command","dashboard.context_breakdown.exec_details.group_by_duration":"Duration","dashboard.context_breakdown.exec_details.group_by_output":"Output","dashboard.context_breakdown.exec_details.group_by_exit":"By exit","heatmap.3d.hover_tip":"Click to enter 3D fullscreen rotation analysis mode","heatmap.3d.modal.title":"Token 3D Perspective","heatmap.3d.modal.desc":"Drag with left mouse button to rotate. Hover to inspect daily activity and multidimensional metrics.","heatmap.3d.modal.stats.total_tokens":"Annual Total Tokens","heatmap.3d.modal.stats.precision_total_tokens":"Precise annual consumption","heatmap.3d.modal.stats.estimated_cost":"Annual Estimated Cost","heatmap.3d.modal.stats.active_rate_days":"Active Rate / Days","heatmap.3d.modal.stats.max_streak":"Longest Active Streak","heatmap.3d.modal.stats.days_suffix":"Days","heatmap.3d.modal.stats.peak_day":"Peak Day Blowout","heatmap.3d.modal.stats.precision_peak_value":"Precise daily peak","heatmap.3d.modal.stats.no_data":"No data","heatmap.3d.modal.legend.title":"Activity Levels","heatmap.3d.modal.palette.emerald":"Emerald City","heatmap.3d.modal.palette.ocean":"Ocean Abyss","heatmap.3d.modal.palette.neon":"Cyber Neon","heatmap.3d.modal.palette.amber":"Blazing Amber","heatmap.3d.modal.control.play":"Start slow rotation","heatmap.3d.modal.control.pause":"Pause auto-rotation","heatmap.3d.modal.control.reset":"Reset 3D view","heatmap.3d.modal.footer.tip":"Pinch to zoom / Scroll to zoom / Drag to rotate 3D chart","heatmap.3d.modal.ai.title.default":"Persistent Creator","heatmap.3d.modal.ai.eval.default":"You keep showing up and moving forward. Every small point of activity records another moment of thought and exploration. Over time, those sparks gather into a body of work that is uniquely yours.","heatmap.3d.modal.ai.title.peak":"Peak Contributor","heatmap.3d.modal.ai.eval.peak":"This year, your token activity reached an exceptional level. You repeatedly turned complex ideas into concrete results with remarkable focus and momentum — a clear sign of sustained creative drive.","heatmap.3d.modal.ai.title.heavy":"Heavy Producer","heatmap.3d.modal.ai.eval.heavy":"Exceptional continuous output. Your accumulated tokens reflect an enormous volume of research, creation, and problem-solving. This sustained pace shows impressive focus and execution.","heatmap.3d.modal.ai.title.core":"Core Productivity Expert","heatmap.3d.modal.ai.eval.core":"Highly resilient long-term commitment. Over the past year, you maintained a strong and consistent rhythm, steadily turning AI-assisted work into durable results. You are a true productivity cornerstone.","heatmap.3d.modal.ai.title.steady":"Steady Creator","heatmap.3d.modal.ai.eval.steady":"Steady and focused progress. Every token marks another step in turning ideas into useful work. This consistent rhythm is how lasting expertise is built.","heatmap.3d.voxel.joke.1":"🔥 Extremely crazy! Produced {{value}} tokens! Are you training a large language model or writing a compiler by hand?","heatmap.3d.voxel.joke.2":"🚀 Epic output! Total {{value}} tokens. Today's production can circle the earth once, even the AI is amazed by you!","heatmap.3d.voxel.joke.3":"⚡ Critical Day! {{value}} tokens. Code is gushing out, and the keyboard is starting to smoke!","heatmap.3d.voxel.level3":"⚡ Productivity explosion ({{value}} tokens)! High efficiency and focus, keep up this peak state!","heatmap.3d.voxel.level2":"🌱 Getting into the groove ({{value}} tokens)! Steady output, every keystroke is contributing to the architecture.","heatmap.3d.voxel.level1":"🍃 Every drop counts ({{value}} tokens). Tiny commits are investments in the future, embrace compound interest!","heatmap.3d.voxel.level0":"💤 Recharging. On days without coding, inspiration grows silently.","ipcheck.page.title":"Claude IP Check","ipcheck.page.subtitle":"Inspect the exit IP used to reach Claude, plus reputation, geo, and risk signals that may affect sign-in or trigger rate-limiting.","ipcheck.mask.toggle":"Hide IP","ipcheck.ipv6.warn":"IPv6 detected. Using IPv6 to reach Claude Code is not recommended; some checks may be incomplete.","ipcheck.ip.cn":"China exit IPv4","ipcheck.ip.cloudflare":"Cloudflare exit","ipcheck.ip.claude":"Claude exit","ipcheck.ip.failed":"Unable to fetch","ipcheck.ip.loading":"Loading...","ipcheck.trust.title":"Trust Score","ipcheck.trust.subtitle":"IP cleanliness from Claude's risk view","ipcheck.trust.no_data":"No data","ipcheck.trust.no_ip":"Claude exit IP not detected — cannot score","ipcheck.trust.no_score":"No score data for this IP","ipcheck.trust.gauge.low":"0 High risk","ipcheck.trust.gauge.high":"100 Trusted","ipcheck.trust.label.pristine":"Pristine","ipcheck.trust.label.clean":"Clean","ipcheck.trust.label.good":"Good","ipcheck.trust.label.neutral":"Neutral","ipcheck.trust.label.suspicious":"Suspicious","ipcheck.trust.label.unreachable":"Unreachable","ipcheck.trust.text.excellent":"Excellent reputation","ipcheck.trust.text.great":"Strong reputation","ipcheck.trust.text.minor":"Minor risk","ipcheck.trust.text.moderate":"Moderate risk","ipcheck.trust.text.severe":"Severe risk","ipcheck.trust.text.restricted":"Restricted region — Claude enforces strict risk controls","ipcheck.trust.region_warn.title":"Claude exit IP is in {{region}}","ipcheck.trust.region_warn.body":"Avoid signing in — high chance of triggering account flagging.","ipcheck.trust.region_support":"Claude support","ipcheck.trust.region.accessible":"Accessible","ipcheck.common.unknown":"Unknown","ipcheck.props.title":"IP Attributes","ipcheck.props.region":"Region","ipcheck.props.city":"City","ipcheck.props.type":"Type","ipcheck.props.asn":"ASN","ipcheck.props.org":"ISP","ipcheck.props.residential":"Residential","ipcheck.props.datacenter":"Datacenter","ipcheck.security.title":"Security Checks","ipcheck.security.vpn":"VPN","ipcheck.security.proxy":"Proxy","ipcheck.security.tor":"Tor","ipcheck.security.crawler":"Crawler","ipcheck.security.abuser":"Abuse history","ipcheck.security.proxy_flag":"Proxy","ipcheck.security.crawler_yes":"Yes","ipcheck.security.crawler_no":"No","ipcheck.security.abuser_yes":"Reported","ipcheck.security.abuser_no":"Clean","ipcheck.security.clean":"Not detected","ipcheck.avail.title":"Claude Availability","ipcheck.avail.tooltip":"Claude servers run in the US; latency above 100ms from Asia is normal.","ipcheck.avail.refresh":"Refresh","ipcheck.avail.svc_row":"Service status","ipcheck.avail.latency.normal":"Normal","ipcheck.avail.latency.good":"Good","ipcheck.avail.latency.slow":"Slow","ipcheck.avail.latency.unreachable":"Unreachable","ipcheck.avail.svc.none":"All systems normal","ipcheck.avail.svc.minor":"Minor outage","ipcheck.avail.svc.major":"Major outage","ipcheck.avail.svc.critical":"Critical outage","ipcheck.avail.svc.maintenance":"Maintenance","ipcheck.avail.svc.other":"Disrupted","ipcheck.dns.title":"DNS Leak","ipcheck.dns.status":"Status","ipcheck.dns.outlet":"DNS exit","ipcheck.dns.outlet_ip":"DNS exit IP","ipcheck.dns.isp":"Provider","ipcheck.dns.leaked":"Possible leak","ipcheck.dns.no_leak":"No leak detected","ipcheck.dns.encrypted":"DNS encrypted or hidden","ipcheck.dns.cn_tag":"China DNS","ipcheck.udp.title":"WebRTC UDP Leak","ipcheck.udp.status":"Status","ipcheck.udp.outlet":"UDP exit","ipcheck.udp.outlet_ip":"UDP exit IP","ipcheck.udp.origin":"Origin","ipcheck.udp.disabled":"WebRTC disabled","ipcheck.udp.no_leak":"No leak detected","ipcheck.udp.leaked":"Possible leak","ipcheck.udp.anomaly":"Anomaly","ipcheck.device.title":"Device Info","ipcheck.device.tz":"Timezone","ipcheck.device.lang":"Language","ipcheck.device.os":"OS / Browser","ipcheck.device.touch":"Touch","ipcheck.device.net":"Network type","ipcheck.device.dnt":"Do Not Track","ipcheck.device.webgl_render":"WebGL renderer","ipcheck.device.canvas_fp":"Canvas fingerprint","ipcheck.device.webgl_fp":"WebGL fingerprint","ipcheck.device.match":"Match","ipcheck.device.mismatch":"Mismatch","ipcheck.device.local":"Local","ipcheck.device.estimate_suffix":"(est.)","ipcheck.device.diff_equal":"Slight offset","ipcheck.device.diff_ahead":"Claude is {{h}}h ahead","ipcheck.device.diff_behind":"Claude is {{h}}h behind","ipcheck.device.lang_expected":"Claude region usually","ipcheck.device.touch_yes":"Yes","ipcheck.device.touch_no":"No","ipcheck.device.dnt_on":"On","ipcheck.device.dnt_off":"Off","ipcheck.device.dnt_unset":"Unset","ipcheck.device.net_unsupported":"Not detected","ipcheck.device.unsupported":"Unsupported","ipcheck.history.title":"Claude exit IP history","ipcheck.history.subtitle":"Stored only in this browser, up to 6 entries","ipcheck.history.clear":"Clear","ipcheck.history.empty":"No history yet","ipcheck.history.current":"Now","ipcheck.region.CN":"Mainland China","ipcheck.region.HK":"Hong Kong","ipcheck.region.MO":"Macao","ipcheck.region.RU":"Russia","ipcheck.region.KP":"North Korea","ipcheck.region.IR":"Iran","ipcheck.region.SY":"Syria","ipcheck.region.CU":"Cuba","ipcheck.region.BY":"Belarus","ipcheck.region.VE":"Venezuela","leaderboard.profile_modal.close":"Close","leaderboard.profile_modal.loading":"Loading profile…","leaderboard.profile_modal.error":"Failed to load profile.","leaderboard.profile_modal.empty":"This profile is not public.","leaderboard.profile_modal.row_aria":"Open profile for {{name}}","leaderboard.profile_modal.rank":"#{{rank}}","leaderboard.profile_modal.hero.total_tokens":"Total Tokens","leaderboard.profile_modal.hero.total_cost":"Total Cost","leaderboard.profile_modal.hero.github":"GitHub profile","leaderboard.profile_modal.stat.total_cost":"Total Cost","leaderboard.profile_modal.stat.total_tokens":"Total Tokens","leaderboard.profile_modal.stat.active_days":"Active Days","leaderboard.profile_modal.stat.avg_per_day":"Avg/Day","leaderboard.profile_modal.streak.current":"Current Streak","leaderboard.profile_modal.streak.longest":"Longest Streak","leaderboard.profile_modal.streak.days":"{{count}} days","leaderboard.profile_modal.best_day.title":"Best Day","leaderboard.profile_modal.best_day.none":"—","leaderboard.profile_modal.models.count":"{{count}} models used","leaderboard.profile_modal.models.favorite":"Favorite","leaderboard.profile_modal.models.none":"No models tracked","leaderboard.profile_modal.heatmap.title":"Activity (last 365 days)","leaderboard.profile_modal.providers.title":"By provider","leaderboard.profile_modal.providers.none":"No usage this period.","leaderboard.profile_modal.view_full":"View full profile","leaderboard.profile_modal.badge.copy_url":"Copy profile URL","leaderboard.profile_modal.badge.copy":"Copy README badge","leaderboard.profile_modal.badge.copied":"Copied!","local_only.title":"Available in the app","local_only.body":"This page reads data from your own machine, so it only works in the Mac app or the CLI dashboard.","local_only.open_app":"Open in Mac app","local_only.download":"Get the Mac app","leaderboard.profile.like.aria_like":"Like profile","leaderboard.profile.like.aria_unlike":"Unlike profile","dashboard.auth_gate.title":"Sign in to Token Tracker","dashboard.auth_gate.subtitle":"Sign in to sync and view your API usage, cost, and token consumption trends in the cloud.","dashboard.auth_gate.button":"Sign In","dashboard.expired_gate.title":"Session Expired","dashboard.expired_gate.subtitle":"Your session has expired. Please sign in again to continue viewing your cloud dashboard.","dashboard.expired_gate.button":"Sign In Again","shared.app_name":"Token Tracker","dashboard.auth_gate.hero_title":"Track every AI agent token seamlessly","dashboard.auth_gate.hero_subtitle":"Clear, transparent, and multi-endpoint control","dashboard.auth_gate.desc":"Securely sync token quotas, concurrent costs, and latency across Claude Code, Cursor, and Gemini CLI in a beautifully unified real-time dashboard.","dashboard.auth_gate.feature.sync.title":"Real-time Cloud Sync","dashboard.auth_gate.feature.sync.desc":"Automated pipeline harvesting terminal execution costs into secure cloud records.","dashboard.auth_gate.feature.anal.title":"Multi-dimensional Analytics","dashboard.auth_gate.feature.anal.desc":"Slice and dice by models or period to isolate high-cost peaks and allocations.","dashboard.auth_gate.feature.guard.title":"Local-first Autonomy","dashboard.auth_gate.feature.guard.desc":"Skip all auth steps entirely on localhost. Preserves local debug speed.","dashboard.expired_gate.hero_title":"Your cloud session has expired","dashboard.expired_gate.desc":"For privacy and cloud drive security, active sessions expire automatically after a period. Verify again to restore your dashboard instantly.","dashboard.expired_gate.feature.sec.title":"Secure Protection","dashboard.expired_gate.feature.sec.desc":"Encrypted tokens automatically rotate, guaranteeing complete assets privacy.","dashboard.expired_gate.feature.restore.title":"Seamless Restore","dashboard.expired_gate.feature.restore.desc":"Instantly resume telemetry charts without reconfiguring terminal hooks.","dashboard.expired_gate.feature.cloud.title":"Multi-device Sync","dashboard.expired_gate.feature.cloud.desc":"Readily access parsed token logs anywhere through synced dashboard.","landing.v2.leaderboard.kicker":"GLOBAL TOKEN LEADERBOARD","landing.v2.leaderboard.title":"AI Token Efficiency","landing.v2.leaderboard.subtitle":"Optionally and anonymously sync your local AI token usage to join the global efficiency leaderboard. Benchmark cost efficiency and model rotations with users worldwide.","landing.v2.leaderboard.active_developers":"1,240+ users actively syncing","landing.v2.leaderboard.top_badge":"EFFICIENCY CHAMP","landing.v2.leaderboard.rank_first":"NO. 1 GLOBAL","landing.v2.leaderboard.rank_second":"NO. 2","landing.v2.leaderboard.rank_third":"NO. 3","landing.v2.leaderboard.synced_tokens":"{{count}} tokens synced","landing.v2.leaderboard.efficiency":"Efficiency: {{value}}","landing.v2.leaderboard.streak_days":"{{count}} day streak","landing.v2.leaderboard.view_more":"View full leaderboard","cmdk.placeholder":"Search pages and skills…","cmdk.empty":"No matches","cmdk.group.pages":"Pages","cmdk.group.skills":"Skills","cmdk.close":"Close command menu","cmdk.open_aria":"Command menu","skills.dot.synced_aria":"{{agent}}: synced. Click to unsync.","skills.dot.off_aria":"{{agent}}: not synced. Click to sync.","skills.dot.orphan_aria":"{{agent}}: link broken. Click to re-sync.","skills.update.badge":"Update","skills.select.row_aria":"Select {{name}}","skills.select.toolbar_aria":"Bulk actions","skills.select.count":"{{count}} selected","skills.select.bulk_sync":"Sync to","skills.select.bulk_sync_hint":"Add agent to all selected","skills.select.bulk_remove":"Remove","skills.select.clear":"Clear","skills.mode.popular":"Popular","skills.browse.placeholder_popular":"Filter popular skills","skills.empty.popular":"No popular skills right now.","skills.toast.bulk_synced":"Synced {{count}} skills to {{agent}}.","skills.toast.bulk_removed":"Removed {{count}} skills.","skills.toast.synced_one":"Synced {{name}} to {{agent}}.","skills.toast.unsynced_one":"Unsynced {{name}} from {{agent}}.","skills.toast.updated":"Updated {{name}}.","skills.toast.updated_many":"Updated {{count}} skills.","skills.toast.updated_partial":"Updated {{count}} of {{total}} skills. {{failed}} failed.","skills.toast.updated_none":"All skills are already up to date.","skills.confirm.bulk_remove_title":"Remove {{count}} skills?","skills.confirm.bulk_remove_desc":"This unsyncs each skill from every agent and deletes its local copy.","skills.confirm.update_all_title":"Update {{count}} skills?","skills.confirm.update_all_desc":"Each skill is re-downloaded from its source repository, replacing the local copy.","skills.update.available":"A newer version is available upstream.","skills.update.action":"Update","skills.update.all_action":"Update all ({{count}})","skills.update.rate_limited":"GitHub rate limit reached after {{count}} updates. Try again in an hour.","skills.usage.section_title":"Activity","skills.usage.invocations":"Invocations","skills.usage.cost":"Est. cost","skills.usage.never":"Never","skills.usage.last_used":"Last used","skills.usage.today":"Today","skills.usage.days_ago":"{{days}}d ago","skills.usage.months_ago":"{{months}}mo ago","skills.usage.unknown":"Unknown","skills.usage.unused":"Not invoked yet. Possible dead weight if you never use it.","skills.usage.disclaimer":"Counts from Claude transcripts. Cost is the approximate spend of turns that invoked this skill.","skills.inventory.plugin":"Plugin","skills.inventory.remote":"Other device","skills.inventory.on_devices":"Also on {{devices}}","skills.inventory.read_only_remote":"This skill is installed on another device and is shown here as read-only.","skills.inventory.read_only_managed":"This plugin skill is managed by its tool and cannot be changed or removed from Token Tracker.","skills.inventory.source":"Source: {{source}}","skills.inventory.devices_title":"Installed on other devices","dashboard.device_filter.all":"All devices","dashboard.device_filter.aria":"Filter by device","dashboard.device_card.title":"By device","dashboard.device_card.current":"This device","dashboard.device_card.unnamed":"Unnamed device","dashboard.device_card.rename_aria":"Rename device","dashboard.device_card.rename_placeholder":"Device name","dashboard.device_card.rename_save":"Save name","dashboard.device_card.rename_cancel":"Cancel","dashboard.device_card.rename_error":"Couldn't rename — that name may already be in use.","dashboard.device_card.clear":"Clear","dashboard.device_card.empty":"No active devices found","dashboard.device_card.account_scope":"Account-wide","dashboard.device_card.account_scope_tip":"Synced from the provider's account API — not tied to a single device","limits.provider.opencode_go":"OpenCode Go","limits.label.opencode_go_5h":"5h","limits.label.opencode_go_weekly":"Weekly","limits.label.opencode_go_monthly":"Monthly","limits.provider.qoder":"Qoder","limits.label.qoder_credits":"Credits","limits.label.qoder_ultimate":"Ultimate Free Calls","limits.provider.qoder_cn":"Qoder CN","limits.label.qoder_cn_credits":"Credits","limits.label.qoder_cn_ultimate":"Ultimate Free Calls","limits.qoder_calls.detail":"{{used}} / {{limit}} calls used · {{remaining}} left","limits.hover.expires_at":"Expires {{time}}","limits.opencodeGo.setupHint.title":"Connect OpenCode Go","limits.opencodeGo.setupHint.subtitle":"Reads your OpenCode Go usage from the official API (opencode.ai/zen/go/v1/usage).","limits.opencodeGo.setupHint.step1":"Sign in at opencode.ai and subscribe to Go.","limits.opencodeGo.setupHint.cta":"Open opencode.ai","limits.opencodeGo.setupHint.step2":"Create and copy an API key in the console.","limits.opencodeGo.setupHint.step3":"Run this command, paste your API key (input stays invisible), then restart TokenTracker:","limits.opencodeGo.setupHint.note_app":"macOS app: use the launchctl setenv line, then reopen the app.","limits.opencodeGo.setupHint.copy":"Copy","limits.opencodeGo.setupHint.copied":"Copied","settings.menubar.updates.checking":"Checking...","settings.menubar.updates.upToDate":"You are up to date!","settings.menubar.updates.failed":"Failed to check for updates. Please try again.","settings.menubar.updates.modalTitle":"Update Available","settings.menubar.updates.modalDescription":"A new version {{version}} is available. Would you like to view and download it on GitHub?","settings.menubar.updates.modalConfirm":"Download","settings.menubar.updates.modalCancel":"Cancel","settings.menubar.updates.footerCore":"TokenTracker v{{version}}","settings.menubar.updates.footerCombined":"TokenTrackerBar v{{barVersion}} (Core v{{coreVersion}})","nav.pet":"Pet","pet.page.eyebrow":"Desktop companion","pet.page.title":"Pet","pet.page.subtitle":"Choose a companion and preview how it reacts to your real AI activity.","pet.preview.states":"Preview pet states","pet.controls.title":"Desktop controls","pet.controls.show":"Show desktop pet","pet.controls.show_hint":"Keep your companion above other windows.","pet.controls.size":"Pet size","pet.controls.native_only":"Open this page in the TokenTracker desktop app to control the live pet.","pet.characters.title":"Choose your companion","pet.characters.subtitle":"Every character shares the full state system, with its own palette and silhouette.","pet.character.clawd":"Clawd","pet.character.clawd_desc":"The original claw-shaped token keeper.","pet.character.bot":"Bot","pet.character.bot_desc":"A single shape that morphs to match your token pace.","pet.bot.color":"Body colour","pet.bot.color.auto":"Match theme","pet.bot.color.bleu":"Blue","pet.bot.color.turquoise":"Teal","pet.bot.color.vert":"Green","pet.bot.color.ambre":"Amber","pet.bot.color.rose":"Pink","pet.bot.color.violet":"Violet","pet.character.sprout":"Sprout","pet.character.sprout_desc":"A leaf-eared seedling spirit with tiny root feet.","pet.character.byte":"Byte","pet.character.byte_desc":"A hovering terminal robot with expressive screen eyes.","pet.character.ember":"Ember","pet.character.ember_desc":"A flame-tailed fox spirit that celebrates hot streaks.","pet.state.calm":"Calm","pet.state.focus":"Focus","pet.state.multitask":"Multi-model","pet.state.streak":"Streak","pet.state.celebrate":"New usage","pet.state.rest":"Rest","pet.size.small":"Small","pet.size.medium":"Medium","pet.size.large":"Large","pet.import.title":"Import Codex Pet","pet.import.subtitle":"Paste a codex-pets.net link or choose a .zip package.","pet.import.add":"Add","pet.import.zip":"Choose package","pet.import.remove":"Remove pet","pet.import.success":"Pet imported and selected.","pet.import.failed":"Could not import this pet.","pet.import.busy":"Importing…","pet.format.v2":"V2","pet.import.removed":"Pet removed.","pet.import.url_label":"Codex Pets URL or pet id","pet.codex.title":"From Codex","pet.codex.subtitle":"Import pets you already have in the Codex app — including its built-in companions.","pet.codex.import":"Import selected","pet.codex.browse":"Import from Codex","pet.codex.close":"Close","pet.codex.select_all":"Select all","pet.codex.empty":"No new Codex pets to import.","pet.codex.imported":"Imported from Codex.","nav.achievements":"Achievements","achievements.section.title":"Achievements","achievements.page.title":"Achievements","achievements.page.local_note":"Project and night-owl badges stay on this device.","achievements.signin.prompt":"Sign in to earn cloud achievements and show them on the leaderboard.","achievements.mini.tooltip":"{{name}} — {{tier}}","achievements.badge.aria":"{{name}} — {{tier}}","achievements.tier.bronze":"Bronze","achievements.tier.silver":"Silver","achievements.tier.gold":"Gold","achievements.tier.diamond":"Diamond","achievements.modal.locked":"Locked","achievements.modal.achieved_label":"Achieved","achievements.modal.value_label":"Current value","achievements.modal.progress_to_next":"Progress to {{tier}}","achievements.modal.max_tier":"Max tier reached","achievements.modal.close":"Close","achievements.modal.tier_history":"Tier history","achievements.modal.coin_aria":"{{name}} badge coin — drag or use arrow keys to spin","achievements.modal.issue_number":"No.{{number}}","achievements.badge.token_titan.name":"Token Titan","achievements.badge.token_titan.desc":"Accumulate lifetime tokens across all your AI tools.","achievements.badge.big_day.name":"Big Day","achievements.badge.big_day.desc":"Burn through a massive number of tokens in a single day.","achievements.badge.wordsmith.name":"Wordsmith","achievements.badge.wordsmith.desc":"Accumulate output tokens — the code and words your AI actually writes.","achievements.badge.marathoner.name":"Marathoner","achievements.badge.marathoner.desc":"Rack up active days over your tracking history.","achievements.badge.streak.name":"On Fire","achievements.badge.streak.desc":"Keep an unbroken daily usage streak alive.","achievements.badge.weekend_warrior.name":"Weekend Warrior","achievements.badge.weekend_warrior.desc":"Keep shipping on Saturdays and Sundays.","achievements.badge.momentum.name":"Momentum","achievements.badge.momentum.desc":"Multiply your weekly usage over the previous week.","achievements.badge.polyglot.name":"Model Polyglot","achievements.badge.polyglot.desc":"Put many different models to work.","achievements.badge.trendsetter.name":"Trendsetter","achievements.badge.trendsetter.desc":"Adopt new models within their first week in the wild.","achievements.badge.multitool.name":"Multitool","achievements.badge.multitool.desc":"Track usage across many AI coding tools.","achievements.badge.podium.name":"Podium","achievements.badge.podium.desc":"Climb the all-time leaderboard.","achievements.badge.veteran.name":"Veteran","achievements.badge.veteran.desc":"Stick around — counted from your first tracked day.","achievements.badge.project_hopper.name":"Project Hopper","achievements.badge.project_hopper.desc":"Spread your tokens across many projects.","achievements.badge.project_devotion.name":"Project Devotion","achievements.badge.project_devotion.desc":"Pour tokens into a single beloved project.","achievements.badge.night_owl.name":"Night Owl","achievements.badge.night_owl.desc":"Code in the small hours between midnight and 6 AM.","achievements.signin.action":"Sign in","achievements.scope.local":"Local","achievements.page.suggest":"Have an idea for a new badge?","achievements.page.suggest_link":"Suggest it on GitHub","sessions.card.title":"Session efficiency","sessions.card.subtitle":"Comparable edit-turn signals across Claude and Codex","sessions.card.loading":"Analyzing local session metadata…","sessions.card.edit_sessions":"Edit sessions","sessions.card.first_pass":"First-pass","sessions.card.cost_edit":"Cost / edit","sessions.card.model":"Model","sessions.card.edit_session_value":"{{edits}} / {{sessions}}","sessions.card.edit_turn_count":"{{count}} edit turns","sessions.card.tokens_edit":"Tokens / edit","sessions.card.sample":"{{sessions}} sessions · {{edits}} edit turns","sessions.card.methodology_label":"How measured","sessions.card.methodology":"Edit = a user turn containing an observed edit tool. First-pass = exactly one edit turn with no repeated request.","sessions.card.context":"Estimated fixed context","sessions.card.context_tooltip":"Instructions, installed skills, and inferred MCP tool schemas","sessions.card.privacy":"Local metadata only. Prompt, response, command output, and diff contents are never retained.","sessions.card.subagents":"Subagent dispatches","sessions.card.subagent_item":"{{name}} · {{calls}}","sessions.page.refresh":"Refresh sessions","sessions.filter.source_aria":"Filter by session source","sessions.filter.range_aria":"Filter by date range","sessions.filter.range_7d":"7d","sessions.filter.range_30d":"30d","sessions.filter.range_90d":"90d","sessions.filter.project_all":"All projects","sessions.filter.project_search":"Search projects…","sessions.filter.project_empty":"No matching projects","sessions.filter.project_aria":"Filter by project","sessions.filter.result_count":"{{filtered}} of {{total}}","sessions.action.search_aria":"Search sessions","sessions.action.search_clear":"Clear search","sessions.search.placeholder":"Search title, project, model, or ID…","sessions.loading":"Loading sessions…","sessions.col.tokens":"Tokens","sessions.col.cost":"Cost","sessions.col.edits":"Edits","sessions.badge.first_pass":"First-pass","sessions.badge.reported_cost":"Reported cost","sessions.badge.partial_usage":"Partial usage","sessions.badge.partial_cost":"Partial cost","sessions.cost.partial_title":"Lower bound - some models in this session have no public rate, so their tokens cost $0 here.","sessions.grok.runtime_breakdown":"Model calls {{calls}} · API {{seconds}}s · Tools {{tools}} · Errors {{errors}}","sessions.grok.context_breakdown":"Context {{used}} / {{window}} ({{percent}}%)","sessions.badge.subagent":"Subagent","sessions.thread.expand":"Expand {{count}} subagents","sessions.thread.collapse":"Collapse {{count}} subagents","sessions.thread.tokens_summary":"Own {{own}} · Subagents {{subagents}} · Combined {{combined}}","sessions.thread.result_count":"{{roots}} root sessions · {{subagents}} subagents collapsed","sessions.thread.model_usage":"Subagent model usage","sessions.thread.model_all":"All · {{count}} agents · {{tokens}}","sessions.thread.model_item":"{{model}} · {{count}} agents · {{tokens}}","sessions.duration.minutes":"{{minutes}}m","sessions.duration.hours":"{{hours}}h {{minutes}}m","sessions.project.unknown":"Untitled session","sessions.model.unknown":"Unknown model","sessions.resume.copy_aria":"Copy resume command: {{command}}","sessions.resume.copied":"Resume command copied","sessions.resume.copy_failed":"Could not copy command","sessions.resume.unavailable":"Resume command unavailable","sessions.empty.title":"No sessions yet","sessions.empty.body":"Run Claude Code, Codex, OpenCode, Grok, or ZCode on this machine and your sessions will show up here.","sessions.empty.filtered_title":"No matching sessions","sessions.empty.filtered_body":"Try a different search, or widen the date range.","sessions.col.turns":"Turns","sessions.project.copy_hint":"Click to copy this path","sessions.project.copy_aria":"Copy the local path for {{project}}","sessions.project.copied":"Project path copied","sessions.project.copy_failed":"Could not copy path","sessions.action.load_more":"Show more sessions","sessions.error.title":"Could not load sessions","sessions.error.retry":"Try again","sessions.error.outdated_app":"This TokenTracker app is too old to list sessions. Update to the latest version.","sessions.truncated":"Showing the {{shown}} most recent of {{total}} sessions. Narrow the date range to see older ones.","sessions.privacy":"Processed locally. Prompt and response bodies, command output, and diff contents are never retained or uploaded.","limits.alert.enable":"Enable predictive limit alerts","limits.alert.disable":"Disable predictive limit alerts","limits.alert.title":"{{provider}} limit may run out early","limits.alert.body":"At the current pace, usage may run out in {{eta}} ({{percent}}% used).","limits.alert.blocked":"Notifications are off — allow in System Settings","limits.provenance.fresh":"Live","limits.provenance.stale":"Stale","limits.provenance.tooltip":"Source: {{source}}; confidence: {{confidence}}","limits.reauth.badge":"Re-auth","limits.reauth.tooltip":"Sign-in expired — run `{{command}}` in a terminal once to sign in again, then refresh.","shared.github.star":"Star","device.approval.title":"Approve your CLI","device.approval.description":"Enter the code shown by your CLI. It will link this machine to your account so its token usage appears in your leaderboard profile.","device.approval.sign_in_banner":"Sign in first, then return to this page.","device.approval.code_label":"CLI code","device.approval.action.approve":"Approve","device.approval.action.approving":"Approving…","device.approval.error.sign_in":"Please sign in first.","device.approval.error.invalid_code":"Invalid code format. Expected XXXX-XXXX.","device.approval.error.no_token":"No access token — please sign in again.","device.approval.success.already":"This device was already approved.","device.approval.success.already_client":"{{client}} was already approved.","device.approval.success.approved":"Approved. You can close this tab — your CLI will connect within a few seconds.","device.approval.success.approved_client":"Approved for {{client}}. You can close this tab — your CLI will connect within a few seconds.","device.approval.error.not_found":"Code not found. Double-check the code shown by your CLI.","device.approval.error.expired":"Code expired. Run `tracker device-login` again and retry.","device.approval.error.session_expired":"Session expired. Sign out, sign in, and try again.","device.approval.error.server":"Server error (HTTP {{status}}).","device.approval.error.server_detail":"Server error: {{message}}","device.approval.error.network":"Network error: {{message}}","dashboard.cost_breakdown.empty":"No spend recorded.","dashboard.cost_breakdown.model_column":"Model","dashboard.cost_breakdown.cost_column":"Cost","heatmap.3d.modal.eyebrow":"3D Insight","heatmap.tooltip.level":"Level {{level}}","heatmap.tooltip.tokens":"{{day}}: {{value}} tokens","heatmap.tooltip.model_breakdown":"Model Breakdown","heatmap.tooltip.token_breakdown":"Token Breakdown","trend.monitor.empty":"No data yet","trend.monitor.unsynced":"Unsynced","wrapped.loading":"Loading…","wrapped.error":"Couldn't load Wrapped: {{error}}","wrapped.empty":"No data for that year yet. Run `{{command}}` first.","wrapped.kicker":"TokenTracker Wrapped","wrapped.total_tokens":"Total tokens","wrapped.summary":"Across {{conversations}} conversations, {{days}} active days, and {{tools}} tools","wrapped.top_tools":"Top tools","wrapped.top_models":"Top models","wrapped.peak_hour":"Peak hour","wrapped.tokens":"{{count}} tokens","wrapped.longest_streak":"Longest streak","wrapped.days":"{{count}} days","wrapped.top_days":"Top days","wrapped.highlights":"Highlights","wrapped.footer":"Generated from local queue.jsonl · share with `{{command}}`","wrapped.highlight.model":"{{model}} powered {{percent}}% of your year.","wrapped.highlight.day":"Your busiest day was {{day}} ({{tokens}} tokens).","wrapped.highlight.hour":"You hit peak flow around {{hour}}:00 UTC.","wrapped.highlight.streak":"Longest streak: {{days}} consecutive days of coding with AI.","wrapped.highlight.tools":"You used {{count}} different AI tools — that's range.","widgets.preview.today":"Today","widgets.preview.seven_days":"7 days","widgets.preview.heatmap_summary":"tokens · {{days}} active days","widgets.preview.reset_days":"in {{days}}d","widgets.preview.reset_hours_minutes":"in {{hours}}h {{minutes}}m","widgets.preview.metric":"Metric","landing.v3.how.scene.terminal_title":"Terminal","landing.v3.how.scene.prompt":'"refactor the parser"',"landing.v3.how.scene.thinking":"thinking…","landing.v3.how.scene.editing":"editing {{path}}","landing.v3.how.scene.files_changed":"{{count}} files changed","landing.v3.how.scene.session_title":"session log · last turn","landing.v3.how.scene.appended":"appended locally","landing.v3.how.scene.total_tokens":"total tokens","subscriptions.add":"Add subscription","subscriptions.edit":"Edit","subscriptions.delete":"Delete","subscriptions.save":"Save","subscriptions.confirm_delete_title":"Delete this subscription?","subscriptions.delete_error":"Failed to delete. Please try again.","subscriptions.form.plan":"Plan","subscriptions.form.plan_placeholder":"e.g. Plus, Pro","subscriptions.form.auto_renew":"Auto-renew","subscriptions.form.auto_renew_on":"On","subscriptions.form.auto_renew_off":"Off","subscriptions.form.started_at":"Subscription date","subscriptions.form.cycle":"Billing cycle","subscriptions.form.cycle_weekly":"Weekly","subscriptions.form.cycle_monthly":"Monthly","subscriptions.form.cycle_yearly":"Yearly","subscriptions.form.error":"Something went wrong. Please try again.","subscriptions.status.auto_renew":"Auto-renew on","subscriptions.status.manual":"Auto-renew off","subscriptions.label.renews_at":"Next renewal","subscriptions.label.expires_at":"Expires","subscriptions.countdown":"in {{days}}d {{hours}}h {{minutes}}m","subscriptions.expired":"Expired","subscriptions.empty.title":"No subscriptions yet","subscriptions.empty.body":"Add a plan to keep an eye on its next renewal or expiry date.","subscriptions.load_error":"Failed to load subscriptions.","subscriptions.inline.label":"Subscription","subscriptions.badge.auto_renew":"Auto-renew","subscriptions.badge.stops":"Stops at expiry","subscriptions.form.provider":"Linked tool","subscriptions.form.provider_required":"Select a linked tool.","subscriptions.form.provider_taken":"This tool already has a subscription. Edit the existing record instead.","subscriptions.form.provider_taken_suffix":"(already subscribed)","limits.page.openSubscriptions":"Subscriptions","limits.page.refresh":"Refresh limits","limits.page.refresh_loading":"Refreshing limits…","limits.page.refreshed_at":"Limits updated {{time}}","limits.page.refresh_failed":"Couldn't refresh limits.","limits.page.refresh_partial":"Limits refreshed {{time}}, but some data still comes from cache or failed to update.","limits.page.refresh_stale":"Refresh finished, but every provider still reports cached or failed data.","limits.provider.ark_coding_plan":"Ark Coding Plan","limits.label.ark_coding_plan_5h":"5h","limits.label.ark_coding_plan_weekly":"Weekly","limits.label.ark_coding_plan_monthly":"Monthly","limits.codingPlan.setupHint.title":"Connect Ark Coding Plan","limits.codingPlan.setupHint.subtitle":"Quota is read from the official Ark CLI (arkcli) on this machine.","limits.codingPlan.setupHint.step1":"Install the Ark CLI from npm.","limits.codingPlan.setupHint.cta":"View install guide","limits.codingPlan.setupHint.step2":"Sign in with your Volcengine account (browser SSO recommended).","limits.codingPlan.setupHint.step2_remote":"Headless / remote terminals: arkcli auth login --no-browser","limits.codingPlan.setupHint.step3":"Run these, then refresh this page:","limits.codingPlan.setupHint.note_app":"Refresh after signing in — no app restart needed.","limits.codingPlan.setupHint.copy":"Copy","limits.codingPlan.setupHint.copied":"Copied","limits.provider.ark_agent_plan":"Ark Agent Plan","limits.label.ark_agent_plan_5h":"5h","limits.label.ark_agent_plan_weekly":"Weekly","limits.label.ark_agent_plan_monthly":"Monthly","limits.agentPlan.setupHint.title":"Connect Ark Agent Plan","limits.agentPlan.setupHint.subtitle":"Quota is read from the official Ark CLI (arkcli) on this machine.","limits.agentPlan.setupHint.step1":"Install the Ark CLI from npm.","limits.agentPlan.setupHint.cta":"View install guide","limits.agentPlan.setupHint.step2":"Sign in with your Volcengine account (browser SSO recommended).","limits.agentPlan.setupHint.step2_remote":"Headless / remote terminals: arkcli auth login --no-browser","limits.agentPlan.setupHint.step3":"Run these, then refresh this page:","limits.agentPlan.setupHint.note_app":"Refresh after signing in — no app restart needed.","limits.agentPlan.setupHint.copy":"Copy","limits.agentPlan.setupHint.copied":"Copied","limits.tooltip.ark_cached":"Cached limits. Run arkcli to refresh.","limits.agentPlan.setupHint.snippet_install":"npm install -g @volcengine/ark-cli","limits.agentPlan.setupHint.snippet_login":"arkcli auth login volc-sso # browser SSO (recommended)","limits.agentPlan.setupHint.snippet_status":"arkcli auth status # verify the session","limits.provider.command_code":"Command Code","limits.label.command_code_5h":"5h","limits.label.command_code_weekly":"Weekly","limits.commandCode.setupHint.title":"Connect Command Code","limits.commandCode.setupHint.subtitle":"Reads your subscription usage from the official Command Code API with the same login as the cmd CLI.","limits.commandCode.setupHint.step1":"Option 1 — sign in with the Command Code CLI (recommended): run the login command below. TokenTracker reuses that login with no restart.","limits.commandCode.setupHint.step2":"Option 2 — use an API key instead: run this command, paste your key (input stays invisible), then restart TokenTracker:","limits.commandCode.setupHint.copy":"Copy","limits.commandCode.setupHint.copied":"Copied","limits.commandCode.setupHint.note_app":"macOS app: use the launchctl setenv line, then reopen the app.","limits.commandCode.setupHint.snippet_login":"cmd login","limits.commandCode.setupHint.snippet_read":"read -r -s COMMAND_CODE_API_KEY","limits.commandCode.setupHint.snippet_export":"export COMMAND_CODE_API_KEY","limits.commandCode.setupHint.snippet_setenv":'launchctl setenv COMMAND_CODE_API_KEY "$COMMAND_CODE_API_KEY"',"limits.commandCode.setupHint.snippet_login_windows":"cmdc auth login","limits.commandCode.setupHint.snippet_env_windows":"$token = Read-Host -AsSecureString\\n$env:COMMAND_CODE_API_KEY = [System.Net.NetworkCredential]::new('', $token).Password\\n[Environment]::SetEnvironmentVariable('COMMAND_CODE_API_KEY', $env:COMMAND_CODE_API_KEY, 'User')","limits.commandCode.setupHint.note_windows":"Windows: run in PowerShell, then restart TokenTracker.","limits.commandCode.setupHint.note_linux":"Linux: start TokenTracker from this terminal to inherit the environment variable.","landing.discovery.tracked_usage":"Token Tracker tracks input, output, cached, and cache-creation tokens per model, project, and time window. It also detects usage limits for 17 providers, including Claude, Codex, Cursor, Gemini, Antigravity, Qoder, Qoder CN, Command Code, and Devin.","landing.discovery.limits_summary":"live quota and subscription status for 17 providers, with last-good caching for local providers such as Antigravity and Qoder.","landing.discovery.faq_usage":"Input, output, cached, and cache-creation tokens per model, project, and time window. It also surfaces usage limits for 17 providers, including Claude, Codex, Cursor, Gemini, Antigravity, Qoder, Qoder CN, Command Code, and Devin.","limits.provider.devin":"Devin","limits.label.devin_daily":"Daily","limits.label.devin_weekly":"Weekly","limits.devin.setupHint.title":"Connect Devin","limits.devin.setupHint.subtitle":"Reads your Devin subscription quota with the Devin CLI's saved sign-in on this machine.","limits.devin.setupHint.step1":"Install the Devin CLI and sign in with the command below — TokenTracker picks it up with no restart.","limits.devin.setupHint.note":"Refresh this page after signing in. TokenTracker sends the saved session token only to Devin's official quota endpoint.","limits.devin.setupHint.snippet_login":"devin auth login","quota.title":"Limits","quota.remaining":"Remaining","quota.stale":"Update delayed","quota.drag":"Drag to move","quota.choose":"Choose limits","quota.collapse":"Collapse","quota.expand":"Expand limits","quota.empty":"Connect a provider in the dashboard","quota.loading":"Loading limits…","quota.awaiting":"Waiting for updated limits","quota.resets":"Resets {{time}}","quota.no_reset":"Reset time unavailable","quota.unavailable":"Selected limits are unavailable","quota.dashboard":"Open dashboard","quota.pick_two":"Choose up to two windows","quota.percent":"%","quota.reset_in":"Resets in {{time}}","quota.close":"Close widget","quota.close_hint":"Close widget; reopen from the tray menu","provider.display.workbuddy_ai":"WorkBuddy AI","trend.monitor.pin_hint":"Click a bar to pin and scroll details","cloud.nav":"Cloud","cloud.page.eyebrow":"TokenTracker Cloud","cloud.page.title":"Choose your plan","cloud.page.subtitle":"Track locally for free. Choose Cloud for cross-device sync and hosted history.","cloud.selector.term":"Billing period","cloud.term.monthly":"Monthly","cloud.term.yearly":"Yearly","cloud.selector.billing_mode":"Payment terms","cloud.billing_mode.fixed":"Fixed term","cloud.billing_mode.recurring":"Auto-renewal","cloud.free.title":"Local, free","cloud.free.subtitle":"Everything you need to track usage on your own computer.","cloud.free.price":"Free","cloud.free.forever":"Complete local features, forever.","cloud.free.cta":"Use the free app","cloud.free.tracking":"All supported providers and cost estimates","cloud.free.limits":"Provider usage limits","cloud.free.desktop":"CLI and desktop features","cloud.free.exports":"Local history and exports","cloud.free.community":"Leaderboard, achievements, public profile; daily sync from one device","cloud.free.installations":"Unlimited local installations. No subscription needed.","cloud.plan.title":"TokenTracker Cloud","cloud.plan.subtitle":"Hosted sync and usage history across your devices, without maintaining a server.","cloud.price.pending":"Pending","cloud.price.waiting":"Price is available after the service responds.","cloud.price.per_year":"/ year","cloud.price.per_month":"/ month","cloud.price.annual_total":"{{total}} billed yearly. Equivalent to {{equivalent}}/month.","cloud.price.monthly_total":"{{total}} for one month.","cloud.price.savings":"Save {{percent}}% yearly","cloud.action.try":"Try free for {{days}} days","cloud.action.subscribe":"Subscribe to Cloud","cloud.action.manage_membership":"Manage membership","cloud.action.view_plans":"View Cloud plans","cloud.action.retry":"Retry","cloud.action.start_trial":"Start {{days}}-day free trial","cloud.action.sign_in_continue":"Sign in to continue","cloud.action.open_dashboard":"Open dashboard","cloud.action.choose_plan":"Choose a plan","cloud.action.create_checkout":"Continue to payment · {{amount}}","cloud.action.resume_order":"Continue payment","cloud.action.open_payment":"Open secure checkout","cloud.action.check_payment":"I've paid · Check status","cloud.action.checking":"Checking payment…","cloud.action.keep":"Keep current settings","cloud.action.restore":"Recover order","cloud.action.refresh_membership":"Refresh membership","cloud.action.manage_subscription":"Manage subscription","cloud.action.cancel_renewal":"Cancel auto-renewal","cloud.action.renew":"Renew Cloud","cloud.action.read_export":"View and export Cloud history","cloud.trial.no_card":"No card required. No automatic charge.","cloud.trial.disclosure":"Try Cloud free for {{days}} days, until {{date}}. No automatic charge.","cloud.trial.used_hint":"Your free trial has already been used. Choose a Cloud plan to continue.","cloud.trial.expiry":"After the trial, personal Cloud sync stops. You have 30 days to view and export retained Cloud data. Daily community uploads from one selected device, leaderboard participation and local tracking stay free.","cloud.trial.ends":"Your Cloud trial ends {{date}}.","cloud.renewal.manual":"Pay once. No automatic renewal.","cloud.renewal.auto":"Renews automatically. Cancel anytime; keep the paid term.","cloud.feature.sync":"Changed data syncs every {{minutes}} minutes. Pause or reconnect sync devices from your account.","cloud.feature.history":"{{days}} days of hourly detail and {{months}} months of daily history, with Cloud data exports.","cloud.feature.pro_identity":"Cloud avatar frame and badge. Rankings stay based on usage.","cloud.feature.privacy_detail":"No prompts, code, provider credentials, or local session and project records.","cloud.catalog.loading":"Loading Cloud availability…","cloud.catalog.preview":"Cloud subscriptions are not open yet. Payment and trial activation are disabled until launch.","cloud.catalog.provider_unavailable":"Cloud payments are unavailable right now. Your plan selection is kept; return later.","cloud.catalog.sandbox":"Payment sandbox. Test transactions do not buy a live Cloud membership.","cloud.faq.local_title":"What stays free?","cloud.faq.local_body":"All local tracking, integrations, estimates, limits, desktop features, and exports remain complete and open source. Cloud pays for hosted aggregation and history.","cloud.faq.expiry_title":"What happens when Cloud ends?","cloud.faq.expiry_body":"Personal Cloud synchronization ends. Free community uploads and leaderboard participation continue daily from one selected device; pause other active devices if needed. Retained personal Cloud history stays readable and exportable for 30 days. Local data and features remain available.","cloud.faq.existing_title":"Already using the cloud dashboard?","cloud.faq.existing_body":"Existing cloud accounts receive a 30-day transition when subscriptions launch. Your account page shows your exact transition end date.","cloud.faq.platform_title":"Do I pay separately for each platform?","cloud.faq.platform_body":"One membership covers your TokenTracker account across CLI, macOS, Windows, Linux, and web. You do not pay separately for each platform.","cloud.checkout.title":"Review your Cloud purchase","cloud.checkout.trial_title":"Start your Cloud trial","cloud.checkout.back":"Back to plans","cloud.checkout.local_free":"Your complete local app stays free with every plan.","cloud.checkout.sign_in":"Sign in to the TokenTracker account that should receive this membership. Your plan selection will be kept.","cloud.checkout.review":"Check your plan and payment terms. Waffo shows the final total before you pay.","cloud.checkout.summary":"Cloud includes","cloud.checkout.tax":"Listed USD prices exclude tax. Waffo calculates applicable tax and shows the final total before you pay.","cloud.checkout.choose_plan":"Choose a Cloud plan to continue.","cloud.checkout.loading":"Checking your order…","cloud.checkout.creating":"Preparing your payment order","cloud.checkout.starting_trial":"Starting your Cloud trial","cloud.checkout.awaiting":"Waiting for payment","cloud.checkout.activating":"Payment received, activating Cloud","cloud.checkout.success":"Your Cloud membership is active","cloud.checkout.canceled":"This order is closed","cloud.checkout.expired":"This order has expired","cloud.checkout.trial_success":"Your Cloud trial has started","cloud.checkout.pending_creation":"Your order is saved. The payment provider has not confirmed checkout yet. Check its status before trying again; do not create another order.","cloud.checkout.pending_payment":"Complete payment with the selected provider. This page will confirm membership after the server verifies the transaction.","cloud.checkout.received":"The server has recorded payment and is confirming membership. Use Check status if activation takes longer.","cloud.checkout.expired_detail":"This checkout can no longer accept payment. Choose a plan to create a new order. If you already paid, recover the order before paying again.","cloud.checkout.canceled_detail":"The server marked this order closed. If you already paid, check your membership or recover this order before purchasing again.","cloud.checkout.recovery_hint":"Already paid? Check status to ask the server to verify this order. Returning from checkout alone cannot activate membership.","cloud.checkout.order_id":"Order ID","cloud.checkout.expires":"Checkout expires {{date}}.","cloud.provider.alipay":"Alipay","cloud.provider.wechat":"WeChat Pay","cloud.provider.paddle":"Paddle","cloud.membership.title":"TokenTracker Cloud","cloud.membership.tools_title":"Tools & billing","cloud.billing.title":"Billing & payments","cloud.membership.signed_out":"Sign in to manage Cloud. The full local app stays free.","cloud.membership.expires":"Available until {{date}}","cloud.membership.transition_until":"Transition until {{date}}","cloud.membership.trial_until":"Trial until {{date}}","cloud.membership.active_until":"Active until {{date}}","cloud.membership.gift_until":"Gifted Cloud until {{date}}","cloud.membership.expired_on":"Expired on {{date}}","cloud.membership.renews":"Renews on {{date}}","cloud.membership.preview":"Subscriptions have not launched. Your current cloud access continues during preview.","cloud.membership.read_only":"Personal Cloud sync has ended. Read and export its history until {{date}}. Free daily community uploads and leaderboard participation continue from one selected device; pause other active devices.","cloud.membership.expired_detail":"Personal Cloud access has ended. Local tracking and exports remain free, as do daily community uploads and leaderboard participation from one selected device; pause other active devices.","cloud.membership.transition_detail":"Your existing Cloud account has a 30-day transition. After it ends, personal Cloud sync stops while free daily community uploads continue from one selected device.","cloud.membership.local_free":"Local tracking, history, and exports remain complete and free.","cloud.membership.renewal_off":"Auto-renewal is off.","cloud.cancel.detail":"Cancel auto-renewal? Your Cloud membership remains available until {{date}}. Local features are always free.","cloud.cancel.confirm":"Confirm cancellation","cloud.status.legacy_free":"Cloud preview","cloud.status.active":"Cloud active","cloud.status.trial":"Free trial","cloud.status.transition":"Transition period","cloud.status.expired":"Cloud expired","cloud.status.free":"Free local plan","cloud.status.unknown":"Checking membership","cloud.date.unknown":"Date unavailable","cloud.devices.title":"Cloud devices","cloud.devices.count":"{{count}} / {{limit}} devices","cloud.devices.unlimited":"{{count}} devices · preview","cloud.devices.detail":"Repeated sign-ins on the same system and user identity share a slot. Different systems or users may use separate slots. Local installations are unlimited.","cloud.devices.over_limit":"This account has more Cloud devices than its allowance. Pause an old device to allow another to sync.","cloud.devices.empty":"No Cloud devices linked yet.","cloud.devices.unnamed":"Unnamed device","cloud.devices.platform_unknown":"Platform unknown","cloud.devices.last_seen_unknown":"Last sync time unavailable","cloud.devices.last_seen":"Last seen {{date}}","cloud.devices.current":"This device","cloud.devices.remove":"Pause","cloud.devices.remove_detail":"Pause this device? Its Cloud slot is freed and new uploads stop. Local data and existing Cloud history stay. Resume it here before syncing again.","cloud.devices.confirm_remove":"Pause Cloud sync","cloud.restore.title":"Find an order","cloud.restore.detail":"Enter your order ID to check its status or continue payment.","cloud.restore.placeholder":"Paste your order ID","cloud.restore.invalid":"Enter a complete TokenTracker order ID.","cloud.history.title":"Payment history","cloud.history.date":"Date","cloud.history.amount":"Amount","cloud.history.status":"Status","cloud.history.paid":"Paid","cloud.history.pending":"Pending","cloud.history.empty":"No verified payments yet.","cloud.history.term":"{{start}} to {{end}}","cloud.history.refunded":"Refunded {{amount}}","cloud.error.auth":"Your sign-in needs refreshing. Sign in again with the account that owns this order.","cloud.error.unavailable":"Cloud billing is not available yet. You can keep using the complete free local app.","cloud.error.provider":"This payment method is not available right now.","cloud.error.subscription_exists":"An active subscription already exists. Manage it in Settings → Personal → Cloud before choosing another plan.","cloud.error.fixed_term":"Your current fixed-term membership is still active. Wait until it ends before starting an automatically renewing subscription.","cloud.error.trial":"This account cannot start another free trial. View Cloud plans or manage your current cloud access.","cloud.error.order_not_found":"This order was not found for your account. Check the order ID and sign in with the account used at checkout.","cloud.error.expired":"The checkout has expired. Check the order before creating another purchase.","cloud.error.request_conflict":"A previous purchase is still unresolved. Resume it in Settings → Personal → Cloud before creating a different purchase.","cloud.error.network":"The connection was interrupted. Your purchase request is kept. Retry or recover the same order before paying again.","cloud.error.browser":"The payment page did not open. Reopen checkout or recover this order; no new purchase is needed.","cloud.error.machines":"This account has reached its Cloud sync device limit. Review devices in Settings → Personal → Cloud.","cloud.error.generic":"We could not confirm this operation. Refresh your account or check this order again. Your local app continues to work.","cloud.error.catalog":"Cloud plans could not be loaded. Payments are disabled until the service is available.","cloud.devices.count_unknown":"Device count unavailable","cloud.error.devices":"Cloud devices could not be loaded. Retry to review your linked devices.","cloud.action.resume_purchase":"Resume previous purchase","cloud.devices.resume":"Resume sync","cloud.devices.paused":"Paused · no sync slot used","cloud.devices.active":"Sync slot in use","cloud.devices.resumed":"Cloud sync resumed. The device reconnects with a fresh connection on its next permitted sync.","cloud.devices.no_slot":"Pause another device to free a sync slot.","cloud.error.machine_paused":"This device is paused. Resume it explicitly in Settings → Personal → Cloud before syncing again.","cloud.error.membership":"Choose a Cloud plan to resume cloud access. Local tracking and exports remain free.","cloud.error.account_network":"The connection was interrupted. Refresh your account to check the latest state before trying again.","cloud.checkout.refunded":"This payment has been refunded","cloud.checkout.refunded_detail":"The server confirmed a full refund for this payment. Check Settings → Personal → Cloud for your current access and payment history.","cloud.checkout.term_ended":"This membership period has ended","cloud.checkout.term_ended_detail":"This payment remains in your account history. Choose a plan to renew Cloud; local features remain free.","cloud.error.account_provider":"Subscription management is unavailable right now. Refresh your account to confirm the current renewal status.","cloud.membership.renewal_paused":"Auto-renewal is paused. Check subscription details for any scheduled resumption.","cloud.membership.renewal_unknown":"The next billing date is unavailable. Check subscription details to confirm renewal.","cloud.membership.payment_due":"Payment needs attention. Update your payment method or check the bill to restore renewal.","cloud.cancel.no_term":"Cancel auto-renewal? Your current Cloud access stays as shown above. Local features remain free.","cloud.feature.analysis":"Cross-device analysis","cloud.feature.analysis_detail":"Combine usage across your devices. Review estimated costs, trends, and provider or model breakdowns from any browser.","cloud.feature.history_title":"Hosted history and exports","cloud.feature.sync_title":"Managed synchronization","cloud.self_host.title":"Prefer your own server?","cloud.self_host.body":"Self-host the open-source backend on your VPS. The software is free; you manage hosting, backups, and upgrades. Deployment is currently a technical preview.","cloud.self_host.cta":"Read deployment guidance","self_host.back":"Back to Cloud plans","self_host.status":"Technical preview","self_host.title":"Run your own backend.","self_host.subtitle":"TokenTracker is open source. You can build a private instance on your VPS using InsForge and the backend source. The software license is free; hosting and operations are yours.","self_host.preview_title":"The full deployment flow is still being verified","self_host.preview_body":"Backend TypeScript functions and SQL migrations are available. A clean TokenTracker schema bootstrap and fresh-VPS verification are still pending. Do not run every historical migration: some contain production-specific repairs.","self_host.steps_title":"What deployment involves","self_host.step.backend_title":"Deploy the InsForge stack","self_host.step.backend_body":"Use the official Docker Compose configuration, with your own domain, HTTPS, database, and authentication settings. InsForge’s cloud management CLI does not manage self-hosted instances.","self_host.step.schema_title":"Install TokenTracker’s schema and functions","self_host.step.schema_body":"Create the base tables, access policies, and aggregation functions before deploying the backend TypeScript. This bootstrap is still being prepared; historical patches alone are not an installer.","self_host.step.client_title":"Build clients for your own instance","self_host.step.client_body":"Configure the dashboard, authentication callbacks, and sync endpoints for your instance. Released desktop apps currently use the official service by default; a private instance requires a client build and connection checks.","self_host.responsibility_title":"You operate the service","self_host.responsibility_body":"You cover the VPS, domain, email delivery, backups, upgrades, and security. Free software does not include managed hosting or an uptime commitment.","self_host.community":"Your private instance has its own accounts and data. It does not feed the official public leaderboard.","self_host.link.insforge":"InsForge deployment reference","self_host.link.source":"Backend source","self_host.managed_title":"Want us to handle the servers?","self_host.managed_body":"TokenTracker Cloud includes cross-device analysis, hosted history, and synchronization on the official service. Your local app remains complete and free.","self_host.link.cloud":"View Cloud plans","cloud.checkout.waffo":"Secure checkout by Waffo","cloud.checkout.methods_fixed":"Pay with WeChat or a card where available. Waffo shows the supported methods. Checkout opens in a new tab; this order stays here.","cloud.checkout.methods_recurring":"Credit card, with Apple Pay or Google Pay where supported. Checkout opens in a new tab; this order stays here.","cloud.provider.waffo":"Waffo","cloud.provider.unknown":"Payment provider","cloud.membership.portal_login":"To view Waffo bills, sign in with the email used at checkout.","cloud.action.view_bills":"View payment bills","cloud.price.draft":"Test pricing draft. The same USD base price applies worldwide; prices are not yet final.","cloud.action.restart_checkout":"Close checkout and try again","cloud.action.restarting_checkout":"Closing unpaid checkout…","cloud.checkout.restart_detail":"Cannot reopen the Waffo payment page? Close this unpaid checkout and try again. Already paid? Check status first. The server must confirm it is unpaid; a payment in progress cannot restart.","cloud.checkout.verification_pending":"Payment confirmation is still pending. This checkout cannot restart yet. Check status to verify the original order before trying again.","cloud.checkout.duplicate_payment":"Payments were detected on both the original and replacement orders. Review your bills and contact support to resolve the duplicate charge. Do not pay again.","cloud.action.review_duplicate_payment":"Review duplicate payment","cloud.prompt.label":"Cloud options","cloud.prompt.dismiss":"Dismiss Cloud reminder","cloud.prompt.free":"Local tracking and exports stay free. Daily community uploads and leaderboard participation do not require membership.","cloud.prompt.sync":"Personal Cloud syncs changed usage across your devices every 15 minutes. Free community uploads continue daily from one selected device.","cloud.prompt.view":"Cloud brings your devices into one private usage view, with estimated costs and provider or model comparisons available from the web.","cloud.prompt.history":"Personal Cloud provides access to 90 days of hourly detail and 24 months of daily summaries across your devices. Your retained local history stays available without membership.","cloud.prompt.devices":"Free community uploads use one selected device. Cloud supports multi-device sync; you can also pause a device and keep using free community uploads.","cloud.prompt.devices_manage":"This device is paused or the sync allowance is full. Manage your registered devices to pause or reconnect one; their history stays intact.","cloud.prompt.history_window":"This date range is outside the Cloud history window. Choose a supported range, or use the complete history retained on your own machine.","cloud.prompt.unconfirmed":"Cloud purchase availability has not been confirmed. You can read about the hosted service while local use and daily free community uploads continue.","cloud.prompt.billing_recovery":"Your automatic-renewal subscription is still open, but personal Cloud access is currently unavailable. Review account billing and payment status to manage the existing subscription.","cloud.prompt.try":"Try Cloud free","cloud.prompt.learn":"Learn about Cloud","cloud.prompt.local":"Use local data","cloud.prompt.deadline_trial":"Your trial ends {{date}}. You will not be charged automatically. Personal Cloud history then has a 30-day read and export window; local use and community uploads stay free.","cloud.prompt.deadline_transition":"Your transition ends {{date}}. Existing personal Cloud history then has 30 days for reading and export. Local use and community uploads continue.","cloud.prompt.deadline_active":"Your Cloud access remains available through {{date}}. Check account billing for renewal status. Your local data stays available after the term ends.","instance.configuration.invalid":"This instance connection is not configured safely. The operator must provide a valid backend URL and that instance's public anon key, then reload and sign in.","instance.configuration.changed":"The backend instance changed. Reload and sign in to the selected instance.","cloud.status.self_hosted":"Self-hosted · free","cloud.self_host.instance_title":"Your free self-hosted instance","cloud.self_host.instance_body":"This account uses your own TokenTracker backend. It does not require an official Cloud subscription or payment, and its accounts and leaderboard are separate from the official service.","cloud.self_host.instance_retention":"The instance operator manages server capacity, backups and history retention. Ask them about its storage policy; official Cloud device/history pricing limits do not apply.","cloud.self_host.manage_devices":"Manage sync devices","cloud.devices.unlimited_self_hosted":"{{count}} registered sync devices","cloud.self_host.sync_hint":"Uploads go to this self-hosted instance. Its operator manages synchronization, storage and retention without an official Cloud membership.","instance.connection.destination":"Sign in to {{host}}. Your credentials will be sent to this instance.","cloud.self_host.public_profile_disabled":"Public profiles are not enabled on this private instance. Nothing is published to the official leaderboard.","legal.nav.pricing":"Cloud pricing","legal.nav.terms":"Terms of Service","legal.nav.support":"Support","cloud.action.open_app":"Open in TokenTracker","cloud.checkout.return_app_hint":"Check this order with the account signed in to your desktop app. The server confirms access.","cloud.gift.redeem_action":"Redeem Cloud code","cloud.gift.detail":"A gift includes all Cloud features and creates no auto-renewal. Any existing subscription is managed separately.","cloud.gift.code_label":"Cloud gift code","cloud.gift.confirm":"Redeem code","cloud.gift.redeeming":"Redeeming…","cloud.gift.redeemed":"Code redeemed","cloud.gift.already_redeemed":"You have already redeemed this code. Its gift is shown in your account.","cloud.gift.refresh_needed":"The code was redeemed, but membership could not be refreshed. Refresh your account to confirm its access and dates.","cloud.gift.redeem_another":"Redeem another code","cloud.gift.done":"Done","cloud.gift.membership_label":"Gifted Cloud","cloud.gift.history_title":"Cloud gifts","cloud.gift.duration":"{{days}} days of Cloud","cloud.gift.term":"{{days}} days of Cloud, {{start}} to {{end}}.","cloud.gift.state_active":"Active","cloud.gift.state_pending":"Starts after current access","cloud.gift.state_expired":"Expired","cloud.gift.state_revoked":"Revoked","cloud.gift.error_unavailable":"This code is unavailable. Check the code or contact the person who gave it to you.","cloud.gift.error_rate_limit":"Too many attempts. Wait a little before trying again.","cloud.gift.error_not_available":"Gift redemption is not available on this instance yet.","cloud.gift.error_renewal":"Turn off auto-renewal in Manage subscription before redeeming.","cloud.gift.error_checkout":"Finish the pending payment in Billing & payments before redeeming.","cloud.gift.error_active":"You have an active or upcoming Cloud gift. Manage it in your account before starting another payment.","cloud.gift.error_network":"The redemption result could not be confirmed. Retry the same code; an already recorded gift will not be added twice.","cloud.prompt.deadline_gift":"Your gifted Cloud access ends {{date}}. The gift creates no auto-renewal. Your local data stays available afterward.","sessions.filter.model_all":"All models","sessions.filter.model_search":"Search models…","sessions.filter.model_empty":"No matching models","sessions.filter.model_aria":"Filter by session model","sessions.filter.range_custom":"Custom","sessions.filter.from":"Sessions from","sessions.filter.to":"Sessions through","sessions.filter.clear":"Clear filters","sessions.group.aria":"Group sessions","sessions.group.time":"By date","sessions.group.project":"By project","sessions.group.unknown_date":"Unknown date","sessions.sort.aria":"Sort sessions","sessions.sort.recent":"Recent","sessions.sort.cost":"Highest cost","sessions.sort.tokens":"Most tokens","sessions.summary.count":"Matching sessions","sessions.summary.scope":"Token and cost totals use the selected dates for sessions with timestamped usage. Sessions without usage buckets retain lifetime totals. Turn, duration and performance metrics describe the full session. Each session and subagent is counted once.","sessions.summary.speed":"Estimated speed","sessions.performance.speed":"≈{{speed}} tok/s","sessions.performance.samples":"{{count}} timed requests","sessions.performance.method":"Output tokens / estimated request time, including response wait. Tool execution and idle time are excluded. This is not pure generation speed.","sessions.performance.first_response":"First response wait","sessions.performance.first_response_value":"{{seconds}}s · {{count}} samples","sessions.performance.first_response_method":"Average reported time to first token. Codex measures whole turns, which can include multiple model calls.","sessions.detail.open_aria":"View statistics for {{title}}","sessions.detail.title":"Session statistics","sessions.detail.close":"Close session statistics","sessions.detail.tokens":"Token composition","sessions.detail.models":"Models and cost","sessions.detail.own":"This session","sessions.detail.subagents":"Subagents","sessions.detail.signals":"Observed activity","sessions.detail.retries":"Repeated requests","sessions.detail.tools":"Tool calls","sessions.detail.tool_failures":"Tool failures","sessions.detail.errors":"Errors","sessions.detail.model_calls":"Model calls","sessions.detail.compactions":"Compactions","sessions.detail.cost_source":"Cost source","sessions.detail.cost_reported":"Reported by tool","sessions.detail.cost_estimated":"Model pricing estimate","sessions.detail.cost_mixed":"Reported and estimated","sessions.detail.cost_unknown":"Not reported","sessions.detail.pricing_unpriced":"No published rate","sessions.detail.pricing_free":"Free model","sessions.detail.pricing_rates":"Base USD / million tokens · Input {{input}} · Output {{output}} · Cache read {{cacheRead}} · Cache write {{cacheWrite}}. Tier and priority rates can differ.","sessions.detail.reasoning_note":"Reasoning is informational and may already be included in output tokens.","sessions.detail.no_speed":"No reliable timing samples","usage.filter.source_all":"All tools","dashboard.cost_breakdown.method":"Model rates estimate API-equivalent cost, not subscription spend. Tool-reported costs take priority; missing rates are excluded.","dashboard.cost_breakdown.reported":"Cost reported by the tool","dashboard.cost_breakdown.mixed":"Tool-reported costs and model estimates","dashboard.cost_breakdown.estimated":"Estimated from model pricing","dashboard.cost_breakdown.unpriced":"No rate found. These tokens are retained but their cost is unknown.","dashboard.cost_breakdown.no_token_charge":"No token charge for this source or model","dashboard.cost_breakdown.unpriced_label":"Unpriced","dashboard.cost_breakdown.token_mix":"Input {{input}} · Output {{output}} · Cache read {{read}} · Cache write {{write}}","dashboard.cost_breakdown.rates":"Base USD / million tokens · Input {{input}} · Output {{output}} · Cache read {{read}} · Cache write {{write}}. Tier and priority rates can differ.","dashboard.cost_breakdown.known_subtotal":"Known cost subtotal","dashboard.cost_breakdown.rate_unknown":"Rate unavailable","sessions.detail.not_recorded":"Not recorded","sessions.detail.pricing_litellm":"LiteLLM pricing","sessions.detail.pricing_curated":"Maintained pricing table","sessions.page.summary":"Local sessions, usage and estimated cost.","sessions.filter.range_label_all":"Any time","sessions.summary.scope_help":"About these totals","sessions.col.session":"Session / project","sessions.col.speed":"Speed","sessions.col.actions":"Actions","sessions.detail.consumption":"Usage and cost","sessions.detail.pricing_details":"Pricing details","sessions.detail.identifiers":"Session identifiers","sessions.detail.session_id":"Session ID","sessions.detail.local_path":"Local path","sessions.detail.resume_command":"Resume command","sessions.performance.first_response_value_single":"{{seconds}}s · {{count}} sample","cloud.export.open":"Export Cloud usage","cloud.export.description":"Daily totals · UTC dates · USD estimates","cloud.export.from":"From (UTC)","cloud.export.to":"To (UTC)","cloud.export.csv":"Download CSV","cloud.export.json":"Download JSON","cloud.export.busy":"Checking Cloud access and preparing your file…","cloud.export.error_auth":"Sign in again, then retry the export.","cloud.export.error_access":"This Cloud history is no longer available for export.","cloud.export.error_dates":"Choose a valid date range.","cloud.export.error_changed":"Your account, backend, dates or access changed. Retry the export.","cloud.export.error_failed":"The export failed. Try CSV or JSON again.","cloud.export.success":"Downloaded {{count}} recorded days from {{from}} to {{to}} (UTC).","cloud.export.empty":"No recorded days. The downloaded file contains scope metadata and no usage rows.","cloud.export.truncated":"Downloaded only the available range, {{from}} to {{to}} (UTC). The file also records your original request.","cloud.export.dashboard":"Open dashboard","cloud.action.buy_pro":"Buy Cloud","cloud.price.fixed_monthly_total":"One payment for one month.","cloud.price.fixed_annual_total":"One payment for one year. Equivalent to {{equivalent}}/month.","cloud.checkout.help_title":"Having trouble with payment?","cloud.faq.cost_title":"Why is Cloud paid?","cloud.faq.cost_body":"Official hosted synchronization, storage, bandwidth, backups and maintenance require ongoing resources as usage grows. Cloud subscriptions support this service and its continued maintenance. The complete local app remains free and open source.","cloud.plan.local_community":"Leaderboard, achievements and public profile","cloud.plan.monthly_equivalent":"Equivalent to {{equivalent}}/month","cloud.plan.sync":"Automatic sync every {{minutes}} minutes","cloud.plan.hourly_history":"{{days}} days of hourly usage detail","cloud.plan.daily_history":"{{months}} months of daily history and exports","cloud.plan.identity":"Cloud avatar frame and badge","cloud.plan.faq_title":"Questions about plans","cloud.plan.details_title":"What does Cloud include?","cloud.plan.self_host_summary":"Use your own server. Free software; hosting and maintenance are up to you. Technical preview.","cloud.plan.renewal_hint":"· Cancel anytime","cloud.plan.renewal_off":"· Pay once","cloud.plan.skip_trial":"Buy Cloud","cloud.plan.anywhere":"All your devices, in one browser dashboard","cloud.plan.retained_history":"{{days}} days of hourly detail · {{months}} months of daily history","cloud.onboarding.local_next":"Enable sync in Settings → Personal → Cloud to connect this device. Sign in with the same account on your other computers to see their usage together.","cloud.onboarding.web_next":"In the TokenTracker app on each computer, sign in with this account and enable sync in Settings → Personal → Cloud. Your usage will then appear here.","cloud.action.setup_sync":"Set up Cloud sync","cloud.login.trial_context":"Sign in to start your Cloud trial. Your plan selection is saved.","cloud.login.purchase_context":"Sign in to continue your Cloud purchase. Your plan selection is saved.","cloud.plan.trial_setup_hint":"Start your trial, then set up sync on your computers.","sessions.storage.label":"Transcript: {{size}}","sessions.storage.tooltip":"Session files only · {{metric}} · {{ratio}} bytes per 1K lifetime tokens. Shared databases, caches and project files are excluded.","sessions.storage.allocated":"allocated bytes","sessions.storage.logical":"logical file size","sessions.storage.size":"{{value}} MiB","cloud.free.device_scope":"Usage statistics for this device only","cloud.plan.includes_local":"All free local features included","cloud.plan.device_sync":"Unlimited devices · cross-device usage sync","cloud.plan.device_fair_use":"Unlimited devices for everyday personal use, with no per-device charges. Bulk or abnormal device connections may trigger sync protection."},ZN={"provider.display.workbuddy_ai":"WorkBuddy AI","header.auth.sign_in_aria":"登录","login.back_home":"返回首页","login.cloud_only":"未配置云端登录。请使用 localhost 上的本地仪表盘。","login.title":"登录","login.subtitle":"选择邮箱或已连接账号。","login.dismiss":"关闭","login.verify_email_success":"邮箱已验证。你现在可以登录。","login.verify_email_pending":"请先在邮箱中完成验证,然后再登录。","login.oauth.continue":"使用 {{provider}} 继续","login.oauth.desktop_start_failed":"无法启动桌面端登录,请重试。","login.divider":"或","login.tab.sign_in":"登录","login.tab.sign_up":"创建账户","login.field.name":"显示名称","login.field.name_placeholder":"可选","login.field.email":"电子邮件","login.field.password":"密码","login.forgot_password":"忘记密码?","login.password_hint":"至少 {{min}} 个字符。","login.submit.sign_in":"使用邮箱登录","login.submit.sign_up":"创建账号","reset_password.back_to_sign_in":"返回登录","reset_password.title":"重置密码","reset_password.subtitle":"输入邮箱以接收重置链接。","reset_password.request.submit":"发送重置链接","reset_password.request.sent":"已发送重置链接与验证码,请检查邮箱。","reset_password.field.code":"重置验证码","reset_password.field.new_password":"新密码","reset_password.field.confirm_password":"确认密码","reset_password.reset.submit":"重置密码","reset_password.error.password_mismatch":"两次输入的密码不一致。","reset_password.error.missing_token":"缺少重置令牌。请重新请求重置链接。","reset_password.success":"密码已更新。你现在可以使用新密码登录。","reset_password.success_cta":"返回登录","auth.callback.processing":"处理中…","auth.callback.success":"登录成功","auth.callback.redirecting":"正在返回 TokenTracker…","auth.callback.failed":"登录未完成,请重试。","auth.callback.close":"关闭此页","login_modal.subtitle":"登录以加入排行榜","login_modal.continue_email":"使用邮箱继续","login_modal.divider_email":"邮箱","shared.placeholder.short":"--","shared.unit.percent":"%","shared.unit.thousand_abbrev":"K","shared.unit.million_abbrev":"M","shared.unit.billion_abbrev":"B","shared.unit.trillion_abbrev":"T","shared.data_source":"数据来源:{{source}}","shared.error.prefix":"错误:{{error}}","shared.status.unsynced":"—","shared.time.now":"刚刚","shared.time.m_ago":"{{n}}分钟前","shared.time.h_ago":"{{n}}小时前","shared.time.d_ago":"{{n}}天前","error.boundary.title":"出了点问题","error.boundary.subtitle":"这个视图渲染失败了","error.boundary.hint":"打开控制台,然后重新加载页面","error.boundary.no_details":"没有错误详细信息","error.boundary.action.reload":"重新加载","identity_card.rank_label":"开始使用","identity_card.streak_label":"活跃天数","identity_card.rank_placeholder":"—","identity_card.streak_value":"{{days}} 天","usage.summary.total":"Token 总数","usage.summary.toggle_aria":"切换紧凑数字格式","usage.period.day":"日","usage.period.week":"周","usage.period.month":"月","usage.period.total":"总计","usage.period.custom":"自定义","usage.metric.total":"总计","usage.metric.input":"输入","usage.metric.output":"输出","usage.metric.cached_input":"缓存输入","usage.metric.reasoning_output":"推理输出","usage.button.refresh":"刷新","usage.overview.tablist_aria":"时间范围","usage.overview.cost_breakdown_aria":"查看成本明细","usage.overview.distribution_aria":"来源占比:{{items}}","usage.overview.distribution_item":"{{label}} {{percent}}%","usage.overview.provider_card_aria":"{{provider}}:{{percent}}%,{{tokens}} Token,{{cost}}。点击{{action}}详情","usage.overview.expand":"展开","usage.overview.collapse":"收起","usage.overview.model_count":"{{count}} 个模型","usage.overview.model_details_aria":"{{provider}} 模型详情","widgets.page.title":"菜单栏与小组件","widgets.cta.open_gallery":"打开小组件库","widgets.cta.download":"下载 Mac App","widgets.cta.macos_only":"仅限 macOS","widgets.menubar.section.title":"菜单栏","widgets.gallery.section.title":"桌面小组件","widgets.summary.name":"使用概览","widgets.summary.description":"今天和近 7 天的用量,以及紧凑趋势线。","widgets.heatmap.name":"热力图","widgets.heatmap.description":"像 GitHub 一样,一眼看清活跃和空闲的日子。","widgets.topModels.name":"热门模型","widgets.topModels.description":"你最常用的模型,按 Token 占比排序。","widgets.limits.name":"使用限制","widgets.limits.description":"Claude、Codex、Cursor、Gemini 等的实时速率限制进度。","daily.sort.date.label":"日期","daily.sort.date.title":"按日期排序","daily.sort.total.label":"总计","daily.sort.total.title":"按总计排序","daily.sort.input.label":"输入","daily.sort.input.title":"按输入排序","daily.sort.output.label":"输出","daily.sort.output.title":"按输出排序","daily.sort.cached.label":"缓存","daily.sort.cached.title":"按缓存输入排序","daily.sort.reasoning.label":"推理","daily.sort.reasoning.title":"按推理输出排序","daily.sort.conversations.label":"对话数","daily.sort.conversations.title":"按对话排序","details.pagination.prev":"上一页","details.pagination.next":"下一页","limits.copilot.otelHint.title":"跟踪 Copilot Token 使用情况","limits.copilot.otelHint.body":"限额信息通过你的 GitHub OAuth 令牌读取。如果还想记录逐 Token 用量,请启用 Copilot 的 OpenTelemetry 导出,把下面这段加到你的 shell 配置文件(~/.zshrc 或 ~/.bashrc):","limits.copilot.otelHint.copy":"复制","limits.copilot.otelHint.copied":"已复制","limits.panel.title":"使用限制","limits.panel.mode_separator":" · ","limits.label.cursor_plan":"套餐","limits.label.cursor_grok_bot":"Grok 机器人","limits.label.cursor_auto":"自动","limits.label.cursor_api":"API","limits.label.kiro_month":"月度","limits.label.kiro_bonus":"奖励","limits.label.kiro_tracked_credits":"本地用量:{{credits}} 积分 · {{count}} 个回合","limits.label.kimi_weekly":"周","limits.label.kimi_5h":"5h","limits.label.kimi_total":"总量","limits.label.kimi_parallel":"并发:{{count}}","limits.explain.used":"{{label}}:已用 {{used}}%","limits.explain.on_track":"{{label}}:节奏正常,预计用到 {{pct}}%","limits.explain.ahead_eta":"{{label}}:偏快,约 {{eta}} 后用完","limits.explain.ahead_pct":"{{label}}:偏快,预计用到 {{pct}}%","limits.explain.body":"竖标为匀速到现在应到的位置,填充超过即为偏快。","limits.explain.remaining":"{{label}}:剩余 {{used}}%","limits.explain.on_track_remaining":"{{label}}:节奏正常,预计剩余 {{pct}}%","limits.explain.ahead_pct_remaining":"{{label}}:偏快,预计剩余 {{pct}}%","limits.explain.body_remaining":"竖标为匀速到现在应到的位置,填充不足即为偏快。","limits.label.copilot_premium":"高级","limits.label.copilot_chat":"对话","limits.label.grok_month":"月度","limits.label.grok_week":"周","limits.label.grok_day":"日","limits.label.grok_ondemand":"按需","limits.provider.claude":"Claude","limits.provider.codex":"Codex","limits.provider.cursor":"Cursor","limits.provider.gemini":"Gemini","limits.provider.kimi":"Kimi","limits.provider.kiro":"Kiro","limits.provider.grok":"Grok Build","limits.provider.copilot":"GitHub Copilot","provider.display.omp":"oh-my-pi","provider.display.omo":"OmO","provider.display.minimax_code":"MiniMax Code","provider.display.command_code":"Command Code","provider.display.deepseek_harness":"DeepSeek Harness","provider.display.cline":"Cline","provider.display.trae":"TRAE","provider.display.trae_work_cn":"TRAE Work 中国版","limits.provider.antigravity":"Antigravity","limits.provider.zcode":"ZCode","limits.provider.opencode_go":"OpenCode Go","limits.provider.qoder":"Qoder","limits.provider.qoder_cn":"Qoder CN","limits.provider.command_code":"Command Code","limits.label.command_code_5h":"5h","limits.label.command_code_weekly":"每周","limits.label.zcode_glm52":"GLM-5.2","limits.label.zcode_glm5t":"GLM-5-Turbo","limits.label.opencode_go_5h":"5h","limits.label.opencode_go_weekly":"每周","limits.label.opencode_go_monthly":"每月","limits.label.qoder_credits":"积分","limits.label.qoder_ultimate":"Ultimate 免费调用","limits.label.qoder_cn_credits":"积分","limits.label.qoder_cn_ultimate":"Ultimate 免费调用","limits.provider.ark_coding_plan":"Ark Coding Plan","limits.label.ark_coding_plan_5h":"5h","limits.label.ark_coding_plan_weekly":"每周","limits.label.ark_coding_plan_monthly":"每月","limits.qoder_calls.detail":"已用 {{used}} / {{limit}} 次 · 剩余 {{remaining}} 次","limits.hover.expires_at":"{{time}} 到期","limits.label.claude_5h":"5h","limits.label.claude_7d":"7d","limits.label.claude_opus":"Opus","limits.label.codex_5h":"5h","limits.label.codex_7d":"7d","limits.label.codex_credits":"额度","limits.label.codex_spark_5h":"Spark 5h","limits.label.codex_spark_7d":"Spark 7d","limits.codex_credits.detail":"已用 {{used}} / {{limit}} 点额度 · 剩余 {{remaining}}","limits.codex_reset_bank.title":"重置","limits.codex_reset_bank.row_label":"重置 {{index}}","limits.codex_reset_bank.count_only":"重置额度:可用 {{count}} 次 · 到期时间不可用","limits.label.gemini_pro":"Pro","limits.label.gemini_flash":"Flash","limits.label.gemini_lite":"Lite","limits.label.antigravity_claude_weekly":"Cl 7d","limits.label.antigravity_claude_5h":"Cl 5h","limits.label.antigravity_gemini_weekly":"Gm 7d","limits.label.antigravity_gemini_5h":"Gm 5h","limits.label.antigravity_live":"实时","limits.label.antigravity_cached":"缓存","qpd.card.title":"研发性价比与交付成本","qpd.card.badge":"测试版","qpd.card.subtitle":"基于已合并 PR 与 AI 归因提交的历史,估算不同模型的平均交付成本。","qpd.card.updating":"更新中…","qpd.card.best_value":"最省钱","qpd.card.col_model":"模型","qpd.card.col_cost":"花费","qpd.card.col_accepted":"已合 PR","qpd.card.col_rate":"采纳率","qpd.card.col_qpd":"单PR成本","qpd.card.qpd_tooltip":"平均每合并一个 PR 消耗的 Token 资金 (总花费 ÷ 已合并数)","qpd.card.totals":"已合并 {{accepted}}/{{outcomes}} 个 PR · 总花费 {{cost}}","qpd.card.et":"有效 Token: {{tokens}} (采纳率 {{rate}})","qpd.card.et_tooltip":"有效 Token (Effective Tokens) —— 最终成功采纳并合并的代码所消耗的 Token 占总消耗的比例","qpd.card.sparse_notice":"提示:数据量较少,建议筛选更窄的时间区间以获得精准分析。","limits.tooltip.antigravity_live":"实时额度,来自你的 Antigravity Google 账号。","limits.tooltip.antigravity_cached":"缓存的额度。会用本机 Antigravity 登录凭据刷新,无需打开应用。","limits.tooltip.qoder_cached":"缓存的额度。启动 Qoder 以刷新。","limits.provenance.fresh":"实时","limits.provenance.stale":"过期","limits.provenance.tooltip":"来源:{{source}};可信度:{{confidence}}","limits.reauth.badge":"需重新登录","limits.reauth.tooltip":"登录已过期——在终端运行一次 `{{command}}` 重新登录,然后刷新。","limits.bar.sub_one_percent":"<1","limits.status.not_connected":"未连接","limits.status.no_data":"未返回实时限额数据","limits.opencodeGo.status.inactive":"OpenCode Go 订阅已失效","limits.status.all_hidden":"所有限额提供商都已隐藏。请打开显示设置重新显示。","nav.usage":"用量","nav.limits":"限额","nav.widgets":"菜单栏与小组件","nav.skills":"Skills","nav.leaderboard":"排行榜","nav.collapse":"折叠侧边栏","nav.expand":"展开侧边栏","nav.menu":"打开导航菜单","nav.close_menu":"关闭导航菜单","nav.aside_label":"主导航","nav.nav_label":"导航","limits.page.subtitle":"AI 工具的速率限制和配额使用情况。","leaderboard.community.tokens_label":"社区累计追踪 Token","leaderboard.community.devs":"{{count}} 位用户正在同步","leaderboard.community.view_stats":"查看全局社区统计","leaderboard.community.tokens_chip":"社区 Token","leaderboard.community.devs_chip":"用户","leaderboard.community.modal.title":"全局指标","leaderboard.community.modal.description":"保护隐私的社区 AI 使用概览。","leaderboard.community.modal.total_tokens":"总 Token","leaderboard.community.modal.active_devs":"活跃用户","leaderboard.community.modal.active_devs_detail":"{{count}} 正在同步","leaderboard.community.modal.global_spend":"预估花费","leaderboard.community.modal.global_spend_detail":"${{amount}} USD","leaderboard.community.modal.top_models":"热门模型","leaderboard.community.modal.all_time":"全部时间","leaderboard.community.modal.tokens_title":"{{count}} Token","leaderboard.community.modal.no_data":"暂无汇总数据","leaderboard.community.modal.activity_chart":"社区每日 Token 活跃趋势","leaderboard.community.modal.developers_short":"位用户","leaderboard.community.modal.daily_tokens":"每日 Token","leaderboard.community.modal.seven_day_average":"7 日均值","leaderboard.community.modal.composition":"构成","leaderboard.community.modal.token_mix":"Token 构成","leaderboard.community.modal.token_mix.input":"输入","leaderboard.community.modal.token_mix.cache_read":"缓存读取","leaderboard.community.modal.token_mix.cache_write":"缓存写入","leaderboard.community.modal.token_mix.output":"输出","leaderboard.community.modal.token_mix.reasoning":"推理","leaderboard.community.modal.last_30_days":"近 30 天","leaderboard.community.modal.daily_average":"日均 Token","leaderboard.community.modal.peak_day":"峰值日","leaderboard.community.modal.community_activity":"社区活跃趋势","leaderboard.community.modal.utc_note":"按 UTC 汇总每日数据","leaderboard.community.modal.ecosystem":"生态","leaderboard.community.modal.provider_distribution":"Provider 分布","leaderboard.community.modal.rank":"排名","leaderboard.community.modal.provider":"Provider","leaderboard.community.modal.usage_share":"用量占比","leaderboard.community.modal.developer_count":"{{count}} 位用户","leaderboard.community.modal.participation":"参与情况","leaderboard.community.modal.usage_distribution":"累计用量分层","leaderboard.community.modal.band.lt_1m":"低于 1M","leaderboard.community.modal.band.1m_10m":"1M–10M","leaderboard.community.modal.band.10m_100m":"10M–100M","leaderboard.community.modal.band.100m_1b":"100M–1B","leaderboard.community.modal.band.1b_plus":"1B+","leaderboard.community.modal.developer_share_title":"占贡献者的 {{share}}","leaderboard.community.modal.adoption":"采用情况","leaderboard.community.modal.platforms":"平台","leaderboard.community.modal.platform.darwin":"macOS","leaderboard.community.modal.platform.win32":"Windows","leaderboard.community.modal.platform.linux":"Linux","leaderboard.community.modal.machine_count":"{{count}} 个匿名安装","leaderboard.community.modal.platform_privacy":"平台采用数据仅使用匿名安装哈希,不采集位置或账户身份。","leaderboard.community.modal.model_landscape":"模型格局","leaderboard.community.modal.eyebrow":"社区洞察","leaderboard.community.modal.tokens_30d":"Token · 30 天","leaderboard.community.modal.contributors":"贡献者","leaderboard.community.modal.with_usage":"已有用量记录","leaderboard.community.modal.active_30d":"活跃 · 30 天","leaderboard.community.modal.vs_previous_week":"对比前 7 个完整日","leaderboard.community.modal.views":"全局指标视图","leaderboard.community.modal.updated":"更新于 {{time}}","leaderboard.community.modal.tab.overview":"概览","leaderboard.community.modal.tab.providers":"Provider","leaderboard.community.modal.tab.community":"社区","leaderboard.community.modal.tab.models":"模型","leaderboard.community.modal.note":"汇总数据每小时从社区标准聚合表刷新,不公开用户级明细。","shared.dialog.close":"关闭对话框","limits.settings.toggle_visible":"切换可见性","limits.settings.display_mode_label":"用量显示","limits.settings.display_mode_used":"已用","limits.settings.display_mode_remaining":"剩余","limits.page.openSettings":"显示设置","limits.page.openSubscriptions":"订阅管理","limits.page.refresh":"刷新限额","limits.page.refresh_loading":"正在刷新限额…","limits.page.refreshed_at":"限额已更新:{{time}}","limits.page.refresh_failed":"限额刷新失败。","limits.page.refresh_partial":"已于 {{time}} 刷新限额,但部分数据仍来自缓存或刷新失败。","limits.page.refresh_stale":"刷新完成,但所有服务商仍显示缓存或失败数据。","nav.group.general":"常规","nav.group.tools":"工具","nav.group.account":"账户","nav.settings":"设置","header.auth.open_settings":"打开设置","settings.page.title":"设置","settings.page.subtitle":"管理你的账户、外观和显示偏好。","settings.nav.group.personal":"个人","settings.nav.group.app":"应用","settings.nav.group.developer":"开发者","settings.section.appearance":"外观","settings.section.appearance.description":"主题、语言、货币和数字格式。","settings.section.account":"账户","settings.section.account.description":"公开资料和账户详情。","settings.section.cloud":"云服务","settings.section.cloud.description":"管理 Cloud 会员、账单和设备同步。","settings.section.limits":"用量与限额","settings.section.limits.description":"选择用量展示方式并配置限额服务商。","settings.section.network":"网络","settings.section.network.description":"控制云同步和诊断功能使用的代理。","settings.network.mode.label":"出网代理","settings.network.mode.hint":"选择 Token Tracker 云同步访问互联网时使用的代理。应用更新始终跟随系统代理。","settings.network.mode.system":"系统","settings.network.mode.manual":"手动","settings.network.mode.off":"关闭","settings.network.protocol.label":"协议","settings.network.protocol.http":"HTTP 代理","settings.network.protocol.https":"HTTPS 代理","settings.network.protocol.socks5":"SOCKS5 代理","settings.network.host.label":"主机","settings.network.host.placeholder":"127.0.0.1","settings.network.port.label":"端口","settings.network.port.placeholder":"7890","settings.network.test":"测试连接","settings.network.test.testing":"正在测试…","settings.network.test.ok":"已到达测试地址(HTTP {{status}})。","settings.network.test.fail":"无法连接:{{error}}","settings.network.save":"保存","settings.network.saving":"正在保存…","settings.network.saved":"代理设置已保存。","settings.network.error.host":"请填写主机,不要带 http:// 或路径。","settings.network.error.port":"请填写 1 到 65535 之间的端口。","settings.network.effective.manual":"当前正在使用手动代理。","settings.network.effective.env":"当前正在使用环境变量中的代理。","settings.network.effective.system":"当前正在使用系统代理。","settings.network.effective.none":"当前为直连。","settings.network.effective.blocked":"出网已被阻断:手动代理未能生效。","settings.network.apply_error":"已保存的代理未能生效:{{error}}。代理未生效,出网已被阻断,请检查代理设置。","settings.network.save_error":"无法保存代理设置:{{error}}","settings.network.save_error_unprotected":"无法保存代理设置:{{error}}。出网当前处于无保护状态——连阻断都失败了。","settings.limits.providers":"Provider","settings.labs.island.label":"灵动岛","settings.labs.island.hint":"将 MacBook 刘海变成灵动岛:收起时展示今日 Token 与花费,悬停查看花费与额度详情。","settings.labs.island.aria":"切换灵动岛","settings.labs.island_hide_menubar.label":"隐藏菜单栏图标","settings.labs.island_hide_menubar.hint":"启用灵动岛后隐藏顶部菜单栏图标,仅使用灵动岛。","settings.labs.island_hide_menubar.aria":"切换隐藏菜单栏图标","dashboard.island.title":"认识一下灵动岛","dashboard.island.hint":"把 MacBook 刘海变成实时 Token 仪表:今日 Token 与花费一目了然,悬停查看花费与额度详情。","dashboard.island.enable":"立即开启","dashboard.island.settings_link":"在设置中查看","dashboard.island.enabled_toast":"灵动岛已开启,抬头看看刘海吧","dashboard.island.dismiss_aria":"关闭灵动岛提示","dashboard.linux_pet.title":"认识一下桌面宠物","dashboard.linux_pet.hint":"桌面上的小伙伴——悬停查看今日 Token、花费和额度,随处拖动。","dashboard.linux_pet.show":"显示宠物","dashboard.linux_pet.settings_link":"宠物设置","dashboard.linux_pet.dismiss_aria":"关闭桌面宠物提示","settings.labs.qpd.label":"PR 研发性价比分析","settings.labs.qpd.hint":"基于已合并 PR 与 AI 归因提交,分析各模型的平均交付成本与有效 Token。","settings.labs.qpd.aria":"切换 PR 性价比分析","settings.labs.sessions.label":"会话效率分析","settings.labs.sessions.hint":"仅使用本地元数据,分析 Claude 与 Codex 的编辑覆盖、一次完成率和单次编辑成本。","settings.labs.sessions.aria":"切换会话效率分析","settings.appearance.theme.label":"主题","settings.appearance.theme.hint":"选择 Token Tracker 在仪表盘中的显示方式。","settings.appearance.theme.light":"浅色","settings.appearance.theme.dark":"深色","settings.appearance.theme.system":"系统","settings.account.displayName":"显示名称","settings.account.edit":"编辑","settings.account.save":"保存","settings.account.saving":"保存...","settings.account.cancel":"取消","settings.account.userId":"用户 ID","settings.account.copyUserId":"复制用户 ID","settings.account.copy":"复制","settings.account.copied":"已复制","settings.account.cloudSync":"云同步","settings.account.cloudSyncHint":"同步这台电脑的用量统计,汇总查看各设备用量。Prompt、代码和 Provider 凭据留在本地。","settings.account.cloudSyncPending":"正在尝试同步…","settings.account.cloudSyncError":"同步未完成。请检查网络、本地服务和登录状态后重试,本地记录不受影响。","settings.account.publicProfile":"公开主页","settings.account.publicProfileHint":"在公开排行榜中展示你的用量。","settings.account.displayNameAnonymousHint":"匿名状态下,排行榜会隐藏你的名字和头像","settings.account.displayNameDisabledWhileAnon":"请先关闭匿名,再编辑名字","settings.account.githubUrl":"GitHub 主页","settings.account.githubUrlHint":"在排行榜名字旁显示 GitHub 链接。","settings.account.githubUrlPlaceholder":"用户名或 https://github.com/用户名","settings.account.githubUrlInvalid":"请输入 GitHub 用户名,或 https://github.com/用户名","leaderboard.github.aria":"打开 GitHub 主页","leaderboard.github.tooltipAction":"点击查看 GitHub 主页","leaderboard.github.tooltipPrefix":"可在","leaderboard.github.tooltipSettingsLink":"设置","leaderboard.github.tooltipSuffix":"中配置你的主页","leaderboard.pro.badge":"Pro","leaderboard.pro.badge_aria":"TokenTracker Pro 会员","leaderboard.pro.tooltip":"Pro 会员,排名仍按用量计算。","settings.account.signOut":"退出登录","settings.account.signIn":"登录","settings.account.signedOutHint":"登录后可管理公开资料和账户详情。","settings.section.menubar":"App 与更新","settings.section.menubar.description":"管理后台同步、启动行为和应用更新。","settings.menubar.showStats":"在菜单栏中显示统计信息","settings.menubar.showStatsHint":"在菜单栏图标旁边显示今天的 Token 数量和成本。","settings.menubar.iconStyle":"菜单栏图标","settings.menubar.iconStyleHint":"选择谁住在菜单栏。AI 工具消耗 token 时,小猫和宠物会跑得更快。","settings.menubar.iconStyle.clawd":"Clawd","settings.menubar.iconStyle.bot":"Bot","settings.menubar.iconStyle.cat":"小猫","settings.menubar.iconStyle.pet":"我的宠物","settings.menubar.iconStyle.static":"静态","pet.menubar.title":"在菜单栏奔跑","pet.menubar.hint":"宠物将取代菜单栏图标,AI 工具消耗 token 时会加速冲刺。","settings.menubar.toastOnReset":"额度重置时显示提示","settings.menubar.toastOnResetHint":"用量额度重置时显示一条简短提示。","settings.menubar.confettiOnReset":"额度重置时撒花","settings.menubar.confettiOnResetHint":"在接近上限后,额度重置时放一场烟花庆祝。","settings.menubar.appearance":"菜单栏显示与图标","settings.menubar.appearanceHint":"统计信息、指标位与动态图标在「菜单栏与小组件」页面配置。","settings.menubar.appearanceLink":"前往","settings.menubar.launchAtLogin":"登录时启动","settings.menubar.launchAtLoginHint":"登录 macOS 时自动启动 TokenTrackerBar。","settings.menubar.syncNow":"立即同步","settings.menubar.syncNowHint":"触发本地AI工具日志立即解析并上传。","settings.menubar.syncing":"正在同步...","settings.menubar.updates":"更新","settings.menubar.autoUpdate":"自动更新","settings.menubar.autoUpdateHint":"在后台自动下载并安装新版本。关闭后仍可随时手动检查更新。","settings.menubar.checkUpdates":"检查更新","settings.footer.statusPage":"系统状态","menubar.slot.primary":"第一个位置","menubar.slot.secondary":"第二个位置","menubar.native_only":"打开 macOS 版 TokenTrackerBar 后可编辑菜单栏显示。","menubar.metric.today_tokens":"今日 Token","menubar.metric.none":"不显示(留空)","menubar.metric.today_cost":"今日成本","menubar.metric.last_7d_tokens":"近 7 天 Token","menubar.metric.total_tokens":"总 Token","menubar.metric.total_cost":"总成本","menubar.metric.claude_5h":"Claude 5 小时限额","menubar.metric.claude_7d":"Claude 7 天限额","menubar.metric.codex_5h":"Codex 5 小时限额","menubar.metric.codex_7d":"Codex 7 天限额","menubar.metric.codex_credits":"Codex 额度上限","menubar.metric.codex_spark_5h":"Codex Spark 5 小时限额","menubar.metric.codex_spark_7d":"Codex Spark 7 天限额","nav.ip_check":"Claude IP 检查","nav.service_status":"服务状态","status.page.subtitle":"来自各 AI 提供商官方状态页的实时事故状态。","status.page.source_note":"由浏览器直接读取各提供商的公开状态页,每分钟自动刷新。","status.state.checking":"检查中…","status.state.none":"运行正常","status.state.minor":"轻微事故","status.state.major":"重大事故","status.state.critical":"严重故障","status.state.unknown":"无法访问","status.open_page":"打开 {{provider}} 状态页","status.refresh":"刷新","status.last_checked":"检查于 {{time}}","skills.page.title":"Skills","skills.tab.my":"我的","skills.tab.browse":"发现","skills.action.refresh":"刷新","skills.action.install":"安装","skills.action.choose_targets":"选择目标","skills.target.menu_label":"安装到","skills.target.none":"未选目标","skills.toast.installed":"已把 {{name}} 安装到 {{targets}}。","skills.action.remove":"移除","skills.action.search":"搜索","skills.action.search_aria":"搜索 Skills","skills.action.search_clear":"清除搜索","skills.target.synced_summary":"已同步到 {{targets}}","skills.target.synced_none":"尚未同步到任何 Agent","skills.row.open_details":"查看 {{name}} 详情","skills.detail.close":"关闭详情","skills.detail.sync_section_title":"同步到","skills.detail.remove_button":"从所有 Agent 移除","skills.detail.remove_confirm_hint":"这会从每个 Agent 取消同步并删除本地副本。","skills.filter.agent_label":"Agent","skills.filter.agent_all":"全部 Agent","skills.filter.clear":"清除筛选","skills.my.placeholder":"筛选已安装的 Skills…","skills.filter.result_count":"{{filtered}} / {{total}} 个 Skill","skills.filter.result_count_browse":"{{count}} 个结果","skills.empty.no_match":"当前筛选下没有匹配的 Skill。","skills.inventory.plugin":"插件","skills.inventory.remote":"其他设备","skills.inventory.on_devices":"也安装在 {{devices}}","skills.inventory.read_only_remote":"此 Skill 安装在其他设备上,此处仅供查看。","skills.inventory.read_only_managed":"此插件 Skill 由对应工具管理,无法在 Token Tracker 中更改或移除。","skills.inventory.source":"来源:{{source}}","skills.inventory.devices_title":"安装于其他设备","hint.dismiss":"关闭提示","hint.dismissible_aria":"可关闭的提示","skills.card.installed":"已安装","skills.card.targets_prefix":"将安装到:","skills.card.targets_change":"更改","skills.card.installs":"{{count}} 次安装","skills.source.label":"来源","skills.source.all":"全部仓库","skills.mode.repo":"仓库","skills.mode.skillssh":"skills.sh","skills.browse.placeholder_all":"在已启用的仓库里搜索…","skills.browse.placeholder_repo":"在 {{repo}} 中搜索…","skills.browse.placeholder_skillssh":"在 skills.sh 仓库中搜索…","skills.browse.empty_sources":"添加一个 GitHub 仓库以开始浏览 Skills。","skills.browse.add_repo_hint":"想要更多 Skill?添加一个 GitHub 仓库。","skills.browse.manage_sources":"管理来源","skills.browse.hint_skillssh":"至少输入 2 个字符以搜索 skills.sh。","skills.browse.loading_hint":"正在从 GitHub 拉取 Skill 信息,首次加载可能需要一分钟,结果会缓存。","skills.error.generic":"Skill 操作失败。","skills.confirm.remove_title":"要移除 {{name}} 吗?","skills.confirm.remove_managed":"这个 Skill 将从所有已连接的 AI 工具中移除,几秒内可以撤销。","skills.confirm.remove_local":"将从所有 AI 工具目录中删除该 Skill 文件夹。此操作无法撤销。","skills.toast.removed":"已移除 {{name}}。","shared.action.undo":"撤销","shared.action.cancel":"取消","shared.action.apply":"应用","skills.empty.my":"还没有 Skill。去「发现」搜索或安装。","skills.empty.my_cta":"去发现","skills.empty.browse":"这个来源下没有找到 Skill。","skills.empty.search":"没有结果,换个关键词试试。","skills.repo.placeholder":"owner/repository","skills.repo.add":"添加仓库","skills.repo.invalid":"请输入 owner/repository 或 GitHub 仓库 URL。","skills.repo.remove":"移除仓库","settings.appearance.language.label":"语言","settings.appearance.language.hint":"使用“系统”时会默认跟随本机语言。","settings.appearance.language.system":"系统","settings.appearance.language.english":"英语","settings.appearance.language.chinese":"简体中文","settings.appearance.language.traditional_chinese":"繁体中文","settings.appearance.language.japanese":"日语","settings.appearance.language.korean":"韩语","settings.appearance.language.german":"德语","settings.appearance.currency.label":"货币","settings.appearance.currency.hint":"选择用量成本的显示币种。","settings.appearance.token_format.label":"Token 数字显示","settings.appearance.token_format.hint":"全局使用紧凑或完整数字;紧凑模式下悬停可查看精确数值。","settings.appearance.token_format.compact":"紧凑","settings.appearance.token_format.full":"完整","settings.appearance.token_unit.label":"数字单位","settings.appearance.token_unit.hint":"紧凑数字使用 K/M/B 或万/亿单位;完整数字不使用单位缩写。","settings.appearance.token_unit.english":"K/M/B(英文)","settings.appearance.token_unit.chinese":"万/亿(中文)","settings.appearance.currency.opt.usd":"美元 ($)","settings.appearance.currency.opt.eur":"欧元 (€)","settings.appearance.currency.opt.gbp":"英镑 (£)","settings.appearance.currency.opt.cny":"人民币 (¥)","settings.appearance.currency.opt.jpy":"日元 (¥)","settings.appearance.currency.opt.hkd":"港币 (HK$)","settings.appearance.currency.rate_source.default":"内置默认汇率","settings.appearance.currency.rate_source.fetched":"数据源:open.er-api.com","settings.appearance.currency.rate_updated":"更新于 {{when}}","settings.appearance.currency.rate_never":"尚未刷新","sessions.card.title":"会话效率","sessions.card.subtitle":"Claude 与 Codex 的统一编辑回合指标","sessions.card.loading":"正在分析本地会话元数据…","sessions.card.edit_sessions":"编辑会话","sessions.card.first_pass":"一次完成","sessions.card.cost_edit":"单次编辑成本","sessions.card.model":"模型","sessions.card.edit_session_value":"{{edits}} / {{sessions}}","sessions.card.edit_turn_count":"{{count}} 个编辑回合","sessions.card.tokens_edit":"单次编辑 Token","sessions.card.sample":"{{sessions}} 个会话 · {{edits}} 个编辑回合","sessions.card.methodology_label":"统计口径","sessions.card.methodology":"编辑 = 一个包含已观测编辑工具的用户回合。一次完成 = 仅有一个编辑回合,且用户没有重复提出同一请求。","sessions.card.context":"预估固定上下文","sessions.card.context_tooltip":"指令、已安装 Skills 与推断的 MCP 工具结构","sessions.card.privacy":"仅处理本地元数据,不保留 Prompt、回复、命令输出或差异内容。","sessions.card.subagents":"Sub-agent 调度","sessions.card.subagent_item":"{{name}} · {{calls}}","nav.sessions":"会话","sessions.page.refresh":"刷新会话","sessions.filter.source_aria":"按会话来源筛选","sessions.filter.range_aria":"按日期范围筛选","sessions.filter.range_7d":"7 天","sessions.filter.range_30d":"30 天","sessions.filter.range_90d":"90 天","sessions.filter.project_all":"所有项目","sessions.filter.project_search":"搜索项目…","sessions.filter.project_empty":"无匹配项目","sessions.filter.project_aria":"按项目筛选","sessions.filter.result_count":"{{filtered}} / {{total}}","sessions.action.search_aria":"搜索会话","sessions.action.search_clear":"清除搜索","sessions.search.placeholder":"搜索标题、项目、模型或 ID…","sessions.loading":"正在加载会话…","sessions.col.tokens":"Token 数","sessions.col.cost":"花费","sessions.col.edits":"编辑","sessions.badge.first_pass":"一次完成","sessions.badge.reported_cost":"官方费用","sessions.badge.partial_usage":"用量不完整","sessions.badge.partial_cost":"成本不完整","sessions.cost.partial_title":"下限值 — 本会话中部分模型没有公开费率,其 token 在此按 $0 计。","sessions.grok.runtime_breakdown":"模型调用 {{calls}} 次 · API {{seconds}} 秒 · 工具调用 {{tools}} 次 · 错误 {{errors}} 个","sessions.grok.context_breakdown":"上下文 {{used}} / {{window}}({{percent}}%)","sessions.badge.subagent":"子代理","sessions.thread.expand":"展开 {{count}} 个子代理","sessions.thread.collapse":"收起 {{count}} 个子代理","sessions.thread.tokens_summary":"自身 {{own}} · 子代理 {{subagents}} · 合计 {{combined}}","sessions.thread.result_count":"{{roots}} 个主线程 · {{subagents}} 个子代理已折叠","sessions.thread.model_usage":"子代理模型用量","sessions.thread.model_all":"全部 · {{count}} 个 · {{tokens}}","sessions.thread.model_item":"{{model}} · {{count}} 个 · {{tokens}}","sessions.duration.minutes":"{{minutes}} 分","sessions.duration.hours":"{{hours}} 时 {{minutes}} 分","sessions.project.unknown":"未命名会话","sessions.model.unknown":"未知模型","sessions.resume.copy_aria":"复制恢复命令:{{command}}","sessions.resume.copied":"已复制恢复命令","sessions.resume.copy_failed":"无法复制命令","sessions.resume.unavailable":"暂无恢复命令","sessions.empty.title":"还没有会话","sessions.empty.body":"在这台机器上运行 Claude Code、Codex 或 Grok,会话就会出现在这里。","sessions.empty.filtered_title":"没有匹配的会话","sessions.empty.filtered_body":"换个搜索词,或放宽时间范围。","sessions.col.turns":"轮数","sessions.project.copy_hint":"点击复制该路径","sessions.project.copy_aria":"复制 {{project}} 的本地路径","sessions.project.copied":"项目路径已复制","sessions.project.copy_failed":"无法复制路径","sessions.action.load_more":"显示更多会话","sessions.error.title":"无法加载会话","sessions.error.retry":"重试","sessions.error.outdated_app":"当前 TokenTracker 版本过旧,无法列出会话。请更新到最新版本。","sessions.truncated":"仅显示最近 {{shown}} 个会话(共 {{total}} 个)。缩小时间范围可看到更早的会话。","sessions.privacy":"仅在本地处理。Prompt 与回复正文、命令输出和差异内容绝不保留或上传。","nav.achievements":"成就","limits.alert.enable":"开启额度预测提醒","limits.alert.disable":"关闭额度预测提醒","limits.alert.title":"{{provider}} 额度可能提前用尽","limits.alert.body":"按当前速度,额度可能在 {{eta}} 后用尽(已用 {{percent}}%)。","settings.section.labs":"实验功能","settings.section.labs.description":"提前体验即将成为标准功能的实验性洞察。","limits.alert.blocked":"通知已关闭——去系统设置中允许","limits.hover.resets_at":"{{time}} 重置","limits.reset_bank.hover_detail":"{{date}} 到期 · 剩余 {{days}} 天","limits.reset_bank.hover_detail_today":"{{date}} 到期 · 今天","limits.label.zcode_5h":"5 小时","limits.label.zcode_weekly":"每周","limits.label.zcode_tools":"工具","limits.opencodeGo.setupHint.title":"连接 OpenCode Go","limits.opencodeGo.setupHint.subtitle":"通过官方 API(opencode.ai/zen/go/v1/usage)读取你的 OpenCode Go 用量。","limits.opencodeGo.setupHint.step1":"登录 opencode.ai 并订阅 Go。","limits.opencodeGo.setupHint.cta":"打开 opencode.ai","limits.opencodeGo.setupHint.step2":"在控制台创建并复制 API Key。","limits.opencodeGo.setupHint.step3":"执行这条命令,粘贴 API Key(输入不会显示),然后重启 Token Tracker:","limits.opencodeGo.setupHint.note_app":"macOS App:使用 launchctl setenv 那一行,然后重新打开 App。","limits.opencodeGo.setupHint.copy":"复制","limits.opencodeGo.setupHint.copied":"已复制","limits.commandCode.setupHint.title":"连接 Command Code","limits.commandCode.setupHint.subtitle":"通过官方 Command Code API 读取你的订阅用量,复用与 cmd CLI 相同的登录。","limits.commandCode.setupHint.step1":"方式 1 — 使用 Command Code CLI 登录(推荐):运行下方登录命令。TokenTracker 自动复用登录,无需重启。","limits.commandCode.setupHint.step2":"方式二——改用 API Key:运行以下命令,粘贴你的 Key(输入不会显示),然后重启 TokenTracker:","limits.commandCode.setupHint.copy":"复制","limits.commandCode.setupHint.copied":"已复制","limits.commandCode.setupHint.note_app":"macOS App:使用 launchctl setenv 那一行,然后重新打开 App。","limits.codingPlan.setupHint.title":"连接 Ark Coding Plan","limits.codingPlan.setupHint.subtitle":"额度通过本机的官方 Ark CLI(arkcli)读取。","limits.codingPlan.setupHint.step1":"通过 npm 安装 Ark CLI。","limits.codingPlan.setupHint.cta":"查看安装指南","limits.codingPlan.setupHint.step2":"使用火山引擎账号登录(推荐浏览器 SSO)。","limits.codingPlan.setupHint.step2_remote":"无浏览器 / 远程终端:arkcli auth login --no-browser","limits.codingPlan.setupHint.step3":"依次执行以下命令,然后刷新本页:","limits.codingPlan.setupHint.note_app":"登录后刷新页面即可,无需重启 App。","limits.codingPlan.setupHint.copy":"复制","limits.codingPlan.setupHint.copied":"已复制","limits.provider.ark_agent_plan":"Ark Agent Plan","limits.label.ark_agent_plan_5h":"5h","limits.label.ark_agent_plan_weekly":"每周","limits.label.ark_agent_plan_monthly":"每月","limits.agentPlan.setupHint.title":"连接 Ark Agent Plan","limits.agentPlan.setupHint.subtitle":"额度通过本机的官方 Ark CLI(arkcli)读取。","limits.agentPlan.setupHint.step1":"通过 npm 安装 Ark CLI。","limits.agentPlan.setupHint.cta":"查看安装指南","limits.agentPlan.setupHint.step2":"使用火山引擎账号登录(推荐浏览器 SSO)。","limits.agentPlan.setupHint.step2_remote":"无浏览器 / 远程终端:arkcli auth login --no-browser","limits.agentPlan.setupHint.step3":"依次执行以下命令,然后刷新本页:","limits.agentPlan.setupHint.note_app":"登录后刷新页面即可,无需重启 App。","limits.agentPlan.setupHint.copy":"复制","limits.agentPlan.setupHint.copied":"已复制","limits.tooltip.ark_cached":"缓存的额度。运行 arkcli 刷新。","limits.agentPlan.setupHint.snippet_install":"npm install -g @volcengine/ark-cli","limits.agentPlan.setupHint.snippet_login":"arkcli auth login volc-sso # 浏览器 SSO(推荐)","limits.agentPlan.setupHint.snippet_status":"arkcli auth status # 验证会话","skills.card.manage":"管理","skills.dot.synced_aria":"{{agent}}:已同步。点击可取消同步。","skills.dot.off_aria":"{{agent}}:未同步。点击可同步。","skills.dot.orphan_aria":"{{agent}}:链接已失效。点击可重新同步。","skills.update.badge":"可更新","skills.select.row_aria":"选择 {{name}}","skills.select.toolbar_aria":"批量操作","skills.select.count":"已选择 {{count}} 项","skills.select.bulk_sync":"同步到","skills.select.bulk_sync_hint":"将所选 Skill 全部添加到此 Agent","skills.select.bulk_remove":"移除","skills.select.clear":"清除选择","skills.mode.popular":"热门","skills.browse.placeholder_popular":"筛选热门 Skills","skills.empty.popular":"目前没有热门 Skill。","skills.toast.bulk_synced":"已将 {{count}} 个 Skill 同步到 {{agent}}。","skills.toast.bulk_removed":"已移除 {{count}} 个 Skill。","skills.toast.synced_one":"已将 {{name}} 同步到 {{agent}}。","skills.toast.unsynced_one":"已取消 {{name}} 与 {{agent}} 的同步。","skills.toast.updated":"已更新 {{name}}。","skills.toast.updated_many":"已更新 {{count}} 个 Skill。","skills.toast.updated_partial":"已更新 {{total}} 个 Skill 中的 {{count}} 个,{{failed}} 个失败。","skills.toast.updated_none":"所有 Skill 均为最新。","skills.confirm.bulk_remove_title":"移除 {{count}} 个 Skill?","skills.confirm.bulk_remove_desc":"这会取消每个 Skill 与所有 Agent 的同步,并删除其本地副本。","skills.update.available":"上游有新版本可用。","skills.update.action":"更新","skills.update.all_action":"全部更新({{count}})","skills.update.rate_limited":"已更新 {{count}} 个 Skill 后触发 GitHub 速率限制。请一小时后重试。","skills.confirm.update_all_title":"更新 {{count}} 个 Skill?","skills.confirm.update_all_desc":"每个 Skill 都会从其源仓库重新下载,覆盖本地副本。","skills.usage.section_title":"活动情况","skills.usage.invocations":"调用次数","skills.usage.cost":"预估费用","skills.usage.never":"从未使用","skills.usage.last_used":"上次使用","skills.usage.today":"今天","skills.usage.days_ago":"{{days}} 天前","skills.usage.months_ago":"{{months}} 个月前","skills.usage.unknown":"未知","skills.usage.unused":"尚未调用。如果你从未使用它,它可能只是无用负担。","skills.usage.disclaimer":"调用次数来自 Claude 对话记录;费用是调用此 Skill 的各轮对话的近似花费。","shared.action.dismiss":"关闭","cmdk.placeholder":"搜索页面和 Skills…","cmdk.empty":"没有匹配项","cmdk.group.pages":"页面","cmdk.group.skills":"Skills","cmdk.close":"关闭命令菜单","cmdk.open_aria":"命令菜单","settings.menubar.updates.checking":"正在检查…","settings.menubar.updates.upToDate":"已是最新版本!","settings.menubar.updates.failed":"检查更新失败,请重试。","settings.menubar.updates.modalTitle":"有可用更新","settings.menubar.updates.modalDescription":"新版本 {{version}} 已发布。是否前往 GitHub 查看并下载?","settings.menubar.updates.modalConfirm":"下载","settings.menubar.updates.modalCancel":"取消","settings.menubar.updates.footerCore":"TokenTracker v{{version}}","settings.menubar.updates.footerCombined":"TokenTrackerBar v{{barVersion}}(Core v{{coreVersion}})","shared.github.star":"Star","device.approval.title":"授权你的 CLI","device.approval.description":"输入 CLI 显示的代码,将此设备关联到你的账号;该设备的 Token 用量随后会显示在你的排行榜主页中。","device.approval.sign_in_banner":"请先登录,然后返回此页面。","device.approval.code_label":"CLI 代码","device.approval.action.approve":"授权","device.approval.action.approving":"正在授权…","device.approval.error.sign_in":"请先登录。","device.approval.error.invalid_code":"代码格式无效,应为 XXXX-XXXX。","device.approval.error.no_token":"未获取到访问令牌,请重新登录。","device.approval.success.already":"此设备此前已经授权。","device.approval.success.already_client":"{{client}} 此前已经授权。","device.approval.success.approved":"授权成功。你可以关闭此标签页,CLI 将在几秒内完成连接。","device.approval.success.approved_client":"已授权 {{client}}。你可以关闭此标签页,CLI 将在几秒内完成连接。","device.approval.error.not_found":"找不到该代码,请核对 CLI 显示的内容。","device.approval.error.expired":"代码已过期,请重新运行 `tracker device-login` 后再试。","device.approval.error.session_expired":"会话已过期,请退出账号、重新登录后再试。","device.approval.error.server":"服务器错误(HTTP {{status}})。","device.approval.error.server_detail":"服务器错误:{{message}}","device.approval.error.network":"网络错误:{{message}}","widgets.preview.today":"今天","widgets.preview.seven_days":"7 天","widgets.preview.heatmap_summary":"Token · {{days}} 个活跃日","widgets.preview.reset_days":"{{days}} 天后","widgets.preview.reset_hours_minutes":"{{hours}} 小时 {{minutes}} 分钟后","widgets.preview.metric":"指标","settings.limits.showSubscriptions":"显示订阅","settings.limits.showSubscriptionsHint":"在限额面板中显示手动记录的订阅续费进度。","limits.commandCode.setupHint.snippet_login":"cmd login","limits.commandCode.setupHint.snippet_read":"read -r -s COMMAND_CODE_API_KEY","limits.commandCode.setupHint.snippet_export":"export COMMAND_CODE_API_KEY","limits.commandCode.setupHint.snippet_setenv":'launchctl setenv COMMAND_CODE_API_KEY "$COMMAND_CODE_API_KEY"',"limits.commandCode.setupHint.snippet_login_windows":"cmdc auth login","limits.commandCode.setupHint.snippet_env_windows":"$token = Read-Host -AsSecureString\\n$env:COMMAND_CODE_API_KEY = [System.Net.NetworkCredential]::new('', $token).Password\\n[Environment]::SetEnvironmentVariable('COMMAND_CODE_API_KEY', $env:COMMAND_CODE_API_KEY, 'User')","limits.commandCode.setupHint.note_windows":"Windows:在 PowerShell 中运行,然后重启 TokenTracker。","limits.commandCode.setupHint.note_linux":"Linux:从当前终端启动 TokenTracker,以读取环境变量。","limits.provider.devin":"Devin","limits.label.devin_daily":"每日","limits.label.devin_weekly":"每周","limits.devin.setupHint.title":"连接 Devin","limits.devin.setupHint.subtitle":"使用本机 Devin CLI 保存的登录读取你的 Devin 订阅额度。","limits.devin.setupHint.step1":"安装 Devin CLI 并运行下方命令登录,TokenTracker 自动复用登录,无需重启。","limits.devin.setupHint.note":"登录后刷新此页即可。TokenTracker 只会将保存的会话令牌发送到 Devin 官方额度接口。","limits.devin.setupHint.snippet_login":"devin auth login # 登录 Devin","settings.appearance.token_grouping.label":"数字分组","settings.appearance.token_grouping.hint":"精确数字使用 3 位或中文 4 位分组;紧凑模式的悬停数值也会使用该设置。","settings.appearance.token_grouping.thousand":"3位","settings.appearance.token_grouping.wan":"4位","legal.nav.pricing":"云服务定价","legal.nav.terms":"服务条款","legal.nav.support":"联系客服"},QN={"cloud.membership.tools_title":"工具与账单","trend.monitor.pin_hint":"点击柱子固定并滚动查看详情","usage.overview.all_tools":"全部","usage.overview.all_models":"全部模型","usage.overview.all_models_note":"同名模型会跨工具合并,并按总用量排序。","usage.overview.week_cross_month_hint":"本周跨越两个自然月,总量与单个自然月的用量并不直接可比","usage.overview.all_tools_card_aria":"全部工具:{{tokens}} Token,{{cost}},{{count}} 个模型。显示合并后的模型排行","usage.overview.antigravity_notice_title":"Token 详情","usage.overview.cache_hit_rate_label":"缓存命中率","usage.overview.cache_hit_rate_detail":"{{reused}} 复用 / {{input}} 输入","usage.overview.antigravity_notice_body":"本地存在会话元数据时,将直接从 Antigravity 读取精确的 Token 用量与 Prompt 缓存命中;缺少元数据的会话则按字符长度(约 4 字符/Token)估算。","usage.overview.devin_notice_title":"费用未估算","usage.overview.trae_notice_title":"TRAE 费用不完整","usage.overview.trae_notice_body":"在多步对话中,TRAE 只拆分最后一步的缓存输入,不拆分之前的步骤。没有缓存拆分的输入计入 Token 总量,但不计入费用。费用按模型定价计算,并非实际账单金额。","usage.overview.devin_notice_body":"Devin 上报的是真实的本地 Token 计数,但本版本没有 swe-2、swe-2-high 和 compactor 的定价数据,这部分用量不参与美元费用估算——显示 $0 并不代表用量免费。","stats.period.last_7d":"7 天","stats.period.last_30d":"30 天","stats.period.avg":"平均","stats.period.convs":"对话","dashboard.core_index.collapse_label":"▾","dashboard.core_index.expand_label":"▸","dashboard.core_index.collapse_aria":"折叠模型分解","dashboard.core_index.expand_aria":"展开模型细分","dashboard.rolling.title":"最近的活动","dashboard.rolling.last_7d":"过去 7 天","dashboard.rolling.last_30d":"过去 30 天","dashboard.rolling.avg_active_day":"日平均","dashboard.projects.title":"项目用量","dashboard.projects.limit_aria":"选择项目显示数量","dashboard.projects.limit_top_3":"前 3 名","dashboard.projects.limit_top_6":"前 6 名","dashboard.projects.limit_top_10":"前 10 名","dashboard.projects.empty":"暂无项目用量。在 git 仓库内使用受支持的 CLI,用量就会归属到对应项目。","dashboard.projects.detail.close_aria":"关闭项目详情","dashboard.projects.detail.error":"项目详情加载失败","dashboard.projects.detail.empty_range":"所选时间范围内没有用量","dashboard.projects.detail.stat_total":"Token 总量","dashboard.projects.detail.stat_conversations":"对话数","dashboard.projects.detail.stat_active_days":"活跃天数","dashboard.projects.detail.stat_avg_day":"日均(活跃日)","dashboard.projects.detail.stat_cache_hit":"缓存命中率","dashboard.projects.detail.stat_share":"占总用量比例","dashboard.projects.detail.section_trend":"每日活跃","dashboard.projects.detail.section_composition":"Token 构成","dashboard.projects.detail.section_sources":"按来源","dashboard.projects.detail.comp_input":"输入","dashboard.projects.detail.comp_cached":"缓存读取","dashboard.projects.detail.comp_cache_write":"缓存写入","dashboard.projects.detail.comp_output":"输出","dashboard.projects.detail.comp_reasoning":"推理","dashboard.projects.detail.source_days":"{{n}} 天","dashboard.projects.detail.source_conv":"{{n}} 次对话","dashboard.widgets.title":"桌面小组件","dashboard.widgets.hint":"右键点按桌面 → 编辑小组件 → 搜索“TokenTracker”","dashboard.widgets.dismiss_aria":"关闭小组件介绍","dashboard.linux_topbar.title":"在顶栏查看用量","dashboard.linux_topbar.hint":"在 GNOME 上,TokenTracker 扩展会在顶栏的 Clawd 旁显示今日 Token 和花费,下拉菜单可查看额度和趋势。","dashboard.linux_topbar.setup":"设置","dashboard.linux_topbar.dismiss_aria":"关闭顶栏提示","dashboard.linux_topbar.preview_readout":"8.2M · $12.40","dashboard.cost_breakdown.title":"成本明细","dashboard.cost_breakdown.total_label":"预计总成本","dashboard.cost_breakdown.close":"关闭","trend.monitor.label":"使用趋势","trend.monitor.predicted":"预测值","trend.zoom.open_aria":"展开全屏","trend.zoom.close_aria":"关闭","trend.zoom.badge":"趋势洞察","trend.zoom.desc":"悬停任意柱子查看 token、成本与对话数。切换粒度可从月份下钻到半小时。","trend.zoom.insight_badge":"洞察","trend.zoom.tooltip.cost":"成本","trend.zoom.tooltip.conversations":"对话","trend.zoom.stats.tokens":"Token 总量","trend.zoom.stats.cost":"总成本","trend.zoom.stats.conversations":"对话数","trend.zoom.stats.peak":"峰值时段","trend.zoom.gran.aria":"粒度","trend.zoom.gran.30min":"30 分钟","trend.zoom.gran.day":"天","trend.zoom.gran.month":"月","trend.zoom.prev_day":"前一天","trend.zoom.next_day":"后一天","trend.zoom.loading":"加载中…","trend.zoom.pick_day":"选择日期","trend.zoom.pick_range":"选择日期范围","trend.zoom.insight.empty":"一段安静的时光,没有一个 token 流过。","trend.zoom.insight.calm":"轻描淡写。模型大多在待命,只在你需要时才醒来搭把手。","trend.zoom.insight.steady":"{{active}} 个活跃时段里节奏平稳,峰值 {{peak}}。是那种不声不响就把事情交付掉的节奏。","trend.zoom.insight.heavy":"火力全开:{{active}} 个时段持续高热,峰值冲到 {{peak}}。这是自己制造势能、而非等待灵感的人的产出。","trend.zoom.insight.massive":"工业级别。{{peak}} 的峰值,吞吐从不降温。到这个量级,你已经不是在用模型,而是在运营一座工厂。","heatmap.title":"热力图","heatmap.empty":"尚无活动数据。","heatmap.legend.less":"少","heatmap.legend.more":"多","heatmap.legend.utc":"UTC","heatmap.tooltip":"{{day}} • {{value}} {{unit}} • {{tz}}","heatmap.unit.tokens":"Token","heatmap.month.jan":"1月","heatmap.month.feb":"2月","heatmap.month.mar":"3月","heatmap.month.apr":"4月","heatmap.month.may":"5月","heatmap.month.jun":"6月","heatmap.month.jul":"7月","heatmap.month.aug":"8月","heatmap.month.sep":"9月","heatmap.month.oct":"10月","heatmap.month.nov":"11月","heatmap.month.dec":"12月","heatmap.day.sun":"日","heatmap.day.mon":"一","heatmap.day.tue":"二","heatmap.day.wed":"三","heatmap.day.thu":"四","heatmap.day.fri":"五","heatmap.day.sat":"六","dashboard.session_expired.copy_label":"运行 npx --yes tokentracker-cli init","dashboard.session_expired.copied":"已复制","dashboard.install.prompt":"安装 Node.js 18+ 然后运行:","dashboard.install.cmd.init":"npx --yes tokentracker-cli init","dashboard.install.cmd.init_link_code":"npx --yes tokentracker-cli init --link-code {{link_code}}","dashboard.install.copy":"复制安装命令","dashboard.install.copy_base":"复制初始化命令","dashboard.install.copied":"已复制到剪贴板","dashboard.install.link_code.loading":"正在生成专属代码...","dashboard.install.link_code.failed":"专属代码不可用","dashboard.install.cmd.sync":"npx --yes tokentracker-cli sync","dashboard.daily.title":"每日细目","dashboard.daily.empty":"还没有数据。先使用 AI CLI,再运行 {{cmd}}。","dashboard.identity.title":"你的个人资料","dashboard.identity.subtitle":"记录你的编码之旅","dashboard.identity.fallback":"匿名用户","dashboard.overview.layout.drag_handle":"拖拽以重新排列","dashboard.screenshot.twitter_text":"记录中的 {{total_tokens}} Token。\\n{{model_name}} 以 {{model_percent}}% 领先。\\n\\n我的 AI 使用情况,未经审计 →","heatmap.3d.hover_tip":"点击进入 3D 全屏旋转分析模式","heatmap.3d.modal.title":"Token 三维透视","heatmap.3d.modal.desc":"按住左键拖拽可任意旋转,悬浮感知每日活跃数据与多维统计。","heatmap.3d.modal.stats.total_tokens":"年度 Token 总量","heatmap.3d.modal.stats.precision_total_tokens":"精准年消耗量","heatmap.3d.modal.stats.estimated_cost":"年度估算费用","heatmap.3d.modal.stats.active_rate_days":"活跃占比 / 天数","heatmap.3d.modal.stats.max_streak":"最长连续活跃","heatmap.3d.modal.stats.days_suffix":"天","heatmap.3d.modal.stats.peak_day":"单日峰值暴击","heatmap.3d.modal.stats.precision_peak_value":"精确单日峰值","heatmap.3d.modal.stats.no_data":"无数据","heatmap.3d.modal.legend.title":"活跃度层级","heatmap.3d.modal.palette.emerald":"翡翠之城","heatmap.3d.modal.palette.ocean":"深海浩瀚","heatmap.3d.modal.palette.neon":"赛博霓虹","heatmap.3d.modal.palette.amber":"烈焰余晖","heatmap.3d.modal.control.play":"启动慢速自转","heatmap.3d.modal.control.pause":"暂停自动旋转","heatmap.3d.modal.control.reset":"重置 3D 视角","heatmap.3d.modal.footer.tip":"双指缩放 / 滚轮缩放 / 鼠标拖拽旋转 3D 图表","heatmap.3d.modal.ai.title.default":"持之以恒的行者","heatmap.3d.modal.ai.eval.default":"您一直在持续行动、不断向前。每一个微小的活跃点,都记录着一次思考与探索。点滴星火终会汇聚成只属于您的成果。","heatmap.3d.modal.ai.title.peak":"极限活跃级贡献者","heatmap.3d.modal.ai.eval.peak":"这一年中,您的 Token 活跃度达到了非凡水平。您持续以高度专注和强劲动能,把复杂想法转化为具体成果,展现出持久的创造力。","heatmap.3d.modal.ai.title.heavy":"高频创作者","heatmap.3d.modal.ai.eval.heavy":"卓越的持续输出。累积的 Token 记录了大量研究、创作与问题解决过程。这样的稳定节奏展现出令人印象深刻的专注力与执行力。","heatmap.3d.modal.ai.title.core":"核心生产力专家","heatmap.3d.modal.ai.eval.core":"极具韧性的长期投入。在过去的一年中,您始终保持着稳定而高效的节奏,不断把 AI 协作转化为持久成果,是当之无愧的核心生产力。","heatmap.3d.modal.ai.title.steady":"稳健创作者","heatmap.3d.modal.ai.eval.steady":"踏实而专注地持续前进。每一次 Token 的递增,都代表您又把一个想法转化成了有价值的成果。持久的专业能力,正是在这样的稳定节奏中积累起来的。","heatmap.3d.voxel.joke.1":"🔥 极度疯狂!产出 {{value}} tokens!你是在疯狂训练大模型,还是手撸了一个编译器?","heatmap.3d.voxel.joke.2":"🚀 史诗级输出!共 {{value}} tokens。今日产出可绕地球一圈,AI 都在为你惊叹!","heatmap.3d.voxel.joke.3":"⚡ 爆击日!{{value}} tokens。代码如泉涌,键盘已经开始冒烟了!","heatmap.3d.voxel.level3":"⚡ 生产力大爆发({{value}} tokens)!高效专注的黄金时刻,继续保持这个巅峰状态!","heatmap.3d.voxel.level2":"🌱 渐入佳境({{value}} tokens)!稳步产出,每一次敲击键盘都是在为大厦添砖加瓦。","heatmap.3d.voxel.level1":"🍃 聚沙成塔({{value}} tokens)。微小的提交也是对未来的投资,保持复利的力量!","heatmap.3d.voxel.level0":"💤 养精蓄锐。在不写代码的日子里,灵感也在悄悄生长。","ipcheck.page.title":"Claude IP 检测","ipcheck.page.subtitle":"查看当前访问 Claude 的出口 IP、纯净度、地理与风险信号,识别可能影响登录或触发风控的因素。","ipcheck.mask.toggle":"隐藏 IP","ipcheck.ipv6.warn":"当前为 IPv6 环境,不建议用 IPv6 访问 Claude Code,部分检测结果可能不完整。","ipcheck.ip.cn":"中国出口 IPv4","ipcheck.ip.cloudflare":"Cloudflare 出口","ipcheck.ip.claude":"Claude 出口","ipcheck.ip.failed":"获取失败","ipcheck.ip.loading":"加载中...","ipcheck.trust.title":"信任评分","ipcheck.trust.subtitle":"Claude 风控视角下的 IP 纯净度","ipcheck.trust.no_data":"无数据","ipcheck.trust.no_ip":"未获取到 Claude 出口 IP,无法评分","ipcheck.trust.no_score":"该 IP 暂无评分数据","ipcheck.trust.gauge.low":"0 高危","ipcheck.trust.gauge.high":"100 可信","ipcheck.trust.label.pristine":"极度纯净","ipcheck.trust.label.clean":"纯净","ipcheck.trust.label.good":"良好","ipcheck.trust.label.neutral":"中性","ipcheck.trust.label.suspicious":"可疑","ipcheck.trust.label.unreachable":"不可访问","ipcheck.trust.text.excellent":"该 IP 信誉极好","ipcheck.trust.text.great":"该 IP 信誉优异","ipcheck.trust.text.minor":"该 IP 存在轻微风险","ipcheck.trust.text.moderate":"该 IP 存在一定风险","ipcheck.trust.text.severe":"该 IP 风险极高","ipcheck.trust.text.restricted":"处于不可访问区域,Claude 会严格风控","ipcheck.trust.region_warn.title":"Claude 出口 IP 位于 {{region}}","ipcheck.trust.region_warn.body":"不建议登录 Claude,容易触发封号风控。","ipcheck.trust.region_support":"Claude 支持地区","ipcheck.trust.region.accessible":"可访问","ipcheck.common.unknown":"未知","ipcheck.props.title":"IP 属性","ipcheck.props.region":"地区","ipcheck.props.city":"城市","ipcheck.props.type":"类型","ipcheck.props.asn":"ASN","ipcheck.props.org":"运营商","ipcheck.props.residential":"家庭住宅","ipcheck.props.datacenter":"机房","ipcheck.security.title":"安全检测","ipcheck.security.vpn":"VPN","ipcheck.security.proxy":"代理 (Proxy)","ipcheck.security.tor":"Tor","ipcheck.security.crawler":"机器人 (Crawler)","ipcheck.security.abuser":"滥用记录","ipcheck.security.proxy_flag":"代理","ipcheck.security.crawler_yes":"是","ipcheck.security.crawler_no":"否","ipcheck.security.abuser_yes":"有记录","ipcheck.security.abuser_no":"无记录","ipcheck.security.clean":"未检测到","ipcheck.avail.title":"Claude 可用性","ipcheck.avail.tooltip":"Claude 服务器在美国,从亚洲访问延迟超过 100ms 属于正常情况。","ipcheck.avail.refresh":"刷新","ipcheck.avail.svc_row":"服务状态","ipcheck.avail.latency.normal":"正常","ipcheck.avail.latency.good":"良好","ipcheck.avail.latency.slow":"较慢","ipcheck.avail.latency.unreachable":"不可访问","ipcheck.avail.svc.none":"全部正常","ipcheck.avail.svc.minor":"轻微故障","ipcheck.avail.svc.major":"重大故障","ipcheck.avail.svc.critical":"严重故障","ipcheck.avail.svc.maintenance":"维护中","ipcheck.avail.svc.other":"服务异常","ipcheck.dns.title":"DNS 泄露检测","ipcheck.dns.status":"状态","ipcheck.dns.outlet":"DNS 出口","ipcheck.dns.outlet_ip":"DNS 出口 IP","ipcheck.dns.isp":"服务商","ipcheck.dns.leaked":"可能泄露","ipcheck.dns.no_leak":"未检测到泄露","ipcheck.dns.encrypted":"DNS 加密或未暴露","ipcheck.dns.cn_tag":"中国 DNS","ipcheck.udp.title":"WebRTC UDP 泄露","ipcheck.udp.status":"状态","ipcheck.udp.outlet":"UDP 出口","ipcheck.udp.outlet_ip":"UDP 出口 IP","ipcheck.udp.origin":"归属地","ipcheck.udp.disabled":"WebRTC 已禁用","ipcheck.udp.no_leak":"未检测到泄露","ipcheck.udp.leaked":"可能泄露","ipcheck.udp.anomaly":"异常","ipcheck.device.title":"设备信息","ipcheck.device.tz":"时区","ipcheck.device.lang":"语言","ipcheck.device.os":"操作系统 / 浏览器","ipcheck.device.touch":"触屏","ipcheck.device.net":"网络类型","ipcheck.device.dnt":"请勿追踪","ipcheck.device.webgl_render":"WebGL 渲染器","ipcheck.device.canvas_fp":"Canvas 指纹","ipcheck.device.webgl_fp":"WebGL 指纹","ipcheck.device.match":"一致","ipcheck.device.mismatch":"不一致","ipcheck.device.local":"本地","ipcheck.device.estimate_suffix":"(估算)","ipcheck.device.diff_equal":"偏移略有差异","ipcheck.device.diff_ahead":"Claude 快 {{h}} 小时","ipcheck.device.diff_behind":"Claude 慢 {{h}} 小时","ipcheck.device.lang_expected":"Claude 出口常用","ipcheck.device.touch_yes":"是","ipcheck.device.touch_no":"否","ipcheck.device.dnt_on":"已开启","ipcheck.device.dnt_off":"已关闭","ipcheck.device.dnt_unset":"未设置","ipcheck.device.net_unsupported":"不支持检测","ipcheck.device.unsupported":"不支持","ipcheck.history.title":"Claude 出口 IP 历史","ipcheck.history.subtitle":"仅本地存储于浏览器,最多保留 6 条","ipcheck.history.clear":"清除","ipcheck.history.empty":"暂无历史记录","ipcheck.history.current":"当前","ipcheck.region.CN":"中国大陆","ipcheck.region.HK":"香港","ipcheck.region.MO":"澳门","ipcheck.region.RU":"俄罗斯","ipcheck.region.KP":"朝鲜","ipcheck.region.IR":"伊朗","ipcheck.region.SY":"叙利亚","ipcheck.region.CU":"古巴","ipcheck.region.BY":"白俄罗斯","ipcheck.region.VE":"委内瑞拉","leaderboard.profile_modal.close":"关闭","leaderboard.profile_modal.loading":"正在加载用户资料…","leaderboard.profile_modal.error":"加载用户资料失败。","leaderboard.profile_modal.empty":"这个用户的资料未公开。","leaderboard.profile_modal.row_aria":"查看 {{name}} 的资料","leaderboard.profile_modal.rank":"#{{rank}}","leaderboard.profile.hero.rank_label":"排名","leaderboard.profile_modal.hero.total_tokens":"总 Token","leaderboard.profile_modal.hero.total_cost":"总花费","leaderboard.profile_modal.hero.github":"GitHub 主页","leaderboard.profile_modal.stat.total_cost":"总花费","leaderboard.profile_modal.stat.total_tokens":"总 Token","leaderboard.profile_modal.stat.active_days":"活跃天数","leaderboard.profile_modal.stat.avg_per_day":"日均花费","leaderboard.profile_modal.streak.current":"当前连续","leaderboard.profile_modal.streak.longest":"最长连续","leaderboard.profile_modal.streak.days":"{{count}} 天","leaderboard.profile_modal.best_day.title":"最佳日","leaderboard.profile_modal.best_day.none":"—","leaderboard.profile_modal.models.count":"使用了 {{count}} 个模型","leaderboard.profile_modal.models.favorite":"最爱模型","leaderboard.profile_modal.models.none":"暂无模型记录","leaderboard.profile_modal.heatmap.title":"活跃度(最近 365 天)","leaderboard.profile_modal.providers.title":"按 Provider 分布","leaderboard.profile_modal.providers.none":"本周期无使用数据。","leaderboard.profile_modal.view_full":"查看完整主页","local_only.title":"请在客户端内使用","local_only.body":"这个页面读取的是你本机上的数据,所以只能在 Mac App 或命令行仪表盘里查看。","local_only.open_app":"在 Mac App 内打开","local_only.download":"下载 Mac App","dashboard.auth_gate.title":"登录 Token Tracker","dashboard.auth_gate.subtitle":"登录以在云端同步并查看您的 API 使用量、成本和 Token 消耗趋势。","dashboard.auth_gate.button":"立即登录","dashboard.expired_gate.title":"会话已过期","dashboard.expired_gate.subtitle":"您的会话已过期。请重新登录以继续查看您的云端仪表盘。","dashboard.expired_gate.button":"重新登录","shared.app_name":"Token Tracker","dashboard.auth_gate.hero_title":"让 AI 代理的每一笔 Token 消耗","dashboard.auth_gate.hero_subtitle":"清晰透明、多端无缝掌控","dashboard.auth_gate.desc":"为您在纯云端安全同步来自 Claude Code、Cursor、Gemini CLI 等全平台主流代理的 Token 额度、并发费用及耗时统计,提供前所未有的全景可视化数据分析。","dashboard.auth_gate.feature.sync.title":"实时云端同步","dashboard.auth_gate.feature.sync.desc":"全自动采集各端代理的开销,并在您的私人云盘中秒级安全归档。","dashboard.auth_gate.feature.anal.title":"多维看板分析","dashboard.auth_gate.feature.anal.desc":"按模型分类、时间跨度统计 Token 分布,随时追溯开销尖峰及用量结构。","dashboard.auth_gate.feature.guard.title":"本地直连免登","dashboard.auth_gate.feature.guard.desc":"在 Localhost 模式下自动跳过所有登录验证,完美保护本地离线调试体验。","dashboard.expired_gate.hero_title":"您的云端会话已过期","dashboard.expired_gate.desc":"为了您的隐私与云盘数据安全,安全凭证会在一段时间后自动过期。请重新验证以极速同步仪表盘。","dashboard.expired_gate.feature.sec.title":"安全证书保护","dashboard.expired_gate.feature.sec.desc":"加密证书到期自动销毁,严密守护您的 Token 账单资产。","dashboard.expired_gate.feature.restore.title":"无缝数据恢复","dashboard.expired_gate.feature.restore.desc":"重新登入后自动恢复多端实时看板刷新,无需重新绑定。","dashboard.expired_gate.feature.cloud.title":"跨端云端同步","dashboard.expired_gate.feature.cloud.desc":"多端随时离线统计并同步至个人控制台,多地协同掌握开销。","dashboard.device_filter.all":"全部设备","dashboard.device_filter.aria":"按设备筛选","dashboard.device_card.title":"设备分布","dashboard.device_card.current":"本机","dashboard.device_card.unnamed":"未命名设备","dashboard.device_card.rename_aria":"重命名设备","dashboard.device_card.rename_placeholder":"设备名称","dashboard.device_card.rename_save":"保存","dashboard.device_card.rename_cancel":"取消","dashboard.device_card.rename_error":"重命名失败 — 该名称可能已被占用。","dashboard.device_card.empty":"未发现活跃设备","dashboard.device_card.account_scope":"账号级","dashboard.device_card.account_scope_tip":"来自该 Provider 的账号 API,不归属于单台设备","nav.pet":"桌面宠物","pet.page.eyebrow":"桌面陪伴","pet.page.title":"宠物","pet.page.subtitle":"选择你的陪伴角色,并预览它如何响应真实的 AI 使用状态。","pet.preview.states":"预览宠物状态","pet.controls.title":"桌面控制","pet.controls.show":"显示桌面宠物","pet.controls.show_hint":"让陪伴角色始终显示在其他窗口上方。","pet.controls.size":"宠物大小","pet.controls.native_only":"请在 TokenTracker 桌面 App 中打开此页面,以控制真实桌宠。","pet.characters.title":"选择你的陪伴角色","pet.characters.subtitle":"每个角色都拥有完整状态系统,并有独立配色和轮廓。","pet.character.clawd":"Clawd","pet.character.clawd_desc":"经典钳爪造型的 Token 管家。","pet.character.bot":"Bot","pet.character.bot_desc":"一个随你的 token 节奏变形的形状。","pet.bot.color":"身体颜色","pet.bot.color.auto":"跟随主题","pet.bot.color.bleu":"蓝色","pet.bot.color.turquoise":"青色","pet.bot.color.vert":"绿色","pet.bot.color.ambre":"琥珀","pet.bot.color.rose":"粉色","pet.bot.color.violet":"紫色","pet.character.sprout":"Sprout","pet.character.sprout_desc":"长着叶片耳朵和小根须脚的幼苗精灵。","pet.character.byte":"Byte","pet.character.byte_desc":"拥有表情屏幕和悬浮推进器的终端机器人。","pet.character.ember":"Ember","pet.character.ember_desc":"拖着火焰尾巴、为高产连胜庆祝的狐灵。","pet.state.calm":"平静","pet.state.focus":"专注","pet.state.multitask":"多模型","pet.state.streak":"连续活跃","pet.state.celebrate":"新增用量","pet.state.rest":"休息","pet.size.small":"小","pet.size.medium":"中","pet.size.large":"大","pet.import.title":"导入 Codex 宠物","pet.import.subtitle":"粘贴 codex-pets.net 链接,或选择 .zip 宠物包。","pet.import.add":"添加","pet.import.zip":"选择宠物包","pet.import.remove":"移除宠物","pet.import.success":"宠物已导入并选中。","pet.import.failed":"无法导入这个宠物。","pet.import.busy":"正在导入…","pet.format.v2":"V2","pet.import.removed":"已移除宠物。","pet.import.url_label":"Codex Pets 链接或宠物 ID","pet.codex.title":"从 Codex 导入","pet.codex.subtitle":"把你在 Codex App 里已有的宠物导入进来——包括 Codex 自带的内置角色。","pet.codex.import":"导入所选","pet.codex.browse":"从 Codex 导入","pet.codex.close":"关闭","pet.codex.select_all":"全选","pet.codex.empty":"没有可导入的新 Codex 宠物。","pet.codex.imported":"已从 Codex 导入。","dashboard.projects.detail.badge":"项目","achievements.section.title":"成就","achievements.page.title":"成就","achievements.page.local_note":"项目与夜猫子徽章仅保存在本机。","achievements.signin.prompt":"登录后可获得云端成就,并在排行榜上展示。","achievements.mini.tooltip":"{{name}} — {{tier}}","achievements.badge.aria":"{{name}} — {{tier}}","achievements.tier.bronze":"青铜","achievements.tier.silver":"白银","achievements.tier.gold":"黄金","achievements.tier.diamond":"钻石","achievements.modal.locked":"未解锁","achievements.modal.achieved_label":"达成于","achievements.modal.value_label":"当前数值","achievements.modal.progress_to_next":"距{{tier}}进度","achievements.modal.max_tier":"已达最高等级","achievements.modal.close":"关闭","achievements.modal.tier_history":"等级历程","achievements.modal.coin_aria":"{{name}} 徽章——拖动或使用方向键旋转","achievements.modal.issue_number":"第 {{number}} 号","achievements.badge.token_titan.name":"Token 巨擘","achievements.badge.token_titan.desc":"在所有 AI 工具中累计消耗 Token。","achievements.badge.big_day.name":"高光之日","achievements.badge.big_day.desc":"单日烧掉海量 Token。","achievements.badge.wordsmith.name":"妙笔生花","achievements.badge.wordsmith.desc":"累积 AI 真正写出的输出 Token——代码与文字。","achievements.badge.marathoner.name":"马拉松","achievements.badge.marathoner.desc":"在整个记录史中积累活跃天数。","achievements.badge.streak.name":"连胜火焰","achievements.badge.streak.desc":"保持每日连续使用不间断。","achievements.badge.weekend_warrior.name":"周末战士","achievements.badge.weekend_warrior.desc":"周六周日也坚持产出。","achievements.badge.momentum.name":"势头","achievements.badge.momentum.desc":"周用量较上一周成倍增长。","achievements.badge.polyglot.name":"模型通","achievements.badge.polyglot.desc":"驱使众多不同的模型。","achievements.badge.trendsetter.name":"尝鲜先锋","achievements.badge.trendsetter.desc":"新模型发布一周内即刻上手。","achievements.badge.multitool.name":"多面手","achievements.badge.multitool.desc":"在多款 AI 编码工具中记录用量。","achievements.badge.podium.name":"领奖台","achievements.badge.podium.desc":"攀登总排行榜。","achievements.badge.veteran.name":"老兵","achievements.badge.veteran.desc":"从首个记录日起坚持至今。","achievements.badge.project_hopper.name":"项目游侠","achievements.badge.project_hopper.desc":"把 Token 撒向多个项目。","achievements.badge.project_devotion.name":"专情项目","achievements.badge.project_devotion.desc":"为一个挚爱项目倾注 Token。","achievements.badge.night_owl.name":"夜猫子","achievements.badge.night_owl.desc":"在午夜至清晨六点间写代码。","achievements.signin.action":"登录","achievements.scope.local":"本地","achievements.page.suggest":"有新成就的点子?","achievements.page.suggest_link":"去 GitHub 提交建议","dashboard.projects.sources_more":"+{{n}}","heatmap.iso.aria":"三维等距活跃热力图","heatmap.view.2d":"2D","heatmap.view.3d":"3D","leaderboard.column.kilo-cli":"Kilo CLI","leaderboard.column.kilo-code":"Kilo Code","leaderboard.summary.percentile":"前 {{p}}%","leaderboard.summary.jump_to_me":"跳转到我的排名","leaderboard.summary.view_profile":"查看我的主页","usage.overview.percent_below_threshold":"<0.01","dashboard.context_breakdown.empty":"所选时间段内没有 Claude Code 活动。","dashboard.context_breakdown.empty_codex":"所选时间段内没有 Codex 活动。","dashboard.context_breakdown.error":"无法读取此视图所需的 Claude Code 日志。","dashboard.context_breakdown.error_codex":"无法读取此视图所需的 Codex 日志。","dashboard.context_breakdown.bar_aria":"Token 分布:{{summary}}","dashboard.context_breakdown.system_prefix_tooltip":"系统 Prompt、工具结构、Skills、规则和 MCP 描述会作为同一个前缀缓存,无法从日志中分别拆分。","dashboard.context_breakdown.footnote":"近似统计:缓存读取会随对话轮次累积,因此对话历史会逐渐占据主要部分。只有 Claude Code 日志能提供此视图所需的逐消息明细。","dashboard.context_breakdown.footnote_codex":"Codex 在此使用互不重叠的 Token 分类。工具和命令执行下钻数据,是对同一批对话轮次进行的独立启发式归因。","dashboard.context_breakdown.category.system_prompt":"系统 Prompt","dashboard.context_breakdown.category.messages":"消息","dashboard.context_breakdown.category.tool_calls":"工具调用","dashboard.context_breakdown.category.mcp_servers":"MCP 服务器","dashboard.context_breakdown.category.custom_agents":"自定义 Agent","dashboard.context_breakdown.category.reasoning":"推理","dashboard.context_breakdown.category.skills":"Skills","dashboard.context_breakdown.loading_aria":"正在加载上下文细分","dashboard.context_breakdown.loading_hint":"正在扫描会话日志…","dashboard.context_breakdown.tool_details.total_column":"总计","dashboard.context_breakdown.tool_details.unavailable_codex":"此时间段没有工具级 Codex 明细,仅显示队列总量。","dashboard.context_breakdown.message_details.title":"消息明细","dashboard.context_breakdown.message_details.note":"仅提供汇总数据——不会存储消息文本。","dashboard.context_breakdown.message_details.category_column":"类别","dashboard.context_breakdown.message_details.user_input":"用户输入","dashboard.context_breakdown.message_details.conversation_history":"对话历史","dashboard.context_breakdown.message_details.assistant_response":"助手回复","dashboard.context_breakdown.exec_details.title":"命令执行明细","dashboard.context_breakdown.exec_details.kind_column":"类型","dashboard.context_breakdown.exec_details.calls_column":"调用","dashboard.context_breakdown.exec_details.failures_column":"失败","dashboard.context_breakdown.exec_details.duration_column":"耗时","dashboard.context_breakdown.exec_details.max_duration_column":"最长耗时","dashboard.context_breakdown.exec_details.output_column":"行数","dashboard.context_breakdown.exec_details.group_by_type":"按类型","dashboard.context_breakdown.exec_details.group_by_executable":"可执行文件","dashboard.context_breakdown.exec_details.group_by_command":"命令","dashboard.context_breakdown.exec_details.group_by_duration":"耗时","dashboard.context_breakdown.exec_details.group_by_output":"输出","dashboard.context_breakdown.exec_details.group_by_exit":"按退出状态","leaderboard.profile_modal.badge.copy_url":"复制个人主页链接","leaderboard.profile_modal.badge.copy":"复制 README 徽章","leaderboard.profile_modal.badge.copied":"已复制!","leaderboard.profile.like.aria_like":"点赞此主页","leaderboard.profile.like.aria_unlike":"取消点赞此主页","dashboard.device_card.clear":"清除","dashboard.cost_breakdown.empty":"暂无费用记录。","dashboard.cost_breakdown.model_column":"模型","dashboard.cost_breakdown.cost_column":"费用","heatmap.3d.modal.eyebrow":"三维洞察","heatmap.tooltip.level":"等级 {{level}}","heatmap.tooltip.tokens":"{{day}}:{{value}} Token","heatmap.tooltip.model_breakdown":"模型细分","heatmap.tooltip.token_breakdown":"Token 构成","trend.monitor.empty":"暂无数据","trend.monitor.unsynced":"尚未同步","wrapped.loading":"正在加载…","wrapped.error":"无法加载年度总结:{{error}}","wrapped.empty":"该年度尚无数据,请先运行 `{{command}}`。","wrapped.kicker":"TokenTracker 年度总结","wrapped.total_tokens":"Token 总量","wrapped.summary":"共 {{conversations}} 次对话、{{days}} 个活跃日,使用了 {{tools}} 款工具","wrapped.top_tools":"常用工具","wrapped.top_models":"常用模型","wrapped.peak_hour":"高峰时段","wrapped.tokens":"{{count}} Token","wrapped.longest_streak":"最长连续活跃","wrapped.days":"{{count}} 天","wrapped.top_days":"最高用量日期","wrapped.highlights":"年度亮点","wrapped.footer":"根据本地 queue.jsonl 生成 · 使用 `{{command}}` 分享","wrapped.highlight.model":"{{model}} 贡献了全年 {{percent}}% 的用量。","wrapped.highlight.day":"最忙碌的一天是 {{day}}({{tokens}} Token)。","wrapped.highlight.hour":"你的高效时段集中在 UTC {{hour}}:00 左右。","wrapped.highlight.streak":"最长连续活跃:连续 {{days}} 天使用 AI 编程。","wrapped.highlight.tools":"你使用了 {{count}} 款不同的 AI 工具,涉猎广泛。","dashboard.context_breakdown.empty_grok":"所选时间段内没有 Grok Build 活动。","dashboard.context_breakdown.error_grok":"无法读取此视图所需的 Grok Build 日志。","dashboard.context_breakdown.footnote_grok":"Grok 在此使用互不重叠的 Token 分类。工具和命令执行下钻数据,是对同一批对话轮次进行的独立启发式归因,以 turn_completed.usage 为权威总量。","dashboard.context_breakdown.heading":"上下文细分","dashboard.context_breakdown.heading_claude":"Claude 上下文细分","dashboard.context_breakdown.heading_codex":"Codex 上下文细分","dashboard.context_breakdown.heading_grok":"Grok 上下文细分","subscriptions.add":"添加订阅","subscriptions.edit":"编辑","subscriptions.delete":"删除","subscriptions.save":"保存","subscriptions.confirm_delete_title":"确定删除这条订阅?","subscriptions.delete_error":"删除失败,请重试。","subscriptions.form.plan":"套餐","subscriptions.form.plan_placeholder":"如 Plus、Pro","subscriptions.form.auto_renew":"自动续费","subscriptions.form.auto_renew_on":"开启","subscriptions.form.auto_renew_off":"关闭","subscriptions.form.started_at":"订阅时间","subscriptions.form.cycle":"计费周期","subscriptions.form.cycle_weekly":"每周","subscriptions.form.cycle_monthly":"每月","subscriptions.form.cycle_yearly":"每年","subscriptions.form.error":"出了点问题,请重试。","subscriptions.status.auto_renew":"自动续费中","subscriptions.status.manual":"已关闭自动续费","subscriptions.label.renews_at":"下次续费","subscriptions.label.expires_at":"到期时间","subscriptions.countdown":"{{days}} 天 {{hours}} 小时 {{minutes}} 分后","subscriptions.expired":"已到期","subscriptions.empty.title":"还没有订阅","subscriptions.empty.body":"添加一条套餐,随时关注它的下次续费或到期时间。","subscriptions.load_error":"加载订阅失败。","subscriptions.inline.label":"订阅","subscriptions.badge.auto_renew":"自动续费","subscriptions.badge.stops":"到期停止","subscriptions.form.provider":"关联工具","subscriptions.form.provider_required":"请选择关联的工具","subscriptions.form.provider_taken":"该工具已有订阅,请编辑现有记录","subscriptions.form.provider_taken_suffix":"(已有订阅)","quota.title":"限额","quota.percent":"%","quota.remaining":"剩余","quota.stale":"数据未更新","quota.drag":"拖动调整位置","quota.choose":"选择额度","quota.collapse":"收起","quota.expand":"展开限额","quota.empty":"请在主界面连接服务","quota.loading":"正在读取限额…","quota.awaiting":"等待额度更新","quota.resets":"重置于 {{time}}","quota.no_reset":"暂无重置时间","quota.unavailable":"选中的额度暂不可用","quota.dashboard":"打开主界面","quota.pick_two":"最多关注两个周期","quota.reset_in":"{{time}}后重置","quota.close":"关闭组件","quota.close_hint":"关闭组件;可从托盘菜单重新打开","cloud.nav":"云服务","cloud.page.eyebrow":"TokenTracker Cloud","cloud.page.title":"选择适合你的方案","cloud.page.subtitle":"本地统计免费,云服务支持跨设备同步与历史管理。","cloud.selector.term":"计费周期","cloud.term.monthly":"月付","cloud.term.yearly":"年付","cloud.selector.billing_mode":"付款方式","cloud.billing_mode.fixed":"按期购买","cloud.billing_mode.recurring":"自动续费","cloud.free.title":"免费本地版","cloud.free.subtitle":"在自己的电脑上,完整记录和分析 AI 用量。","cloud.free.price":"免费","cloud.free.forever":"完整本地功能,永久免费。","cloud.free.cta":"使用免费应用","cloud.free.tracking":"所有已支持的 Provider 与费用估算","cloud.free.limits":"Provider 用量限额","cloud.free.desktop":"CLI 和桌面端全部功能","cloud.free.exports":"本地历史与导出","cloud.free.community":"排行榜、成就与公开资料,每天从 1 台设备同步","cloud.free.installations":"本地安装数量不限,无需订阅。","cloud.plan.title":"TokenTracker Cloud","cloud.plan.subtitle":"跨设备同步与用量历史,无需自行维护服务器。","cloud.price.pending":"待确认","cloud.price.waiting":"服务响应后显示实际价格。","cloud.price.per_year":"/ 年","cloud.price.per_month":"/ 月","cloud.price.annual_total":"每年实付 {{total}},折合每月 {{equivalent}}。","cloud.price.monthly_total":"一个月实付 {{total}}。","cloud.price.savings":"年付省 {{percent}}%","cloud.action.try":"免费试用 {{days}} 天","cloud.action.subscribe":"订阅云服务","cloud.action.manage_membership":"管理会员","cloud.action.view_plans":"查看云服务方案","cloud.action.retry":"重试","cloud.action.start_trial":"开始 {{days}} 天免费试用","cloud.action.sign_in_continue":"登录后继续","cloud.action.open_dashboard":"打开仪表盘","cloud.action.choose_plan":"选择方案","cloud.action.create_checkout":"前往付款 · {{amount}}","cloud.action.resume_order":"继续付款","cloud.action.open_payment":"打开支付页面","cloud.action.check_payment":"我已付款,检查状态","cloud.action.checking":"正在检查付款…","cloud.action.keep":"保留现有设置","cloud.action.restore":"恢复订单","cloud.action.refresh_membership":"刷新会员状态","cloud.action.manage_subscription":"管理订阅","cloud.action.cancel_renewal":"取消自动续费","cloud.action.renew":"续费云服务","cloud.action.read_export":"查看和导出云端历史","cloud.trial.no_card":"无需绑卡,不会自动扣款。","cloud.trial.disclosure":"免费试用 {{days}} 天,至 {{date}}。到期不会自动扣款。","cloud.trial.expiry":"试用到期后个人 Cloud 同步停止,已有云端历史有 30 天可查看和导出。选定 1 台设备的每日社区上传、排行榜参与和本地记录仍免费。","cloud.trial.ends":"云服务试用于 {{date}} 结束。","cloud.renewal.manual":"一次付款,到期不自动续费。","cloud.renewal.auto":"按订阅周期自动续费,可随时取消;已付权益保留。","cloud.feature.sync":"变更数据每 {{minutes}} 分钟同步,可在账户中暂停或恢复设备同步。","cloud.feature.history":"{{days}} 天小时明细,{{months}} 个月日汇总,支持云端数据导出。","cloud.feature.pro_identity":"云服务头像边框和标识,排名仍按用量计算。","cloud.feature.privacy_detail":"不上传 Prompt、代码、Provider 凭据或本地会话与项目记录。","cloud.catalog.loading":"正在载入云服务状态…","cloud.catalog.preview":"云服务订阅尚未开放,正式上线前无法付款或开启试用。","cloud.catalog.provider_unavailable":"云服务付款暂不可用。已保留方案选择,请稍后再试。","cloud.catalog.sandbox":"当前为付款沙盒,测试交易不会购买正式云服务会员。","cloud.faq.local_title":"哪些功能仍然免费?","cloud.faq.local_body":"本地记录、接入、估算、限额、桌面功能与导出保持完整开源。云服务支持托管汇总与历史服务。","cloud.faq.expiry_title":"云服务到期后会怎样?","cloud.faq.expiry_body":"个人 Cloud 同步到期后,仍可每天从选定的 1 台设备免费上传社区数据、参与排行榜;如有多台活跃设备,需要暂停其他设备。已有个人云端历史有 30 天只读和导出窗口。本地数据与功能继续可用。","cloud.faq.existing_title":"已经在用云端仪表盘?","cloud.faq.existing_body":"订阅上线时,现有云端账号有 30 天过渡期。账户页会显示你的具体过渡截止日期。","cloud.faq.platform_title":"每个平台要分别付费吗?","cloud.faq.platform_body":"一个会员覆盖同一 TokenTracker 账号下的 CLI、macOS、Windows、Linux 和网页,无需按平台重复付费。","cloud.checkout.title":"确认云服务购买方案","cloud.checkout.trial_title":"开启云服务试用","cloud.checkout.back":"返回方案页","cloud.checkout.local_free":"无论选择哪个方案,完整本地应用始终免费。","cloud.checkout.sign_in":"登录需要开通会员的 TokenTracker 账号,当前选择的方案会保留。","cloud.checkout.review":"核对套餐和付款方式,Waffo 会在付款前显示最终金额。","cloud.checkout.summary":"云服务权益","cloud.checkout.tax":"美元标价为未税基础价。税费由 Waffo 收银台计算,付款前会显示最终金额。","cloud.checkout.choose_plan":"选择云服务方案后继续。","cloud.checkout.loading":"正在查询订单…","cloud.checkout.creating":"正在准备支付订单","cloud.checkout.starting_trial":"正在开通云服务试用","cloud.checkout.awaiting":"等待付款","cloud.checkout.activating":"已收到付款,正在开通云服务","cloud.checkout.success":"云服务会员已开通","cloud.checkout.canceled":"订单已关闭","cloud.checkout.expired":"订单已过期","cloud.checkout.trial_success":"云服务试用已开始","cloud.checkout.pending_creation":"订单已保存,支付方尚未确认支付页面。请先检查状态,不要重复创建订单。","cloud.checkout.pending_payment":"请在所选支付方完成付款。服务端核验交易后,此页会显示会员状态。","cloud.checkout.received":"服务端已记录付款,正在确认会员权益。如开通时间较长,请检查状态。","cloud.checkout.expired_detail":"此支付订单已过期。可重新选择方案创建订单。如已经付款,请先恢复订单,不要再次付款。","cloud.checkout.canceled_detail":"服务端已关闭此订单。如已经付款,请先查看会员状态或恢复订单,再决定是否重新购买。","cloud.checkout.recovery_hint":"已经付款?检查状态会让服务端核验此订单。仅返回本页不会开通会员。","cloud.checkout.order_id":"订单编号","cloud.checkout.expires":"支付订单于 {{date}} 过期。","cloud.provider.alipay":"支付宝","cloud.provider.wechat":"微信支付","cloud.provider.paddle":"Paddle 支付","cloud.membership.title":"TokenTracker Cloud","cloud.membership.signed_out":"登录后管理云服务,完整本地应用始终免费。","cloud.membership.expires":"可用至 {{date}}","cloud.membership.transition_until":"过渡期至 {{date}}","cloud.membership.trial_until":"试用至 {{date}}","cloud.membership.active_until":"有效期至 {{date}}","cloud.membership.gift_until":"赠送权益至 {{date}}","cloud.membership.expired_on":"已于 {{date}} 到期","cloud.membership.renews":"于 {{date}} 续费","cloud.membership.preview":"订阅尚未上线,预览期继续保留现有云端访问。","cloud.membership.read_only":"个人 Cloud 同步已到期,已有历史可查看和导出至 {{date}}。仍可每天从选定的 1 台设备免费上传社区数据并参与排行榜;请暂停其他活跃设备。","cloud.membership.expired_detail":"个人 Cloud 访问已到期。本地记录和导出继续免费;仍可每天从选定的 1 台设备免费上传社区数据并参与排行榜,请暂停其他活跃设备。","cloud.membership.transition_detail":"现有云端账号有 30 天过渡期。到期后个人 Cloud 同步停止,仍可每天从选定的 1 台设备免费上传社区数据。","cloud.membership.local_free":"本地记录、历史和导出始终完整免费。","cloud.membership.renewal_off":"自动续费已关闭。","cloud.cancel.detail":"取消自动续费?云服务会员仍可使用至 {{date}}。本地功能始终免费。","cloud.cancel.confirm":"确认取消续费","cloud.status.legacy_free":"云服务预览期","cloud.status.active":"云服务已开通","cloud.status.trial":"免费试用中","cloud.status.transition":"过渡期","cloud.status.expired":"云服务已到期","cloud.status.free":"免费本地版","cloud.status.unknown":"会员状态待确认","cloud.date.unknown":"日期待确认","cloud.devices.title":"云端设备","cloud.devices.count":"{{count}} / {{limit}} 台设备","cloud.devices.unlimited":"{{count}} 台设备,预览期","cloud.devices.detail":"同一系统、同一用户身份重复登录共用名额,不同系统或用户可能独立计数。本地安装不受限制。","cloud.devices.over_limit":"当前云端设备数超出名额。请暂停旧设备,再让其他设备同步。","cloud.devices.empty":"尚未关联云端设备。","cloud.devices.unnamed":"未命名设备","cloud.devices.platform_unknown":"平台未知","cloud.devices.last_seen_unknown":"最近同步时间未知","cloud.devices.last_seen":"最近出现于 {{date}}","cloud.devices.current":"当前设备","cloud.devices.remove":"暂停","cloud.devices.remove_detail":"暂停此设备?它会释放云端名额并停止新的上传。本地数据和已有云端历史仍保留,再次同步前请在此恢复。","cloud.devices.confirm_remove":"暂停云同步","cloud.restore.title":"查找订单","cloud.restore.detail":"输入订单编号,查看付款状态或继续付款。","cloud.billing.title":"账单与付款","cloud.restore.placeholder":"粘贴订单编号","cloud.restore.invalid":"请输入完整的 TokenTracker 订单编号。","cloud.history.title":"付款记录","cloud.history.date":"日期","cloud.history.amount":"金额","cloud.history.status":"状态","cloud.history.paid":"已付款","cloud.history.pending":"待付款","cloud.history.empty":"暂无已核验付款。","cloud.history.term":"{{start}} 至 {{end}}","cloud.history.refunded":"已退款 {{amount}}","cloud.error.auth":"登录状态需要刷新,请重新登录此订单所属账号。","cloud.error.unavailable":"云服务计费尚不可用,你可以继续使用完整的免费本地应用。","cloud.error.provider":"此支付方式目前不可用。","cloud.error.subscription_exists":"已有有效订阅,请先到「设置 → 个人 → 云服务」管理,再选择其他方案。","cloud.error.fixed_term":"当前按固定期限购买的会员仍有效,请到期后再开通自动续费订阅。","cloud.error.trial":"此账号无法再次开启免费试用。查看云服务方案或管理当前云端访问权限。","cloud.error.order_not_found":"此账号下未找到该订单,请核对编号,并登录购买时使用的账号。","cloud.error.expired":"支付订单已过期,重新购买前请先查询该订单。","cloud.error.request_conflict":"上一笔购买尚未确认,请先到「设置 → 个人 → 云服务」恢复该订单,再创建其他购买。","cloud.error.network":"连接中断,购买请求已保留。请重试或恢复同一订单,不要重复付款。","cloud.error.browser":"支付页面未打开,请重新打开或恢复同一订单,无需重新购买。","cloud.error.machines":"此账号已达到云同步设备上限,请在「设置 → 个人 → 云服务」查看设备列表。","cloud.error.generic":"暂时无法确认操作结果,请刷新账户或再次检查订单状态。本地应用仍可照常使用。","cloud.error.catalog":"无法载入云服务方案,服务可用前不能付款。","cloud.devices.count_unknown":"设备数量待确认","cloud.error.devices":"暂时无法加载云端设备,请重试后查看关联设备。","cloud.action.resume_purchase":"恢复上一笔购买","cloud.devices.resume":"恢复同步","cloud.devices.paused":"已暂停,不占用名额","cloud.devices.active":"占用同步名额","cloud.devices.resumed":"云同步已恢复,设备将在下一次允许同步时重新建立连接。","cloud.devices.no_slot":"请暂停另一台设备,释放同步名额。","cloud.error.machine_paused":"此设备已暂停,再次同步前请到「设置 → 个人 → 云服务」恢复。","cloud.error.membership":"选择云服务方案以恢复云端访问,本地记录与导出仍免费。","cloud.error.account_network":"连接中断,请先刷新账户确认最新状态,再重试操作。","cloud.checkout.refunded":"此笔付款已退款","cloud.checkout.refunded_detail":"服务端已确认此笔付款全额退款。请到「设置 → 个人 → 云服务」查看当前 Cloud 权益和付款记录。","cloud.checkout.term_ended":"此段会员期限已结束","cloud.checkout.term_ended_detail":"这笔付款仍保留在账单历史中。可选择方案续费云服务,本地功能仍免费。","cloud.error.account_provider":"订阅管理目前不可用,请刷新账户确认当前续费状态。","cloud.membership.renewal_paused":"自动续费已暂停,请在订阅详情中核查是否安排了恢复。","cloud.membership.renewal_unknown":"下次扣款日期待确认,请在订阅详情中核查续费安排。","cloud.cancel.no_term":"取消自动续费?当前 Cloud 权益以上方显示为准,本地功能始终免费。","cloud.feature.analysis":"跨设备用量分析","cloud.feature.analysis_detail":"汇总各设备用量,随时查看费用估算、趋势与 Provider 或模型明细。","cloud.feature.history_title":"托管历史与导出","cloud.feature.sync_title":"持续同步与设备管理","cloud.self_host.title":"想把后端放在自己的服务器?","cloud.self_host.body":"开源后端可作为 VPS 自部署的基础。软件免费,服务器、备份和升级由你负责。目前部署方案仍处于技术预览。","cloud.self_host.cta":"查看部署说明","self_host.back":"返回云服务方案","self_host.status":"技术预览","self_host.title":"部署到自己的服务器。","self_host.subtitle":"TokenTracker 保持开源。你可以使用 InsForge 和后端源码,在 VPS 上搭建独立实例。软件许可免费,服务器费用和运维由你负责。","self_host.preview_title":"完整部署流程仍待验证","self_host.preview_body":"后端 TypeScript 函数和 SQL 迁移已公开。TokenTracker 的完整基础建表流程、全新 VPS 联调仍待完成。不要直接执行全部历史迁移,其中包含针对线上数据的修复。","self_host.steps_title":"部署需要做什么","self_host.step.backend_title":"部署 InsForge 服务","self_host.step.backend_body":"使用官方 Docker Compose 配置,并设置自己的域名、HTTPS、数据库和登录配置。InsForge 云端管理 CLI 不用于管理自部署实例。","self_host.step.schema_title":"补齐 TokenTracker 数据结构和函数","self_host.step.schema_body":"先创建基础表、访问策略和汇总函数,再部署后端 TypeScript。该基础部署流程仍在整理,历史补丁不能替代安装器。","self_host.step.client_title":"编译并接入自有客户端","self_host.step.client_body":"配置自有仪表盘、登录回调和同步地址。已发行桌面客户端目前默认连接官方服务,自有实例需要重新编译客户端并验证连接。","self_host.responsibility_title":"服务器由你维护","self_host.responsibility_body":"VPS、域名、邮件发送、备份、升级和安全维护由你负责。免费软件不包含托管服务或可用性承诺。","self_host.community":"独立实例使用自己的账户与数据,不接入官方公共排行榜。","self_host.link.insforge":"InsForge 部署参考","self_host.link.source":"后端源码","self_host.managed_title":"希望我们维护服务器?","self_host.managed_body":"TokenTracker Cloud 提供跨设备分析、托管历史与同步,服务器由我们维护。本地应用始终完整免费。","self_host.link.cloud":"查看云服务方案","cloud.checkout.waffo":"Waffo 安全支付","cloud.checkout.methods_fixed":"可使用微信或银行卡,具体可用方式以 Waffo 支付页为准。支付页会在新标签页打开,此处保留订单。","cloud.checkout.methods_recurring":"支持信用卡,适用时也可使用 Apple Pay 或 Google Pay。支付页会在新标签页打开,此处保留订单。","cloud.provider.waffo":"Waffo 支付","cloud.provider.unknown":"支付渠道","cloud.membership.portal_login":"查看 Waffo 账单时,请使用购买时的邮箱登录。","cloud.action.view_bills":"查看付款账单","cloud.price.draft":"测试价格草案。国内外使用相同的美元基础价,最终价格尚未确定。","cloud.action.restart_checkout":"关闭本次结账并重新尝试","cloud.action.restarting_checkout":"正在关闭未付款结账…","cloud.checkout.restart_detail":"Waffo 支付页无法重新打开时,可关闭本次未付款结账后重试。如果已经付款,请先检查状态。服务端会核实原订单未付款,正在处理的付款不能重开。","cloud.checkout.verification_pending":"付款仍在等待确认,暂时不能重开结账。请先检查原订单状态,确认后再重试。","cloud.checkout.duplicate_payment":"检测到原订单和重试订单均有付款。请查看账单并联系支持处理重复收款,暂时不要再次付款。","cloud.action.review_duplicate_payment":"查看重复收款","cloud.prompt.label":"云服务方案","cloud.prompt.dismiss":"关闭云服务提示","cloud.prompt.free":"本地追踪和导出继续免费。每日社区上传和排行榜参与不需要会员。","cloud.prompt.sync":"个人 Cloud 每 15 分钟同步各设备变化的用量。免费社区上传仍可每天从选定的 1 台设备继续。","cloud.prompt.view":"Cloud 把多台设备的用量合并到同一个个人视图,可通过网页查看估算费用及 provider、模型分析。","cloud.prompt.history":"个人 Cloud 提供跨设备最近 90 天小时明细和 24 个月日汇总访问。机器上已保留的本地历史不需要会员也能查看。","cloud.prompt.devices":"免费社区上传使用选定的 1 台设备。Cloud 支持多设备同步;你也可以暂停已有设备,继续使用免费社区上传。","cloud.prompt.devices_manage":"这台设备已暂停,或同步名额已满。请在账号页选择需要暂停或恢复的设备,历史数据会保留。","cloud.prompt.history_window":"这个日期范围超出了 Cloud 历史窗口。请选择支持的范围,或查看自己机器上保留的完整本地历史。","cloud.prompt.unconfirmed":"云服务购买状态尚未确认。可先了解托管服务,本地使用与每日免费社区上报仍可继续。","cloud.prompt.billing_recovery":"账号仍有未结束的自动续费订阅,但个人 Cloud 当前不可用。请查看账号账单和付款状态,处理现有订阅。","cloud.prompt.try":"免费试用云服务","cloud.prompt.learn":"了解云服务","cloud.prompt.local":"查看本地数据","cloud.prompt.deadline_trial":"试用将于 {{date}} 结束,不会自动扣款。个人云端历史随后有 30 天只读和导出窗口,本地使用和社区上传仍免费。","cloud.prompt.deadline_transition":"过渡期将于 {{date}} 结束。已有个人云端历史随后有 30 天可读和导出,本地使用和社区上传继续可用。","cloud.prompt.deadline_active":"你的云服务权益可用至 {{date}}。续费状态请查看账户账单。到期后本地数据仍可使用。","instance.configuration.invalid":"此实例的连接配置不完整或不安全。部署者需提供有效服务地址及该实例的公开 anon key,重新加载后再登录。","instance.configuration.changed":"后端实例已改变,请重新加载并登录选定的实例。","cloud.status.self_hosted":"自部署,免费","cloud.self_host.instance_title":"免费自部署实例","cloud.self_host.instance_body":"此账号使用你自己的 TokenTracker 后端,无需订阅或支付官方云服务服务,账号与排行榜也独立于官方服务。","cloud.self_host.instance_retention":"实例运营者负责服务器容量、备份和历史保留。存储规则请向运营者确认,官方 Cloud 的设备和历史收费限制不适用。","cloud.self_host.manage_devices":"管理同步设备","cloud.devices.unlimited_self_hosted":"已登记 {{count}} 台同步设备","cloud.self_host.sync_hint":"上报发往自部署实例,由运营者管理同步、存储与保留策略,无需官方云服务会员。","instance.connection.destination":"登录目标为 {{host}},登录凭证会发送到这个实例。","cloud.self_host.public_profile_disabled":"这个私有实例未启用公开 Profile,不会向官方排行榜公开资料。","cloud.action.open_app":"在 TokenTracker 中打开","cloud.checkout.return_app_hint":"回到已登录的桌面应用中查询该订单,开通状态由服务端确认。","cloud.gift.redeem_action":"兑换会员","cloud.gift.detail":"赠送会员包含完整云服务权益,本次兑换不会创建自动续费。已有订阅需单独管理。","cloud.gift.code_label":"会员兑换码","cloud.gift.confirm":"确认兑换","cloud.gift.redeeming":"正在兑换…","cloud.gift.redeemed":"兑换成功","cloud.gift.already_redeemed":"你已兑换过此码,对应礼遇已显示在账户中。","cloud.gift.refresh_needed":"兑换已记录,但会员状态刷新失败。请刷新账户,确认权益和生效日期。","cloud.gift.redeem_another":"兑换其他码","cloud.gift.membership_label":"获赠云服务","cloud.gift.history_title":"云服务礼遇","cloud.gift.duration":"{{days}} 天云服务","cloud.gift.term":"{{days}} 天云服务,{{start}} 至 {{end}}。","cloud.gift.state_active":"使用中","cloud.gift.state_pending":"当前权益结束后生效","cloud.gift.state_expired":"已到期","cloud.gift.state_revoked":"已撤销","cloud.gift.error_unavailable":"此兑换码不可用。请检查输入,或联系发码人。","cloud.gift.error_rate_limit":"尝试次数较多,请稍后再试。","cloud.gift.error_not_available":"当前实例暂未开放会员兑换。","cloud.gift.error_renewal":"请先在订阅管理中关闭自动续费。","cloud.gift.error_checkout":"请先处理账单中的待付款订单。","cloud.gift.error_active":"你有正在使用或待生效的云服务礼遇。请先在账户中查看,再决定后续付费。","cloud.gift.error_network":"暂时无法确认兑换结果。可以重试同一码,已记录的礼遇不会重复发放。","cloud.prompt.deadline_gift":"获赠云服务将于 {{date}} 到期。礼遇本身不会自动续费,到期后本地数据仍可使用。","sessions.filter.model_all":"全部模型","sessions.filter.model_search":"搜索模型…","sessions.filter.model_empty":"没有匹配的模型","sessions.filter.model_aria":"按会话模型筛选","sessions.filter.range_custom":"自定义","sessions.filter.from":"范围开始日期","sessions.filter.to":"范围结束日期","sessions.filter.clear":"清除筛选","sessions.group.aria":"会话分组","sessions.group.time":"按日期","sessions.group.project":"按项目","sessions.group.unknown_date":"未知日期","sessions.sort.aria":"会话排序","sessions.sort.recent":"最近","sessions.sort.cost":"费用最多","sessions.sort.tokens":"Tokens 最多","sessions.summary.count":"匹配会话","sessions.summary.scope":"有时间用量记录的会话按所选日期汇总 token 和成本;没有用量时间桶的会话保留完整历史。轮数、时长和性能指标仍描述整个会话。每个会话和子代理仅计一次。","sessions.summary.speed":"估算速度","sessions.performance.speed":"约 {{speed}} tok/s","sessions.performance.samples":"{{count}} 个有效计时请求","sessions.performance.method":"输出 tokens ÷ 估算请求时长,包含响应等待,排除工具执行和空闲时间。该值不代表纯生成速度。","sessions.performance.first_response":"首次响应等待","sessions.performance.first_response_value":"{{seconds}} 秒 · {{count}} 个样本","sessions.performance.first_response_method":"工具上报的首次 token 等待时间均值。Codex 按整轮上报,一轮可能包含多次模型调用。","sessions.detail.open_aria":"查看 {{title}} 的统计","sessions.detail.title":"会话统计","sessions.detail.close":"关闭会话统计","sessions.detail.tokens":"Token 构成","sessions.detail.models":"模型与费用","sessions.detail.own":"当前会话","sessions.detail.subagents":"子代理","sessions.detail.signals":"已记录的活动","sessions.detail.retries":"重复请求","sessions.detail.tools":"工具调用","sessions.detail.tool_failures":"工具失败","sessions.detail.errors":"错误","sessions.detail.model_calls":"模型调用","sessions.detail.compactions":"上下文压缩","sessions.detail.cost_source":"费用来源","sessions.detail.cost_reported":"工具上报","sessions.detail.cost_estimated":"按模型价格估算","sessions.detail.cost_mixed":"工具上报与价格估算混合","sessions.detail.cost_unknown":"未上报","sessions.detail.pricing_unpriced":"无公开价格","sessions.detail.pricing_free":"免费模型","sessions.detail.pricing_rates":"基础价格,美元 / 百万 tokens。输入 {{input}} · 输出 {{output}} · 缓存读取 {{cacheRead}} · 缓存写入 {{cacheWrite}}。分档与优先处理费率可能不同。","sessions.detail.reasoning_note":"推理 tokens 为参考项,可能已包含在输出 tokens 中。","sessions.detail.no_speed":"暂无可靠计时样本","usage.filter.source_all":"全部工具","dashboard.cost_breakdown.method":"模型价格用于估算 API 等价费用,不代表订阅支出。工具上报费用优先,缺少价格的用量不计入费用。","dashboard.cost_breakdown.reported":"费用由工具上报","dashboard.cost_breakdown.mixed":"工具上报费用与模型估算混合","dashboard.cost_breakdown.estimated":"按模型价格估算","dashboard.cost_breakdown.unpriced":"未匹配到价格。保留这些 tokens,但费用未知。","dashboard.cost_breakdown.no_token_charge":"此数据来源或模型不收取 token 费用","dashboard.cost_breakdown.unpriced_label":"未定价","dashboard.cost_breakdown.token_mix":"输入 {{input}} · 输出 {{output}} · 缓存读取 {{read}} · 缓存写入 {{write}}","dashboard.cost_breakdown.rates":"基础价格,美元 / 百万 tokens。输入 {{input}} · 输出 {{output}} · 缓存读取 {{read}} · 缓存写入 {{write}}。分档与优先处理费率可能不同。","dashboard.cost_breakdown.known_subtotal":"已知费用小计","dashboard.cost_breakdown.rate_unknown":"费率状态未知","sessions.detail.not_recorded":"未记录","sessions.detail.pricing_litellm":"LiteLLM 价格","sessions.detail.pricing_curated":"维护价格表","sessions.page.summary":"查看本机会话、用量和估算费用。","sessions.filter.range_label_all":"不限日期","sessions.summary.scope_help":"查看统计口径","sessions.col.session":"会话 / 项目","sessions.col.speed":"速度","sessions.col.actions":"操作","sessions.detail.consumption":"用量与费用","sessions.detail.pricing_details":"价格详情","sessions.detail.identifiers":"会话标识","sessions.detail.session_id":"会话 ID","sessions.detail.local_path":"本地路径","sessions.detail.resume_command":"恢复命令","sessions.performance.first_response_value_single":"{{seconds}} 秒 · {{count}} 个样本","cloud.export.open":"导出 Cloud 用量","cloud.export.description":"按日导出 · UTC 日期 · 美元估算","cloud.export.from":"开始日期 (UTC)","cloud.export.to":"结束日期 (UTC)","cloud.export.csv":"下载 CSV","cloud.export.json":"下载 JSON","cloud.export.busy":"正在核对 Cloud 权限并准备文件…","cloud.export.error_auth":"请重新登录后再导出。","cloud.export.error_access":"这些 Cloud 历史已无法导出。","cloud.export.error_dates":"请选择有效的日期范围。","cloud.export.error_changed":"账号、后端、日期或读取权限已变化,请重新导出。","cloud.export.error_failed":"导出失败,请重试 CSV 或 JSON。","cloud.export.success":"已下载 {{from}} 至 {{to}} 的 {{count}} 个有记录日期 (UTC)。","cloud.export.empty":"所选范围没有记录。下载文件包含范围说明,不包含用量行。","cloud.export.truncated":"仅下载可读取的 {{from}} 至 {{to}} (UTC),文件也记录了原先选择的范围。","cloud.export.dashboard":"查看仪表盘","cloud.action.buy_pro":"开通云服务","cloud.price.fixed_monthly_total":"一次付款,使用一个月。","cloud.price.fixed_annual_total":"一次付款,使用一年,折合每月 {{equivalent}}。","cloud.checkout.help_title":"付款遇到问题?","cloud.faq.cost_title":"为什么云服务收费?","cloud.faq.cost_body":"随着使用量增长,官方托管同步、存储、带宽、备份和维护需要持续投入。云服务订阅用于支持这些服务及其长期维护。本地应用的完整功能仍免费开源。","cloud.plan.local_community":"排行榜、成就与个人主页","cloud.plan.monthly_equivalent":"折合 {{equivalent}} / 月","cloud.plan.sync":"每 {{minutes}} 分钟自动同步","cloud.plan.hourly_history":"{{days}} 天小时级用量明细","cloud.plan.daily_history":"{{months}} 个月日汇总与云端导出","cloud.plan.identity":"专属头像框与会员标识","cloud.plan.faq_title":"你可能想了解","cloud.plan.details_title":"云服务具体包含什么?","cloud.plan.self_host_summary":"也可以部署到自己的服务器,软件免费,托管与维护由你负责。当前为技术预览。","cloud.plan.renewal_hint":"· 可随时取消","cloud.plan.renewal_off":"· 一次付款","cloud.plan.skip_trial":"购买 Cloud","cloud.plan.anywhere":"随时从浏览器查看各设备用量","cloud.plan.retained_history":"{{days}} 天小时明细 · {{months}} 个月日汇总","cloud.onboarding.local_next":"在「设置 → 个人 → 云服务」中开启同步,即可连接此设备;其他电脑登录同一账号,便可汇总查看用量。","cloud.onboarding.web_next":"在各电脑的 TokenTracker 应用中登录此账号,并在「设置 → 个人 → 云服务」中开启同步,用量会显示在这里。","cloud.action.setup_sync":"设置云同步","cloud.login.trial_context":"登录后继续开启云服务试用,已保留你的方案选择。","cloud.login.purchase_context":"登录后继续开通云服务,已保留你的方案选择。","cloud.membership.payment_due":"续费付款需要处理,请在账单中检查付款状态或更新支付方式。","cloud.plan.trial_setup_hint":"开始试用后,在电脑上开启云同步。","cloud.trial.used_hint":"你已使用过免费试用,选择 Cloud 方案继续使用。","sessions.storage.label":"转录文件:{{size}}","sessions.storage.tooltip":"仅会话文件 · {{metric}} · 每千个历史 token {{ratio}} 字节。不含共享数据库、缓存和项目文件。","sessions.storage.allocated":"分配空间","sessions.storage.logical":"逻辑文件大小","sessions.storage.size":"{{value}} MiB","cloud.gift.done":"完成","cloud.free.device_scope":"仅统计当前设备的用量","cloud.plan.includes_local":"包含全部免费本地功能","cloud.plan.device_sync":"不限设备数量,跨设备汇总同步","cloud.plan.device_fair_use":"日常个人使用不限设备数量,不按设备收费;大量或异常设备接入可能触发同步保护。"},JN={"landing.screenshot.alt":"TokenTracker 仪表板截图","landing.nav.login":"登录","landing.nav.signup":"注册","landing.install.command":"npx --yes tokentracker-cli","landing.install.action.copy":"复制命令","landing.install.action.copied":"已复制","landing.meta.title":"Token Tracker —— AI 编程 CLI 的 Token 用量追踪器","landing.meta.description":"自动监控 Claude Code、Cursor、Codex 等工具的 Token 用量。本地优先、注重隐私、零配置。","landing.meta.og_site_name":"Token Tracker","landing.meta.og_type":"website","landing.meta.og_image":"https://www.tokentracker.cc/og-image.jpg","landing.meta.og_url":"https://www.tokentracker.cc/","landing.meta.twitter_card":"summary_large_image","share.meta.title":"Token Tracker 分享","share.meta.description":"分享你的 Token Tracker 仪表板快照,包含跨模型、项目和时间窗口的用量洞察。","share.meta.og_site_name":"Token Tracker","share.meta.og_type":"website","share.meta.og_image":"https://www.tokentracker.cc/share-dashboard.jpg","share.meta.og_url":"https://www.tokentracker.cc/share","share.meta.twitter_card":"summary_large_image","landing.cta.primary":"进入仪表板","landing.cta.secondary":"GitHub","landing.v2.hero.title_line1":"追踪每一个","landing.v2.hero.title_line2":"AI TOKEN","landing.v2.install.mac_cta":"下载 macOS 版","landing.v2.install.win_cta":"下载 Windows 版","landing.v2.install.desktop_cta":"下载桌面版","landing.v2.install.os_macos":"macOS","landing.v2.install.os_windows":"Windows","landing.v2.install.availability":"支持 macOS 与 Windows","landing.v2.models.title":"支持的 AI CLI 工具","landing.v2.distill.body":"100% 本地处理,不上传任何 Prompt 或代码。","landing.v2.leaderboard.kicker":"全球 TOKEN 排行榜","landing.v2.leaderboard.title":"AI Token 效率","landing.v2.leaderboard.subtitle":"您可以选择匿名同步本地 AI Token 用量,加入全球效率排行榜。与全球用户一同评估模型开销效率与调用频次。","landing.v2.leaderboard.view_more":"查看完整排行榜","landing.v2.footer.line":"Token Tracker —— 为每一位使用 AI 的人而打造。","landing.v2.nav.status":"状态","landing.v2.nav.privacy":"隐私","landing.v2.nav.github":"GitHub","landing.v2.cta.primary":"仪表板","landing.v2.hero.subtagline":"自动监控 Claude Code、Cursor、Codex 等工具的 Token 用量。本地优先、注重隐私、零配置。","leaderboard.profile.nav.back":"排行榜","leaderboard.profile.nav.download":"下载","leaderboard.title":"排行榜","leaderboard.horizontal_scroll":"横向滚动排行榜列","limits.settings.enable_all":"全部开启","limits.settings.disable_all":"全部关闭","limits.settings.bulk_visibility":"服务商显示","limits.settings.enabled_count":"已开启 {{enabled}} / {{total}} 个服务商","limits.zcode.start_grants":"Start 套餐","limits.zcode.grant_amount":"剩余 {{remaining}} / {{total}} Token","limits.zcode.reset_bank.title":"额度重置","limits.zcode.reset_bank.count":"{{count}} 次可用","limits.zcode.reset_bank.earliest":"最早 {{time}} 到期","leaderboard.range":"UTC {{period}} · {{from}} – {{to}}","leaderboard.range_loading":"UTC {{period}} · …","leaderboard.range.total":"全部时间","leaderboard.generated_at":"更新于 {{ts}}","leaderboard.period.week":"周","leaderboard.period.month":"月","leaderboard.period.total":"全部","leaderboard.me_label":"你","leaderboard.anon_label":"匿名","leaderboard.error.unknown":"未知错误","leaderboard.loading":"加载中…","leaderboard.empty":"暂无数据","leaderboard.column.rank":"排名","leaderboard.column.user":"用户","leaderboard.column.total":"总计","leaderboard.column.codex":"Codex","leaderboard.column.claude":"Claude","leaderboard.column.gemini":"Gemini","leaderboard.column.cursor":"Cursor","leaderboard.column.opencode":"OpenCode","leaderboard.column.openclaw":"OpenClaw","leaderboard.column.hermes":"Hermes","leaderboard.column.kiro":"Kiro","leaderboard.column.copilot":"Copilot","leaderboard.column.kimi":"Kimi","leaderboard.column.supplemental":"其他","leaderboard.column.est_cost":"预估花费","leaderboard.signin_prompt":"登录后即可上榜","leaderboard.signin_button":"登录","leaderboard.sync_prompt":"开启免费榜单同步即可参与排名。","leaderboard.sync_button.idle":"开启免费同步","leaderboard.sync_button.busy":"同步中…","leaderboard.pagination.page_size_label":"每页显示","leaderboard.pagination.prev":"上一页","leaderboard.pagination.next":"下一页","leaderboard.pagination.ellipsis":"……","leaderboard.pagination.page_unknown":"第 {{page}} 页","share.modal.title":"分享你的数据","share.modal.subtitle":"生成海报卡片,随处分享。","share.modal.close":"关闭","share.modal.action.x":"分享到 X","share.modal.action.download":"下载","share.modal.action.copy":"复制图片","share.modal.hint.x":"把图片粘贴到推文里","share.modal.hint.copy":"到剪贴板","share.modal.name_label":"显示名称","share.modal.name_placeholder":"输入你的名字","share.modal.style_label":"样式","share.modal.footer":"数据始终保留在本地——图片在你的浏览器内生成,绝不上传。","share.button.label":"分享","share.button.aria":"打开分享卡片","share.toast.copied":"图片已复制到剪贴板","share.toast.downloaded":"图片已保存","share.toast.failed":"图片生成失败","share.toast.working":"生成中…","share.variant.neon":"霓虹","share.variant.broadsheet":"特刊","share.date.month_year":"{{year}} 年 {{month}}","share.issue.all_time":"总计","share.month_short.jan":"1 月","share.month_short.feb":"2 月","share.month_short.mar":"3 月","share.month_short.apr":"4 月","share.month_short.may":"5 月","share.month_short.jun":"6 月","share.month_short.jul":"7 月","share.month_short.aug":"8 月","share.month_short.sep":"9 月","share.month_short.oct":"10 月","share.month_short.nov":"11 月","share.month_short.dec":"12 月","share.hook.top_loyal":"{{name}} 占了 {{percent}}% 的用量。","share.hook.days_record":"共记录 {{days}} 天。","share.hook.top_led":"{{name}} 领跑,占比 {{percent}}%。","share.hook.multi_models":"{{days}} 天里用了 {{count}} 个模型。","share.hook.days_with_model":"{{name}} 陪你跑了 {{days}} 天。","share.hook.new_chapter":"新的记录,从这里开始。","share.card.broadsheet.issue":"期号","share.card.broadsheet.by":"分享者","share.card.broadsheet.tracked_since":"追踪起始","share.card.broadsheet.total_tokens":"总 Token 数","share.card.broadsheet.estimated_spend":"预估花费","share.card.broadsheet.billable_days":"{{days}} 个活跃日","share.card.broadsheet.heatmap_title":"年度热图","share.card.broadsheet.heatmap_days_on_record":"{{active}} / {{total}} 天有记录","share.card.broadsheet.roster_title":"模型榜","share.card.broadsheet.roster_subtitle":"常用模型轮换","share.card.broadsheet.empty":"这一周很安静,还没有模型数据。","share.card.broadsheet.global_rank":"全站排名","share.card.broadsheet.active_days":"活跃","share.card.broadsheet.days_count":"{{days}} 天","share.card.broadsheet.track_yours":"追踪你自己的","share.card.annual.report_title":"用量报告","share.card.annual.less":"少","share.card.annual.more":"多","share.card.annual.heatmap_title":"Token 热图","share.card.annual.total_tokens":"总 Token 数","share.card.annual.estimated_cost":"预估成本","share.card.annual.longest_streak":"最长连击","share.card.annual.days_count":"{{days}} 天","share.card.annual.top_model":"热门模型","landing.v3.hero.kicker":"桌面宠物 · 4 款小组件 · 成就系统","landing.v3.hero.subtitle":"由 27 款 AI 编码工具的真实活动驱动:一个会陪你写代码的桌面伙伴,本地优先、开源,隐私从设计开始。","landing.v3.hero.stat_label":"社区已追踪的 Token 总量","landing.v3.hero.scroll_hint":"滚动","landing.v3.stats.devs_syncing":"{{count}} 位用户正在同步","landing.v3.tools.count":"开箱即用支持 {{count}}+ 款 AI 编码工具。","landing.v3.how.kicker":"工作原理","landing.v3.how.title":"从敲下回车到仪表板,只需毫秒。","landing.v3.how.subtitle":"无需代理,无需粘贴 API Key。TokenTracker 直接读取 CLI 已经写在本地的用量数据——全程在你的机器上完成。","landing.v3.how.step1.title":"照常使用你的 Agent","landing.v3.how.step1.body":"Claude Code、Codex、Cursor、Gemini——保持你现有的工作方式,一切照旧。","landing.v3.how.step2.title":"Hook 捕获用量","landing.v3.how.step2.body":"每一轮对话的 Token 数直接从 CLI 自己的本地会话日志中解析。","landing.v3.how.step3.title":"在本机排队落盘","landing.v3.how.step3.body":"用量被规范化后追加写入 ~/.tokentracker 下的队列文件,数据不出你的磁盘。","landing.v3.how.step4.title":"实时渲染","landing.v3.how.step4.body":"本地仪表板即时聚合每个工具、每个模型、每个小时的数据。","landing.v3.cap.kicker":"尽收眼底","landing.v3.cap.title":"一个仪表板,装下所有 Agent。","landing.v3.cap.subtitle":"开销、额度、节奏与模型——你的 AI 用量全景,实时在本地聚合。","landing.v3.cap.limits.title":"额度雷达","landing.v3.cap.limits.body":"跨 Provider 监控 5 小时、每周与每月窗口——在任务中途撞墙之前就心中有数。","landing.v3.cap.heatmap.title":"365 天活跃热力图","landing.v3.cap.heatmap.body":"GitHub 风格的编码节奏一览——每个小时都在你的本机上分桶统计。","landing.v3.cap.devices.title":"多设备,一张全景图","landing.v3.cap.devices.body":"macOS 菜单栏、Windows 托盘、CLI 全平台——可选同步为同一账号视图。","landing.v3.privacy.kicker":"本地优先","landing.v3.privacy.title":"你的 Prompt 永远不会离开你的机器。","landing.v3.privacy.p1":"只统计 Token 数","landing.v3.privacy.p2":"不收集 Prompt 与代码","landing.v3.privacy.p3":"GitHub 开源","landing.v3.leaderboard.panel_title":"社区排行(全球)","landing.v3.leaderboard.live":"实时","landing.v3.leaderboard.anonymous":"匿名用户","landing.v3.leaderboard.tokens_synced":"已同步 {{count}} Token","landing.v3.download.title":"30 秒开始追踪。","landing.v3.download.subtitle":"一条命令,或一次下载。免费、开源、属于你。","landing.v3.stats.fallback_tokens":"2200000000000","landing.v3.stats.fallback_devs":"600","landing.v2.leaderboard.active_developers":"1,240+ 位用户正在同步","landing.v2.leaderboard.top_badge":"效率冠军","landing.v2.leaderboard.rank_first":"全球第 1 名","landing.v2.leaderboard.rank_second":"第 2 名","landing.v2.leaderboard.rank_third":"第 3 名","landing.v2.leaderboard.synced_tokens":"已同步 {{count}} Token","landing.v2.leaderboard.efficiency":"效率:{{value}}","landing.v2.leaderboard.streak_days":"连续 {{count}} 天","landing.v3.how.scene.terminal_title":"终端","landing.v3.how.scene.prompt":'"重构解析器"',"landing.v3.how.scene.thinking":"正在思考…","landing.v3.how.scene.editing":"正在编辑 {{path}}","landing.v3.how.scene.files_changed":"已修改 {{count}} 个文件","landing.v3.how.scene.session_title":"会话日志 · 上一轮","landing.v3.how.scene.appended":"已在本机追加","landing.v3.how.scene.total_tokens":"Token 总量","landing.discovery.tracked_usage":"Token Tracker 按模型、项目和时间范围统计输入、输出、缓存及缓存写入 token,并读取 Claude、Codex、Cursor、Gemini、Antigravity、Qoder、Qoder CN、Command Code 和 Devin 等 17 家工具的使用额度。","landing.discovery.limits_summary":"查看 17 家工具的实时额度和订阅状态;Antigravity、Qoder 等本地来源支持保留最近一次有效结果。","landing.discovery.faq_usage":"按模型、项目和时间范围统计输入、输出、缓存及缓存写入 token,并展示 Claude、Codex、Cursor、Gemini、Antigravity、Qoder、Qoder CN、Command Code 和 Devin 等 17 家工具的使用额度。"},XN={"provider.display.workbuddy_ai":"WorkBuddy AI","header.auth.sign_in_aria":"登入","login.back_home":"返回首頁","login.cloud_only":"未配置雲端登入。請使用 localhost 上的本地儀表盤。","login.title":"登入","login.subtitle":"選擇郵箱或已連線賬號。","login.dismiss":"關閉","login.verify_email_success":"郵箱已驗證。你現在可以登入。","login.verify_email_pending":"請先在郵箱中完成驗證,然後再登入。","login.oauth.continue":"使用 {{provider}} 繼續","login.oauth.desktop_start_failed":"無法啟動桌面版登入,請再試一次。","login.divider":"或","login.tab.sign_in":"登入","login.tab.sign_up":"建立賬戶","login.field.name":"顯示名稱","login.field.name_placeholder":"可選","login.field.email":"電子郵件","login.field.password":"密碼","login.forgot_password":"忘記密碼?","login.password_hint":"至少 {{min}} 個字元。","login.submit.sign_in":"使用郵箱登入","login.submit.sign_up":"建立賬號","reset_password.back_to_sign_in":"返回登入","reset_password.title":"重設密碼","reset_password.subtitle":"輸入郵箱以接收重設連結。","reset_password.request.submit":"傳送重設連結","reset_password.request.sent":"已發送重設連結與驗證碼,請檢查郵箱。","reset_password.field.code":"重設驗證碼","reset_password.field.new_password":"新密碼","reset_password.field.confirm_password":"確認密碼","reset_password.reset.submit":"重設密碼","reset_password.error.password_mismatch":"兩次輸入的密碼不一致。","reset_password.error.missing_token":"缺少重設令牌。請重新請求重設連結。","reset_password.success":"密碼已更新。你現在可以使用新密碼登入。","reset_password.success_cta":"返回登入","auth.callback.processing":"處理中…","auth.callback.success":"登入成功","auth.callback.redirecting":"正在返回 TokenTracker…","auth.callback.failed":"登入未完成,請重試。","auth.callback.close":"關閉此頁","login_modal.subtitle":"登入以加入排行榜","login_modal.continue_email":"使用郵箱繼續","login_modal.divider_email":"郵箱","shared.placeholder.short":"--","shared.unit.percent":"%","shared.unit.thousand_abbrev":"K","shared.unit.million_abbrev":"M","shared.unit.billion_abbrev":"B","shared.unit.trillion_abbrev":"T","shared.data_source":"資料來源:{{source}}","shared.error.prefix":"錯誤:{{error}}","shared.status.unsynced":"—","shared.time.now":"剛剛","shared.time.m_ago":"{{n}}分鐘前","shared.time.h_ago":"{{n}}小時前","shared.time.d_ago":"{{n}}天前","error.boundary.title":"出了點問題","error.boundary.subtitle":"這個檢視渲染失敗了","error.boundary.hint":"開啟控制台,然後重新載入頁面","error.boundary.no_details":"沒有錯誤詳細資訊","error.boundary.action.reload":"重新載入","identity_card.rank_label":"開始使用","identity_card.streak_label":"活躍天數","identity_card.rank_placeholder":"—","identity_card.streak_value":"{{days}} 天","usage.summary.total":"Token 總數","usage.summary.toggle_aria":"切換精簡數字格式","usage.period.day":"日","usage.period.week":"周","usage.period.month":"月","usage.period.total":"總計","usage.period.custom":"自定義","usage.metric.total":"總計","usage.metric.input":"輸入","usage.metric.output":"輸出","usage.metric.cached_input":"快取輸入","usage.metric.reasoning_output":"推理輸出","usage.button.refresh":"重新整理","usage.overview.tablist_aria":"時間範圍","usage.overview.cost_breakdown_aria":"檢視成本明細","usage.overview.distribution_aria":"來源佔比:{{items}}","usage.overview.distribution_item":"{{label}} {{percent}}%","usage.overview.provider_card_aria":"{{provider}}:{{percent}}%,{{tokens}} Token,{{cost}}。點選{{action}}詳情","usage.overview.expand":"展開","usage.overview.collapse":"收起","usage.overview.model_count":"{{count}} 個模型","usage.overview.model_details_aria":"{{provider}} 模型詳情","widgets.page.title":"選單欄與小元件","widgets.cta.open_gallery":"開啟小元件庫","widgets.cta.download":"下載 Mac App","widgets.cta.macos_only":"僅限 macOS","widgets.menubar.section.title":"選單欄","widgets.gallery.section.title":"桌面小元件","widgets.summary.name":"使用概覽","widgets.summary.description":"今天和近 7 天的用量,以及緊湊趨勢線。","widgets.heatmap.name":"熱力圖","widgets.heatmap.description":"像 GitHub 一樣,一眼看清活躍和空閒的日子。","widgets.topModels.name":"熱門模型","widgets.topModels.description":"你最常用的模型,按 Token 佔比排序。","widgets.limits.name":"使用限制","widgets.limits.description":"Claude、Codex、Cursor、Gemini 等的即時速率限制進度。","daily.sort.date.label":"日期","daily.sort.date.title":"按日期排序","daily.sort.total.label":"總計","daily.sort.total.title":"按總計排序","daily.sort.input.label":"輸入","daily.sort.input.title":"按輸入排序","daily.sort.output.label":"輸出","daily.sort.output.title":"按輸出排序","daily.sort.cached.label":"快取","daily.sort.cached.title":"按快取輸入排序","daily.sort.reasoning.label":"推理","daily.sort.reasoning.title":"按推理輸出排序","daily.sort.conversations.label":"對話數","daily.sort.conversations.title":"按對話排序","details.pagination.prev":"上一頁","details.pagination.next":"下一頁","limits.copilot.otelHint.title":"跟蹤 Copilot Token 使用情況","limits.copilot.otelHint.body":"限額資訊通過你的 GitHub OAuth 令牌讀取。如果還想記錄逐 Token 用量,請啟用 Copilot 的 OpenTelemetry 匯出,把下面這段加到你的 shell 配置檔案(~/.zshrc 或 ~/.bashrc):","limits.copilot.otelHint.copy":"複製","limits.copilot.otelHint.copied":"已複製","limits.panel.title":"使用限制","limits.panel.mode_separator":" · ","limits.label.cursor_plan":"套餐","limits.label.cursor_grok_bot":"Grok 機器人","limits.label.cursor_auto":"自動","limits.label.cursor_api":"API","limits.label.kiro_month":"月度","limits.label.kiro_bonus":"獎勵","limits.label.kiro_tracked_credits":"本機用量:{{credits}} 積分 · {{count}} 個回合","limits.label.kimi_weekly":"周","limits.label.kimi_5h":"5h","limits.label.kimi_total":"總量","limits.label.kimi_parallel":"併發:{{count}}","limits.explain.used":"{{label}}:已用 {{used}}%","limits.explain.on_track":"{{label}}:節奏正常,預計用到 {{pct}}%","limits.explain.ahead_eta":"{{label}}:偏快,約 {{eta}} 後用完","limits.explain.ahead_pct":"{{label}}:偏快,預計用到 {{pct}}%","limits.explain.body":"豎標為勻速到現在應到的位置,填充超過即為偏快。","limits.explain.remaining":"{{label}}:剩餘 {{used}}%","limits.explain.on_track_remaining":"{{label}}:節奏正常,預計剩餘 {{pct}}%","limits.explain.ahead_pct_remaining":"{{label}}:偏快,預計剩餘 {{pct}}%","limits.explain.body_remaining":"豎標為勻速到現在應到的位置,填充不足即為偏快。","limits.label.copilot_premium":"高階","limits.label.copilot_chat":"對話","limits.label.grok_month":"月度","limits.label.grok_week":"週","limits.label.grok_day":"日","limits.label.grok_ondemand":"按需","limits.provider.claude":"Claude","limits.provider.codex":"Codex","limits.provider.cursor":"Cursor","limits.provider.gemini":"Gemini","limits.provider.kimi":"Kimi","limits.provider.kiro":"Kiro","limits.provider.grok":"Grok Build","limits.provider.copilot":"GitHub Copilot","provider.display.omp":"oh-my-pi","provider.display.omo":"OmO","provider.display.minimax_code":"MiniMax Code","provider.display.command_code":"Command Code","provider.display.deepseek_harness":"DeepSeek Harness","provider.display.cline":"Cline","provider.display.trae":"TRAE","provider.display.trae_work_cn":"TRAE Work 中國版","limits.provider.antigravity":"Antigravity","limits.provider.zcode":"ZCode","limits.provider.opencode_go":"OpenCode Go","limits.provider.qoder":"Qoder","limits.provider.qoder_cn":"Qoder CN","limits.provider.command_code":"Command Code","limits.label.command_code_5h":"5h","limits.label.command_code_weekly":"每週","limits.label.zcode_glm52":"GLM-5.2","limits.label.zcode_glm5t":"GLM-5-Turbo","limits.label.opencode_go_5h":"5h","limits.label.opencode_go_weekly":"每週","limits.label.opencode_go_monthly":"每月","limits.label.qoder_credits":"積分","limits.label.qoder_ultimate":"Ultimate 免費呼叫","limits.label.qoder_cn_credits":"積分","limits.label.qoder_cn_ultimate":"Ultimate 免費呼叫","limits.provider.ark_coding_plan":"Ark Coding Plan","limits.label.ark_coding_plan_5h":"5h","limits.label.ark_coding_plan_weekly":"每週","limits.label.ark_coding_plan_monthly":"每月","limits.qoder_calls.detail":"已用 {{used}} / {{limit}} 次 · 剩餘 {{remaining}} 次","limits.hover.expires_at":"{{time}} 到期","limits.label.claude_5h":"5h","limits.label.claude_7d":"7d","limits.label.claude_opus":"Opus","limits.label.codex_5h":"5h","limits.label.codex_7d":"7d","limits.label.codex_credits":"額度","limits.label.codex_spark_5h":"Spark 5h","limits.label.codex_spark_7d":"Spark 7d","limits.codex_credits.detail":"已用 {{used}} / {{limit}} 點額度 · 剩餘 {{remaining}}","limits.codex_reset_bank.title":"重置","limits.codex_reset_bank.row_label":"重置 {{index}}","limits.codex_reset_bank.count_only":"重置額度:可用 {{count}} 次 · 到期時間不可用","limits.label.gemini_pro":"Pro","limits.label.gemini_flash":"Flash","limits.label.gemini_lite":"Lite","limits.label.antigravity_claude_weekly":"Cl 7d","limits.label.antigravity_claude_5h":"Cl 5h","limits.label.antigravity_gemini_weekly":"Gm 7d","limits.label.antigravity_gemini_5h":"Gm 5h","limits.label.antigravity_live":"即時","limits.label.antigravity_cached":"快取","limits.provenance.fresh":"即時","limits.provenance.stale":"過期","limits.provenance.tooltip":"來源:{{source}};可信度:{{confidence}}","limits.reauth.badge":"需重新登入","limits.reauth.tooltip":"登入已過期——在終端執行一次 `{{command}}` 重新登入,然後重新整理。","limits.tooltip.antigravity_live":"即時額度,來自你的 Antigravity Google 帳號。","limits.tooltip.antigravity_cached":"快取的額度。會用本機 Antigravity 登入憑證重新整理,無需打開應用。","limits.tooltip.qoder_cached":"快取的額度。啟動 Qoder 以重新整理。","limits.bar.sub_one_percent":"<1","limits.status.not_connected":"未連線","limits.status.no_data":"未返回即時限額資料","limits.opencodeGo.status.inactive":"OpenCode Go 訂閱已失效","limits.status.all_hidden":"所有限額提供商都已隱藏。請開啟顯示設定重新顯示。","nav.usage":"用量","nav.limits":"限額","nav.widgets":"選單欄與小元件","nav.skills":"Skills","nav.leaderboard":"排行榜","nav.collapse":"摺疊側邊欄","nav.expand":"展開側邊欄","nav.menu":"開啟導航選單","nav.close_menu":"關閉導航選單","nav.aside_label":"主導航","nav.nav_label":"導航","limits.page.subtitle":"AI 工具的速率限制和配額使用情況。","limits.settings.toggle_visible":"切換可見性","limits.settings.display_mode_label":"用量顯示","limits.settings.display_mode_used":"已用","limits.settings.display_mode_remaining":"剩餘","limits.page.openSettings":"顯示設定","limits.page.openSubscriptions":"訂閱管理","limits.page.refresh":"重新整理限額","limits.page.refresh_loading":"正在重新整理限額…","limits.page.refreshed_at":"限額已更新:{{time}}","limits.page.refresh_failed":"限額重新整理失敗。","limits.page.refresh_partial":"已於 {{time}} 更新限額,但部分資料仍來自快取或更新失敗。","limits.page.refresh_stale":"重新整理完成,但所有服務商仍顯示快取或失敗資料。","nav.group.general":"常規","nav.group.tools":"工具","nav.group.account":"賬戶","nav.settings":"設定","header.auth.open_settings":"開啟設定","settings.page.title":"設定","settings.page.subtitle":"管理你的賬戶、外觀和顯示偏好。","settings.nav.group.personal":"個人","settings.nav.group.app":"應用程式","settings.nav.group.developer":"開發者","settings.section.appearance":"外觀","settings.section.appearance.description":"主題、語言、貨幣和數字格式。","settings.section.account":"賬戶","settings.section.account.description":"公開資料和帳戶詳情。","settings.section.cloud":"雲端服務","settings.section.cloud.description":"管理 Cloud 會員、帳單和裝置同步。","settings.section.limits":"用量與限制","settings.section.limits.description":"選擇用量顯示方式並設定限制服務商。","settings.section.network":"網路","settings.section.network.description":"控制雲端同步和診斷功能使用的代理。","settings.network.mode.label":"對外代理","settings.network.mode.hint":"選擇 Token Tracker 雲端同步連上網際網路時使用的代理。應用程式更新一律依照系統代理。","settings.network.mode.system":"系統","settings.network.mode.manual":"手動","settings.network.mode.off":"關閉","settings.network.protocol.label":"協定","settings.network.protocol.http":"HTTP 代理","settings.network.protocol.https":"HTTPS 代理","settings.network.protocol.socks5":"SOCKS5 代理","settings.network.host.label":"主機","settings.network.host.placeholder":"127.0.0.1","settings.network.port.label":"連接埠","settings.network.port.placeholder":"7890","settings.network.test":"測試連線","settings.network.test.testing":"正在測試…","settings.network.test.ok":"已到達測試網址(HTTP {{status}})。","settings.network.test.fail":"無法連線:{{error}}","settings.network.save":"儲存","settings.network.saving":"正在儲存…","settings.network.saved":"代理設定已儲存。","settings.network.error.host":"請填寫主機,不要帶 http:// 或路徑。","settings.network.error.port":"請填寫 1 到 65535 之間的連接埠。","settings.network.effective.manual":"目前正在使用手動代理。","settings.network.effective.env":"目前正在使用環境變數中的代理。","settings.network.effective.system":"目前正在使用系統代理。","settings.network.effective.none":"目前為直連。","settings.network.effective.blocked":"對外連線已被阻斷:手動代理未能生效。","settings.network.apply_error":"已儲存的代理未能生效:{{error}}。代理未生效,出網已被阻斷,請檢查代理設定。","settings.network.save_error":"無法儲存代理設定:{{error}}","settings.network.save_error_unprotected":"無法儲存代理設定:{{error}}。對外連線目前處於無保護狀態——連阻斷都失敗了。","settings.limits.providers":"Provider","settings.labs.island.label":"靈動島","settings.labs.island.hint":"將 MacBook 瀏海變成靈動島:收起時展示今日 Token 與花費,懸停查看花費與額度詳情。","settings.labs.island.aria":"切換靈動島","settings.labs.island_hide_menubar.label":"隱藏選單列圖示","settings.labs.island_hide_menubar.hint":"啟用靈動島後隱藏頂部選單列圖示,僅使用靈動島。","settings.labs.island_hide_menubar.aria":"切換隱藏選單列圖示","dashboard.island.title":"認識一下靈動島","dashboard.island.hint":"把 MacBook 瀏海變成即時 Token 儀表:今日 Token 與花費一目了然,懸停查看花費與額度詳情。","dashboard.island.enable":"立即開啟","dashboard.island.settings_link":"在設定中查看","dashboard.island.enabled_toast":"靈動島已開啟,抬頭看看瀏海吧","dashboard.island.dismiss_aria":"關閉靈動島提示","dashboard.linux_pet.title":"認識一下桌面寵物","dashboard.linux_pet.hint":"桌面上的小夥伴——懸停查看今日 Token、花費和額度,隨處拖動。","dashboard.linux_pet.show":"顯示寵物","dashboard.linux_pet.settings_link":"寵物設定","dashboard.linux_pet.dismiss_aria":"關閉桌面寵物提示","settings.labs.qpd.label":"PR 研發性價比分析","settings.labs.qpd.hint":"基於已合併 PR 與 AI 歸因提交,分析各模型的平均交付成本與有效 Token。","settings.labs.qpd.aria":"切換 PR 性價比分析","settings.labs.sessions.label":"會話效率分析","settings.labs.sessions.hint":"僅使用本機中繼資料,分析 Claude 與 Codex 的編輯覆蓋、一次完成率和單次編輯成本。","settings.labs.sessions.aria":"切換會話效率分析","qpd.card.title":"研發性價比與交付成本","qpd.card.badge":"測試版","qpd.card.subtitle":"基於已合併 PR 與 AI 歸因提交的歷史,估算不同模型的平均交付成本。","qpd.card.updating":"更新中…","qpd.card.best_value":"最省錢","qpd.card.col_model":"模型","qpd.card.col_cost":"花費","qpd.card.col_accepted":"已合 PR","qpd.card.col_rate":"採納率","qpd.card.col_qpd":"單PR成本","qpd.card.qpd_tooltip":"平均每合併一個 PR 消耗的 Token 資金 (總花費 ÷ 已合併數)","qpd.card.totals":"已合併 {{accepted}}/{{outcomes}} 個 PR · 總花費 {{cost}}","qpd.card.et":"有效 Token: {{tokens}} (採納率 {{rate}})","qpd.card.et_tooltip":"有效 Token (Effective Tokens) —— 最終成功採納並合併的程式碼所消耗的 Token 占總消耗的比例","qpd.card.sparse_notice":"提示:資料量較少,建議篩選更窄的時間區間以獲得精準分析。","settings.appearance.theme.label":"主題","settings.appearance.theme.hint":"選擇 Token Tracker 在儀表盤中的顯示方式。","settings.appearance.theme.light":"淺色","settings.appearance.theme.dark":"深色","settings.appearance.theme.system":"系統","settings.account.displayName":"顯示名稱","settings.account.edit":"編輯","settings.account.save":"儲存","settings.account.saving":"儲存...","settings.account.cancel":"取消","settings.account.userId":"使用者 ID","settings.account.copyUserId":"複製使用者 ID","settings.account.copy":"複製","settings.account.copied":"已複製","settings.account.cloudSync":"雲同步","settings.account.cloudSyncHint":"同步這台電腦的用量統計,彙總查看各裝置用量。Prompt、程式碼和 Provider 憑證留在本機。","settings.account.cloudSyncPending":"正在嘗試同步…","settings.account.cloudSyncError":"同步未完成。請檢查網路、本機服務及登入狀態後重試,本機記錄不受影響。","settings.account.publicProfile":"公開主頁","settings.account.publicProfileHint":"在公開排行榜中展示你的用量。","settings.account.displayNameAnonymousHint":"匿名狀態下,排行榜會隱藏你的名字和頭像","settings.account.displayNameDisabledWhileAnon":"請先關閉匿名,再編輯名字","settings.account.githubUrl":"GitHub 主頁","settings.account.githubUrlHint":"在排行榜名字旁顯示 GitHub 連結。","settings.account.githubUrlPlaceholder":"使用者名稱或 https://github.com/使用者名稱","settings.account.githubUrlInvalid":"請輸入 GitHub 使用者名稱,或 https://github.com/使用者名稱","leaderboard.github.aria":"開啟 GitHub 主頁","leaderboard.github.tooltipAction":"點選檢視 GitHub 主頁","leaderboard.github.tooltipPrefix":"可在","leaderboard.github.tooltipSettingsLink":"設定","leaderboard.github.tooltipSuffix":"中配置你的主頁","leaderboard.pro.badge":"Pro","leaderboard.pro.badge_aria":"TokenTracker Pro 會員","leaderboard.pro.tooltip":"Pro 會員,排名仍依用量計算。","settings.account.signOut":"退出登入","settings.account.signIn":"登入","settings.account.signedOutHint":"登入後可管理公開資料和帳戶詳情。","settings.section.menubar":"App 與更新","settings.section.menubar.description":"管理背景同步、啟動行為和應用程式更新。","settings.menubar.showStats":"在選單欄中顯示統計資訊","settings.menubar.showStatsHint":"在選單欄圖示旁邊顯示今天的 Token 數量和成本。","settings.menubar.iconStyle":"選單欄圖示","settings.menubar.iconStyleHint":"選擇誰住在選單欄。AI 工具消耗 token 時,小貓和寵物會跑得更快。","settings.menubar.iconStyle.clawd":"Clawd","settings.menubar.iconStyle.bot":"Bot","settings.menubar.iconStyle.cat":"小貓","settings.menubar.iconStyle.pet":"我的寵物","settings.menubar.iconStyle.static":"靜態","pet.menubar.title":"在選單欄奔跑","pet.menubar.hint":"寵物將取代選單欄圖示,AI 工具消耗 token 時會加速衝刺。","settings.menubar.toastOnReset":"額度重置時顯示提示","settings.menubar.toastOnResetHint":"用量額度重置時顯示一則簡短提示。","settings.menubar.confettiOnReset":"額度重置時撒花","settings.menubar.confettiOnResetHint":"在接近上限後,額度重置時放一場煙火慶祝。","settings.menubar.appearance":"選單欄顯示與圖示","settings.menubar.appearanceHint":"統計資訊、指標位與動態圖示在「選單欄與小元件」頁面設定。","settings.menubar.appearanceLink":"前往","settings.menubar.launchAtLogin":"登入時啟動","settings.menubar.launchAtLoginHint":"登入 macOS 時自動啟動 TokenTrackerBar。","settings.menubar.syncNow":"立即同步","settings.menubar.syncNowHint":"觸發本地AI工具日誌立即解析並上傳。","settings.menubar.syncing":"正在同步...","settings.menubar.updates":"更新","settings.menubar.autoUpdate":"自動更新","settings.menubar.autoUpdateHint":"在背景自動下載並安裝新版本。關閉後仍可隨時手動檢查更新。","settings.menubar.checkUpdates":"檢查更新","settings.footer.statusPage":"系統狀態","menubar.slot.primary":"第一個位置","menubar.slot.secondary":"第二個位置","menubar.native_only":"開啟 macOS 版 TokenTrackerBar 後可編輯選單欄顯示。","menubar.metric.today_tokens":"今日 Token","menubar.metric.none":"不顯示(留空)","menubar.metric.today_cost":"今日成本","menubar.metric.last_7d_tokens":"近 7 天 Token","menubar.metric.total_tokens":"總 Token","menubar.metric.total_cost":"總成本","menubar.metric.claude_5h":"Claude 5 小時限額","menubar.metric.claude_7d":"Claude 7 天限額","menubar.metric.codex_5h":"Codex 5 小時限額","menubar.metric.codex_7d":"Codex 7 天限額","menubar.metric.codex_credits":"Codex 額度上限","menubar.metric.codex_spark_5h":"Codex Spark 5 小時限額","menubar.metric.codex_spark_7d":"Codex Spark 7 天限額","nav.ip_check":"Claude IP 檢查","nav.service_status":"服務狀態","status.page.subtitle":"來自各 AI 提供商官方狀態頁的即時事故狀態。","status.page.source_note":"由瀏覽器直接讀取各提供商的公開狀態頁,每分鐘自動重新整理。","status.state.checking":"檢查中…","status.state.none":"運作正常","status.state.minor":"輕微事故","status.state.major":"重大事故","status.state.critical":"嚴重故障","status.state.unknown":"無法存取","status.open_page":"打開 {{provider}} 狀態頁","status.refresh":"重新整理","status.last_checked":"檢查於 {{time}}","skills.page.title":"Skills","skills.tab.my":"我的","skills.tab.browse":"發現","skills.action.refresh":"重新整理","skills.action.install":"安裝","skills.action.choose_targets":"選擇目標","skills.target.menu_label":"安裝到","skills.target.none":"未選目標","skills.toast.installed":"已把 {{name}} 安裝到 {{targets}}。","skills.action.remove":"移除","skills.action.search":"搜尋","skills.action.search_aria":"搜尋 Skills","skills.action.search_clear":"清除搜尋","skills.target.synced_summary":"已同步到 {{targets}}","skills.target.synced_none":"尚未同步到任何 Agent","skills.row.open_details":"檢視 {{name}} 詳情","skills.detail.close":"關閉詳情","skills.detail.sync_section_title":"同步到","skills.detail.remove_button":"從所有 Agent 移除","skills.detail.remove_confirm_hint":"這會從每個 Agent 取消同步並刪除本地副本。","skills.filter.agent_label":"Agent","skills.filter.agent_all":"全部 Agent","skills.filter.clear":"清除篩選","skills.my.placeholder":"篩選已安裝的 Skills…","skills.filter.result_count":"{{filtered}} / {{total}} 個 Skill","skills.filter.result_count_browse":"{{count}} 個結果","skills.empty.no_match":"目前篩選條件下沒有符合的 Skill。","skills.inventory.plugin":"外掛","skills.inventory.remote":"其他裝置","skills.inventory.on_devices":"也安裝在 {{devices}}","skills.inventory.read_only_remote":"此 Skill 安裝在其他裝置上,此處僅供檢視。","skills.inventory.read_only_managed":"此外掛 Skill 由對應工具管理,無法在 Token Tracker 中變更或移除。","skills.inventory.source":"來源:{{source}}","skills.inventory.devices_title":"安裝於其他裝置","hint.dismiss":"關閉提示","hint.dismissible_aria":"可關閉的提示","skills.card.installed":"已安裝","skills.card.targets_prefix":"將安裝到:","skills.card.targets_change":"更改","skills.card.installs":"{{count}} 次安裝","skills.source.label":"來源","skills.source.all":"全部倉庫","skills.mode.repo":"倉庫","skills.mode.skillssh":"skills.sh","skills.browse.placeholder_all":"在已啟用的倉庫裡搜尋…","skills.browse.placeholder_repo":"在 {{repo}} 中搜索…","skills.browse.placeholder_skillssh":"在 skills.sh 倉庫中搜索…","skills.browse.empty_sources":"新增一個 GitHub 倉庫以開始瀏覽 Skills。","skills.browse.add_repo_hint":"想要更多 Skill?新增一個 GitHub 儲存庫。","skills.browse.manage_sources":"管理來源","skills.browse.hint_skillssh":"至少輸入 2 個字元以搜尋 skills.sh。","skills.browse.loading_hint":"正在從 GitHub 取得 Skill 資訊,首次載入可能需要一分鐘,結果會快取。","skills.error.generic":"Skill 操作失敗。","skills.confirm.remove_title":"要移除 {{name}} 嗎?","skills.confirm.remove_managed":"這個 Skill 將從所有已連線的 AI 工具中移除,幾秒內可以復原。","skills.confirm.remove_local":"將從所有 AI 工具目錄中刪除該 Skill 資料夾。此操作無法復原。","skills.toast.removed":"已移除 {{name}}。","shared.action.undo":"撤銷","shared.action.cancel":"取消","shared.action.apply":"套用","skills.empty.my":"還沒有 Skill。去「發現」搜尋或安裝。","skills.empty.my_cta":"去發現","skills.empty.browse":"這個來源下沒有找到 Skill。","skills.empty.search":"沒有結果,換個關鍵詞試試。","skills.repo.placeholder":"owner/repository","skills.repo.add":"新增倉庫","skills.repo.invalid":"請輸入 owner/repository 或 GitHub 倉庫 URL。","skills.repo.remove":"移除倉庫","settings.appearance.language.label":"語言","settings.appearance.language.hint":"使用“系統”時會預設跟隨本機語言。","settings.appearance.language.system":"系統","settings.appearance.language.english":"英語","settings.appearance.language.chinese":"簡體中文","settings.appearance.language.traditional_chinese":"繁體中文","settings.appearance.language.japanese":"日語","settings.appearance.language.korean":"韓語","settings.appearance.language.german":"德語","settings.appearance.currency.label":"貨幣","settings.appearance.currency.hint":"選擇用量成本的顯示幣種。","settings.appearance.token_format.label":"Token 數字顯示","settings.appearance.token_format.hint":"全域使用精簡或完整數字;精簡模式下懸停可查看精確數值。","settings.appearance.token_format.compact":"精簡","settings.appearance.token_format.full":"完整","settings.appearance.token_unit.label":"數字單位","settings.appearance.token_unit.hint":"精簡數字使用 K/M/B 或萬/億單位;完整數字不使用單位縮寫。","settings.appearance.token_unit.english":"K/M/B(英文)","settings.appearance.token_unit.chinese":"萬/億(中文)","settings.appearance.currency.opt.usd":"美元 ($)","settings.appearance.currency.opt.eur":"歐元 (€)","settings.appearance.currency.opt.gbp":"英鎊 (£)","settings.appearance.currency.opt.cny":"人民幣 (¥)","settings.appearance.currency.opt.jpy":"日元 (¥)","settings.appearance.currency.opt.hkd":"港幣 (HK$)","settings.appearance.currency.rate_source.default":"內建預設匯率","settings.appearance.currency.rate_source.fetched":"資料來源:open.er-api.com","settings.appearance.currency.rate_updated":"更新於 {{when}}","settings.appearance.currency.rate_never":"尚未重新整理","sessions.card.title":"工作階段效率","sessions.card.subtitle":"Claude 與 Codex 的統一編輯回合指標","sessions.card.loading":"正在分析本機會話中繼資料…","sessions.card.edit_sessions":"編輯工作階段","sessions.card.first_pass":"一次完成","sessions.card.cost_edit":"單次編輯成本","sessions.card.model":"模型","sessions.card.edit_session_value":"{{edits}} / {{sessions}}","sessions.card.edit_turn_count":"{{count}} 個編輯回合","sessions.card.tokens_edit":"單次編輯 Token","sessions.card.sample":"{{sessions}} 個工作階段 · {{edits}} 個編輯回合","sessions.card.methodology_label":"統計口徑","sessions.card.methodology":"編輯 = 一個包含已觀測編輯工具的使用者回合。一次完成 = 僅有一個編輯回合,且使用者未重複提出相同要求。","sessions.card.context":"預估固定上下文","sessions.card.context_tooltip":"指令、已安裝 Skills 與推斷的 MCP 工具結構","sessions.card.privacy":"僅處理本機中繼資料,不保留 Prompt、回覆、命令輸出或差異內容。","sessions.card.subagents":"Sub-agent 調度","sessions.card.subagent_item":"{{name}} · {{calls}}","nav.sessions":"工作階段","sessions.page.refresh":"重新整理工作階段","sessions.filter.source_aria":"依工作階段來源篩選","sessions.filter.range_aria":"依日期範圍篩選","sessions.filter.range_7d":"7 天","sessions.filter.range_30d":"30 天","sessions.filter.range_90d":"90 天","sessions.filter.project_all":"所有專案","sessions.filter.project_search":"搜尋專案…","sessions.filter.project_empty":"沒有符合的專案","sessions.filter.project_aria":"依專案篩選","sessions.filter.result_count":"{{filtered}} / {{total}}","sessions.action.search_aria":"搜尋工作階段","sessions.action.search_clear":"清除搜尋","sessions.search.placeholder":"搜尋標題、專案、模型或 ID…","sessions.loading":"正在載入工作階段…","sessions.col.tokens":"Token 數","sessions.col.cost":"花費","sessions.col.edits":"編輯","sessions.badge.first_pass":"一次完成","sessions.badge.reported_cost":"官方費用","sessions.badge.partial_usage":"用量不完整","sessions.badge.partial_cost":"成本不完整","sessions.cost.partial_title":"下限值 — 本工作階段中部分模型沒有公開費率,其 token 在此以 $0 計。","sessions.grok.runtime_breakdown":"模型呼叫 {{calls}} 次 · API {{seconds}} 秒 · 工具呼叫 {{tools}} 次 · 錯誤 {{errors}} 個","sessions.grok.context_breakdown":"上下文 {{used}} / {{window}}({{percent}}%)","sessions.badge.subagent":"子代理","sessions.thread.expand":"展開 {{count}} 個子代理","sessions.thread.collapse":"收合 {{count}} 個子代理","sessions.thread.tokens_summary":"自身 {{own}} · 子代理 {{subagents}} · 合計 {{combined}}","sessions.thread.result_count":"{{roots}} 個主執行緒 · {{subagents}} 個子代理已摺疊","sessions.thread.model_usage":"子代理模型用量","sessions.thread.model_all":"全部 · {{count}} 個 · {{tokens}}","sessions.thread.model_item":"{{model}} · {{count}} 個 · {{tokens}}","sessions.duration.minutes":"{{minutes}} 分","sessions.duration.hours":"{{hours}} 時 {{minutes}} 分","sessions.project.unknown":"未命名工作階段","sessions.model.unknown":"未知模型","sessions.resume.copy_aria":"複製恢復命令:{{command}}","sessions.resume.copied":"已複製恢復命令","sessions.resume.copy_failed":"無法複製命令","sessions.resume.unavailable":"暫無恢復命令","sessions.empty.title":"還沒有工作階段","sessions.empty.body":"在這台機器上執行 Claude Code、Codex 或 Grok,工作階段就會出現在這裡。","sessions.empty.filtered_title":"沒有符合的工作階段","sessions.empty.filtered_body":"換個搜尋詞,或放寬時間範圍。","sessions.col.turns":"輪數","sessions.project.copy_hint":"點擊複製該路徑","sessions.project.copy_aria":"複製 {{project}} 的本機路徑","sessions.project.copied":"專案路徑已複製","sessions.project.copy_failed":"無法複製路徑","sessions.action.load_more":"顯示更多工作階段","sessions.error.title":"無法載入工作階段","sessions.error.retry":"重試","sessions.error.outdated_app":"目前的 TokenTracker 版本過舊,無法列出工作階段。請更新至最新版本。","sessions.truncated":"僅顯示最近 {{shown}} 個工作階段(共 {{total}} 個)。縮小時間範圍即可看到更早的紀錄。","sessions.privacy":"僅在本機處理。Prompt 與回覆正文、命令輸出和差異內容絕不保留或上傳。","nav.achievements":"成就","limits.alert.enable":"開啟額度預測提醒","limits.alert.disable":"關閉額度預測提醒","limits.alert.title":"{{provider}} 額度可能提前用盡","limits.alert.body":"按目前速度,額度可能在 {{eta}} 後用盡(已使用 {{percent}}%)。","settings.section.labs":"實驗功能","settings.section.labs.description":"提前體驗即將成為標準功能的實驗性洞察。","limits.alert.blocked":"通知已關閉——請到系統設定允許","limits.hover.resets_at":"{{time}} 重置","limits.reset_bank.hover_detail":"{{date}} 到期 · 剩餘 {{days}} 天","limits.reset_bank.hover_detail_today":"{{date}} 到期 · 今天","limits.label.zcode_5h":"5 小時","limits.label.zcode_weekly":"每週","limits.label.zcode_tools":"工具","limits.opencodeGo.setupHint.title":"連接 OpenCode Go","limits.opencodeGo.setupHint.subtitle":"透過官方 API(opencode.ai/zen/go/v1/usage)讀取你的 OpenCode Go 用量。","limits.opencodeGo.setupHint.step1":"登入 opencode.ai 並訂閱 Go。","limits.opencodeGo.setupHint.cta":"開啟 opencode.ai","limits.opencodeGo.setupHint.step2":"在主控台建立並複製 API Key。","limits.opencodeGo.setupHint.step3":"執行這條命令,貼上 API Key(輸入不會顯示),然後重新啟動 Token Tracker:","limits.opencodeGo.setupHint.note_app":"macOS App:使用 launchctl setenv 那一行,然後重新開啟 App。","limits.opencodeGo.setupHint.copy":"複製","limits.opencodeGo.setupHint.copied":"已複製","limits.commandCode.setupHint.title":"連接 Command Code","limits.commandCode.setupHint.subtitle":"透過官方 Command Code API 讀取你的訂閱用量,沿用與 cmd CLI 相同的登入。","limits.commandCode.setupHint.step1":"方式 1 — 使用 Command Code CLI 登入(推薦):執行下方登入命令。TokenTracker 自動沿用登入,無需重新啟動。","limits.commandCode.setupHint.step2":"方式二——改用 API Key:執行以下命令,貼上你的 Key(輸入不會顯示),然後重新啟動 TokenTracker:","limits.commandCode.setupHint.copy":"複製","limits.commandCode.setupHint.copied":"已複製","limits.commandCode.setupHint.note_app":"macOS App:使用 launchctl setenv 那一行,然後重新開啟 App。","limits.codingPlan.setupHint.title":"連接 Ark Coding Plan","limits.codingPlan.setupHint.subtitle":"額度透過本機的官方 Ark CLI(arkcli)讀取。","limits.codingPlan.setupHint.step1":"透過 npm 安裝 Ark CLI。","limits.codingPlan.setupHint.cta":"查看安裝指南","limits.codingPlan.setupHint.step2":"使用火山引擎帳號登入(推薦瀏覽器 SSO)。","limits.codingPlan.setupHint.step2_remote":"無瀏覽器 / 遠端終端:arkcli auth login --no-browser","limits.codingPlan.setupHint.step3":"依序執行以下指令,然後重新整理本頁:","limits.codingPlan.setupHint.note_app":"登入後重新整理頁面即可,無需重新啟動 App。","limits.codingPlan.setupHint.copy":"複製","limits.codingPlan.setupHint.copied":"已複製","limits.provider.ark_agent_plan":"Ark Agent Plan","limits.label.ark_agent_plan_5h":"5h","limits.label.ark_agent_plan_weekly":"每週","limits.label.ark_agent_plan_monthly":"每月","limits.agentPlan.setupHint.title":"連接 Ark Agent Plan","limits.agentPlan.setupHint.subtitle":"額度透過本機的官方 Ark CLI(arkcli)讀取。","limits.agentPlan.setupHint.step1":"透過 npm 安裝 Ark CLI。","limits.agentPlan.setupHint.cta":"查看安裝指南","limits.agentPlan.setupHint.step2":"使用火山引擎帳號登入(推薦瀏覽器 SSO)。","limits.agentPlan.setupHint.step2_remote":"無瀏覽器 / 遠端終端:arkcli auth login --no-browser","limits.agentPlan.setupHint.step3":"依序執行以下指令,然後重新整理本頁:","limits.agentPlan.setupHint.note_app":"登入後重新整理頁面即可,無需重新啟動 App。","limits.agentPlan.setupHint.copy":"複製","limits.agentPlan.setupHint.copied":"已複製","limits.tooltip.ark_cached":"快取的額度。執行 arkcli 重新整理。","limits.agentPlan.setupHint.snippet_install":"npm install -g @volcengine/ark-cli","limits.agentPlan.setupHint.snippet_login":"arkcli auth login volc-sso # 瀏覽器 SSO(推薦)","limits.agentPlan.setupHint.snippet_status":"arkcli auth status # 驗證會話","skills.card.manage":"管理","skills.dot.synced_aria":"{{agent}}:已同步。點選可取消同步。","skills.dot.off_aria":"{{agent}}:未同步。點選可同步。","skills.dot.orphan_aria":"{{agent}}:連結已失效。點選可重新同步。","skills.update.badge":"可更新","skills.select.row_aria":"選取 {{name}}","skills.select.toolbar_aria":"批次操作","skills.select.count":"已選取 {{count}} 項","skills.select.bulk_sync":"同步到","skills.select.bulk_sync_hint":"將所選 Skill 全部加入此 Agent","skills.select.bulk_remove":"移除","skills.select.clear":"清除選取","skills.mode.popular":"熱門","skills.browse.placeholder_popular":"篩選熱門 Skills","skills.empty.popular":"目前沒有熱門 Skill。","skills.toast.bulk_synced":"已將 {{count}} 個 Skill 同步到 {{agent}}。","skills.toast.bulk_removed":"已移除 {{count}} 個 Skill。","skills.toast.synced_one":"已將 {{name}} 同步到 {{agent}}。","skills.toast.unsynced_one":"已取消 {{name}} 與 {{agent}} 的同步。","skills.toast.updated":"已更新 {{name}}。","skills.toast.updated_many":"已更新 {{count}} 個 Skill。","skills.toast.updated_partial":"已更新 {{total}} 個 Skill 中的 {{count}} 個,{{failed}} 個失敗。","skills.toast.updated_none":"所有 Skill 均為最新。","skills.confirm.bulk_remove_title":"移除 {{count}} 個 Skill?","skills.confirm.bulk_remove_desc":"這會取消每個 Skill 與所有 Agent 的同步,並刪除其本機副本。","skills.update.available":"上游有新版本可用。","skills.update.action":"更新","skills.update.all_action":"全部更新({{count}})","skills.update.rate_limited":"已更新 {{count}} 個 Skill 後觸發 GitHub 速率限制。請一小時後重試。","skills.confirm.update_all_title":"更新 {{count}} 個 Skill?","skills.confirm.update_all_desc":"每個 Skill 都會從其來源儲存庫重新下載,覆蓋本機副本。","skills.usage.section_title":"活動情況","skills.usage.invocations":"呼叫次數","skills.usage.cost":"預估費用","skills.usage.never":"從未使用","skills.usage.last_used":"上次使用","skills.usage.today":"今天","skills.usage.days_ago":"{{days}} 天前","skills.usage.months_ago":"{{months}} 個月前","skills.usage.unknown":"未知","skills.usage.unused":"尚未呼叫。如果你從未使用它,它可能只是無用負擔。","skills.usage.disclaimer":"呼叫次數來自 Claude 對話記錄;費用是呼叫此 Skill 的各輪對話的近似花費。","shared.dialog.close":"關閉對話框","shared.action.dismiss":"關閉","cmdk.placeholder":"搜尋頁面和 Skills…","cmdk.empty":"沒有相符項目","cmdk.group.pages":"頁面","cmdk.group.skills":"Skills","cmdk.close":"關閉命令選單","cmdk.open_aria":"命令選單","settings.menubar.updates.checking":"正在檢查…","settings.menubar.updates.upToDate":"已是最新版本!","settings.menubar.updates.failed":"檢查更新失敗,請再試一次。","settings.menubar.updates.modalTitle":"有可用更新","settings.menubar.updates.modalDescription":"新版本 {{version}} 已發佈。是否前往 GitHub 檢視並下載?","settings.menubar.updates.modalConfirm":"下載","settings.menubar.updates.modalCancel":"取消","settings.menubar.updates.footerCore":"TokenTracker v{{version}}","settings.menubar.updates.footerCombined":"TokenTrackerBar v{{barVersion}}(Core v{{coreVersion}})","pet.codex.title":"來自 Codex","pet.codex.subtitle":"匯入你在 Codex App 中已有的寵物,包括內建夥伴。","pet.codex.import":"匯入所選項目","pet.codex.browse":"從 Codex 匯入","pet.codex.close":"關閉","pet.codex.select_all":"全選","pet.codex.empty":"沒有可匯入的新 Codex 寵物。","pet.codex.imported":"已從 Codex 匯入。","shared.github.star":"Star","device.approval.title":"授權你的 CLI","device.approval.description":"輸入 CLI 顯示的代碼,將此裝置連結到你的帳號;該裝置的 Token 用量隨後會顯示在你的排行榜個人頁面中。","device.approval.sign_in_banner":"請先登入,然後返回此頁面。","device.approval.code_label":"CLI 代碼","device.approval.action.approve":"授權","device.approval.action.approving":"正在授權…","device.approval.error.sign_in":"請先登入。","device.approval.error.invalid_code":"代碼格式無效,應為 XXXX-XXXX。","device.approval.error.no_token":"未取得存取權杖,請重新登入。","device.approval.success.already":"此裝置先前已經授權。","device.approval.success.already_client":"{{client}} 先前已經授權。","device.approval.success.approved":"授權成功。你可以關閉此分頁,CLI 將在幾秒內完成連接。","device.approval.success.approved_client":"已授權 {{client}}。你可以關閉此分頁,CLI 將在幾秒內完成連接。","device.approval.error.not_found":"找不到該代碼,請核對 CLI 顯示的內容。","device.approval.error.expired":"代碼已過期,請重新執行 `tracker device-login` 後再試。","device.approval.error.session_expired":"工作階段已過期,請登出帳號、重新登入後再試。","device.approval.error.server":"伺服器錯誤(HTTP {{status}})。","device.approval.error.server_detail":"伺服器錯誤:{{message}}","device.approval.error.network":"網路錯誤:{{message}}","widgets.preview.today":"今天","widgets.preview.seven_days":"7 天","widgets.preview.heatmap_summary":"Token · {{days}} 個活躍日","widgets.preview.reset_days":"{{days}} 天後","widgets.preview.reset_hours_minutes":"{{hours}} 小時 {{minutes}} 分鐘後","widgets.preview.metric":"指標","settings.limits.showSubscriptions":"顯示訂閱","settings.limits.showSubscriptionsHint":"在額度面板中顯示手動記錄的訂閱續費進度。","limits.commandCode.setupHint.snippet_login":"cmd login","limits.commandCode.setupHint.snippet_read":"read -r -s COMMAND_CODE_API_KEY","limits.commandCode.setupHint.snippet_export":"export COMMAND_CODE_API_KEY","limits.commandCode.setupHint.snippet_setenv":'launchctl setenv COMMAND_CODE_API_KEY "$COMMAND_CODE_API_KEY"',"limits.commandCode.setupHint.snippet_login_windows":"cmdc auth login","limits.commandCode.setupHint.snippet_env_windows":"$token = Read-Host -AsSecureString\\n$env:COMMAND_CODE_API_KEY = [System.Net.NetworkCredential]::new('', $token).Password\\n[Environment]::SetEnvironmentVariable('COMMAND_CODE_API_KEY', $env:COMMAND_CODE_API_KEY, 'User')","limits.commandCode.setupHint.note_windows":"Windows:在 PowerShell 中執行,然後重新啟動 TokenTracker。","limits.commandCode.setupHint.note_linux":"Linux:從目前終端啟動 TokenTracker,以讀取環境變數。","limits.provider.devin":"Devin","limits.label.devin_daily":"每日","limits.label.devin_weekly":"每週","limits.devin.setupHint.title":"連接 Devin","limits.devin.setupHint.subtitle":"使用本機 Devin CLI 儲存的登入讀取你的 Devin 訂閱額度。","limits.devin.setupHint.step1":"安裝 Devin CLI 並執行下方命令登入,TokenTracker 自動沿用登入,無需重新啟動。","limits.devin.setupHint.note":"登入後重新整理此頁即可。TokenTracker 只會將儲存的工作階段權杖傳送到 Devin 官方額度端點。","limits.devin.setupHint.snippet_login":"devin auth login # 登入 Devin","settings.appearance.token_grouping.label":"數字分組","settings.appearance.token_grouping.hint":"精確數字使用 3 位或中文 4 位分組;精簡模式的懸停數值也會使用該設定。","settings.appearance.token_grouping.thousand":"3位","settings.appearance.token_grouping.wan":"4位","legal.nav.pricing":"雲服務定價","legal.nav.terms":"服務條款","legal.nav.support":"聯絡客服"},eD={"cloud.membership.tools_title":"工具與帳單","trend.monitor.pin_hint":"點擊柱子固定並捲動查看詳情","usage.overview.all_tools":"全部","usage.overview.all_models":"全部模型","usage.overview.all_models_note":"同名模型會跨工具合併,並按總用量排序。","usage.overview.week_cross_month_hint":"本週跨越兩個自然月,總量與單一自然月的用量並不直接可比","usage.overview.all_tools_card_aria":"全部工具:{{tokens}} Token,{{cost}},{{count}} 個模型。顯示合併後的模型排行","usage.overview.antigravity_notice_title":"Token 詳情","usage.overview.cache_hit_rate_label":"快取命中率","usage.overview.cache_hit_rate_detail":"{{reused}} 重用 / {{input}} 輸入","usage.overview.antigravity_notice_body":"本機存在工作階段元資料時,將直接從 Antigravity 讀取精確的 Token 用量與 Prompt 快取命中;缺少元資料的工作階段則依字元長度(約 4 字元/Token)估算。","usage.overview.devin_notice_title":"費用未估算","usage.overview.trae_notice_title":"TRAE 費用不完整","usage.overview.trae_notice_body":"在多步對話中,TRAE 只拆分最後一步的快取輸入,不拆分先前的步驟。沒有快取拆分的輸入計入 Token 總量,但不計入費用。費用依模型定價計算,並非實際帳單金額。","usage.overview.devin_notice_body":"Devin 回報的是真實的本機 Token 計數,但此版本沒有 swe-2、swe-2-high 和 compactor 的定價資料,這部分用量不計入美元費用估算——顯示 $0 並不代表用量免費。","stats.period.last_7d":"7 天","stats.period.last_30d":"30 天","stats.period.avg":"平均","stats.period.convs":"對話","dashboard.core_index.collapse_label":"▾","dashboard.core_index.expand_label":"▸","dashboard.core_index.collapse_aria":"摺疊模型分解","dashboard.core_index.expand_aria":"展開模型細分","dashboard.rolling.title":"最近的活動","dashboard.rolling.last_7d":"過去 7 天","dashboard.rolling.last_30d":"過去 30 天","dashboard.rolling.avg_active_day":"日平均","dashboard.projects.title":"專案用量","dashboard.projects.limit_aria":"選擇專案顯示數量","dashboard.projects.limit_top_3":"前 3 名","dashboard.projects.limit_top_6":"前 6 名","dashboard.projects.limit_top_10":"前 10 名","dashboard.projects.empty":"暫無專案用量。在 git 儲存庫內使用受支援的 CLI,用量就會歸屬到對應專案。","dashboard.projects.detail.close_aria":"關閉專案詳情","dashboard.projects.detail.error":"專案詳情載入失敗","dashboard.projects.detail.empty_range":"所選時間範圍內沒有用量","dashboard.projects.detail.stat_total":"Token 總量","dashboard.projects.detail.stat_conversations":"對話數","dashboard.projects.detail.stat_active_days":"活躍天數","dashboard.projects.detail.stat_avg_day":"日均(活躍日)","dashboard.projects.detail.stat_cache_hit":"快取命中率","dashboard.projects.detail.stat_share":"佔總用量比例","dashboard.projects.detail.section_trend":"每日活躍","dashboard.projects.detail.section_composition":"Token 構成","dashboard.projects.detail.section_sources":"依來源","dashboard.projects.detail.comp_input":"輸入","dashboard.projects.detail.comp_cached":"快取讀取","dashboard.projects.detail.comp_cache_write":"快取寫入","dashboard.projects.detail.comp_output":"輸出","dashboard.projects.detail.comp_reasoning":"推理","dashboard.projects.detail.source_days":"{{n}} 天","dashboard.projects.detail.source_conv":"{{n}} 次對話","dashboard.widgets.title":"桌面小元件","dashboard.widgets.hint":"右鍵點按桌面 → 編輯小元件 → 搜尋“TokenTracker”","dashboard.widgets.dismiss_aria":"關閉小元件介紹","dashboard.linux_topbar.title":"在頂欄查看用量","dashboard.linux_topbar.hint":"在 GNOME 上,TokenTracker 擴充功能會在頂欄的 Clawd 旁顯示今日 Token 和花費,下拉選單可查看額度和趨勢。","dashboard.linux_topbar.setup":"設定","dashboard.linux_topbar.dismiss_aria":"關閉頂欄提示","dashboard.linux_topbar.preview_readout":"8.2M · $12.40","dashboard.cost_breakdown.title":"成本明細","dashboard.cost_breakdown.total_label":"預計總成本","dashboard.cost_breakdown.close":"關閉","trend.monitor.label":"使用趨勢","trend.monitor.predicted":"預測值","trend.zoom.open_aria":"展開全螢幕","trend.zoom.close_aria":"關閉","trend.zoom.badge":"趨勢洞察","trend.zoom.desc":"懸停任一長條查看 token、成本與對話數。切換粒度可從月份下鑽到半小時。","trend.zoom.insight_badge":"洞察","trend.zoom.tooltip.cost":"成本","trend.zoom.tooltip.conversations":"對話","trend.zoom.stats.tokens":"Token 總量","trend.zoom.stats.cost":"總成本","trend.zoom.stats.conversations":"對話數","trend.zoom.stats.peak":"峰值時段","trend.zoom.gran.aria":"粒度","trend.zoom.gran.30min":"30 分鐘","trend.zoom.gran.day":"天","trend.zoom.gran.month":"月","trend.zoom.prev_day":"前一天","trend.zoom.next_day":"後一天","trend.zoom.loading":"載入中…","trend.zoom.pick_day":"選擇日期","trend.zoom.pick_range":"選擇日期範圍","trend.zoom.insight.empty":"一段安靜的時光,沒有一個 token 流過。","trend.zoom.insight.calm":"輕描淡寫。模型大多在待命,只在你需要時才醒來搭把手。","trend.zoom.insight.steady":"{{active}} 個活躍時段裡節奏平穩,峰值 {{peak}}。是那種不聲不響就把事情交付掉的節奏。","trend.zoom.insight.heavy":"火力全開:{{active}} 個時段持續高熱,峰值衝到 {{peak}}。這是自己製造勢能、而非等待靈感的人的產出。","trend.zoom.insight.massive":"工業級別。{{peak}} 的峰值,吞吐從不降溫。到這個量級,你已經不是在用模型,而是在營運一座工廠。","heatmap.title":"熱力圖","heatmap.empty":"尚無活動資料。","heatmap.legend.less":"少","heatmap.legend.more":"多","heatmap.legend.utc":"UTC","heatmap.tooltip":"{{day}} • {{value}} {{unit}} • {{tz}}","heatmap.unit.tokens":"Token","heatmap.month.jan":"1月","heatmap.month.feb":"2月","heatmap.month.mar":"3月","heatmap.month.apr":"4月","heatmap.month.may":"5月","heatmap.month.jun":"6月","heatmap.month.jul":"7月","heatmap.month.aug":"8月","heatmap.month.sep":"9月","heatmap.month.oct":"10月","heatmap.month.nov":"11月","heatmap.month.dec":"12月","heatmap.day.sun":"日","heatmap.day.mon":"一","heatmap.day.tue":"二","heatmap.day.wed":"三","heatmap.day.thu":"四","heatmap.day.fri":"五","heatmap.day.sat":"六","dashboard.session_expired.copy_label":"執行 npx --yes tokentracker-cli init","dashboard.session_expired.copied":"已複製","dashboard.install.prompt":"安裝 Node.js 18+ 然後執行:","dashboard.install.cmd.init":"npx --yes tokentracker-cli init","dashboard.install.cmd.init_link_code":"npx --yes tokentracker-cli init --link-code {{link_code}}","dashboard.install.copy":"複製安裝命令","dashboard.install.copy_base":"複製初始化命令","dashboard.install.copied":"已複製到剪貼簿","dashboard.install.link_code.loading":"正在生成專屬程式碼...","dashboard.install.link_code.failed":"專屬程式碼不可用","dashboard.install.cmd.sync":"npx --yes tokentracker-cli sync","dashboard.daily.title":"每日細目","dashboard.daily.empty":"還沒有資料。先使用 AI CLI,再執行 {{cmd}}。","dashboard.identity.title":"你的個人資料","dashboard.identity.subtitle":"記錄你的編碼之旅","dashboard.identity.fallback":"匿名使用者","dashboard.overview.layout.drag_handle":"拖曳以重新排列","dashboard.screenshot.twitter_text":"記錄中的 {{total_tokens}} Token。\\n{{model_name}} 以 {{model_percent}}% 領先。\\n\\n我的 AI 使用情況,未經審計 →","heatmap.3d.hover_tip":"點選進入 3D 全屏旋轉分析模式","heatmap.3d.modal.title":"Token 三維透視","heatmap.3d.modal.desc":"按住左鍵拖拽可任意旋轉,懸浮感知每日活躍資料與多維統計。","heatmap.3d.modal.stats.total_tokens":"年度 Token 總量","heatmap.3d.modal.stats.precision_total_tokens":"精準年消耗量","heatmap.3d.modal.stats.estimated_cost":"年度估算費用","heatmap.3d.modal.stats.active_rate_days":"活躍佔比 / 天數","heatmap.3d.modal.stats.max_streak":"最長連續活躍","heatmap.3d.modal.stats.days_suffix":"天","heatmap.3d.modal.stats.peak_day":"單日峰值暴擊","heatmap.3d.modal.stats.precision_peak_value":"精確單日峰值","heatmap.3d.modal.stats.no_data":"無資料","heatmap.3d.modal.legend.title":"活躍度層級","heatmap.3d.modal.palette.emerald":"翡翠之城","heatmap.3d.modal.palette.ocean":"深海浩瀚","heatmap.3d.modal.palette.neon":"賽博霓虹","heatmap.3d.modal.palette.amber":"烈焰餘暉","heatmap.3d.modal.control.play":"啟動慢速自轉","heatmap.3d.modal.control.pause":"暫停自動旋轉","heatmap.3d.modal.control.reset":"重置 3D 視角","heatmap.3d.modal.footer.tip":"雙指縮放 / 滾輪縮放 / 滑鼠拖拽旋轉 3D 圖表","heatmap.3d.modal.ai.title.default":"持之以恆的行者","heatmap.3d.modal.ai.eval.default":"您一直在持續行動、不斷向前。每一個微小的活躍點,都記錄著一次思考與探索。點滴星火終會匯聚成只屬於您的成果。","heatmap.3d.modal.ai.title.peak":"極限活躍級貢獻者","heatmap.3d.modal.ai.eval.peak":"這一年中,您的 Token 活躍度達到非凡水準。您持續以高度專注和強勁動能,把複雜想法轉化為具體成果,展現出持久的創造力。","heatmap.3d.modal.ai.title.heavy":"高頻創作者","heatmap.3d.modal.ai.eval.heavy":"卓越的持續輸出。累積的 Token 記錄了大量研究、創作與問題解決過程。這樣的穩定節奏展現出令人印象深刻的專注力與執行力。","heatmap.3d.modal.ai.title.core":"核心生產力專家","heatmap.3d.modal.ai.eval.core":"極具韌性的長期投入。在過去的一年中,您始終保持穩定而高效的節奏,不斷把 AI 協作轉化為持久成果,是當之無愧的核心生產力。","heatmap.3d.modal.ai.title.steady":"穩健創作者","heatmap.3d.modal.ai.eval.steady":"踏實而專注地持續前進。每一次 Token 的遞增,都代表您又把一個想法轉化成有價值的成果。持久的專業能力,正是在這樣的穩定節奏中累積起來的。","heatmap.3d.voxel.joke.1":"🔥 極度瘋狂!產出 {{value}} tokens!你是在瘋狂訓練大模型,還是手擼了一個編譯器?","heatmap.3d.voxel.joke.2":"🚀 史詩級輸出!共 {{value}} tokens。今日產出可繞地球一圈,AI 都在為你驚歎!","heatmap.3d.voxel.joke.3":"⚡ 爆擊日!{{value}} tokens。程式碼如泉湧,鍵盤已經開始冒煙了!","heatmap.3d.voxel.level3":"⚡ 生產力大爆發({{value}} tokens)!高效專注的黃金時刻,繼續保持這個巔峰狀態!","heatmap.3d.voxel.level2":"🌱 漸入佳境({{value}} tokens)!穩步產出,每一次敲擊鍵盤都是在為大廈添磚加瓦。","heatmap.3d.voxel.level1":"🍃 聚沙成塔({{value}} tokens)。微小的提交也是對未來的投資,保持複利的力量!","heatmap.3d.voxel.level0":"💤 養精蓄銳。在不寫程式碼的日子裡,靈感也在悄悄生長。","ipcheck.page.title":"Claude IP 檢測","ipcheck.page.subtitle":"檢視當前訪問 Claude 的出口 IP、純淨度、地理與風險訊號,識別可能影響登入或觸發風控的因素。","ipcheck.mask.toggle":"隱藏 IP","ipcheck.ipv6.warn":"當前為 IPv6 環境,不建議用 IPv6 訪問 Claude Code,部分檢測結果可能不完整。","ipcheck.ip.cn":"中國出口 IPv4","ipcheck.ip.cloudflare":"Cloudflare 出口","ipcheck.ip.claude":"Claude 出口","ipcheck.ip.failed":"獲取失敗","ipcheck.ip.loading":"載入中...","ipcheck.trust.title":"信任評分","ipcheck.trust.subtitle":"Claude 風控視角下的 IP 純淨度","ipcheck.trust.no_data":"無資料","ipcheck.trust.no_ip":"未獲取到 Claude 出口 IP,無法評分","ipcheck.trust.no_score":"該 IP 暫無評分資料","ipcheck.trust.gauge.low":"0 高危","ipcheck.trust.gauge.high":"100 可信","ipcheck.trust.label.pristine":"極度純淨","ipcheck.trust.label.clean":"純淨","ipcheck.trust.label.good":"良好","ipcheck.trust.label.neutral":"中性","ipcheck.trust.label.suspicious":"可疑","ipcheck.trust.label.unreachable":"不可訪問","ipcheck.trust.text.excellent":"該 IP 信譽極好","ipcheck.trust.text.great":"該 IP 信譽優異","ipcheck.trust.text.minor":"該 IP 存在輕微風險","ipcheck.trust.text.moderate":"該 IP 存在一定風險","ipcheck.trust.text.severe":"該 IP 風險極高","ipcheck.trust.text.restricted":"處於不可訪問區域,Claude 會嚴格風控","ipcheck.trust.region_warn.title":"Claude 出口 IP 位於 {{region}}","ipcheck.trust.region_warn.body":"不建議登入 Claude,容易觸發封號風控。","ipcheck.trust.region_support":"Claude 支援地區","ipcheck.trust.region.accessible":"可訪問","ipcheck.common.unknown":"未知","ipcheck.props.title":"IP 屬性","ipcheck.props.region":"地區","ipcheck.props.city":"城市","ipcheck.props.type":"型別","ipcheck.props.asn":"ASN","ipcheck.props.org":"運營商","ipcheck.props.residential":"家庭住宅","ipcheck.props.datacenter":"機房","ipcheck.security.title":"安全檢測","ipcheck.security.vpn":"VPN","ipcheck.security.proxy":"代理 (Proxy)","ipcheck.security.tor":"Tor","ipcheck.security.crawler":"機器人 (Crawler)","ipcheck.security.abuser":"濫用記錄","ipcheck.security.proxy_flag":"代理","ipcheck.security.crawler_yes":"是","ipcheck.security.crawler_no":"否","ipcheck.security.abuser_yes":"有記錄","ipcheck.security.abuser_no":"無記錄","ipcheck.security.clean":"未檢測到","ipcheck.avail.title":"Claude 可用性","ipcheck.avail.tooltip":"Claude 伺服器在美國,從亞洲訪問延遲超過 100ms 屬於正常情況。","ipcheck.avail.refresh":"重新整理","ipcheck.avail.svc_row":"服務狀態","ipcheck.avail.latency.normal":"正常","ipcheck.avail.latency.good":"良好","ipcheck.avail.latency.slow":"較慢","ipcheck.avail.latency.unreachable":"不可訪問","ipcheck.avail.svc.none":"全部正常","ipcheck.avail.svc.minor":"輕微故障","ipcheck.avail.svc.major":"重大故障","ipcheck.avail.svc.critical":"嚴重故障","ipcheck.avail.svc.maintenance":"維護中","ipcheck.avail.svc.other":"服務異常","ipcheck.dns.title":"DNS 洩露檢測","ipcheck.dns.status":"狀態","ipcheck.dns.outlet":"DNS 出口","ipcheck.dns.outlet_ip":"DNS 出口 IP","ipcheck.dns.isp":"服務商","ipcheck.dns.leaked":"可能洩露","ipcheck.dns.no_leak":"未檢測到洩露","ipcheck.dns.encrypted":"DNS 加密或未暴露","ipcheck.dns.cn_tag":"中國 DNS","ipcheck.udp.title":"WebRTC UDP 洩露","ipcheck.udp.status":"狀態","ipcheck.udp.outlet":"UDP 出口","ipcheck.udp.outlet_ip":"UDP 出口 IP","ipcheck.udp.origin":"歸屬地","ipcheck.udp.disabled":"WebRTC 已停用","ipcheck.udp.no_leak":"未檢測到洩露","ipcheck.udp.leaked":"可能洩露","ipcheck.udp.anomaly":"異常","ipcheck.device.title":"裝置資訊","ipcheck.device.tz":"時區","ipcheck.device.lang":"語言","ipcheck.device.os":"作業系統 / 瀏覽器","ipcheck.device.touch":"觸屏","ipcheck.device.net":"網路型別","ipcheck.device.dnt":"請勿追蹤","ipcheck.device.webgl_render":"WebGL 渲染器","ipcheck.device.canvas_fp":"Canvas 指紋","ipcheck.device.webgl_fp":"WebGL 指紋","ipcheck.device.match":"一致","ipcheck.device.mismatch":"不一致","ipcheck.device.local":"本地","ipcheck.device.estimate_suffix":"(估算)","ipcheck.device.diff_equal":"偏移略有差異","ipcheck.device.diff_ahead":"Claude 快 {{h}} 小時","ipcheck.device.diff_behind":"Claude 慢 {{h}} 小時","ipcheck.device.lang_expected":"Claude 出口常用","ipcheck.device.touch_yes":"是","ipcheck.device.touch_no":"否","ipcheck.device.dnt_on":"已開啟","ipcheck.device.dnt_off":"已關閉","ipcheck.device.dnt_unset":"未設定","ipcheck.device.net_unsupported":"不支援檢測","ipcheck.device.unsupported":"不支援","ipcheck.history.title":"Claude 出口 IP 歷史","ipcheck.history.subtitle":"僅本地儲存於瀏覽器,最多保留 6 條","ipcheck.history.clear":"清除","ipcheck.history.empty":"暫無歷史記錄","ipcheck.history.current":"當前","ipcheck.region.CN":"中國大陸","ipcheck.region.HK":"香港","ipcheck.region.MO":"澳門","ipcheck.region.RU":"俄羅斯","ipcheck.region.KP":"朝鮮","ipcheck.region.IR":"伊朗","ipcheck.region.SY":"敘利亞","ipcheck.region.CU":"古巴","ipcheck.region.BY":"白俄羅斯","ipcheck.region.VE":"委內瑞拉","leaderboard.profile_modal.close":"關閉","leaderboard.profile_modal.loading":"正在載入使用者資料…","leaderboard.profile_modal.error":"載入使用者資料失敗。","leaderboard.profile_modal.empty":"這個使用者的資料未公開。","leaderboard.profile_modal.row_aria":"檢視 {{name}} 的資料","leaderboard.profile_modal.rank":"#{{rank}}","leaderboard.profile.hero.rank_label":"排名","leaderboard.profile_modal.hero.total_tokens":"總 Token","leaderboard.profile_modal.hero.total_cost":"總花費","leaderboard.profile_modal.hero.github":"GitHub 主頁","leaderboard.profile_modal.stat.total_cost":"總花費","leaderboard.profile_modal.stat.total_tokens":"總 Token","leaderboard.profile_modal.stat.active_days":"活躍天數","leaderboard.profile_modal.stat.avg_per_day":"日均花費","leaderboard.profile_modal.streak.current":"當前連續","leaderboard.profile_modal.streak.longest":"最長連續","leaderboard.profile_modal.streak.days":"{{count}} 天","leaderboard.profile_modal.best_day.title":"最佳日","leaderboard.profile_modal.best_day.none":"—","leaderboard.profile_modal.models.count":"使用了 {{count}} 個模型","leaderboard.profile_modal.models.favorite":"最愛模型","leaderboard.profile_modal.models.none":"暫無模型記錄","leaderboard.profile_modal.heatmap.title":"活躍度(最近 365 天)","leaderboard.profile_modal.providers.title":"依 Provider 分布","leaderboard.profile_modal.providers.none":"本週期無使用資料。","leaderboard.profile_modal.view_full":"檢視完整主頁","local_only.title":"請在客戶端內使用","local_only.body":"這個頁面讀取的是你本機上的資料,所以只能在 Mac App 或命令列儀表板中檢視。","local_only.open_app":"在 Mac App 中開啟","local_only.download":"下載 Mac App","dashboard.auth_gate.title":"登入 Token Tracker","dashboard.auth_gate.subtitle":"登入以在雲端同步並檢視您的 API 使用量、成本與 Token 消耗趨勢。","dashboard.auth_gate.button":"立即登入","dashboard.expired_gate.title":"會話已過期","dashboard.expired_gate.subtitle":"您的會話已過期。請重新登入以繼續檢視您的雲端儀表板。","dashboard.expired_gate.button":"重新登入","shared.app_name":"Token Tracker","dashboard.auth_gate.hero_title":"讓 AI 代理的每一筆 Token 消耗","dashboard.auth_gate.hero_subtitle":"清晰透明、多端無縫掌控","dashboard.auth_gate.desc":"為您在純雲端安全同步來自 Claude Code、Cursor、Gemini CLI 等全平台主流代理的 Token 額度、並發費用及耗時統計,提供前所未有的全景可視化數據分析。","dashboard.auth_gate.feature.sync.title":"實時雲端同步","dashboard.auth_gate.feature.sync.desc":"全自動採集各端代理的開銷,並在您的私人雲盤中秒級安全歸檔。","dashboard.auth_gate.feature.anal.title":"多維看板分析","dashboard.auth_gate.feature.anal.desc":"按模型分類、時間跨度統計 Token 分布,隨時追溯開銷尖峰及用量結構。","dashboard.auth_gate.feature.guard.title":"本地直連免登","dashboard.auth_gate.feature.guard.desc":"在 Localhost 模式下自動跳過所有登錄驗證,完美保護本地離線調試體驗。","dashboard.expired_gate.hero_title":"您的雲端會話已過期","dashboard.expired_gate.desc":"為了您的隱私與雲盤數據安全,安全憑證會在一段時間後自動過期。請重新驗證以極速同步儀表盤。","dashboard.expired_gate.feature.sec.title":"安全證書保護","dashboard.expired_gate.feature.sec.desc":"加密證書到期自動銷毀,嚴密守護您的 Token 賬單資產。","dashboard.expired_gate.feature.restore.title":"無縫數據恢復","dashboard.expired_gate.feature.restore.desc":"重新登入後自動恢復多端實時看板刷新,無需重新綁定。","dashboard.expired_gate.feature.cloud.title":"跨端雲端同步","dashboard.expired_gate.feature.cloud.desc":"多端隨時離線統計並同步至個人控制台,多地協同掌握開銷。","dashboard.device_filter.all":"全部裝置","dashboard.device_filter.aria":"依裝置篩選","dashboard.device_card.title":"依裝置","dashboard.device_card.current":"本機","dashboard.device_card.unnamed":"未命名裝置","nav.pet":"桌面寵物","pet.page.eyebrow":"桌面陪伴","pet.page.title":"寵物","pet.page.subtitle":"選擇你的陪伴角色,並預覽它如何回應真實的 AI 使用狀態。","pet.preview.states":"預覽寵物狀態","pet.controls.title":"桌面控制","pet.controls.show":"顯示桌面寵物","pet.controls.show_hint":"讓陪伴角色保持在其他視窗上方。","pet.controls.size":"寵物大小","pet.controls.native_only":"請在 TokenTracker 桌面 App 中開啟此頁面,以控制實際桌寵。","pet.characters.title":"選擇你的陪伴角色","pet.characters.subtitle":"每個角色都擁有完整狀態系統,並有獨立配色與輪廓。","pet.character.clawd":"Clawd","pet.character.clawd_desc":"經典鉗爪造型的 Token 管家。","pet.character.bot":"Bot","pet.character.bot_desc":"一個隨你的 token 節奏變形的形狀。","pet.bot.color":"身體顏色","pet.bot.color.auto":"跟隨主題","pet.bot.color.bleu":"藍色","pet.bot.color.turquoise":"青色","pet.bot.color.vert":"綠色","pet.bot.color.ambre":"琥珀","pet.bot.color.rose":"粉色","pet.bot.color.violet":"紫色","pet.character.sprout":"Sprout","pet.character.sprout_desc":"長著葉片耳朵和小根鬚腳的幼苗精靈。","pet.character.byte":"Byte","pet.character.byte_desc":"擁有表情螢幕和懸浮推進器的終端機器人。","pet.character.ember":"Ember","pet.character.ember_desc":"拖著火焰尾巴、為高產連勝慶祝的狐靈。","pet.state.calm":"平靜","pet.state.focus":"專注","pet.state.multitask":"多模型","pet.state.streak":"連續活躍","pet.state.celebrate":"新增用量","pet.state.rest":"休息","pet.size.small":"小","pet.size.medium":"中","pet.size.large":"大","pet.import.title":"匯入 Codex 寵物","pet.import.subtitle":"貼上 codex-pets.net 連結,或選擇 .zip 寵物包。","pet.import.add":"新增","pet.import.zip":"選擇寵物套件","pet.import.remove":"移除寵物","pet.import.success":"寵物已匯入並選取。","pet.import.failed":"無法匯入這個寵物。","pet.import.busy":"正在匯入…","pet.format.v2":"V2","pet.import.removed":"已移除寵物。","pet.import.url_label":"Codex Pets 連結或寵物 ID","dashboard.projects.detail.badge":"專案","achievements.section.title":"成就","achievements.page.title":"成就","achievements.page.local_note":"專案與夜貓子徽章僅保存在本機。","achievements.signin.prompt":"登入後可獲得雲端成就,並在排行榜上展示。","achievements.mini.tooltip":"{{name}} — {{tier}}","achievements.badge.aria":"{{name}} — {{tier}}","achievements.tier.bronze":"青銅","achievements.tier.silver":"白銀","achievements.tier.gold":"黃金","achievements.tier.diamond":"鑽石","achievements.modal.locked":"未解鎖","achievements.modal.achieved_label":"達成於","achievements.modal.value_label":"目前數值","achievements.modal.progress_to_next":"距{{tier}}進度","achievements.modal.max_tier":"已達最高等級","achievements.modal.close":"關閉","achievements.modal.tier_history":"等級歷程","achievements.modal.coin_aria":"{{name}} 徽章——拖曳或使用方向鍵旋轉","achievements.modal.issue_number":"第 {{number}} 號","achievements.badge.token_titan.name":"Token 巨擘","achievements.badge.token_titan.desc":"在所有 AI 工具中累計消耗 Token。","achievements.badge.big_day.name":"高光之日","achievements.badge.big_day.desc":"單日燒掉海量 Token。","achievements.badge.wordsmith.name":"妙筆生花","achievements.badge.wordsmith.desc":"累積 AI 真正寫出的輸出 Token——程式碼與文字。","achievements.badge.marathoner.name":"馬拉松","achievements.badge.marathoner.desc":"在整個記錄史中累積活躍天數。","achievements.badge.streak.name":"連勝火焰","achievements.badge.streak.desc":"保持每日連續使用不間斷。","achievements.badge.weekend_warrior.name":"週末戰士","achievements.badge.weekend_warrior.desc":"週六週日也堅持產出。","achievements.badge.momentum.name":"勢頭","achievements.badge.momentum.desc":"週用量較上一週成倍增長。","achievements.badge.polyglot.name":"模型通","achievements.badge.polyglot.desc":"驅使眾多不同的模型。","achievements.badge.trendsetter.name":"嘗鮮先鋒","achievements.badge.trendsetter.desc":"新模型發布一週內即刻上手。","achievements.badge.multitool.name":"多面手","achievements.badge.multitool.desc":"在多款 AI 編碼工具中記錄用量。","achievements.badge.podium.name":"頒獎台","achievements.badge.podium.desc":"攀登總排行榜。","achievements.badge.veteran.name":"老兵","achievements.badge.veteran.desc":"從首個記錄日起堅持至今。","achievements.badge.project_hopper.name":"專案遊俠","achievements.badge.project_hopper.desc":"把 Token 撒向多個專案。","achievements.badge.project_devotion.name":"專情專案","achievements.badge.project_devotion.desc":"為一個摯愛專案傾注 Token。","achievements.badge.night_owl.name":"夜貓子","achievements.badge.night_owl.desc":"在午夜至清晨六點間寫程式。","achievements.signin.action":"登入","achievements.scope.local":"本機","achievements.page.suggest":"有新成就的點子?","achievements.page.suggest_link":"前往 GitHub 提交建議","dashboard.projects.sources_more":"+{{n}}","heatmap.iso.aria":"三維等距活動熱力圖","heatmap.view.2d":"2D","heatmap.view.3d":"3D","leaderboard.column.kilo-cli":"Kilo CLI","leaderboard.column.kilo-code":"Kilo Code","leaderboard.community.tokens_label":"社群已追蹤的 Token","leaderboard.community.devs":"{{count}} 位使用者正在同步","leaderboard.community.view_stats":"檢視全球社群統計","leaderboard.community.tokens_chip":"社群 Token","leaderboard.community.devs_chip":"使用者","leaderboard.community.modal.title":"全球指標","leaderboard.community.modal.description":"以保護隱私的方式呈現社群如何運用 AI 開發。","leaderboard.community.modal.total_tokens":"Token 總量","leaderboard.community.modal.active_devs":"活躍使用者","leaderboard.community.modal.active_devs_detail":"{{count}} 位正在同步","leaderboard.community.modal.global_spend":"預估花費","leaderboard.community.modal.global_spend_detail":"{{amount}} 美元","leaderboard.community.modal.top_models":"熱門模型","leaderboard.community.modal.all_time":"全部時間","leaderboard.community.modal.tokens_title":"{{count}} Token","leaderboard.community.modal.no_data":"尚無彙總資料","leaderboard.community.modal.activity_chart":"社群每日 Token 活動","leaderboard.community.modal.developers_short":"位使用者","leaderboard.community.modal.daily_tokens":"每日 Token","leaderboard.community.modal.seven_day_average":"7 天平均","leaderboard.community.modal.composition":"構成","leaderboard.community.modal.token_mix":"Token 構成","leaderboard.community.modal.token_mix.input":"輸入","leaderboard.community.modal.token_mix.cache_read":"快取讀取","leaderboard.community.modal.token_mix.cache_write":"快取寫入","leaderboard.community.modal.token_mix.output":"輸出","leaderboard.community.modal.token_mix.reasoning":"推理","leaderboard.community.modal.last_30_days":"最近 30 天","leaderboard.community.modal.daily_average":"每日平均","leaderboard.community.modal.peak_day":"峰值日","leaderboard.community.modal.community_activity":"社群活動","leaderboard.community.modal.utc_note":"以 UTC 統計每日總量","leaderboard.community.modal.ecosystem":"生態系","leaderboard.community.modal.provider_distribution":"Provider 分布","leaderboard.community.modal.rank":"排名","leaderboard.community.modal.provider":"Provider","leaderboard.community.modal.usage_share":"用量占比","leaderboard.community.modal.developer_count":"{{count}} 位使用者","leaderboard.community.modal.participation":"參與情況","leaderboard.community.modal.usage_distribution":"累計用量區間","leaderboard.community.modal.band.lt_1m":"低於 100 萬","leaderboard.community.modal.band.1m_10m":"100 萬–1,000 萬","leaderboard.community.modal.band.10m_100m":"1,000 萬–1 億","leaderboard.community.modal.band.100m_1b":"1 億–10 億","leaderboard.community.modal.band.1b_plus":"10 億以上","leaderboard.community.modal.developer_share_title":"占貢獻者的 {{share}}","leaderboard.community.modal.adoption":"採用情況","leaderboard.community.modal.platforms":"平台","leaderboard.community.modal.platform.darwin":"macOS","leaderboard.community.modal.platform.win32":"Windows","leaderboard.community.modal.platform.linux":"Linux","leaderboard.community.modal.machine_count":"{{count}} 個匿名安裝","leaderboard.community.modal.platform_privacy":"平台採用情況使用匿名安裝雜湊統計;此檢視不會收集位置或帳號身分。","leaderboard.community.modal.model_landscape":"模型全貌","leaderboard.community.modal.eyebrow":"社群洞察","leaderboard.community.modal.tokens_30d":"Token · 30 天","leaderboard.community.modal.contributors":"貢獻者","leaderboard.community.modal.with_usage":"已有用量記錄","leaderboard.community.modal.active_30d":"活躍 · 30 天","leaderboard.community.modal.vs_previous_week":"與前 7 天相比","leaderboard.community.modal.views":"全球指標檢視次數","leaderboard.community.modal.updated":"更新於 {{time}}","leaderboard.community.modal.tab.overview":"總覽","leaderboard.community.modal.tab.providers":"Provider","leaderboard.community.modal.tab.community":"社群","leaderboard.community.modal.tab.models":"模型","leaderboard.community.modal.note":"彙總資料每小時從標準社群彙總結果更新,不會公開任何使用者層級記錄。","leaderboard.summary.percentile":"前 {{p}}%","leaderboard.summary.jump_to_me":"跳到我的排名","leaderboard.summary.view_profile":"檢視我的個人頁面","usage.overview.percent_below_threshold":"<0.01","dashboard.context_breakdown.empty":"所選時間範圍內沒有 Claude Code 活動。","dashboard.context_breakdown.empty_codex":"所選時間範圍內沒有 Codex 活動。","dashboard.context_breakdown.error":"無法讀取此檢視所需的 Claude Code 日誌。","dashboard.context_breakdown.error_codex":"無法讀取此檢視所需的 Codex 日誌。","dashboard.context_breakdown.bar_aria":"Token 分布:{{summary}}","dashboard.context_breakdown.system_prefix_tooltip":"系統 Prompt、工具結構、Skills、規則和 MCP 描述會一起快取為同一個前綴,無法從日誌中分別拆分。","dashboard.context_breakdown.footnote":"近似統計:快取讀取會隨對話輪次累積,因此對話歷史會逐漸占據主要部分。只有 Claude Code 日誌能提供此檢視所需的逐則訊息明細。","dashboard.context_breakdown.footnote_codex":"Codex 在此使用互不重疊的 Token 分類。工具和命令執行下鑽資料,是對同一批對話輪次進行的獨立啟發式歸因。","dashboard.context_breakdown.category.system_prompt":"系統 Prompt","dashboard.context_breakdown.category.messages":"訊息","dashboard.context_breakdown.category.tool_calls":"工具呼叫","dashboard.context_breakdown.category.mcp_servers":"MCP 伺服器","dashboard.context_breakdown.category.custom_agents":"自訂 Agent","dashboard.context_breakdown.category.reasoning":"推理","dashboard.context_breakdown.category.skills":"Skills","dashboard.context_breakdown.loading_aria":"正在載入上下文細分","dashboard.context_breakdown.loading_hint":"正在掃描工作階段日誌…","dashboard.context_breakdown.tool_details.total_column":"總計","dashboard.context_breakdown.tool_details.unavailable_codex":"此時間範圍沒有工具層級 Codex 明細,僅顯示佇列總量。","dashboard.context_breakdown.message_details.title":"訊息明細","dashboard.context_breakdown.message_details.note":"僅提供彙總資料——不會儲存訊息文字。","dashboard.context_breakdown.message_details.category_column":"類別","dashboard.context_breakdown.message_details.user_input":"使用者輸入","dashboard.context_breakdown.message_details.conversation_history":"對話歷史","dashboard.context_breakdown.message_details.assistant_response":"助理回覆","dashboard.context_breakdown.exec_details.title":"命令執行明細","dashboard.context_breakdown.exec_details.kind_column":"類型","dashboard.context_breakdown.exec_details.calls_column":"呼叫","dashboard.context_breakdown.exec_details.failures_column":"失敗","dashboard.context_breakdown.exec_details.duration_column":"耗時","dashboard.context_breakdown.exec_details.max_duration_column":"最長耗時","dashboard.context_breakdown.exec_details.output_column":"行數","dashboard.context_breakdown.exec_details.group_by_type":"依類型","dashboard.context_breakdown.exec_details.group_by_executable":"執行檔","dashboard.context_breakdown.exec_details.group_by_command":"命令","dashboard.context_breakdown.exec_details.group_by_duration":"耗時","dashboard.context_breakdown.exec_details.group_by_output":"輸出","dashboard.context_breakdown.exec_details.group_by_exit":"依結束狀態","dashboard.device_card.rename_aria":"重新命名裝置","dashboard.device_card.rename_placeholder":"裝置名稱","dashboard.device_card.rename_save":"儲存名稱","dashboard.device_card.rename_cancel":"取消","dashboard.device_card.rename_error":"無法重新命名——該名稱可能已被使用。","dashboard.device_card.clear":"清除","dashboard.device_card.empty":"找不到活躍裝置","dashboard.device_card.account_scope":"整個帳號","dashboard.device_card.account_scope_tip":"從 Provider 的帳號 API 同步,不屬於單一裝置","leaderboard.profile_modal.badge.copy_url":"複製個人頁面連結","leaderboard.profile_modal.badge.copy":"複製 README 徽章","leaderboard.profile_modal.badge.copied":"已複製!","leaderboard.profile.like.aria_like":"讚好此個人頁面","leaderboard.profile.like.aria_unlike":"取消讚好此個人頁面","dashboard.cost_breakdown.empty":"暫無費用記錄。","dashboard.cost_breakdown.model_column":"模型","dashboard.cost_breakdown.cost_column":"費用","heatmap.3d.modal.eyebrow":"三維洞察","heatmap.tooltip.level":"等級 {{level}}","heatmap.tooltip.tokens":"{{day}}:{{value}} Token","heatmap.tooltip.model_breakdown":"模型細分","heatmap.tooltip.token_breakdown":"Token 構成","trend.monitor.empty":"暫無資料","trend.monitor.unsynced":"尚未同步","wrapped.loading":"正在載入…","wrapped.error":"無法載入年度總結:{{error}}","wrapped.empty":"該年度尚無資料,請先執行 `{{command}}`。","wrapped.kicker":"TokenTracker 年度總結","wrapped.total_tokens":"Token 總量","wrapped.summary":"共 {{conversations}} 次對話、{{days}} 個活躍日,使用了 {{tools}} 款工具","wrapped.top_tools":"常用工具","wrapped.top_models":"常用模型","wrapped.peak_hour":"高峰時段","wrapped.tokens":"{{count}} Token","wrapped.longest_streak":"最長連續活躍","wrapped.days":"{{count}} 天","wrapped.top_days":"最高用量日期","wrapped.highlights":"年度亮點","wrapped.footer":"根據本機 queue.jsonl 產生 · 使用 `{{command}}` 分享","wrapped.highlight.model":"{{model}} 貢獻了全年 {{percent}}% 的用量。","wrapped.highlight.day":"最忙碌的一天是 {{day}}({{tokens}} Token)。","wrapped.highlight.hour":"你的高效時段集中在 UTC {{hour}}:00 左右。","wrapped.highlight.streak":"最長連續活躍:連續 {{days}} 天使用 AI 編碼。","wrapped.highlight.tools":"你使用了 {{count}} 款不同的 AI 工具,涉獵廣泛。","dashboard.context_breakdown.empty_grok":"所選時間範圍內沒有 Grok Build 活動。","dashboard.context_breakdown.error_grok":"無法讀取此檢視所需的 Grok Build 日誌。","dashboard.context_breakdown.footnote_grok":"Grok 在此使用互不重疊的 Token 分類。工具和命令執行下鑽資料,是對同一批對話輪次進行的獨立啟發式歸因,以 turn_completed.usage 為權威總量。","dashboard.context_breakdown.heading":"上下文細分","dashboard.context_breakdown.heading_claude":"Claude 上下文細分","dashboard.context_breakdown.heading_codex":"Codex 上下文細分","dashboard.context_breakdown.heading_grok":"Grok 上下文細分","subscriptions.add":"新增訂閱","subscriptions.edit":"編輯","subscriptions.delete":"刪除","subscriptions.save":"儲存","subscriptions.confirm_delete_title":"確定刪除這筆訂閱?","subscriptions.delete_error":"刪除失敗,請重試。","subscriptions.form.plan":"套餐","subscriptions.form.plan_placeholder":"如 Plus、Pro","subscriptions.form.auto_renew":"自動續費","subscriptions.form.auto_renew_on":"開啟","subscriptions.form.auto_renew_off":"關閉","subscriptions.form.started_at":"訂閱時間","subscriptions.form.cycle":"計費週期","subscriptions.form.cycle_weekly":"每週","subscriptions.form.cycle_monthly":"每月","subscriptions.form.cycle_yearly":"每年","subscriptions.form.error":"出了點問題,請重試。","subscriptions.status.auto_renew":"自動續費中","subscriptions.status.manual":"已關閉自動續費","subscriptions.label.renews_at":"下次續費","subscriptions.label.expires_at":"到期時間","subscriptions.countdown":"{{days}} 天 {{hours}} 小時 {{minutes}} 分後","subscriptions.expired":"已到期","subscriptions.empty.title":"還沒有訂閱","subscriptions.empty.body":"新增一筆套餐,隨時掌握它的下次續費或到期時間。","subscriptions.load_error":"載入訂閱失敗。","subscriptions.inline.label":"訂閱","subscriptions.badge.auto_renew":"自動續費","subscriptions.badge.stops":"到期停止","subscriptions.form.provider":"關聯工具","subscriptions.form.provider_required":"請選擇關聯的工具","subscriptions.form.provider_taken":"該工具已有訂閱,請編輯現有記錄","subscriptions.form.provider_taken_suffix":"(已有訂閱)","quota.title":"限額","quota.percent":"%","quota.remaining":"剩餘","quota.stale":"資料未更新","quota.drag":"拖動調整位置","quota.choose":"選擇額度","quota.collapse":"收起","quota.expand":"展開限額","quota.empty":"請在主介面連接服務","quota.loading":"正在讀取限額…","quota.awaiting":"等待額度更新","quota.resets":"重置於 {{time}}","quota.no_reset":"暫無重置時間","quota.unavailable":"選中的額度暫不可用","quota.dashboard":"開啟主介面","quota.pick_two":"最多關注兩個週期","quota.reset_in":"{{time}}後重置","quota.close":"關閉元件","quota.close_hint":"關閉元件;可從系統匣選單重新開啟","cloud.nav":"雲服務","cloud.page.eyebrow":"TokenTracker Cloud","cloud.page.title":"選擇適合你的方案","cloud.page.subtitle":"本地統計免費,雲端服務支援跨裝置同步與歷史管理。","cloud.selector.term":"計費週期","cloud.term.monthly":"月付","cloud.term.yearly":"年付","cloud.selector.billing_mode":"付款方式","cloud.billing_mode.fixed":"按期購買","cloud.billing_mode.recurring":"自動續費","cloud.free.title":"免費本地版","cloud.free.subtitle":"在自己的電腦上,完整記錄和分析 AI 用量。","cloud.free.price":"免費","cloud.free.forever":"完整本地功能,永久免費。","cloud.free.cta":"使用免費應用程式","cloud.free.tracking":"所有已支援的 Provider 與費用估算","cloud.free.limits":"Provider 用量限額","cloud.free.desktop":"CLI 和桌面端全部功能","cloud.free.exports":"本地歷史與匯出","cloud.free.community":"排行榜、成就與公開資料,每天從 1 台裝置同步","cloud.free.installations":"本地安裝數量不限,無需訂閱。","cloud.plan.title":"TokenTracker Cloud","cloud.plan.subtitle":"跨裝置同步與用量歷史,無需自行維護伺服器。","cloud.price.pending":"待確認","cloud.price.waiting":"服務回應後顯示實際價格。","cloud.price.per_year":"/ 年","cloud.price.per_month":"/ 月","cloud.price.annual_total":"每年實付 {{total}},折合每月 {{equivalent}}。","cloud.price.monthly_total":"一個月實付 {{total}}。","cloud.price.savings":"年付省 {{percent}}%","cloud.action.try":"免費試用 {{days}} 天","cloud.action.subscribe":"訂閱雲服務","cloud.action.manage_membership":"管理會員","cloud.action.view_plans":"查看雲服務方案","cloud.action.retry":"重試","cloud.action.start_trial":"開始 {{days}} 天免費試用","cloud.action.sign_in_continue":"登入後繼續","cloud.action.open_dashboard":"開啟儀表板","cloud.action.choose_plan":"選擇方案","cloud.action.create_checkout":"前往付款 · {{amount}}","cloud.action.resume_order":"繼續付款","cloud.action.open_payment":"開啟付款頁面","cloud.action.check_payment":"我已付款,檢查狀態","cloud.action.checking":"正在檢查付款…","cloud.action.keep":"保留現有設定","cloud.action.restore":"恢復訂單","cloud.action.refresh_membership":"重新整理會員狀態","cloud.action.manage_subscription":"管理訂閱","cloud.action.cancel_renewal":"取消自動續費","cloud.action.renew":"續費雲服務","cloud.action.read_export":"查看及匯出雲端歷史","cloud.trial.no_card":"無需綁卡,不會自動扣款。","cloud.trial.disclosure":"免費試用 {{days}} 天,至 {{date}}。到期不會自動扣款。","cloud.trial.expiry":"試用到期後個人 Cloud 同步停止,既有雲端歷史有 30 天可查看和匯出。選定 1 台裝置的每日社群上傳、排行榜參與和本機記錄仍免費。","cloud.trial.ends":"雲服務試用於 {{date}} 結束。","cloud.renewal.manual":"一次付款,到期不自動續費。","cloud.renewal.auto":"按訂閱週期自動續費,可隨時取消;已付權益保留。","cloud.feature.sync":"變更資料每 {{minutes}} 分鐘同步,可在帳戶中暫停或恢復裝置同步。","cloud.feature.history":"{{days}} 天小時明細,{{months}} 個月日彙總,支援雲端資料匯出。","cloud.feature.pro_identity":"雲服務頭像邊框和標識,排名仍依用量計算。","cloud.feature.privacy_detail":"不上傳 Prompt、程式碼、Provider 憑證或本地工作階段與專案記錄。","cloud.catalog.loading":"正在載入雲服務狀態…","cloud.catalog.preview":"雲服務訂閱尚未開放,正式上線前無法付款或開啟試用。","cloud.catalog.provider_unavailable":"雲服務付款暫不可用。已保留方案選擇,請稍後再試。","cloud.catalog.sandbox":"目前為付款沙箱,測試交易不會購買正式雲服務會員。","cloud.faq.local_title":"哪些功能仍然免費?","cloud.faq.local_body":"本機記錄、整合、估算、限額、桌面功能與匯出保持完整開源。雲服務支援託管彙總與歷史服務。","cloud.faq.expiry_title":"雲服務到期後會怎樣?","cloud.faq.expiry_body":"個人 Cloud 同步到期後,仍可每天從選定的 1 台裝置免費上傳社群資料、參與排行榜;如有多台活躍裝置,需要暫停其他裝置。既有個人雲端歷史有 30 天唯讀及匯出期間。本地資料與功能繼續可用。","cloud.faq.existing_title":"已經在用雲端儀表板?","cloud.faq.existing_body":"訂閱上線時,現有雲端帳號有 30 天過渡期。帳戶頁會顯示你的具體過渡截止日期。","cloud.faq.platform_title":"每個平台要分別付費嗎?","cloud.faq.platform_body":"一個會員涵蓋同一 TokenTracker 帳號下的 CLI、macOS、Windows、Linux 和網頁,無需按平台重複付費。","cloud.checkout.title":"確認雲服務購買方案","cloud.checkout.trial_title":"開啟雲服務試用","cloud.checkout.back":"返回方案頁","cloud.checkout.local_free":"無論選擇哪個方案,完整本地應用程式始終免費。","cloud.checkout.sign_in":"登入需要開通會員的 TokenTracker 帳號,目前選擇的方案會保留。","cloud.checkout.review":"核對方案和付款方式,Waffo 會在付款前顯示最終金額。","cloud.checkout.summary":"雲服務權益","cloud.checkout.tax":"美元標價為未稅基礎價。稅費由 Waffo 收銀台計算,付款前會顯示最終金額。","cloud.checkout.choose_plan":"選擇雲服務方案後繼續。","cloud.checkout.loading":"正在查詢訂單…","cloud.checkout.creating":"正在準備付款訂單","cloud.checkout.starting_trial":"正在開通雲服務試用","cloud.checkout.awaiting":"等待付款","cloud.checkout.activating":"已收到付款,正在開通雲服務","cloud.checkout.success":"雲服務會員已開通","cloud.checkout.canceled":"訂單已關閉","cloud.checkout.expired":"訂單已過期","cloud.checkout.trial_success":"雲服務試用已開始","cloud.checkout.pending_creation":"訂單已儲存,付款方尚未確認付款頁面。請先檢查狀態,不要重複建立訂單。","cloud.checkout.pending_payment":"請在所選付款方完成付款。伺服器核驗交易後,此頁會顯示會員狀態。","cloud.checkout.received":"伺服器已記錄付款,正在確認會員權益。如開通時間較長,請檢查狀態。","cloud.checkout.expired_detail":"此付款訂單已過期。可重新選擇方案建立訂單。如已經付款,請先恢復訂單,不要再次付款。","cloud.checkout.canceled_detail":"伺服器已關閉此訂單。如已經付款,請先查看會員狀態或恢復訂單,再決定是否重新購買。","cloud.checkout.recovery_hint":"已經付款?檢查狀態會讓伺服器核驗此訂單。僅返回本頁不會開通會員。","cloud.checkout.order_id":"訂單編號","cloud.checkout.expires":"付款訂單於 {{date}} 過期。","cloud.provider.alipay":"支付寶","cloud.provider.wechat":"微信付款","cloud.provider.paddle":"Paddle 付款","cloud.membership.title":"TokenTracker Cloud","cloud.membership.signed_out":"登入後管理雲服務,完整本機應用程式始終免費。","cloud.membership.expires":"可用至 {{date}}","cloud.membership.transition_until":"過渡期至 {{date}}","cloud.membership.trial_until":"試用至 {{date}}","cloud.membership.active_until":"有效期至 {{date}}","cloud.membership.gift_until":"贈送權益至 {{date}}","cloud.membership.expired_on":"已於 {{date}} 到期","cloud.membership.renews":"於 {{date}} 續費","cloud.membership.preview":"訂閱尚未上線,預覽期間繼續保留現有雲端存取。","cloud.membership.read_only":"個人 Cloud 同步已到期,既有歷史可查看和匯出至 {{date}}。仍可每天從選定的 1 台裝置免費上傳社群資料並參與排行榜;請暫停其他活躍裝置。","cloud.membership.expired_detail":"個人 Cloud 存取已到期。本機記錄和匯出繼續免費;仍可每天從選定的 1 台裝置免費上傳社群資料並參與排行榜,請暫停其他活躍裝置。","cloud.membership.transition_detail":"現有雲端帳號有 30 天過渡期。到期後個人 Cloud 同步停止,仍可每天從選定的 1 台裝置免費上傳社群資料。","cloud.membership.local_free":"本地記錄、歷史和匯出始終完整免費。","cloud.membership.renewal_off":"自動續費已關閉。","cloud.cancel.detail":"取消自動續費?雲服務會員仍可使用至 {{date}}。本機功能始終免費。","cloud.cancel.confirm":"確認取消續費","cloud.status.legacy_free":"雲端服務預覽期","cloud.status.active":"雲服務已開通","cloud.status.trial":"免費試用中","cloud.status.transition":"過渡期間","cloud.status.expired":"雲服務已到期","cloud.status.free":"免費本地版","cloud.status.unknown":"會員狀態待確認","cloud.date.unknown":"日期待確認","cloud.devices.title":"雲端裝置","cloud.devices.count":"{{count}} / {{limit}} 台裝置","cloud.devices.unlimited":"{{count}} 台裝置,預覽期間","cloud.devices.detail":"同一系統、同一使用者身分重複登入共用名額,不同系統或使用者可能獨立計數。本地安裝不受限制。","cloud.devices.over_limit":"目前雲端裝置數超出名額。請暫停舊裝置,再讓其他裝置同步。","cloud.devices.empty":"尚未關聯雲端裝置。","cloud.devices.unnamed":"未命名裝置","cloud.devices.platform_unknown":"平台未知","cloud.devices.last_seen_unknown":"最近同步時間未知","cloud.devices.last_seen":"最近出現於 {{date}}","cloud.devices.current":"目前裝置","cloud.devices.remove":"暫停","cloud.devices.remove_detail":"暫停此裝置?它會釋放雲端名額並停止新的上傳。本地資料和已有雲端歷史仍保留,再次同步前請在此恢復。","cloud.devices.confirm_remove":"暫停雲端同步","cloud.restore.title":"查找訂單","cloud.restore.detail":"輸入訂單編號,查看付款狀態或繼續付款。","cloud.billing.title":"帳單與付款","cloud.restore.placeholder":"貼上訂單編號","cloud.restore.invalid":"請輸入完整的 TokenTracker 訂單編號。","cloud.history.title":"付款記錄","cloud.history.date":"日期","cloud.history.amount":"金額","cloud.history.status":"狀態","cloud.history.paid":"已付款","cloud.history.pending":"待付款","cloud.history.empty":"尚無已核驗付款。","cloud.history.term":"{{start}} 至 {{end}}","cloud.history.refunded":"已退款 {{amount}}","cloud.error.auth":"登入狀態需要重新整理,請重新登入此訂單所屬帳號。","cloud.error.unavailable":"雲服務計費尚不可用,你可以繼續使用完整的免費本機應用程式。","cloud.error.provider":"此付款方式目前無法使用。","cloud.error.subscription_exists":"已有有效訂閱,請先到「設定 → 個人 → 雲端服務」管理,再選擇其他方案。","cloud.error.fixed_term":"目前按固定期限購買的會員仍有效,請到期後再開通自動續費訂閱。","cloud.error.trial":"此帳號無法再次開啟免費試用。查看雲服務方案或管理目前雲端存取權限。","cloud.error.order_not_found":"此帳號下未找到此訂單,請核對編號,並登入購買時使用的帳號。","cloud.error.expired":"付款訂單已過期,重新購買前請先查詢此訂單。","cloud.error.request_conflict":"上一筆購買尚未確認,請先到「設定 → 個人 → 雲端服務」恢復此訂單,再建立其他購買。","cloud.error.network":"連線中斷,購買請求已保留。請重試或恢復同一訂單,不要重複付款。","cloud.error.browser":"付款頁面未開啟,請重新開啟或恢復同一訂單,無需重新購買。","cloud.error.machines":"此帳號已達到雲端同步裝置上限,請在「設定 → 個人 → 雲端服務」查看裝置清單。","cloud.error.generic":"暫時無法確認操作結果,請重新整理帳戶或再次檢查訂單狀態。本地應用程式仍可照常使用。","cloud.error.catalog":"無法載入雲服務方案,服務可用前不能付款。","cloud.devices.count_unknown":"裝置數量待確認","cloud.error.devices":"暫時無法載入雲端裝置,請重試後查看關聯裝置。","cloud.action.resume_purchase":"恢復上一筆購買","cloud.devices.resume":"恢復同步","cloud.devices.paused":"已暫停,不占用名額","cloud.devices.active":"占用同步名額","cloud.devices.resumed":"雲端同步已恢復,裝置將在下一次允許同步時重新建立連線。","cloud.devices.no_slot":"請暫停另一台裝置,釋放同步名額。","cloud.error.machine_paused":"此裝置已暫停,再次同步前請到「設定 → 個人 → 雲端服務」恢復。","cloud.error.membership":"選擇雲服務方案以恢復雲端存取,本機記錄與匯出仍免費。","cloud.error.account_network":"連線中斷,請先重新整理帳戶確認最新狀態,再重試操作。","cloud.checkout.refunded":"此筆付款已退款","cloud.checkout.refunded_detail":"伺服器已確認此筆付款全額退款。請到「設定 → 個人 → 雲端服務」查看目前 Cloud 權益和付款記錄。","cloud.checkout.term_ended":"此段會員期限已結束","cloud.checkout.term_ended_detail":"這筆付款仍保留在帳單歷史中。可選擇方案續費雲服務,本機功能仍免費。","cloud.error.account_provider":"訂閱管理目前不可用,請重新整理帳戶確認目前續費狀態。","cloud.membership.renewal_paused":"自動續費已暫停,請在訂閱詳情中確認是否安排了恢復。","cloud.membership.renewal_unknown":"下次扣款日期待確認,請在訂閱詳情中確認續費安排。","cloud.cancel.no_term":"取消自動續費?目前 Cloud 權益以上方顯示為準,本地功能始終免費。","cloud.feature.analysis":"跨裝置用量分析","cloud.feature.analysis_detail":"彙總各裝置用量,隨時查看費用估算、趨勢與 Provider 或模型明細。","cloud.feature.history_title":"託管歷史與匯出","cloud.feature.sync_title":"持續同步與裝置管理","cloud.self_host.title":"想把後端放在自己的伺服器?","cloud.self_host.body":"開源後端可作為 VPS 自部署的基礎。軟體免費,伺服器、備份和升級由你負責。目前部署方案仍處於技術預覽。","cloud.self_host.cta":"查看部署說明","self_host.back":"返回雲服務方案","self_host.status":"技術預覽","self_host.title":"部署到自己的伺服器。","self_host.subtitle":"TokenTracker 保持開源。你可以使用 InsForge 和後端原始碼,在 VPS 上搭建獨立實例。軟體授權免費,伺服器費用和維運由你負責。","self_host.preview_title":"完整部署流程仍待驗證","self_host.preview_body":"後端 TypeScript 函式和 SQL 遷移已公開。TokenTracker 的完整基礎建表流程、全新 VPS 聯調仍待完成。不要直接執行全部歷史遷移,其中包含針對線上資料的修復。","self_host.steps_title":"部署需要做什麼","self_host.step.backend_title":"部署 InsForge 服務","self_host.step.backend_body":"使用官方 Docker Compose 設定,並設定自己的網域、HTTPS、資料庫和登入設定。InsForge 雲端管理 CLI 不用於管理自部署實例。","self_host.step.schema_title":"補齊 TokenTracker 資料結構和函式","self_host.step.schema_body":"先建立基礎表、存取策略和彙總函式,再部署後端 TypeScript。該基礎部署流程仍在整理,歷史補丁不能取代安裝程式。","self_host.step.client_title":"編譯並接入自有客戶端","self_host.step.client_body":"設定自有儀表板、登入回呼和同步位址。已發行桌面客戶端目前預設連接官方服務,自有實例需要重新編譯客戶端並驗證連接。","self_host.responsibility_title":"伺服器由你維護","self_host.responsibility_body":"VPS、網域、郵件發送、備份、升級和安全維護由你負責。免費軟體不包含託管服務或可用性承諾。","self_host.community":"獨立實例使用自己的帳戶與資料,不接入官方公共排行榜。","self_host.link.insforge":"InsForge 部署參考","self_host.link.source":"後端原始碼","self_host.managed_title":"希望我們維護伺服器?","self_host.managed_body":"TokenTracker Cloud 提供跨裝置分析、託管歷史與同步,伺服器由我們維護。本機應用始終完整免費。","self_host.link.cloud":"查看雲服務方案","cloud.checkout.waffo":"Waffo 安全付款","cloud.checkout.methods_fixed":"可使用微信或銀行卡,實際可用方式以 Waffo 付款頁為準。付款頁會在新分頁開啟,此處保留訂單。","cloud.checkout.methods_recurring":"支援信用卡,適用時也可使用 Apple Pay 或 Google Pay。付款頁會在新分頁開啟,此處保留訂單。","cloud.provider.waffo":"Waffo 付款","cloud.provider.unknown":"付款渠道","cloud.membership.portal_login":"查看 Waffo 帳單時,請使用購買時的信箱登入。","cloud.action.view_bills":"查看付款帳單","cloud.price.draft":"測試價格草案。各地使用相同的美元基礎價,最終價格尚未確定。","cloud.action.restart_checkout":"關閉本次結帳並重新嘗試","cloud.action.restarting_checkout":"正在關閉未付款結帳…","cloud.checkout.restart_detail":"Waffo 付款頁無法重新開啟時,可關閉本次未付款結帳後重試。如果已經付款,請先檢查狀態。伺服器會核實原訂單未付款,正在處理的付款不能重開。","cloud.checkout.verification_pending":"付款仍在等待確認,暫時不能重開結帳。請先檢查原訂單狀態,確認後再重試。","cloud.checkout.duplicate_payment":"偵測到原訂單和重試訂單均有付款。請查看帳單並聯絡支援處理重複收款,暫時不要再次付款。","cloud.action.review_duplicate_payment":"查看重複收款","cloud.prompt.label":"雲服務方案","cloud.prompt.dismiss":"關閉雲服務提示","cloud.prompt.free":"本機追蹤和匯出繼續免費。每日社群上傳和排行榜參與不需要會員。","cloud.prompt.sync":"個人 Cloud 每 15 分鐘同步各裝置變更的用量。免費社群上傳仍可每天從選定的 1 台裝置繼續。","cloud.prompt.view":"Cloud 把多台裝置的用量合併到同一個個人檢視,可透過網頁查看估算費用及 provider、模型分析。","cloud.prompt.history":"個人 Cloud 提供跨裝置最近 90 天小時明細和 24 個月日彙總存取。機器上已保留的本機歷史不需要會員也能查看。","cloud.prompt.devices":"免費社群上傳使用選定的 1 台裝置。Cloud 支援多裝置同步;你也可以暫停已有裝置,繼續使用免費社群上傳。","cloud.prompt.devices_manage":"這台裝置已暫停,或同步名額已滿。請在帳號頁選擇需要暫停或恢復的裝置,歷史資料會保留。","cloud.prompt.history_window":"這個日期範圍超出了 Cloud 歷史視窗。請選擇支援的範圍,或查看自己機器上保留的完整本機歷史。","cloud.prompt.unconfirmed":"雲服務購買狀態尚未確認。可先了解託管服務,本機使用與每日免費社群上傳仍可繼續。","cloud.prompt.billing_recovery":"帳號仍有未結束的自動續費訂閱,但個人 Cloud 目前無法使用。請查看帳號帳單和付款狀態,處理現有訂閱。","cloud.prompt.try":"免費試用雲服務","cloud.prompt.learn":"了解雲服務","cloud.prompt.local":"查看本機資料","cloud.prompt.deadline_trial":"試用將於 {{date}} 結束,不會自動扣款。個人雲端歷史隨後有 30 天唯讀和匯出視窗,本機使用和社群上傳仍免費。","cloud.prompt.deadline_transition":"過渡期將於 {{date}} 結束。已有個人雲端歷史隨後有 30 天可讀和匯出,本機使用和社群上傳繼續可用。","cloud.prompt.deadline_active":"你的雲服務權益可用至 {{date}}。續費狀態請查看帳戶帳單。到期後本機資料仍可使用。","instance.configuration.invalid":"此實例的連線配置不完整或不安全。部署者需提供有效服務位址及該實例的公開 anon key,重新載入後再登入。","instance.configuration.changed":"後端實例已變更,請重新載入並登入選定的實例。","cloud.status.self_hosted":"自部署,免費","cloud.self_host.instance_title":"免費自部署實例","cloud.self_host.instance_body":"此帳號使用你自己的 TokenTracker 後端,無需訂閱或支付官方雲服務服務,帳號與排行榜也獨立於官方服務。","cloud.self_host.instance_retention":"實例營運者負責伺服器容量、備份和歷史保留。儲存規則請向營運者確認,官方 Cloud 的裝置和歷史收費限制不適用。","cloud.self_host.manage_devices":"管理同步裝置","cloud.devices.unlimited_self_hosted":"已登記 {{count}} 台同步裝置","cloud.self_host.sync_hint":"上傳發往自部署實例,由營運者管理同步、儲存與保留策略,無需官方雲服務會員。","instance.connection.destination":"登入目標為 {{host}},登入憑證會傳送到這個實例。","cloud.self_host.public_profile_disabled":"這個私有實例未啟用公開 Profile,不會向官方排行榜公開資料。","cloud.action.open_app":"在 TokenTracker 中開啟","cloud.checkout.return_app_hint":"回到已登入的桌面應用程式查詢這筆訂單,開通狀態由伺服器確認。","cloud.gift.redeem_action":"兌換會員","cloud.gift.detail":"贈送會員包含完整雲服務權益,本次兌換不會建立自動續費。現有訂閱需另行管理。","cloud.gift.code_label":"會員兌換碼","cloud.gift.confirm":"確認兌換","cloud.gift.redeeming":"正在兌換…","cloud.gift.redeemed":"兌換成功","cloud.gift.already_redeemed":"你已兌換過此碼,對應禮遇已顯示於帳戶中。","cloud.gift.refresh_needed":"兌換已記錄,但會員狀態重新整理失敗。請重新整理帳戶,確認權益和生效日期。","cloud.gift.redeem_another":"兌換其他碼","cloud.gift.membership_label":"獲贈雲服務","cloud.gift.history_title":"雲服務禮遇","cloud.gift.duration":"{{days}} 天雲服務","cloud.gift.term":"{{days}} 天雲服務,{{start}} 至 {{end}}。","cloud.gift.state_active":"使用中","cloud.gift.state_pending":"目前權益結束後生效","cloud.gift.state_expired":"已到期","cloud.gift.state_revoked":"已撤銷","cloud.gift.error_unavailable":"此兌換碼無法使用。請檢查輸入,或聯絡發碼人。","cloud.gift.error_rate_limit":"嘗試次數較多,請稍後再試。","cloud.gift.error_not_available":"目前實例尚未開放會員兌換。","cloud.gift.error_renewal":"請先在訂閱管理中關閉自動續費。","cloud.gift.error_checkout":"請先處理帳單中的待付款訂單。","cloud.gift.error_active":"你有使用中或待生效的雲服務禮遇。請先於帳戶中查看,再決定後續付費。","cloud.gift.error_network":"暫時無法確認兌換結果。可重試同一碼,已記錄的禮遇不會重複發放。","cloud.prompt.deadline_gift":"獲贈雲服務將於 {{date}} 到期。禮遇本身不會自動續費,到期後本機資料仍可使用。","sessions.filter.model_all":"全部模型","sessions.filter.model_search":"搜尋模型…","sessions.filter.model_empty":"沒有相符的模型","sessions.filter.model_aria":"依會話模型篩選","sessions.filter.range_custom":"自訂","sessions.filter.from":"範圍開始日期","sessions.filter.to":"範圍結束日期","sessions.filter.clear":"清除篩選","sessions.group.aria":"會話分組","sessions.group.time":"依日期","sessions.group.project":"依專案","sessions.group.unknown_date":"日期不明","sessions.sort.aria":"會話排序","sessions.sort.recent":"最近","sessions.sort.cost":"費用最多","sessions.sort.tokens":"Tokens 最多","sessions.summary.count":"相符會話","sessions.summary.scope":"有時間用量記錄的會話按所選日期彙總 token 和成本;沒有用量時間桶的會話保留完整歷史。輪數、時長和效能指標仍描述整個會話。每個會話和子代理僅計一次。","sessions.summary.speed":"估算速度","sessions.performance.speed":"約 {{speed}} tok/s","sessions.performance.samples":"{{count}} 個有效計時請求","sessions.performance.method":"輸出 tokens ÷ 估算請求時間,包含回應等待,排除工具執行與閒置時間。此值不代表純生成速度。","sessions.performance.first_response":"首次回應等待","sessions.performance.first_response_value":"{{seconds}} 秒 · {{count}} 個樣本","sessions.performance.first_response_method":"工具回報的首次 token 等待時間平均值。Codex 按完整輪次回報,一輪可能包含多次模型呼叫。","sessions.detail.open_aria":"查看 {{title}} 的統計","sessions.detail.title":"會話統計","sessions.detail.close":"關閉會話統計","sessions.detail.tokens":"Token 組成","sessions.detail.models":"模型與費用","sessions.detail.own":"目前會話","sessions.detail.subagents":"子代理","sessions.detail.signals":"已記錄的活動","sessions.detail.retries":"重複請求","sessions.detail.tools":"工具呼叫","sessions.detail.tool_failures":"工具失敗","sessions.detail.errors":"錯誤","sessions.detail.model_calls":"模型呼叫","sessions.detail.compactions":"上下文壓縮","sessions.detail.cost_source":"費用來源","sessions.detail.cost_reported":"工具回報","sessions.detail.cost_estimated":"依模型價格估算","sessions.detail.cost_mixed":"工具回報與價格估算混合","sessions.detail.cost_unknown":"未回報","sessions.detail.pricing_unpriced":"無公開價格","sessions.detail.pricing_free":"免費模型","sessions.detail.pricing_rates":"基礎價格,美元 / 百萬 tokens。輸入 {{input}} · 輸出 {{output}} · 快取讀取 {{cacheRead}} · 快取寫入 {{cacheWrite}}。分級與優先處理費率可能不同。","sessions.detail.reasoning_note":"推理 tokens 為參考項目,可能已包含在輸出 tokens 中。","sessions.detail.no_speed":"暫無可靠計時樣本","usage.filter.source_all":"全部工具","dashboard.cost_breakdown.method":"模型價格用於估算 API 等價費用,不代表訂閱支出。工具回報費用優先,缺少價格的用量不計入費用。","dashboard.cost_breakdown.reported":"費用由工具回報","dashboard.cost_breakdown.mixed":"工具回報費用與模型估算混合","dashboard.cost_breakdown.estimated":"依模型價格估算","dashboard.cost_breakdown.unpriced":"未找到價格。保留這些 tokens,但費用不明。","dashboard.cost_breakdown.no_token_charge":"此資料來源或模型不收取 token 費用","dashboard.cost_breakdown.unpriced_label":"未定價","dashboard.cost_breakdown.token_mix":"輸入 {{input}} · 輸出 {{output}} · 快取讀取 {{read}} · 快取寫入 {{write}}","dashboard.cost_breakdown.rates":"基礎價格,美元 / 百萬 tokens。輸入 {{input}} · 輸出 {{output}} · 快取讀取 {{read}} · 快取寫入 {{write}}。分級與優先處理費率可能不同。","dashboard.cost_breakdown.known_subtotal":"已知費用小計","dashboard.cost_breakdown.rate_unknown":"費率狀態未知","sessions.detail.not_recorded":"未記錄","sessions.detail.pricing_litellm":"LiteLLM 價格","sessions.detail.pricing_curated":"維護價格表","sessions.page.summary":"查看本機會話、用量和估算費用。","sessions.filter.range_label_all":"不限日期","sessions.summary.scope_help":"查看統計口徑","sessions.col.session":"會話 / 專案","sessions.col.speed":"速度","sessions.col.actions":"操作","sessions.detail.consumption":"用量與費用","sessions.detail.pricing_details":"價格詳情","sessions.detail.identifiers":"會話識別","sessions.detail.session_id":"會話 ID","sessions.detail.local_path":"本機路徑","sessions.detail.resume_command":"恢復命令","sessions.performance.first_response_value_single":"{{seconds}} 秒 · {{count}} 個樣本","cloud.export.open":"匯出 Cloud 用量","cloud.export.description":"按日匯出 · UTC 日期 · 美元估算","cloud.export.from":"開始日期 (UTC)","cloud.export.to":"結束日期 (UTC)","cloud.export.csv":"下載 CSV","cloud.export.json":"下載 JSON","cloud.export.busy":"正在核對 Cloud 權限並準備檔案…","cloud.export.error_auth":"請重新登入後再匯出。","cloud.export.error_access":"這些 Cloud 歷史已無法匯出。","cloud.export.error_dates":"請選擇有效的日期範圍。","cloud.export.error_changed":"帳號、後端、日期或讀取權限已變更,請重新匯出。","cloud.export.error_failed":"匯出失敗,請重試 CSV 或 JSON。","cloud.export.success":"已下載 {{from}} 至 {{to}} 的 {{count}} 個有記錄日期 (UTC)。","cloud.export.empty":"所選範圍沒有記錄。下載檔案包含範圍說明,不包含用量列。","cloud.export.truncated":"僅下載可讀取的 {{from}} 至 {{to}} (UTC),檔案也記錄了原先選擇的範圍。","cloud.export.dashboard":"檢視儀表板","cloud.action.buy_pro":"開通雲服務","cloud.price.fixed_monthly_total":"一次付款,使用一個月。","cloud.price.fixed_annual_total":"一次付款,使用一年,折合每月 {{equivalent}}。","cloud.checkout.help_title":"付款遇到問題?","cloud.faq.cost_title":"為什麼雲服務收費?","cloud.faq.cost_body":"隨著使用量成長,官方託管同步、儲存、頻寬、備份和維護需要持續投入。雲服務訂閱用於支持這些服務及其長期維護。本機應用程式的完整功能仍免費開源。","cloud.plan.local_community":"排行榜、成就與個人頁面","cloud.plan.monthly_equivalent":"相當於 {{equivalent}} / 月","cloud.plan.sync":"每 {{minutes}} 分鐘自動同步","cloud.plan.hourly_history":"{{days}} 天每小時用量明細","cloud.plan.daily_history":"{{months}} 個月每日彙總與雲端匯出","cloud.plan.identity":"專屬頭像框與會員標識","cloud.plan.faq_title":"你可能想了解","cloud.plan.details_title":"雲端服務具體包含什麼?","cloud.plan.self_host_summary":"也可以部署到自己的伺服器,軟體免費,託管與維護由你負責。目前為技術預覽。","cloud.plan.renewal_hint":"· 可隨時取消","cloud.plan.renewal_off":"· 一次付款","cloud.plan.skip_trial":"購買 Cloud","cloud.plan.anywhere":"隨時從瀏覽器查看各裝置用量","cloud.plan.retained_history":"{{days}} 天小時明細 · {{months}} 個月日彙總","cloud.onboarding.local_next":"在「設定 → 個人 → 雲端服務」中開啟同步,即可連接此裝置;其他電腦登入同一帳號,便可彙總查看用量。","cloud.onboarding.web_next":"在各電腦的 TokenTracker 應用程式中登入此帳號,並在「設定 → 個人 → 雲端服務」中開啟同步,用量會顯示在這裡。","cloud.action.setup_sync":"設定雲端同步","cloud.login.trial_context":"登入後繼續啟用雲端服務試用,已保留你的方案選擇。","cloud.login.purchase_context":"登入後繼續開通雲端服務,已保留你的方案選擇。","cloud.membership.payment_due":"續費付款需要處理,請在帳單中檢查付款狀態或更新付款方式。","cloud.plan.trial_setup_hint":"開始試用後,在電腦上開啟雲端同步。","cloud.trial.used_hint":"你已使用過免費試用,選擇 Cloud 方案繼續使用。","sessions.storage.label":"轉錄檔案:{{size}}","sessions.storage.tooltip":"僅會話檔案 · {{metric}} · 每千個歷史 token {{ratio}} 位元組。不含共用資料庫、快取和專案檔案。","sessions.storage.allocated":"配置空間","sessions.storage.logical":"邏輯檔案大小","sessions.storage.size":"{{value}} MiB","cloud.gift.done":"完成","cloud.free.device_scope":"僅統計目前裝置的用量","cloud.plan.includes_local":"包含全部免費本地功能","cloud.plan.device_sync":"不限裝置數量,跨裝置彙整同步","cloud.plan.device_fair_use":"日常個人使用不限裝置數量,不按裝置收費;大量或異常裝置接入可能觸發同步保護。"},tD={"landing.screenshot.alt":"TokenTracker 儀表板截圖","landing.nav.login":"登入","landing.nav.signup":"註冊","landing.install.command":"npx --yes tokentracker-cli","landing.install.action.copy":"複製命令","landing.install.action.copied":"已複製","landing.meta.title":"Token Tracker —— AI 編碼 CLI 的 Token 用量追蹤器","landing.meta.description":"自動監控 Claude Code、Cursor、Codex 等工具的 Token 用量。本地優先、注重隱私、零配置。","landing.meta.og_site_name":"Token Tracker","landing.meta.og_type":"website","landing.meta.og_image":"https://www.tokentracker.cc/og-image.jpg","landing.meta.og_url":"https://www.tokentracker.cc/","landing.meta.twitter_card":"summary_large_image","share.meta.title":"Token Tracker 分享","share.meta.description":"分享你的 Token Tracker 儀表板快照,包含跨模型、專案和時間視窗的用量洞察。","share.meta.og_site_name":"Token Tracker","share.meta.og_type":"website","share.meta.og_image":"https://www.tokentracker.cc/share-dashboard.jpg","share.meta.og_url":"https://www.tokentracker.cc/share","share.meta.twitter_card":"summary_large_image","landing.cta.primary":"進入儀表板","landing.cta.secondary":"GitHub","landing.v2.hero.title_line1":"追蹤每一個","landing.v2.hero.title_line2":"AI TOKEN","landing.v2.install.mac_cta":"下載 macOS 版","landing.v2.install.win_cta":"下載 Windows 版","landing.v2.install.desktop_cta":"下載桌面版","landing.v2.install.os_macos":"macOS","landing.v2.install.os_windows":"Windows","landing.v2.install.availability":"支援 macOS 與 Windows","landing.v2.models.title":"支援的 AI CLI 工具","landing.v2.distill.body":"100% 本機處理,不上傳任何 Prompt 或程式碼。","landing.v2.leaderboard.kicker":"全球 TOKEN 排行榜","landing.v2.leaderboard.title":"AI Token 效率","landing.v2.leaderboard.subtitle":"您可以選擇匿名同步本地 AI Token 用量,加入全球效率排行榜。與全球使用者一同評估模型開銷效率與調用頻次。","landing.v2.leaderboard.view_more":"檢視完整排行榜","landing.v2.footer.line":"Token Tracker —— 為每一位使用 AI 的人而打造。","landing.v2.nav.status":"狀態","landing.v2.nav.privacy":"隱私","landing.v2.nav.github":"GitHub","landing.v2.cta.primary":"儀表板","landing.v2.hero.subtagline":"自動監控 Claude Code、Cursor、Codex 等工具的 Token 用量。本地優先、注重隱私、零配置。","leaderboard.profile.nav.back":"排行榜","leaderboard.profile.nav.download":"下載","leaderboard.title":"排行榜","leaderboard.horizontal_scroll":"水平捲動排行榜欄位","limits.settings.enable_all":"全部開啟","limits.settings.disable_all":"全部關閉","limits.settings.bulk_visibility":"服務商顯示","limits.settings.enabled_count":"已開啟 {{enabled}} / {{total}} 個服務商","limits.zcode.start_grants":"Start 方案","limits.zcode.grant_amount":"剩餘 {{remaining}} / {{total}} Token","limits.zcode.reset_bank.title":"額度重設","limits.zcode.reset_bank.count":"{{count}} 次可用","limits.zcode.reset_bank.earliest":"最早 {{time}} 到期","leaderboard.range":"UTC {{period}} · {{from}} – {{to}}","leaderboard.range_loading":"UTC {{period}} · …","leaderboard.range.total":"全部時間","leaderboard.generated_at":"更新於 {{ts}}","leaderboard.period.week":"周","leaderboard.period.month":"月","leaderboard.period.total":"全部","leaderboard.me_label":"你","leaderboard.anon_label":"匿名","leaderboard.error.unknown":"未知錯誤","leaderboard.loading":"載入中…","leaderboard.empty":"暫無資料","leaderboard.column.rank":"排名","leaderboard.column.user":"使用者","leaderboard.column.total":"總計","leaderboard.column.codex":"Codex","leaderboard.column.claude":"Claude","leaderboard.column.gemini":"Gemini","leaderboard.column.cursor":"Cursor","leaderboard.column.opencode":"OpenCode","leaderboard.column.openclaw":"OpenClaw","leaderboard.column.hermes":"Hermes","leaderboard.column.kiro":"Kiro","leaderboard.column.copilot":"Copilot","leaderboard.column.kimi":"Kimi","leaderboard.column.supplemental":"其他","leaderboard.column.est_cost":"預估花費","leaderboard.signin_prompt":"登入後即可上榜","leaderboard.signin_button":"登入","leaderboard.sync_prompt":"開啟免費榜單同步即可參與排名。","leaderboard.sync_button.idle":"開啟免費同步","leaderboard.sync_button.busy":"同步中…","leaderboard.pagination.page_size_label":"每頁顯示","leaderboard.pagination.prev":"上一頁","leaderboard.pagination.next":"下一頁","leaderboard.pagination.ellipsis":"……","leaderboard.pagination.page_unknown":"第 {{page}} 頁","share.modal.title":"分享你的資料","share.modal.subtitle":"生成海報卡片,隨處分享。","share.modal.close":"關閉","share.modal.action.x":"分享到 X","share.modal.action.download":"下載","share.modal.action.copy":"複製圖片","share.modal.hint.x":"把圖片貼上到推文裡","share.modal.hint.copy":"到剪貼簿","share.modal.name_label":"顯示名稱","share.modal.name_placeholder":"輸入你的名字","share.modal.style_label":"樣式","share.modal.footer":"資料始終保留在本地——圖片在你的瀏覽器內生成,絕不上傳。","share.button.label":"分享","share.button.aria":"開啟分享卡片","share.toast.copied":"圖片已複製到剪貼簿","share.toast.downloaded":"圖片已儲存","share.toast.failed":"圖片生成失敗","share.toast.working":"生成中…","share.variant.neon":"霓虹","share.variant.broadsheet":"特刊","share.date.month_year":"{{year}} 年 {{month}}","share.issue.all_time":"總計","share.month_short.jan":"1 月","share.month_short.feb":"2 月","share.month_short.mar":"3 月","share.month_short.apr":"4 月","share.month_short.may":"5 月","share.month_short.jun":"6 月","share.month_short.jul":"7 月","share.month_short.aug":"8 月","share.month_short.sep":"9 月","share.month_short.oct":"10 月","share.month_short.nov":"11 月","share.month_short.dec":"12 月","share.hook.top_loyal":"{{name}} 佔了 {{percent}}% 的用量。","share.hook.days_record":"共記錄 {{days}} 天。","share.hook.top_led":"{{name}} 領跑,佔比 {{percent}}%。","share.hook.multi_models":"{{days}} 天裡用了 {{count}} 個模型。","share.hook.days_with_model":"{{name}} 陪你跑了 {{days}} 天。","share.hook.new_chapter":"新的記錄,從這裡開始。","share.card.broadsheet.issue":"期號","share.card.broadsheet.by":"分享者","share.card.broadsheet.tracked_since":"追蹤起始","share.card.broadsheet.total_tokens":"總 Token 數","share.card.broadsheet.estimated_spend":"預估花費","share.card.broadsheet.billable_days":"{{days}} 個活躍日","share.card.broadsheet.heatmap_title":"年度熱圖","share.card.broadsheet.heatmap_days_on_record":"{{active}} / {{total}} 天有記錄","share.card.broadsheet.roster_title":"模型榜","share.card.broadsheet.roster_subtitle":"常用模型輪換","share.card.broadsheet.empty":"這一週很安靜,還沒有模型資料。","share.card.broadsheet.global_rank":"全站排名","share.card.broadsheet.active_days":"活躍","share.card.broadsheet.days_count":"{{days}} 天","share.card.broadsheet.track_yours":"追蹤你自己的","share.card.annual.report_title":"用量報告","share.card.annual.less":"少","share.card.annual.more":"多","share.card.annual.heatmap_title":"Token 熱圖","share.card.annual.total_tokens":"總 Token 數","share.card.annual.estimated_cost":"預估成本","share.card.annual.longest_streak":"最長連擊","share.card.annual.days_count":"{{days}} 天","share.card.annual.top_model":"熱門模型","landing.v3.hero.kicker":"桌面寵物 · 4 個小工具 · 成就","landing.v3.hero.subtitle":"由 27 款 AI 編碼工具的真實活動驅動,兼具本機優先、開放原始碼與隱私保護的桌面夥伴。","landing.v3.hero.stat_label":"社群已追蹤的 Token","landing.v3.hero.scroll_hint":"向下捲動","landing.v3.stats.devs_syncing":"{{count}} 位使用者正在同步","landing.v3.stats.fallback_tokens":"2200000000000","landing.v3.stats.fallback_devs":"600","landing.v3.tools.count":"開箱即支援 {{count}}+ 款 AI 編碼 Agent。","landing.v3.how.kicker":"運作方式","landing.v3.how.title":"從敲下按鍵到呈現在儀表板,只需幾毫秒。","landing.v3.how.subtitle":"不需代理伺服器,也不用貼上 API 金鑰。TokenTracker 直接讀取 CLI 已寫入的用量資料,全程在你的裝置上完成。","landing.v3.how.step1.title":"照常使用你的 Agent","landing.v3.how.step1.body":"Claude Code、Codex、Cursor、Gemini——完全不必改變現有工作方式。","landing.v3.how.step2.title":"Hook 擷取用量","landing.v3.how.step2.body":"每輪對話的 Token 數會直接從 CLI 本機工作階段日誌解析。","landing.v3.how.step3.title":"在裝置上排入佇列","landing.v3.how.step3.body":"用量會標準化後寫入 ~/.tokentracker 下的唯附加佇列,不會離開你的磁碟。","landing.v3.how.step4.title":"即時呈現","landing.v3.how.step4.body":"資料一寫入,本機儀表板便會立即彙整每個 Agent、模型和小時。","landing.v3.cap.kicker":"完整掌握","landing.v3.cap.title":"一個儀表板,查看所有 Agent。","landing.v3.cap.subtitle":"花費、額度、使用節奏與模型——所有 AI 用量都在本機即時彙整,一覽無遺。","landing.v3.cap.limits.title":"用量額度雷達","landing.v3.cap.limits.body":"追蹤各 Provider 的 5 小時、每週和每月額度,在工作中途觸頂前先掌握狀況。","landing.v3.cap.heatmap.title":"365 天活動熱力圖","landing.v3.cap.heatmap.body":"用 GitHub 風格快速掌握編碼節奏,每個小時都在你的裝置上分桶統計。","landing.v3.cap.devices.title":"所有裝置,一張全貌","landing.v3.cap.devices.body":"macOS 選單列、Windows 系統匣、各平台 CLI——還可選擇同步到同一個帳號檢視。","landing.v3.privacy.kicker":"本機優先","landing.v3.privacy.title":"你的 Prompt 永遠不會離開裝置。","landing.v3.privacy.p1":"只統計 Token 數","landing.v3.privacy.p2":"不收集 Prompt 與程式碼","landing.v3.privacy.p3":"GitHub 開放原始碼","landing.v3.leaderboard.panel_title":"社群排行榜(全球)","landing.v3.leaderboard.live":"即時","landing.v3.leaderboard.anonymous":"匿名使用者","landing.v3.leaderboard.tokens_synced":"已同步 {{count}} Token","landing.v3.download.title":"30 秒開始追蹤。","landing.v3.download.subtitle":"一行命令或一次下載。免費、開放原始碼,完全屬於你。","landing.v2.leaderboard.active_developers":"1,240+ 位使用者正在同步","landing.v2.leaderboard.top_badge":"效率冠軍","landing.v2.leaderboard.rank_first":"全球第 1 名","landing.v2.leaderboard.rank_second":"第 2 名","landing.v2.leaderboard.rank_third":"第 3 名","landing.v2.leaderboard.synced_tokens":"已同步 {{count}} Token","landing.v2.leaderboard.efficiency":"效率:{{value}}","landing.v2.leaderboard.streak_days":"連續 {{count}} 天","landing.v3.how.scene.terminal_title":"終端機","landing.v3.how.scene.prompt":'"重構解析器"',"landing.v3.how.scene.thinking":"正在思考…","landing.v3.how.scene.editing":"正在編輯 {{path}}","landing.v3.how.scene.files_changed":"已修改 {{count}} 個檔案","landing.v3.how.scene.session_title":"工作階段日誌 · 上一輪","landing.v3.how.scene.appended":"已在本機附加","landing.v3.how.scene.total_tokens":"Token 總量","landing.discovery.tracked_usage":"Token Tracker 按模型、專案和時間範圍統計輸入、輸出、快取及快取寫入 token,並讀取 Claude、Codex、Cursor、Gemini、Antigravity、Qoder、Qoder CN、Command Code 和 Devin 等 17 家工具的使用額度。","landing.discovery.limits_summary":"查看 17 家工具的即時額度和訂閱狀態;Antigravity、Qoder 等本機來源支援保留最近一次有效結果。","landing.discovery.faq_usage":"按模型、專案和時間範圍統計輸入、輸出、快取及快取寫入 token,並顯示 Claude、Codex、Cursor、Gemini、Antigravity、Qoder、Qoder CN、Command Code 和 Devin 等 17 家工具的使用額度。"},nD={"header.auth.sign_in_aria":"ログイン","login.back_home":"ホームに戻る","login.cloud_only":"クラウドログインが設定されていません。localhost のローカルダッシュボードをご利用ください。","login.title":"ログイン","login.subtitle":"メールまたは連携済みアカウントを選択してください。","login.dismiss":"閉じる","login.verify_email_success":"メールアドレスが確認されました。ログインできます。","login.verify_email_pending":"ログインの前に、メールでの確認を完了してください。","login.oauth.continue":"{{provider}} で続ける","login.oauth.desktop_start_failed":"デスクトップアプリのログインを開始できませんでした。もう一度お試しください。","login.divider":"または","login.tab.sign_in":"ログイン","login.tab.sign_up":"アカウント作成","login.field.name":"表示名","login.field.name_placeholder":"任意","login.field.email":"メールアドレス","login.field.password":"パスワード","login.forgot_password":"パスワードをお忘れですか?","login.password_hint":"{{min}} 文字以上。","login.submit.sign_in":"メールでログイン","login.submit.sign_up":"アカウントを作成","reset_password.back_to_sign_in":"ログインに戻る","reset_password.title":"パスワードをリセット","reset_password.subtitle":"リセットリンクを受け取るメールアドレスを入力してください。","reset_password.request.submit":"リセットリンクを送信","reset_password.request.sent":"メールを確認してコードを入力してください。","reset_password.field.code":"リセットコード","reset_password.field.new_password":"新しいパスワード","reset_password.field.confirm_password":"パスワードを確認","reset_password.reset.submit":"パスワードをリセット","reset_password.error.password_mismatch":"パスワードが一致しません。","reset_password.error.missing_token":"リセットトークンがありません。新しいリセットリンクをリクエストしてください。","reset_password.success":"パスワードが更新されました。新しいパスワードでログインできます。","reset_password.success_cta":"ログインに戻る","auth.callback.processing":"処理中…","auth.callback.success":"ログインに成功しました","auth.callback.redirecting":"TokenTracker に戻っています…","auth.callback.failed":"ログインが完了しませんでした。もう一度お試しください。","auth.callback.close":"このページを閉じる","login_modal.subtitle":"ログインしてリーダーボードに参加","login_modal.continue_email":"メールで続ける","login_modal.divider_email":"メール","shared.placeholder.short":"--","shared.unit.percent":"%","shared.unit.thousand_abbrev":"K","shared.unit.million_abbrev":"M","shared.unit.billion_abbrev":"B","shared.unit.trillion_abbrev":"T","shared.data_source":"データソース:{{source}}","shared.error.prefix":"エラー:{{error}}","shared.status.unsynced":"—","shared.time.now":"たった今","shared.time.m_ago":"{{n}}分前","shared.time.h_ago":"{{n}}時間前","shared.time.d_ago":"{{n}}日前","error.boundary.title":"問題が発生しました","error.boundary.subtitle":"このビューのレンダリングに失敗しました","error.boundary.hint":"コンソールを開いてから、ページを再読み込みしてください","error.boundary.no_details":"エラーの詳細はありません","error.boundary.action.reload":"再読み込み","identity_card.rank_label":"開始日","identity_card.streak_label":"アクティブ日数","identity_card.rank_placeholder":"—","identity_card.streak_value":"{{days}} 日","usage.summary.total":"トークン合計","usage.summary.toggle_aria":"数値の短縮表示を切り替え","usage.period.day":"日","usage.period.week":"週","usage.period.month":"月","usage.period.total":"合計","usage.period.custom":"カスタム","usage.metric.total":"合計","usage.metric.input":"入力","usage.metric.output":"出力","usage.metric.cached_input":"キャッシュ入力","usage.metric.reasoning_output":"推論出力","usage.button.refresh":"更新","usage.overview.tablist_aria":"期間","usage.overview.cost_breakdown_aria":"コスト内訳を表示","usage.overview.distribution_aria":"ソース別割合:{{items}}","usage.overview.distribution_item":"{{label}} {{percent}}%","usage.overview.provider_card_aria":"{{provider}}:{{percent}}%、{{tokens}} トークン、{{cost}}。クリックして{{action}}詳細","usage.overview.expand":"展開","usage.overview.collapse":"折りたたむ","usage.overview.model_count":"{{count}} 個のモデル","usage.overview.model_details_aria":"{{provider}} のモデル詳細","widgets.page.title":"メニューバーとウィジェット","widgets.cta.open_gallery":"ウィジェットギャラリーを開く","widgets.cta.download":"Mac アプリをダウンロード","widgets.cta.macos_only":"macOS 限定","widgets.menubar.section.title":"メニューバー","widgets.gallery.section.title":"デスクトップウィジェット","widgets.summary.name":"使用状況の概要","widgets.summary.description":"今日と直近 7 日間の使用状況、コンパクトなトレンドライン付き。","widgets.heatmap.name":"ヒートマップ","widgets.heatmap.description":"GitHub のように、アクティブな日とそうでない日をひと目で把握。","widgets.topModels.name":"人気モデル","widgets.topModels.description":"よく使うモデルを、トークン割合順に表示。","widgets.limits.name":"使用制限","widgets.limits.description":"Claude、Codex、Cursor、Gemini などのリアルタイムなレート制限の進捗。","daily.sort.date.label":"日付","daily.sort.date.title":"日付で並べ替え","daily.sort.total.label":"合計","daily.sort.total.title":"合計で並べ替え","daily.sort.input.label":"入力","daily.sort.input.title":"入力で並べ替え","daily.sort.output.label":"出力","daily.sort.output.title":"出力で並べ替え","daily.sort.cached.label":"キャッシュ","daily.sort.cached.title":"キャッシュ入力で並べ替え","daily.sort.reasoning.label":"推論","daily.sort.reasoning.title":"推論出力で並べ替え","daily.sort.conversations.label":"会話数","daily.sort.conversations.title":"会話数で並べ替え","details.pagination.prev":"前のページ","details.pagination.next":"次のページ","limits.copilot.otelHint.title":"Copilot のトークン使用状況を追跡","limits.copilot.otelHint.body":"制限情報は GitHub OAuth トークン経由で読み取られます。トークン単位の使用量も記録したい場合は、Copilot の OpenTelemetry エクスポートを有効にし、次の内容をシェルの設定ファイル(~/.zshrc または ~/.bashrc)に追加してください:","limits.copilot.otelHint.copy":"コピー","limits.copilot.otelHint.copied":"コピーしました","limits.panel.title":"使用制限","limits.panel.mode_separator":" · ","limits.page.refresh":"制限を更新","limits.page.refresh_loading":"制限を更新中…","limits.page.refreshed_at":"制限を更新しました:{{time}}","limits.page.refresh_failed":"制限を更新できませんでした。","limits.page.refresh_partial":"{{time}} に限度を更新しましたが、一部のデータはキャッシュ由来または更新に失敗しています。","limits.page.refresh_stale":"更新は完了しましたが、すべてのプロバイダーがキャッシュまたは失敗データを表示しています。","limits.label.cursor_plan":"プラン","limits.label.cursor_grok_bot":"Grokボット","limits.label.cursor_auto":"自動","limits.label.cursor_api":"API","limits.label.kiro_month":"月間","limits.label.kiro_bonus":"ボーナス","limits.label.kiro_tracked_credits":"ローカル使用量:{{credits}} クレジット · {{count}} ターン","limits.label.kimi_weekly":"週","limits.label.kimi_5h":"5h","limits.label.kimi_total":"総量","limits.label.kimi_parallel":"並列:{{count}}","limits.explain.used":"{{label}}:{{used}}% 使用","limits.explain.on_track":"{{label}}:順調、リセットまでに約 {{pct}}%","limits.explain.ahead_eta":"{{label}}:速い、約 {{eta}} で上限","limits.explain.ahead_pct":"{{label}}:速い、リセットまでに約 {{pct}}%","limits.explain.body":"目盛りは一定ペースの位置。塗りが超えると速いペースです。","limits.explain.remaining":"{{label}}:残り {{used}}%","limits.explain.on_track_remaining":"{{label}}:順調、リセットまでに残り約 {{pct}}%","limits.explain.ahead_pct_remaining":"{{label}}:速い、リセットまでに残り約 {{pct}}%","limits.explain.body_remaining":"目盛りは一定ペースの位置。塗りが届かないと速いペースです。","limits.label.copilot_premium":"プレミアム","limits.label.copilot_chat":"チャット","limits.label.grok_month":"月間","limits.label.grok_week":"週間","limits.label.grok_day":"日","limits.label.grok_ondemand":"オンデマンド","limits.provider.claude":"Claude","limits.provider.codex":"Codex","limits.provider.cursor":"Cursor","limits.provider.gemini":"Gemini","limits.provider.kimi":"Kimi","limits.provider.kiro":"Kiro","limits.provider.grok":"Grok Build","limits.provider.copilot":"GitHub Copilot","limits.provider.antigravity":"Antigravity","limits.provider.zcode":"ZCode","limits.provider.opencode_go":"OpenCode Go","limits.provider.qoder":"Qoder","limits.provider.qoder_cn":"Qoder CN","limits.label.zcode_glm52":"GLM-5.2","limits.label.zcode_glm5t":"GLM-5-Turbo","limits.label.opencode_go_5h":"5h","limits.label.opencode_go_weekly":"Weekly","limits.label.opencode_go_monthly":"Monthly","limits.label.qoder_credits":"クレジット","limits.label.qoder_ultimate":"Ultimate 無料呼び出し","limits.label.qoder_cn_credits":"クレジット","limits.label.qoder_cn_ultimate":"Ultimate 無料呼び出し","limits.qoder_calls.detail":"{{used}} / {{limit}} 回使用 · 残り {{remaining}} 回","limits.hover.expires_at":"{{time}} に期限切れ","limits.label.claude_5h":"5h","limits.label.claude_7d":"7d","limits.label.claude_opus":"Opus","limits.label.codex_5h":"5h","limits.label.codex_7d":"7d","limits.label.codex_credits":"クレジット","limits.label.codex_spark_5h":"Spark 5h","limits.label.codex_spark_7d":"Spark 7d","limits.codex_credits.detail":"{{used}} / {{limit}} クレジット使用済み · 残り {{remaining}}","limits.codex_reset_bank.title":"リセット","limits.codex_reset_bank.row_label":"リセット {{index}}","limits.codex_reset_bank.count_only":"リセット:{{count}} 件利用可 · 有効期限不明","limits.label.gemini_pro":"Pro","limits.label.gemini_flash":"Flash","limits.label.gemini_lite":"Lite","limits.label.antigravity_claude_weekly":"Cl 7d","limits.label.antigravity_claude_5h":"Cl 5h","limits.label.antigravity_gemini_weekly":"Gm 7d","limits.label.antigravity_gemini_5h":"Gm 5h","limits.label.antigravity_live":"リアルタイム","limits.label.antigravity_cached":"キャッシュ","limits.provenance.fresh":"最新","limits.provenance.stale":"古い","limits.provenance.tooltip":"取得元:{{source}}、信頼度:{{confidence}}","limits.reauth.badge":"再ログイン","limits.reauth.tooltip":"ログインの有効期限が切れています。ターミナルで `{{command}}` を一度実行して再ログインし、更新してください。","limits.tooltip.antigravity_live":"Antigravity の Google アカウントから取得したリアルタイムの制限値です。","limits.tooltip.antigravity_cached":"キャッシュされた制限値。Antigravity のログイン情報から更新するため、アプリを開く必要はありません。","limits.tooltip.qoder_cached":"キャッシュされた制限値。更新するには Qoder を実行してください。","limits.bar.sub_one_percent":"<1","limits.status.not_connected":"未接続","limits.status.no_data":"リアルタイムの制限データが返されませんでした","limits.opencodeGo.status.inactive":"OpenCode Go のサブスクリプションは無効です","limits.opencodeGo.setupHint.title":"OpenCode Go を接続","limits.opencodeGo.setupHint.subtitle":"公式 API(opencode.ai/zen/go/v1/usage)から OpenCode Go の使用量を取得します。","limits.opencodeGo.setupHint.step1":"opencode.ai にサインインして Go を購読します。","limits.opencodeGo.setupHint.cta":"opencode.ai を開く","limits.opencodeGo.setupHint.step2":"コンソールで API キーを作成してコピーします。","limits.opencodeGo.setupHint.step3":"このコマンドを実行し、キーを貼り付けて(入力は表示されません)から、TokenTracker を再起動してください:","limits.opencodeGo.setupHint.note_app":"macOS アプリ:launchctl setenv の行を使って、アプリを開き直してください。","limits.opencodeGo.setupHint.copy":"コピー","limits.opencodeGo.setupHint.copied":"コピーしました","limits.status.all_hidden":"すべての制限プロバイダーが非表示になっています。表示設定を開いて再表示してください。","nav.usage":"使用状況","nav.limits":"制限","nav.widgets":"メニューバーとウィジェット","nav.skills":"Skills","nav.leaderboard":"リーダーボード","nav.collapse":"サイドバーを折りたたむ","nav.expand":"サイドバーを展開","nav.menu":"ナビゲーションメニューを開く","nav.close_menu":"ナビゲーションメニューを閉じる","nav.aside_label":"メインナビゲーション","nav.nav_label":"ナビゲーション","limits.page.subtitle":"AI ツールのレート制限とクォータの使用状況。","limits.settings.toggle_visible":"表示を切り替え","limits.settings.display_mode_label":"使用量表示","limits.settings.display_mode_used":"使用済み","limits.settings.display_mode_remaining":"残り","limits.page.openSettings":"表示設定","nav.group.general":"一般","nav.group.tools":"ツール","nav.group.account":"アカウント","nav.settings":"設定","header.auth.open_settings":"設定を開く","settings.page.title":"設定","settings.page.subtitle":"アカウント、外観、表示設定を管理します。","settings.section.appearance":"外観","settings.section.account":"アカウント","settings.section.limits":"制限の表示","settings.section.network":"ネットワーク","settings.network.mode.label":"送信プロキシ","settings.network.mode.hint":"クラウド同期で Token Tracker がインターネットに出る方法を選びます。アプリの更新は常にシステムプロキシに従います。","settings.network.mode.system":"システム","settings.network.mode.manual":"手動","settings.network.mode.off":"オフ","settings.network.protocol.label":"プロトコル","settings.network.protocol.http":"HTTP","settings.network.protocol.https":"HTTPS","settings.network.protocol.socks5":"SOCKS5","settings.network.host.label":"ホスト","settings.network.host.placeholder":"127.0.0.1","settings.network.port.label":"ポート","settings.network.port.placeholder":"7890","settings.network.test":"接続をテスト","settings.network.test.testing":"テスト中…","settings.network.test.ok":"テスト URL に到達しました(HTTP {{status}})。","settings.network.test.fail":"接続できませんでした: {{error}}","settings.network.save":"保存","settings.network.saving":"保存中…","settings.network.saved":"プロキシ設定を保存しました。","settings.network.error.host":"http:// やパスを付けずにホストを入力してください。","settings.network.error.port":"1〜65535 のポートを入力してください。","settings.network.effective.manual":"手動プロキシを使用しています。","settings.network.effective.env":"環境変数のプロキシを使用しています。","settings.network.effective.system":"システムのプロキシを使用しています。","settings.network.effective.none":"現在は直接接続しています。","settings.network.effective.blocked":"送信通信は遮断されています:手動プロキシを適用できませんでした。","settings.network.apply_error":"保存したプロキシを適用できませんでした: {{error}}。プロキシは無効で、送信通信は遮断されています。プロキシ設定を確認してください。","settings.network.save_error":"プロキシ設定を保存できませんでした: {{error}}","settings.network.save_error_unprotected":"プロキシ設定を保存できませんでした: {{error}}。送信通信は現在保護されておらず、遮断にも失敗しています。","settings.limits.providers":"プロバイダー","settings.appearance.theme.label":"テーマ","settings.appearance.theme.hint":"Token Tracker のダッシュボードでの表示方法を選択します。","settings.appearance.theme.light":"ライト","settings.appearance.theme.dark":"ダーク","settings.appearance.theme.system":"システム","settings.account.displayName":"表示名","settings.account.edit":"編集","settings.account.save":"保存","settings.account.saving":"保存中...","settings.account.cancel":"キャンセル","settings.account.userId":"ユーザー ID","settings.account.copyUserId":"ユーザー ID をコピー","settings.account.copy":"コピー","settings.account.copied":"コピーしました","settings.account.cloudSync":"クラウド同期","settings.account.cloudSyncHint":"このパソコンの使用量を同期し、すべてのデバイスの使用量をまとめて確認できます。プロンプト、コード、プロバイダーの認証情報はローカルに残ります。","settings.account.cloudSyncPending":"同期を試行中…","settings.account.cloudSyncError":"同期を完了できませんでした。ネットワーク、ローカルサービス、ログイン状態を確認して再試行してください。ローカルの記録には影響しません。","settings.account.publicProfile":"公開プロフィール","settings.account.publicProfileHint":"公開リーダーボードで使用状況を表示します。","settings.account.displayNameAnonymousHint":"匿名の状態では、リーダーボードであなたの名前とアバターが非表示になります","settings.account.displayNameDisabledWhileAnon":"名前を編集する前に、匿名を解除してください","settings.account.githubUrl":"GitHub プロフィール","settings.account.githubUrlHint":"リーダーボードの名前の横に GitHub リンクを表示します。","settings.account.githubUrlPlaceholder":"ユーザー名または https://github.com/ユーザー名","settings.account.githubUrlInvalid":"GitHub のユーザー名、または https://github.com/ユーザー名 を入力してください","settings.labs.island.label":"ダイナミックアイランド","settings.labs.island.hint":"MacBook のノッチをダイナミックアイランドに:本日のトークンと支出を常時表示し、ホバーで支出と上限の詳細を確認できます。","settings.labs.island.aria":"ダイナミックアイランドの切り替え","settings.labs.island_hide_menubar.label":"メニューバーアイコンを隠す","settings.labs.island_hide_menubar.hint":"メニューバーのアイコンを非表示にし、ダイナミックアイランドのみを使用します。","settings.labs.island_hide_menubar.aria":"メニューバーアイコン非表示の切り替え","dashboard.island.title":"ダイナミックアイランド登場","dashboard.island.hint":"MacBook のノッチをリアルタイムのトークンメーターに:本日のトークンと支出を常時表示し、ホバーで詳細を確認できます。","dashboard.island.enable":"今すぐオンにする","dashboard.island.settings_link":"設定で確認","dashboard.island.enabled_toast":"ダイナミックアイランドをオンにしました。ノッチを見上げてみてください","dashboard.island.dismiss_aria":"ダイナミックアイランドのヒントを閉じる","dashboard.linux_pet.title":"デスクトップペットに会おう","dashboard.linux_pet.hint":"デスクトップの小さな相棒。ホバーで今日のトークン・費用・上限を表示、どこへでもドラッグできます。","dashboard.linux_pet.show":"ペットを表示","dashboard.linux_pet.settings_link":"ペット設定","dashboard.linux_pet.dismiss_aria":"デスクトップペットのヒントを閉じる","settings.labs.qpd.label":"PR費用対効果の分析","settings.labs.qpd.hint":"マージされたPRとAI帰属コミットから、各モデルの平均開発コストと有効Tokenを分析します。","settings.labs.qpd.aria":"PR費用対効果の分析の切り替え","settings.labs.sessions.label":"セッション効率分析","settings.labs.sessions.hint":"ローカルのメタデータのみを使い、Claude と Codex の編集カバレッジ、初回完了率、編集単価を分析します。","settings.labs.sessions.aria":"セッション効率分析の切り替え","leaderboard.github.aria":"GitHub プロフィールを開く","leaderboard.github.tooltipAction":"クリックして GitHub プロフィールを表示","leaderboard.github.tooltipPrefix":"ここに表示するには","leaderboard.github.tooltipSettingsLink":"設定","leaderboard.github.tooltipSuffix":"で設定してください","settings.account.signOut":"ログアウト","settings.account.signIn":"ログイン","settings.account.signedOutHint":"ログインすると、公開プロフィールとアカウント情報を管理できます。","settings.section.account.description":"公開プロフィールとアカウント情報。","settings.section.cloud":"Cloud","settings.nav.group.personal":"個人","settings.section.cloud.description":"Cloud メンバーシップ、請求、デバイスの同期を管理します。","settings.section.menubar":"メニューバーアプリ","settings.menubar.showStats":"メニューバーに統計を表示","settings.menubar.showStatsHint":"メニューバーアイコンの横に、今日のトークン数とコストを表示します。","settings.menubar.iconStyle":"メニューバーアイコン","settings.menubar.iconStyleHint":"メニューバーに住むキャラクターを選択します。AIツールがトークンを消費している間、ネコとペットは速く走ります。","settings.menubar.iconStyle.clawd":"Clawd","settings.menubar.iconStyle.cat":"ネコ","settings.menubar.iconStyle.pet":"マイペット","settings.menubar.iconStyle.static":"静的","pet.menubar.title":"メニューバーで走らせる","pet.menubar.hint":"ペットがメニューバーアイコンの代わりになり、AIツールがトークンを消費している間は全力疾走します。","settings.menubar.toastOnReset":"リセット時に通知を表示","settings.menubar.toastOnResetHint":"使用上限がリセットされたときに短いメッセージを表示します。","settings.menubar.confettiOnReset":"リセット時に紙吹雪","settings.menubar.confettiOnResetHint":"上限間際の後、使用枠がリセットされたら花火でお祝いします。","settings.menubar.appearance":"メニューバーの表示とアイコン","settings.menubar.appearanceHint":"統計、スロット、アニメーションアイコンは「メニューバーとウィジェット」ページで設定します。","settings.menubar.appearanceLink":"開く","settings.menubar.launchAtLogin":"ログイン時に起動","settings.menubar.launchAtLoginHint":"macOS へのログイン時に TokenTrackerBar を自動的に起動します。","settings.menubar.syncNow":"今すぐ同期","settings.menubar.syncNowHint":"ローカルの AI ツールログの解析とアップロードをすぐに実行します。","settings.menubar.syncing":"同期中...","settings.menubar.updates":"更新","settings.menubar.autoUpdate":"自動アップデート","settings.menubar.autoUpdateHint":"新しいバージョンをバックグラウンドで自動的にダウンロードしてインストールします。オフにしても手動での更新確認は引き続き利用できます。","settings.menubar.checkUpdates":"更新を確認","settings.footer.statusPage":"システムステータス","menubar.slot.primary":"1 番目の位置","menubar.slot.secondary":"2 番目の位置","menubar.native_only":"macOS 版 TokenTrackerBar を開くと、メニューバーの表示を編集できます。","menubar.metric.today_tokens":"今日のトークン","menubar.metric.none":"表示しない(空欄)","menubar.metric.today_cost":"今日のコスト","menubar.metric.last_7d_tokens":"直近 7 日間のトークン","menubar.metric.total_tokens":"トークン合計","menubar.metric.total_cost":"コスト合計","menubar.metric.claude_5h":"Claude 5 時間制限","menubar.metric.claude_7d":"Claude 7 日間制限","menubar.metric.codex_5h":"Codex 5 時間制限","menubar.metric.codex_7d":"Codex 7 日間制限","menubar.metric.codex_credits":"Codex クレジット上限","menubar.metric.codex_spark_5h":"Codex Spark 5 時間制限","menubar.metric.codex_spark_7d":"Codex Spark 7 日間制限","nav.ip_check":"Claude IP チェック","nav.service_status":"サービス状況","status.page.subtitle":"各 AI プロバイダーの公式ステータスページからのリアルタイム障害情報。","status.page.source_note":"ブラウザーから各プロバイダーの公開ステータスページを直接読み取り、毎分自動更新します。","status.state.checking":"確認中…","status.state.none":"正常稼働中","status.state.minor":"軽微な障害","status.state.major":"重大な障害","status.state.critical":"重大な停止","status.state.unknown":"アクセス不可","status.open_page":"{{provider}} のステータスページを開く","status.refresh":"更新","status.last_checked":"{{time}} に確認","skills.page.title":"Skills","skills.tab.my":"マイ","skills.tab.browse":"探す","skills.action.refresh":"更新","skills.action.install":"インストール","skills.action.choose_targets":"対象を選択","skills.target.menu_label":"インストール先","skills.target.none":"対象が未選択","skills.toast.installed":"{{name}} を {{targets}} にインストールしました。","skills.action.remove":"削除","skills.action.search":"検索","skills.action.search_aria":"skills を検索","skills.action.search_clear":"検索をクリア","skills.target.synced_summary":"{{targets}} に同期済み","skills.target.synced_none":"まだどの agent にも同期されていません","skills.row.open_details":"{{name}} の詳細を表示","skills.detail.close":"詳細を閉じる","skills.detail.sync_section_title":"同期先","skills.detail.remove_button":"すべての agent から削除","skills.detail.remove_confirm_hint":"これにより、各 agent から同期解除され、ローカルのコピーも削除されます。","skills.filter.agent_label":"Agent","skills.filter.agent_all":"すべての agent","skills.filter.clear":"フィルターをクリア","skills.my.placeholder":"インストール済みの skills を絞り込み…","skills.filter.result_count":"{{filtered}} / {{total}} 個の skill","skills.filter.result_count_browse":"{{count}} 件の結果","skills.empty.no_match":"現在のフィルターに一致する skill はありません。","hint.dismiss":"ヒントを閉じる","hint.dismissible_aria":"閉じられるヒント","skills.card.installed":"インストール済み","skills.card.targets_prefix":"インストール先:","skills.card.targets_change":"変更","skills.card.installs":"{{count}} 回インストール","skills.source.label":"ソース","skills.source.all":"すべてのリポジトリ","skills.mode.repo":"リポジトリ","skills.mode.skillssh":"skills.sh","skills.browse.placeholder_all":"有効なリポジトリ内を検索…","skills.browse.placeholder_repo":"{{repo}} 内を検索…","skills.browse.placeholder_skillssh":"skills.sh のリポジトリ内を検索…","skills.browse.empty_sources":"GitHub リポジトリを追加して、スキルの閲覧を始めましょう。","skills.browse.add_repo_hint":"もっと skill がほしいですか?GitHub リポジトリを追加してください。","skills.browse.manage_sources":"ソースを管理","skills.browse.hint_skillssh":"skills.sh を検索するには 2 文字以上入力してください。","skills.browse.loading_hint":"GitHub から skill 情報を取得しています。初回の読み込みには 1 分ほどかかる場合があり、結果はキャッシュされます。","skills.error.generic":"Skill の操作に失敗しました。","skills.confirm.remove_title":"{{name}} を削除しますか?","skills.confirm.remove_managed":"この skill は接続済みのすべての AI ツールから削除されます。数秒以内であれば元に戻せます。","skills.confirm.remove_local":"すべての AI ツールのディレクトリから、この skill フォルダを削除します。この操作は元に戻せません。","skills.toast.removed":"{{name}} を削除しました。","shared.action.undo":"元に戻す","shared.action.cancel":"キャンセル","shared.action.apply":"適用","skills.empty.my":"まだ skill がありません。「探す」で検索またはインストールしましょう。","skills.empty.my_cta":"探しに行く","skills.empty.browse":"このソースにはスキルが見つかりませんでした。","skills.empty.search":"結果がありません。別のキーワードでお試しください。","skills.repo.placeholder":"owner/repository","skills.repo.add":"リポジトリを追加","skills.repo.invalid":"owner/repository または GitHub リポジトリの URL を入力してください。","skills.repo.remove":"リポジトリを削除","settings.appearance.language.label":"言語","settings.appearance.language.hint":"「システム」を使用すると、デフォルトで端末の言語に従います。","settings.appearance.language.system":"システム","settings.appearance.language.english":"英語","settings.appearance.language.chinese":"簡体字中国語","settings.appearance.language.traditional_chinese":"繁体字中国語","settings.appearance.language.japanese":"日本語","settings.appearance.language.korean":"韓国語","settings.appearance.language.german":"ドイツ語","settings.appearance.currency.label":"通貨","settings.appearance.currency.hint":"使用コストの表示通貨を選択します。","settings.appearance.token_format.label":"Token 数値表示","settings.appearance.token_format.hint":"短縮または完全な数値を全体に適用します。短縮表示ではホバーで正確な値を確認できます。","settings.appearance.token_format.compact":"短縮","settings.appearance.token_format.full":"完全","settings.appearance.token_unit.label":"数値単位","settings.appearance.token_unit.hint":"短縮数値は K/M/B または万/億単位を使用します。完全な数値では単位は使用されません。","settings.appearance.token_unit.english":"K/M/B","settings.appearance.token_unit.chinese":"万/億","settings.appearance.currency.opt.usd":"米ドル ($)","settings.appearance.currency.opt.eur":"ユーロ (€)","settings.appearance.currency.opt.gbp":"英ポンド (£)","settings.appearance.currency.opt.cny":"人民元 (¥)","settings.appearance.currency.opt.jpy":"日本円 (¥)","settings.appearance.currency.opt.hkd":"香港ドル (HK$)","settings.appearance.currency.rate_source.default":"組み込みのデフォルト為替レート","settings.appearance.currency.rate_source.fetched":"データソース:open.er-api.com","settings.appearance.currency.rate_updated":"{{when}} に更新","settings.appearance.currency.rate_never":"まだ更新されていません","qpd.card.title":"開発費用対効果とPRコスト","qpd.card.badge":"BETA","qpd.card.subtitle":"マージされたPRとAI帰属コミットに基づき、各モデルの平均開発コストを算出します。","qpd.card.updating":"更新中…","qpd.card.best_value":"最安","qpd.card.col_model":"モデル","qpd.card.col_cost":"消費額","qpd.card.col_accepted":"マージ済PR","qpd.card.col_rate":"採択率","qpd.card.col_qpd":"PR単価","qpd.card.qpd_tooltip":"PRを1つマージするのに費やした平均トークン費用 (総費用 ÷ マージされたPR数)","qpd.card.totals":"マージ済: {{accepted}}/{{outcomes}} PR · 総消費額 {{cost}}","qpd.card.et":"有効トークン: {{tokens}} (採択率 {{rate}})","qpd.card.et_tooltip":"有効トークン (Effective Tokens) — 最終的に採用・マージされたコードに使用されたトークンの割合","qpd.card.sparse_notice":"ヒント:データ量が少ない場合、費用対効果の数値が偏る可能性があります。期間を狭めてお試しください。","sessions.card.title":"セッション効率","sessions.card.subtitle":"Claude と Codex で統一した編集ターン指標","sessions.card.loading":"ローカルセッションのメタデータを分析しています…","sessions.card.edit_sessions":"編集セッション","sessions.card.first_pass":"初回完了","sessions.card.cost_edit":"編集あたりの費用","sessions.card.model":"モデル","sessions.card.edit_session_value":"{{edits}} / {{sessions}}","sessions.card.edit_turn_count":"{{count}} 編集ターン","sessions.card.tokens_edit":"編集あたりの Token","sessions.card.sample":"{{sessions}} セッション · {{edits}} 編集ターン","sessions.card.methodology_label":"計測方法","sessions.card.methodology":"編集 = 観測された編集ツールを含むユーザーターン。初回完了 = 編集ターンが1回だけで、同じ依頼の繰り返しがない状態。","sessions.card.context":"推定固定コンテキスト","sessions.card.context_tooltip":"指示、インストール済み Skills、推定 MCP ツールスキーマ","sessions.card.privacy":"ローカルのメタデータのみを処理し、プロンプト、応答、コマンド出力、差分内容は保持しません。","sessions.card.subagents":"サブエージェント起動","sessions.card.subagent_item":"{{name}} · {{calls}}","nav.sessions":"セッション","sessions.page.refresh":"セッションを更新","sessions.filter.source_aria":"セッションのソースで絞り込む","sessions.filter.range_aria":"期間で絞り込む","sessions.filter.range_7d":"7日間","sessions.filter.range_30d":"30日間","sessions.filter.range_90d":"90日間","sessions.filter.project_all":"すべてのプロジェクト","sessions.filter.project_search":"プロジェクトを検索…","sessions.filter.project_empty":"一致するプロジェクトがありません","sessions.filter.project_aria":"プロジェクトで絞り込む","sessions.filter.result_count":"{{filtered}} / {{total}}","sessions.action.search_aria":"セッションを検索","sessions.action.search_clear":"検索をクリア","sessions.search.placeholder":"タイトル・プロジェクト・モデル・ID で検索…","sessions.loading":"セッションを読み込み中…","sessions.col.tokens":"トークン","sessions.col.cost":"コスト","sessions.col.edits":"編集","sessions.badge.first_pass":"一発完了","sessions.badge.reported_cost":"報告済みコスト","sessions.badge.partial_usage":"不完全な使用量","sessions.badge.partial_cost":"コスト不完全","sessions.cost.partial_title":"下限値 — このセッションの一部のモデルには公開レートがないため、そのトークンは $0 として計上されます。","sessions.grok.runtime_breakdown":"モデル呼出 {{calls}} 回 · API {{seconds}} 秒 · ツール {{tools}} 回 · エラー {{errors}} 件","sessions.grok.context_breakdown":"コンテキスト {{used}} / {{window}}({{percent}}%)","sessions.badge.subagent":"サブエージェント","sessions.thread.expand":"{{count}} 件のサブエージェントを展開","sessions.thread.collapse":"{{count}} 件のサブエージェントを折りたたむ","sessions.thread.tokens_summary":"自身 {{own}} · サブエージェント {{subagents}} · 合計 {{combined}}","sessions.thread.result_count":"ルートセッション {{roots}} 件 · サブエージェント {{subagents}} 件を折りたたみ","sessions.thread.model_usage":"サブエージェントのモデル使用量","sessions.thread.model_all":"すべて · {{count}} 件 · {{tokens}}","sessions.thread.model_item":"{{model}} · {{count}} 件 · {{tokens}}","sessions.duration.minutes":"{{minutes}}分","sessions.duration.hours":"{{hours}}時間 {{minutes}}分","sessions.project.unknown":"無題のセッション","sessions.model.unknown":"不明なモデル","sessions.resume.copy_aria":"再開コマンドをコピー:{{command}}","sessions.resume.copied":"再開コマンドをコピーしました","sessions.resume.copy_failed":"コマンドをコピーできませんでした","sessions.resume.unavailable":"再開コマンドは利用できません","sessions.empty.title":"まだセッションがありません","sessions.empty.body":"このマシンで Claude Code、Codex、または Grok を実行すると、セッションがここに表示されます。","sessions.empty.filtered_title":"一致するセッションがありません","sessions.empty.filtered_body":"検索語を変えるか、期間を広げてみてください。","sessions.col.turns":"ターン","sessions.project.copy_hint":"クリックでこのパスをコピー","sessions.project.copy_aria":"{{project}} のローカルパスをコピー","sessions.project.copied":"プロジェクトのパスをコピーしました","sessions.project.copy_failed":"パスをコピーできませんでした","sessions.action.load_more":"さらにセッションを表示","sessions.error.title":"セッションを読み込めませんでした","sessions.error.retry":"再試行","sessions.error.outdated_app":"この TokenTracker はバージョンが古いためセッションを一覧できません。最新版に更新してください。","sessions.truncated":"最新の {{shown}} 件のみ表示しています(全 {{total}} 件)。期間を絞ると古いセッションも表示されます。","sessions.privacy":"ローカルで処理されます。Prompt と応答の本文、コマンド出力、差分内容は保持もアップロードもしません。","nav.achievements":"実績","limits.alert.enable":"予測リミット通知を有効にする","limits.alert.disable":"予測リミット通知を無効にする","limits.alert.title":"{{provider}} の上限が早く尽きる可能性があります","limits.alert.body":"現在のペースでは、残り {{eta}} で使い切る可能性があります({{percent}}% 使用済み)。","settings.section.labs":"Labs","limits.alert.blocked":"通知がオフです — システム設定で許可してください","settings.limits.showSubscriptions":"サブスクを制限表示に表示","settings.limits.showSubscriptionsHint":"手動登録した更新日バーを制限と一緒に表示します。","settings.appearance.token_grouping.label":"数値の区切り","settings.appearance.token_grouping.hint":"正確な数値は 3 桁または中国語の 4 桁区切りを使用します。コンパクト表示のツールチップにも適用されます。","settings.appearance.token_grouping.thousand":"3桁","settings.appearance.token_grouping.wan":"4桁","leaderboard.pro.badge":"Pro","leaderboard.pro.badge_aria":"TokenTracker Pro メンバー"},aD={"cloud.action.resume_order":"支払いを続ける","cloud.restore.title":"注文を探す","cloud.restore.detail":"注文IDを入力して、支払い状況を確認するか支払いを続けてください。","cloud.billing.title":"請求と支払い","cloud.membership.transition_until":"移行期間は {{date}} まで","cloud.membership.trial_until":"試用期間は {{date}} まで","cloud.membership.active_until":"{{date}} まで有効","cloud.membership.gift_until":"Cloud ギフトは {{date}} まで","cloud.membership.expired_on":"{{date}} に期限切れ","cloud.history.date":"日付","cloud.history.amount":"金額","cloud.history.status":"状態","cloud.history.paid":"支払い済み","cloud.history.pending":"支払い待ち","cloud.membership.tools_title":"ツールと請求","usage.overview.all_tools":"すべて","usage.overview.all_models":"すべてのモデル","usage.overview.all_models_note":"同じ名前のモデルはツールをまたいで集計され、合計使用量順に表示されます。","usage.overview.week_cross_month_hint":"この週は2つの暦月にまたがるため、合計は単一の月の使用量と直接比較できません","usage.overview.all_tools_card_aria":"すべてのツール:{{tokens}}トークン、{{cost}}、{{count}}モデル。統合モデルランキングを表示","usage.overview.antigravity_notice_title":"トークンの詳細","usage.overview.cache_hit_rate_label":"キャッシュヒット率","usage.overview.cache_hit_rate_detail":"{{reused}} 再利用 / {{input}} 入力","usage.overview.antigravity_notice_body":"利用可能な場合は Antigravity のローカルセッションメタデータから正確なトークン数と prompt cache ヒット数を取得します。メタデータのないログは文字数(約 4 文字/トークン)から推定されます。","usage.overview.devin_notice_title":"料金は未算出です","usage.overview.devin_notice_body":"Devin は実際のローカルトークン数を報告しますが、このビルドには swe-2、swe-2-high、compactor の料金データがないため、これらの使用量はドル換算の推定から除外されます。$0 と表示されても無料とは限りません。","stats.period.today":"今日","stats.period.week":"今週","stats.period.month":"今月","stats.period.all":"全期間","stats.period.last_7d":"7日","stats.period.last_30d":"30日","stats.period.avg":"平均","stats.period.convs":"会話","dashboard.core_index.collapse_label":"▾","dashboard.core_index.expand_label":"▸","dashboard.core_index.collapse_aria":"モデルの内訳を折りたたむ","dashboard.core_index.expand_aria":"モデルの内訳を展開","dashboard.rolling.title":"最近のアクティビティ","dashboard.rolling.last_7d":"過去 7 日間","dashboard.rolling.last_30d":"過去 30 日間","dashboard.rolling.avg_active_day":"1 日平均","dashboard.projects.title":"プロジェクトの使用状況","dashboard.projects.limit_aria":"表示するプロジェクト数を選択","dashboard.projects.limit_top_3":"上位 3 件","dashboard.projects.limit_top_6":"上位 6 件","dashboard.projects.limit_top_10":"上位 10 件","dashboard.projects.empty":"プロジェクト使用量はまだありません。git リポジトリ内で対応 CLI を使うと、使用量がここに表示されます。","dashboard.projects.detail.close_aria":"プロジェクト詳細を閉じる","dashboard.projects.detail.error":"プロジェクト詳細の読み込みに失敗しました","dashboard.projects.detail.empty_range":"選択した期間に使用量はありません","dashboard.projects.detail.stat_total":"合計トークン","dashboard.projects.detail.stat_conversations":"会話数","dashboard.projects.detail.stat_active_days":"アクティブ日数","dashboard.projects.detail.stat_avg_day":"平均 / アクティブ日","dashboard.projects.detail.stat_cache_hit":"キャッシュヒット率","dashboard.projects.detail.stat_share":"全体に占める割合","dashboard.projects.detail.section_trend":"日次アクティビティ","dashboard.projects.detail.section_composition":"トークン構成","dashboard.projects.detail.section_sources":"ソース別","dashboard.projects.detail.comp_input":"入力","dashboard.projects.detail.comp_cached":"キャッシュ読取","dashboard.projects.detail.comp_cache_write":"キャッシュ書込","dashboard.projects.detail.comp_output":"出力","dashboard.projects.detail.comp_reasoning":"推論","dashboard.projects.detail.source_days":"{{n}}日","dashboard.projects.detail.source_conv":"{{n}} 会話","dashboard.widgets.title":"デスクトップウィジェット","dashboard.widgets.hint":"デスクトップを右クリック → ウィジェットを編集 → 「TokenTracker」を検索","dashboard.widgets.dismiss_aria":"ウィジェットの紹介を閉じる","dashboard.linux_topbar.title":"トップバーで使用量をチェック","dashboard.linux_topbar.hint":"GNOME では、TokenTracker 拡張機能がトップバーの Clawd の横に今日のトークンと費用を表示し、ドロップダウンで上限と推移を確認できます。","dashboard.linux_topbar.setup":"セットアップ","dashboard.linux_topbar.dismiss_aria":"トップバーのヒントを閉じる","dashboard.cost_breakdown.title":"コスト内訳","dashboard.cost_breakdown.total_label":"推定総コスト","dashboard.cost_breakdown.close":"閉じる","trend.monitor.label":"使用トレンド","trend.monitor.predicted":"予測値","trend.zoom.open_aria":"全画面表示","trend.zoom.close_aria":"閉じる","trend.zoom.badge":"トレンド分析","trend.zoom.desc":"バーにカーソルを合わせるとトークン、コスト、会話数を確認できます。粒度を切り替えて月から30分単位まで掘り下げられます。","trend.zoom.insight_badge":"分析","trend.zoom.tooltip.cost":"コスト","trend.zoom.tooltip.conversations":"会話","trend.zoom.stats.tokens":"総トークン数","trend.zoom.stats.cost":"総コスト","trend.zoom.stats.conversations":"会話数","trend.zoom.stats.peak":"ピーク時間帯","trend.zoom.gran.aria":"粒度","trend.zoom.gran.30min":"30分","trend.zoom.gran.day":"日","trend.zoom.gran.month":"月","trend.zoom.prev_day":"前日","trend.zoom.next_day":"翌日","trend.zoom.loading":"読み込み中…","trend.zoom.pick_day":"日付を選択","trend.zoom.pick_range":"期間を選択","trend.zoom.insight.empty":"静かな期間。トークンは一つも流れませんでした。","trend.zoom.insight.calm":"控えめな使い方。モデルはほとんど待機し、必要なときだけ動きました。","trend.zoom.insight.steady":"{{active}} 個のアクティブな区間で安定したリズム、ピークは {{peak}}。騒がずに物事を仕上げていくペースです。","trend.zoom.insight.heavy":"本気の稼働:{{active}} 区間が高負荷で動き、ピークは {{peak}}。勢いを待つのではなく自ら生み出す人の出力です。","trend.zoom.insight.massive":"工業規模。{{peak}} のピークと冷めることのないスループット。この量になると、もはやモデルを使うのではなく工場を動かしています。","heatmap.title":"ヒートマップ","heatmap.empty":"まだアクティビティデータがありません。","heatmap.legend.less":"少","heatmap.legend.more":"多","heatmap.legend.utc":"UTC","heatmap.tooltip":"{{day}} • {{value}} {{unit}} • {{tz}}","heatmap.unit.tokens":"トークン","heatmap.month.jan":"1月","heatmap.month.feb":"2月","heatmap.month.mar":"3月","heatmap.month.apr":"4月","heatmap.month.may":"5月","heatmap.month.jun":"6月","heatmap.month.jul":"7月","heatmap.month.aug":"8月","heatmap.month.sep":"9月","heatmap.month.oct":"10月","heatmap.month.nov":"11月","heatmap.month.dec":"12月","heatmap.day.sun":"日","heatmap.day.mon":"月","heatmap.day.tue":"火","heatmap.day.wed":"水","heatmap.day.thu":"木","heatmap.day.fri":"金","heatmap.day.sat":"土","dashboard.session_expired.copy_label":"npx --yes tokentracker-cli init を実行","dashboard.session_expired.copied":"コピーしました","dashboard.install.prompt":"Node.js 18+ をインストールしてから実行:","dashboard.install.cmd.init":"npx --yes tokentracker-cli init","dashboard.install.cmd.init_link_code":"npx --yes tokentracker-cli init --link-code {{link_code}}","dashboard.install.copy":"インストールコマンドをコピー","dashboard.install.copy_base":"初期化コマンドをコピー","dashboard.install.copied":"クリップボードにコピーしました","dashboard.install.link_code.loading":"専用コードを生成中...","dashboard.install.link_code.failed":"専用コードを利用できません","dashboard.install.cmd.sync":"npx --yes tokentracker-cli sync","dashboard.daily.title":"日次内訳","dashboard.daily.empty":"まだデータがありません。先に AI CLI を使用してから {{cmd}} を実行してください。","dashboard.identity.title":"あなたのプロフィール","dashboard.identity.subtitle":"あなたのコーディングの軌跡を記録","dashboard.identity.fallback":"匿名ユーザー","dashboard.overview.layout.drag_handle":"ドラッグして並べ替え","dashboard.overview.layout.reset":"レイアウトをリセット","dashboard.screenshot.twitter_text":"記録された {{total_tokens}} トークン。\\n{{model_name}} が {{model_percent}}% でリード。\\n\\n私の AI 使用状況、未監査 →","heatmap.3d.hover_tip":"クリックして 3D 全画面回転分析モードに入る","heatmap.3d.modal.title":"トークンの 3D ビュー","heatmap.3d.modal.desc":"左ボタンを押しながらドラッグで自由に回転し、ホバーで日々のアクティビティと多次元の統計を確認できます。","heatmap.3d.modal.stats.total_tokens":"年間トークン総量","heatmap.3d.modal.stats.precision_total_tokens":"年間の正確な消費量","heatmap.3d.modal.stats.estimated_cost":"年間推定費用","heatmap.3d.modal.stats.active_rate_days":"アクティブ率 / 日数","heatmap.3d.modal.stats.max_streak":"最長連続アクティブ","heatmap.3d.modal.stats.days_suffix":"日","heatmap.3d.modal.stats.peak_day":"単日ピーク","heatmap.3d.modal.stats.precision_peak_value":"正確な単日ピーク","heatmap.3d.modal.stats.no_data":"データなし","heatmap.3d.modal.legend.title":"アクティビティのレベル","heatmap.3d.modal.palette.emerald":"エメラルドシティ","heatmap.3d.modal.palette.ocean":"ディープオーシャン","heatmap.3d.modal.palette.neon":"サイバーネオン","heatmap.3d.modal.palette.amber":"燃ゆる残照","heatmap.3d.modal.control.play":"ゆっくり自動回転を開始","heatmap.3d.modal.control.pause":"自動回転を一時停止","heatmap.3d.modal.control.reset":"3D 視点をリセット","heatmap.3d.modal.footer.tip":"ピンチでズーム / ホイールでズーム / マウスドラッグで 3D チャートを回転","heatmap.3d.modal.ai.title.default":"たゆまず歩み続ける人","heatmap.3d.modal.ai.eval.default":"あなたは着実に行動し、前へ進み続けています。小さなアクティビティの一つひとつが、思考と探求の瞬間を記録しています。その積み重ねが、やがてあなただけの成果になります。","heatmap.3d.modal.ai.title.peak":"限界突破級コントリビューター","heatmap.3d.modal.ai.eval.peak":"この一年、あなたのトークン活動は並外れた水準に達しました。高い集中力と勢いを保ちながら、複雑なアイデアを具体的な成果へ変え続けています。持続する創造力の証です。","heatmap.3d.modal.ai.title.heavy":"高頻度クリエイター","heatmap.3d.modal.ai.eval.heavy":"卓越した継続的アウトプット。積み重ねたトークンは、膨大な調査、創作、問題解決の歩みを映しています。この安定したペースは、優れた集中力と実行力を示しています。","heatmap.3d.modal.ai.title.core":"中核生産力エキスパート","heatmap.3d.modal.ai.eval.core":"きわめて粘り強い長期的な取り組み。過去一年にわたり安定した高いペースを保ち、AIとの協働を持続的な成果へ変えてきました。まさに生産性の中核です。","heatmap.3d.modal.ai.title.steady":"着実なクリエイター","heatmap.3d.modal.ai.eval.steady":"着実に、集中して前進しています。トークンの積み重ねは、アイデアを価値ある成果へ変えた一歩一歩の記録です。この安定したリズムが、長く活きる専門性を育てます。","heatmap.3d.voxel.joke.1":"🔥 超ヤバい!{{value}} tokens を産出!大規模モデルを猛特訓中?それともコンパイラを手書きで?","heatmap.3d.voxel.joke.2":"🚀 叙事詩級のアウトプット!合計 {{value}} tokens。今日の産出量は地球を一周できるほど、AI もあなたに驚嘆!","heatmap.3d.voxel.joke.3":"⚡ 爆発の日!{{value}} tokens。コードが泉のごとく湧き出て、キーボードが煙を上げ始めた!","heatmap.3d.voxel.level3":"⚡ 生産力の大爆発({{value}} tokens)!高効率で集中したゴールデンタイム、このピークの状態を保ち続けよう!","heatmap.3d.voxel.level2":"🌱 調子が上がってきた({{value}} tokens)!着実なアウトプットで、キーを打つたびに大きな建物に一枚ずつレンガを積み重ねています。","heatmap.3d.voxel.level1":"🍃 塵も積もれば山となる({{value}} tokens)。小さなコミットも未来への投資、複利の力を保とう!","heatmap.3d.voxel.level0":"💤 英気を養う日。コードを書かない日にも、ひらめきはひそかに育っています。","ipcheck.page.title":"Claude IP チェック","ipcheck.page.subtitle":"現在 Claude にアクセスしている出口 IP、クリーン度、地理情報、リスクシグナルを確認し、ログインに影響したりリスク管理を誘発したりしうる要因を把握します。","ipcheck.mask.toggle":"IP を隠す","ipcheck.ipv6.warn":"現在 IPv6 環境です。IPv6 での Claude Code アクセスは推奨されず、一部の検出結果が不完全になる可能性があります。","ipcheck.ip.cn":"中国の出口 IPv4","ipcheck.ip.cloudflare":"Cloudflare 出口","ipcheck.ip.claude":"Claude 出口","ipcheck.ip.failed":"取得に失敗しました","ipcheck.ip.loading":"読み込み中...","ipcheck.trust.title":"信頼スコア","ipcheck.trust.subtitle":"Claude のリスク管理視点での IP クリーン度","ipcheck.trust.no_data":"データなし","ipcheck.trust.no_ip":"Claude の出口 IP を取得できず、スコアを算出できません","ipcheck.trust.no_score":"この IP のスコアデータはまだありません","ipcheck.trust.gauge.low":"0 高リスク","ipcheck.trust.gauge.high":"100 信頼可","ipcheck.trust.label.pristine":"極めてクリーン","ipcheck.trust.label.clean":"クリーン","ipcheck.trust.label.good":"良好","ipcheck.trust.label.neutral":"中立","ipcheck.trust.label.suspicious":"疑わしい","ipcheck.trust.label.unreachable":"アクセス不可","ipcheck.trust.text.excellent":"この IP の評判は非常に良好です","ipcheck.trust.text.great":"この IP の評判は優秀です","ipcheck.trust.text.minor":"この IP には軽微なリスクがあります","ipcheck.trust.text.moderate":"この IP には一定のリスクがあります","ipcheck.trust.text.severe":"この IP は極めて高リスクです","ipcheck.trust.text.restricted":"アクセス不可の地域にあり、Claude は厳格にリスク管理します","ipcheck.trust.region_warn.title":"Claude の出口 IP が {{region}} にあります","ipcheck.trust.region_warn.body":"Claude へのログインは推奨されません。アカウント停止のリスク管理を誘発しやすくなります。","ipcheck.trust.region_support":"Claude 対応地域","ipcheck.trust.region.accessible":"アクセス可","ipcheck.common.unknown":"不明","ipcheck.props.title":"IP の属性","ipcheck.props.region":"地域","ipcheck.props.city":"都市","ipcheck.props.type":"タイプ","ipcheck.props.asn":"ASN","ipcheck.props.org":"プロバイダー","ipcheck.props.residential":"家庭用","ipcheck.props.datacenter":"データセンター","ipcheck.security.title":"セキュリティ検出","ipcheck.security.vpn":"VPN","ipcheck.security.proxy":"プロキシ (Proxy)","ipcheck.security.tor":"Tor","ipcheck.security.crawler":"ボット (Crawler)","ipcheck.security.abuser":"不正利用の記録","ipcheck.security.proxy_flag":"プロキシ","ipcheck.security.crawler_yes":"はい","ipcheck.security.crawler_no":"いいえ","ipcheck.security.abuser_yes":"記録あり","ipcheck.security.abuser_no":"記録なし","ipcheck.security.clean":"検出されませんでした","ipcheck.avail.title":"Claude の可用性","ipcheck.avail.tooltip":"Claude のサーバーは米国にあります。アジアからのアクセスで遅延が 100ms を超えるのは正常な状況です。","ipcheck.avail.refresh":"更新","ipcheck.avail.svc_row":"サービス状態","ipcheck.avail.latency.normal":"正常","ipcheck.avail.latency.good":"良好","ipcheck.avail.latency.slow":"やや遅い","ipcheck.avail.latency.unreachable":"アクセス不可","ipcheck.avail.svc.none":"すべて正常","ipcheck.avail.svc.minor":"軽微な障害","ipcheck.avail.svc.major":"重大な障害","ipcheck.avail.svc.critical":"深刻な障害","ipcheck.avail.svc.maintenance":"メンテナンス中","ipcheck.avail.svc.other":"サービス異常","ipcheck.dns.title":"DNS リーク検出","ipcheck.dns.status":"状態","ipcheck.dns.outlet":"DNS 出口","ipcheck.dns.outlet_ip":"DNS 出口 IP","ipcheck.dns.isp":"プロバイダー","ipcheck.dns.leaked":"リークの可能性あり","ipcheck.dns.no_leak":"リークは検出されませんでした","ipcheck.dns.encrypted":"DNS は暗号化または非公開","ipcheck.dns.cn_tag":"中国 DNS","ipcheck.udp.title":"WebRTC UDP リーク","ipcheck.udp.status":"状態","ipcheck.udp.outlet":"UDP 出口","ipcheck.udp.outlet_ip":"UDP 出口 IP","ipcheck.udp.origin":"所在地","ipcheck.udp.disabled":"WebRTC は無効です","ipcheck.udp.no_leak":"リークは検出されませんでした","ipcheck.udp.leaked":"リークの可能性あり","ipcheck.udp.anomaly":"異常","ipcheck.device.title":"デバイス情報","ipcheck.device.tz":"タイムゾーン","ipcheck.device.lang":"言語","ipcheck.device.os":"OS / ブラウザ","ipcheck.device.touch":"タッチスクリーン","ipcheck.device.net":"ネットワークタイプ","ipcheck.device.dnt":"Do Not Track","ipcheck.device.webgl_render":"WebGL レンダラー","ipcheck.device.canvas_fp":"Canvas フィンガープリント","ipcheck.device.webgl_fp":"WebGL フィンガープリント","ipcheck.device.match":"一致","ipcheck.device.mismatch":"不一致","ipcheck.device.local":"ローカル","ipcheck.device.estimate_suffix":"(推定)","ipcheck.device.diff_equal":"オフセットにわずかな差があります","ipcheck.device.diff_ahead":"Claude が {{h}} 時間進んでいます","ipcheck.device.diff_behind":"Claude が {{h}} 時間遅れています","ipcheck.device.lang_expected":"Claude 出口でよく使われる言語","ipcheck.device.touch_yes":"はい","ipcheck.device.touch_no":"いいえ","ipcheck.device.dnt_on":"オン","ipcheck.device.dnt_off":"オフ","ipcheck.device.dnt_unset":"未設定","ipcheck.device.net_unsupported":"検出に非対応","ipcheck.device.unsupported":"非対応","ipcheck.history.title":"Claude 出口 IP の履歴","ipcheck.history.subtitle":"ブラウザのローカルにのみ保存され、最大 6 件まで保持されます","ipcheck.history.clear":"クリア","ipcheck.history.empty":"履歴はまだありません","ipcheck.history.current":"現在","ipcheck.region.CN":"中国本土","ipcheck.region.HK":"香港","ipcheck.region.MO":"マカオ","ipcheck.region.RU":"ロシア","ipcheck.region.KP":"北朝鮮","ipcheck.region.IR":"イラン","ipcheck.region.SY":"シリア","ipcheck.region.CU":"キューバ","ipcheck.region.BY":"ベラルーシ","ipcheck.region.VE":"ベネズエラ","leaderboard.profile_modal.close":"閉じる","leaderboard.profile_modal.loading":"ユーザープロフィールを読み込み中…","leaderboard.profile_modal.error":"ユーザープロフィールの読み込みに失敗しました。","leaderboard.profile_modal.empty":"このユーザーのプロフィールは公開されていません。","leaderboard.profile_modal.row_aria":"{{name}} のプロフィールを表示","leaderboard.profile_modal.rank":"#{{rank}}","leaderboard.profile.hero.rank_label":"ランク","leaderboard.profile_modal.hero.total_tokens":"トークン合計","leaderboard.profile_modal.hero.total_cost":"支出合計","leaderboard.profile_modal.hero.github":"GitHub プロフィール","leaderboard.profile_modal.stat.total_cost":"支出合計","leaderboard.profile_modal.stat.total_tokens":"トークン合計","leaderboard.profile_modal.stat.active_days":"アクティブ日数","leaderboard.profile_modal.stat.avg_per_day":"1 日平均支出","leaderboard.profile_modal.streak.current":"現在の連続","leaderboard.profile_modal.streak.longest":"最長連続","leaderboard.profile_modal.streak.days":"{{count}} 日","leaderboard.profile_modal.best_day.title":"ベストデー","leaderboard.profile_modal.best_day.none":"—","leaderboard.profile_modal.models.count":"{{count}} 個のモデルを使用","leaderboard.profile_modal.models.favorite":"お気に入りモデル","leaderboard.profile_modal.models.none":"モデルの記録はまだありません","leaderboard.profile_modal.heatmap.title":"アクティビティ(直近 365 日)","leaderboard.profile_modal.providers.title":"プロバイダー別の分布","leaderboard.profile_modal.providers.none":"この期間の使用データはありません。","leaderboard.profile_modal.view_full":"完全なプロフィールを表示","local_only.title":"クライアント内でご利用ください","local_only.body":"このページはお使いの端末上のデータを読み込むため、Mac アプリまたはコマンドラインの dashboard でのみ表示できます。","local_only.open_app":"Mac アプリ内で開く","local_only.download":"Mac アプリをダウンロード","dashboard.auth_gate.title":"Token Tracker にサインイン","dashboard.auth_gate.subtitle":"サインインして、クラウドでの API 使用量、コスト、トークン消費の傾向を同期および表示します。","dashboard.auth_gate.button":"今すぐサインイン","dashboard.expired_gate.title":"セッションの有効期限切れ","dashboard.expired_gate.subtitle":"セッションの有効期限が切れました。クラウドダッシュボードの表示を続けるには、もう一度サインインしてください。","dashboard.expired_gate.button":"再サインイン","shared.app_name":"Token Tracker","dashboard.auth_gate.hero_title":"AIエージェントのすべてのトークン消費","dashboard.auth_gate.hero_subtitle":"明確で透過的、マルチエンドポイント制御","dashboard.auth_gate.desc":"Claude Code、Cursor、Gemini CLIなどのすべての主流エージェントからのトークンクォータ、同時実行コスト、遅延統計をパブリッククラウドで安全に同期し、これまでにない包括的な可視化分析を提供します。","dashboard.auth_gate.feature.sync.title":"リアルタイムクラウド同期","dashboard.auth_gate.feature.sync.desc":"各エンドポイントの実行コストを自動的に収集し、プライベートクラウドに数秒で安全にアーカイブします。","dashboard.auth_gate.feature.anal.title":"多次元ダッシュボード分析","dashboard.auth_gate.feature.anal.desc":"モデル分類、時間枠ごとにトークン分布を統計し、コストの急増と消費構成をいつでも追跡できます。","dashboard.auth_gate.feature.guard.title":"ローカル優先の自律性","dashboard.auth_gate.feature.guard.desc":"Localhostモードではすべてのログイン認証を自動的にスキップし、ローカルのオフラインデバッグエクスペリエンスを完全に保護します。","dashboard.expired_gate.hero_title":"クラウドセッションの有効期限切れ","dashboard.expired_gate.desc":"プライバシーとクラウドドライブのセキュリティのため、有効なセッションは一定期間後に自動的に終了します。ダッシュボードを即座に復元するには、もう一度検証してください。","dashboard.expired_gate.feature.sec.title":"安全な保護","dashboard.expired_gate.feature.sec.desc":"暗号化された資格情報は期限が切れると自動的に破壊され、トークン資産のプライバシーを厳密に保護します。","dashboard.expired_gate.feature.restore.title":"シームレスな復元","dashboard.expired_gate.feature.restore.desc":"再ログイン後、ターミナルフックを再構成することなく、マルチデバイスのリアルタイムダッシュボードが自動的に復元されます。","dashboard.expired_gate.feature.cloud.title":"クロスデバイス同期","dashboard.expired_gate.feature.cloud.desc":"同期されたダッシュボードを介して、どこからでもトークンログを簡単に確認して開消を管理できます。","dashboard.device_filter.all":"すべてのデバイス","dashboard.device_filter.aria":"デバイスで絞り込む","dashboard.device_card.title":"デバイス別","dashboard.device_card.current":"このデバイス","dashboard.device_card.unnamed":"名称未設定のデバイス","nav.pet":"デスクトップペット","pet.page.eyebrow":"デスクトップコンパニオン","pet.page.title":"ペット","pet.page.subtitle":"コンパニオンを選び、実際の AI 利用状況への反応をプレビューできます。","pet.preview.states":"ペットの状態をプレビュー","pet.controls.title":"デスクトップ操作","pet.controls.show":"デスクトップペットを表示","pet.controls.show_hint":"コンパニオンをほかのウィンドウより手前に表示します。","pet.controls.size":"ペットのサイズ","pet.controls.native_only":"実際のペットを操作するには TokenTracker デスクトップアプリでこのページを開いてください。","pet.characters.title":"コンパニオンを選択","pet.characters.subtitle":"すべてのキャラクターが完全な状態システムと独自の配色・シルエットを備えています。","pet.character.clawd":"Clawd","pet.character.clawd_desc":"ハサミ型シルエットの元祖トークンキーパー。","pet.character.sprout":"Sprout","pet.character.sprout_desc":"葉の耳と小さな根の足を持つ苗木の精霊。","pet.character.byte":"Byte","pet.character.byte_desc":"表情豊かな画面とスラスターを持つ端末ロボット。","pet.character.ember":"Ember","pet.character.ember_desc":"炎の尾で好調な連続記録を祝うキツネの精霊。","pet.state.calm":"穏やか","pet.state.focus":"集中","pet.state.multitask":"マルチモデル","pet.state.streak":"連続記録","pet.state.celebrate":"新しい利用","pet.state.rest":"休憩","pet.size.small":"小","pet.size.medium":"中","pet.size.large":"大","pet.import.title":"Codex ペットをインポート","pet.import.subtitle":"codex-pets.net のリンクを貼るか、.zip を選択します。","pet.import.add":"追加","pet.import.zip":"パッケージを選択","pet.import.remove":"ペットを削除","pet.import.success":"ペットをインポートして選択しました。","pet.import.failed":"このペットをインポートできませんでした。","pet.import.busy":"インポート中…","pet.format.v2":"V2","pet.import.removed":"ペットを削除しました。","pet.import.url_label":"Codex Pets のURLまたはペットID","dashboard.projects.detail.badge":"プロジェクト","achievements.section.title":"実績","achievements.page.title":"実績","achievements.page.local_note":"プロジェクト系と夜型バッジはこの端末にのみ保存されます。","achievements.signin.prompt":"サインインするとクラウド実績を獲得し、リーダーボードに表示できます。","achievements.mini.tooltip":"{{name}} — {{tier}}","achievements.badge.aria":"{{name}} — {{tier}}","achievements.tier.bronze":"ブロンズ","achievements.tier.silver":"シルバー","achievements.tier.gold":"ゴールド","achievements.tier.diamond":"ダイヤモンド","achievements.modal.locked":"未解除","achievements.modal.achieved_label":"達成日","achievements.modal.value_label":"現在の値","achievements.modal.progress_to_next":"{{tier}}までの進捗","achievements.modal.max_tier":"最高ティア達成","achievements.modal.close":"閉じる","achievements.modal.tier_history":"ティア履歴","achievements.modal.coin_aria":"{{name}} バッジ——ドラッグまたは矢印キーで回転","achievements.modal.issue_number":"No.{{number}}","achievements.badge.token_titan.name":"トークンタイタン","achievements.badge.token_titan.desc":"すべての AI ツールで生涯トークンを積み上げる。","achievements.badge.big_day.name":"ビッグデイ","achievements.badge.big_day.desc":"一日で膨大なトークンを消費する。","achievements.badge.wordsmith.name":"言葉の匠","achievements.badge.wordsmith.desc":"AI が実際に書き出したコードと文章 — 出力トークンを積み上げよう。","achievements.badge.marathoner.name":"マラソンランナー","achievements.badge.marathoner.desc":"アクティブな日数を積み重ねる。","achievements.badge.streak.name":"連続記録","achievements.badge.streak.desc":"毎日の連続使用を途切れさせない。","achievements.badge.weekend_warrior.name":"週末戦士","achievements.badge.weekend_warrior.desc":"土日も開発を続けよう。","achievements.badge.momentum.name":"モメンタム","achievements.badge.momentum.desc":"週間使用量を前週から大きく伸ばす。","achievements.badge.polyglot.name":"モデルポリグロット","achievements.badge.polyglot.desc":"多種多様なモデルを使いこなす。","achievements.badge.trendsetter.name":"トレンドセッター","achievements.badge.trendsetter.desc":"新モデルを登場から1週間以内に使い始めよう。","achievements.badge.multitool.name":"マルチツール","achievements.badge.multitool.desc":"多くの AI コーディングツールで使用量を記録する。","achievements.badge.podium.name":"表彰台","achievements.badge.podium.desc":"総合リーダーボードを駆け上がる。","achievements.badge.veteran.name":"ベテラン","achievements.badge.veteran.desc":"最初の記録日から使い続ける。","achievements.badge.project_hopper.name":"プロジェクトホッパー","achievements.badge.project_hopper.desc":"多くのプロジェクトにトークンを注ぐ。","achievements.badge.project_devotion.name":"一途なプロジェクト","achievements.badge.project_devotion.desc":"ひとつの愛するプロジェクトにトークンを捧げる。","achievements.badge.night_owl.name":"夜ふかし","achievements.badge.night_owl.desc":"深夜 0 時から朝 6 時の間にコードを書く。","achievements.signin.action":"サインイン","achievements.scope.local":"ローカル","achievements.page.suggest":"新しいバッジのアイデアがある?","achievements.page.suggest_link":"GitHub で提案する","dashboard.context_breakdown.empty_grok":"選択した期間に Grok Build のアクティビティがありません。","dashboard.context_breakdown.error_grok":"このビューに必要な Grok Build ログを読み取れませんでした。","dashboard.context_breakdown.footnote_grok":"Grok では重複しないトークン区分を使います。ツールと exec の詳細は同一ターンへのヒューリスティックな帰属で、turn_completed.usage を正とします。","dashboard.context_breakdown.heading":"コンテキスト内訳","dashboard.context_breakdown.heading_claude":"Claude コンテキスト内訳","dashboard.context_breakdown.heading_codex":"Codex コンテキスト内訳","dashboard.context_breakdown.heading_grok":"Grok コンテキスト内訳","cloud.action.open_app":"TokenTrackerで開く","cloud.checkout.return_app_hint":"デスクトップアプリにログイン中のアカウントでこの注文を確認します。アクセス権はサーバーが確認します。","cloud.gift.redeem_action":"Cloud コードを引き換える","cloud.gift.detail":"ギフトにはすべての Cloud 機能が含まれ、自動更新は作成されません。既存のサブスクリプションは別途管理します。","cloud.gift.code_label":"Cloud ギフトコード","cloud.gift.confirm":"コードを引き換える","cloud.gift.redeeming":"引き換え中…","cloud.gift.redeemed":"コードを引き換えました","cloud.gift.already_redeemed":"このコードは引き換え済みです。ギフトはアカウントに表示されています。","cloud.gift.refresh_needed":"コードは引き換え済みですが、会員情報を更新できませんでした。アカウントを更新してアクセスと日付を確認してください。","cloud.gift.redeem_another":"別のコードを引き換える","cloud.gift.membership_label":"Cloud ギフト","cloud.gift.history_title":"Cloud ギフト","cloud.gift.duration":"Cloud {{days}} 日間","cloud.gift.term":"Cloud {{days}} 日間、{{start}} から {{end}} まで。","cloud.gift.state_active":"利用中","cloud.gift.state_pending":"現在の利用期間終了後に開始","cloud.gift.state_expired":"期限切れ","cloud.gift.state_revoked":"取り消し済み","cloud.gift.error_unavailable":"このコードは利用できません。入力を確認するか、贈り主にお問い合わせください。","cloud.gift.error_rate_limit":"試行回数が多すぎます。少し待ってから再試行してください。","cloud.gift.error_not_available":"このインスタンスではギフトの引き換えをまだ利用できません。","cloud.gift.error_renewal":"引き換え前に「サブスクリプション管理」で自動更新をオフにしてください。","cloud.gift.error_checkout":"引き換え前に「請求と支払い」で未完了の支払いを完了してください。","cloud.gift.error_active":"利用中または開始予定の Cloud ギフトがあります。新しい支払いを開始する前にアカウントで確認してください。","cloud.gift.error_network":"結果を確認できませんでした。同じコードで再試行してください。記録済みのギフトは重複して追加されません。","cloud.prompt.deadline_gift":"Cloud ギフトは {{date}} に終了します。ギフトに自動更新はありません。終了後もローカルデータを利用できます。","leaderboard.pro.tooltip":"Pro 会員。ランキングは引き続き使用量に基づきます。","cloud.feature.pro_identity":"Cloud アバターフレームとバッジ。ランキングは引き続き使用量に基づきます。","cloud.prompt.deadline_active":"Cloud は {{date}} まで利用できます。更新状況はアカウントの請求情報で確認してください。期間終了後もローカルデータを利用できます。","sessions.filter.model_all":"すべてのモデル","sessions.filter.model_search":"モデルを検索…","sessions.filter.model_empty":"該当するモデルはありません","sessions.filter.model_aria":"セッションのモデルで絞り込む","sessions.filter.range_custom":"指定期間","sessions.filter.from":"開始日","sessions.filter.to":"終了日","sessions.filter.clear":"絞り込みを解除","sessions.group.aria":"セッションのグループ分け","sessions.group.time":"日付別","sessions.group.project":"プロジェクト別","sessions.group.unknown_date":"日付不明","sessions.sort.aria":"セッションの並べ替え","sessions.sort.recent":"最近","sessions.sort.cost":"費用が高い順","sessions.sort.tokens":"トークン数が多い順","sessions.summary.count":"該当セッション","sessions.summary.scope":"時刻付きの使用量があるセッションでは、選択した日付内のトークンと費用を集計します。使用量バケットがない場合は全期間の合計を保持します。ターン数、時間、性能はセッション全体の指標です。各セッションとサブエージェントは一度だけ集計します。","sessions.summary.speed":"推定速度","sessions.performance.speed":"約 {{speed}} tok/s","sessions.performance.samples":"計測済みリクエスト {{count}} 件","sessions.performance.method":"出力トークン数 ÷ 推定リクエスト時間。応答待ちを含み、ツール実行と待機時間を除きます。生成のみの速度ではありません。","sessions.performance.first_response":"初回応答の待ち時間","sessions.performance.first_response_value":"{{seconds}} 秒 · {{count}} 件","sessions.performance.first_response_method":"報告された最初のトークンまでの平均待ち時間。Codex はターン全体を計測し、1ターンに複数のモデル呼び出しが含まれる場合があります。","sessions.detail.open_aria":"{{title}} の統計を表示","sessions.detail.title":"セッション統計","sessions.detail.close":"セッション統計を閉じる","sessions.detail.tokens":"トークン構成","sessions.detail.models":"モデルと費用","sessions.detail.own":"このセッション","sessions.detail.subagents":"サブエージェント","sessions.detail.signals":"記録された操作","sessions.detail.retries":"繰り返しリクエスト","sessions.detail.tools":"ツール呼び出し","sessions.detail.tool_failures":"ツールの失敗","sessions.detail.errors":"エラー","sessions.detail.model_calls":"モデル呼び出し","sessions.detail.compactions":"コンテキスト圧縮","sessions.detail.cost_source":"費用の出典","sessions.detail.cost_reported":"ツールからの報告","sessions.detail.cost_estimated":"モデル料金から推定","sessions.detail.cost_mixed":"報告と推定の混在","sessions.detail.cost_unknown":"未報告","sessions.detail.pricing_unpriced":"公開料金なし","sessions.detail.pricing_free":"無料モデル","sessions.detail.pricing_rates":"基本料金、USD / 100万トークン · 入力 {{input}} · 出力 {{output}} · キャッシュ読込 {{cacheRead}} · キャッシュ書込 {{cacheWrite}}。段階別料金や優先処理料金は異なる場合があります。","sessions.detail.reasoning_note":"推論トークン数は参考値で、出力トークン数に含まれている場合があります。","sessions.detail.no_speed":"信頼できる計測データなし","usage.filter.source_all":"すべてのツール","dashboard.cost_breakdown.method":"モデル料金は API 相当の費用を推定するもので、サブスクリプションの支出ではありません。ツールの報告額を優先し、料金が不明な使用量は費用から除外します。","dashboard.cost_breakdown.reported":"ツールから報告された費用","dashboard.cost_breakdown.mixed":"ツールの報告額とモデル推定の混在","dashboard.cost_breakdown.estimated":"モデル料金から推定","dashboard.cost_breakdown.unpriced":"料金が見つかりません。トークン数は保持しますが、費用は不明です。","dashboard.cost_breakdown.no_token_charge":"このデータソースまたはモデルにはトークン料金がありません","dashboard.cost_breakdown.unpriced_label":"料金不明","dashboard.cost_breakdown.token_mix":"入力 {{input}} · 出力 {{output}} · キャッシュ読込 {{read}} · キャッシュ書込 {{write}}","dashboard.cost_breakdown.rates":"基本料金、USD / 100万トークン · 入力 {{input}} · 出力 {{output}} · キャッシュ読込 {{read}} · キャッシュ書込 {{write}}。段階別料金や優先処理料金は異なる場合があります。","dashboard.cost_breakdown.known_subtotal":"判明している費用の小計","dashboard.cost_breakdown.rate_unknown":"料金情報なし","sessions.detail.not_recorded":"未記録","sessions.detail.pricing_litellm":"LiteLLM 料金","sessions.detail.pricing_curated":"管理された料金表","sessions.page.summary":"ローカルセッション、使用量、推定費用。","sessions.filter.range_label_all":"全期間","sessions.summary.scope_help":"集計方法について","sessions.col.session":"セッション / プロジェクト","sessions.col.speed":"速度","sessions.col.actions":"操作","sessions.detail.consumption":"使用量と費用","sessions.detail.pricing_details":"料金の詳細","sessions.detail.identifiers":"セッション識別情報","sessions.detail.session_id":"セッション ID","sessions.detail.local_path":"ローカルパス","sessions.detail.resume_command":"再開コマンド","sessions.performance.first_response_value_single":"{{seconds}}秒 · {{count}} サンプル","cloud.export.open":"Cloud 使用量をエクスポート","cloud.export.description":"日別集計 · UTC 日付 · 米ドルでの費用推定","cloud.export.from":"開始日 (UTC)","cloud.export.to":"終了日 (UTC)","cloud.export.csv":"CSV をダウンロード","cloud.export.json":"JSON をダウンロード","cloud.export.busy":"Cloud の権限を確認し、ファイルを準備しています…","cloud.export.error_auth":"再ログインしてからエクスポートしてください。","cloud.export.error_access":"この Cloud 履歴はエクスポートできなくなりました。","cloud.export.error_dates":"有効な期間を選択してください。","cloud.export.error_changed":"アカウント、バックエンド、期間、または権限が変更されました。再度エクスポートしてください。","cloud.export.error_failed":"エクスポートに失敗しました。CSV または JSON を再試行してください。","cloud.export.success":"{{from}} から {{to}} までの記録のある {{count}} 日分をダウンロードしました (UTC)。","cloud.export.empty":"記録のある日付がありません。ファイルには範囲情報のみが含まれ、使用量の行はありません。","cloud.export.truncated":"読み取り可能な {{from}} から {{to}} (UTC) のみをダウンロードしました。ファイルには元の選択範囲も記録されています。","cloud.export.dashboard":"ダッシュボードを表示","cloud.renewal.auto":"自動更新。いつでも解約でき、支払い済み期間は引き続き利用できます。","cloud.renewal.manual":"一度だけの支払い。自動更新はありません。","cloud.action.create_checkout":"支払いへ進む · {{amount}}","cloud.checkout.review":"プランと支払い条件を確認してください。Waffo は支払い前に最終金額を表示します。","cloud.action.buy_pro":"Cloud を購入","cloud.price.fixed_monthly_total":"1 か月分を一度だけ支払います。","cloud.price.fixed_annual_total":"1 年分を一度だけ支払います。月額換算 {{equivalent}}。","cloud.checkout.help_title":"支払いでお困りですか?","cloud.faq.cost_title":"Cloud が有料なのはなぜですか?","cloud.faq.cost_body":"利用の増加に伴い、公式ホスティングの同期、ストレージ、帯域幅、バックアップ、保守には継続的な費用がかかります。Cloud の利用料金は、これらのサービスと長期的な保守を支えます。ローカルアプリの全機能は引き続き無料でオープンソースです。","cloud.plan.local_community":"ランキング・実績・公開プロフィール","cloud.plan.monthly_equivalent":"月あたり {{equivalent}} 相当","cloud.plan.sync":"{{minutes}} 分ごとに自動同期","cloud.plan.hourly_history":"{{days}} 日間の時間別使用量","cloud.plan.daily_history":"{{months}} か月の日別履歴とエクスポート","cloud.plan.identity":"Cloud アバターフレームとバッジ","cloud.plan.faq_title":"プランについての質問","cloud.plan.details_title":"Cloud に含まれる機能は?","cloud.plan.self_host_summary":"自分のサーバーに導入可能。ソフトウェアは無料、ホスティングと保守は自己管理。技術プレビュー。","cloud.page.title":"プランを選ぶ","cloud.page.subtitle":"ローカル統計は無料。Cloud ならデバイス間の同期と履歴管理も。","cloud.action.try":"{{days}} 日間無料で試す","cloud.plan.renewal_hint":"· いつでも解約可能","cloud.plan.renewal_off":"· 一回払い","cloud.feature.analysis_detail":"各デバイスの使用量を集計。ブラウザから費用の目安、推移、プロバイダー・モデル別内訳を確認。","cloud.faq.platform_body":"一つの会員登録で同じアカウントの CLI、macOS、Windows、Linux、ウェブを利用可能。プラットフォーム別の支払いは不要です。","cloud.prompt.sync":"Cloud は各デバイスの使用量の変更を 15 分ごとに同期します。無料のコミュニティアップロードは選択した 1 台から毎日継続できます。","cloud.prompt.devices":"無料のコミュニティアップロードは選択した 1 台を使用します。Cloud は複数デバイスの同期に対応。デバイスを一時停止して無料アップロードを続けることも可能です。","cloud.plan.skip_trial":"Cloud を購入","cloud.plan.anywhere":"すべてのデバイスの使用量をブラウザで確認","cloud.plan.retained_history":"{{days}} 日間の時間別明細 · {{months}} か月の日別履歴","cloud.onboarding.local_next":"「設定 → 個人 → Cloud」で同期を有効にすると、このデバイスを接続できます。他のパソコンでも同じアカウントにログインすれば、使用量をまとめて確認できます。","cloud.onboarding.web_next":"各パソコンの TokenTracker アプリでこのアカウントにログインし、「設定 → 個人 → Cloud」で同期を有効にすると、使用量がここに表示されます。","cloud.error.subscription_exists":"有効なサブスクリプションがすでにあります。別のプランを選ぶ前に「設定 → 個人 → Cloud」で管理してください。","cloud.error.request_conflict":"前の購入がまだ確定していません。別の購入を始める前に「設定 → 個人 → Cloud」でその注文を再開してください。","cloud.error.machines":"このアカウントは Cloud 同期のデバイス上限に達しました。「設定 → 個人 → Cloud」でデバイスを確認してください。","cloud.error.machine_paused":"このデバイスは一時停止中です。再び同期する前に「設定 → 個人 → Cloud」で再開してください。","cloud.checkout.refunded_detail":"この支払いの全額返金がサーバーで確認されました。「設定 → 個人 → Cloud」で現在の利用権限と支払い履歴を確認してください。","cloud.action.setup_sync":"Cloud 同期を設定","cloud.login.trial_context":"ログインして Cloud の無料試用を開始します。選択したプランは保存されています。","cloud.login.purchase_context":"ログインして Cloud の購入を続けます。選択したプランは保存されています。","cloud.membership.payment_due":"更新時の支払いに対応が必要です。請求書で支払い状況を確認するか、支払い方法を更新してください。","cloud.plan.trial_setup_hint":"試用を開始したら、パソコンで Cloud 同期を有効にしてください。","cloud.trial.disclosure":"Cloud を {{days}} 日間無料で試せます。{{date}} まで。自動課金はありません。","cloud.trial.used_hint":"無料試用は利用済みです。Cloud プランを選んで利用を続けましょう。","cloud.gift.done":"完了","cloud.free.device_scope":"現在のデバイスの使用量のみを集計","cloud.plan.includes_local":"無料版のすべてのローカル機能を含む","cloud.plan.device_sync":"デバイス台数の制限なし、使用量をまとめて同期","cloud.plan.device_fair_use":"通常の個人利用ではデバイス台数の制限や台数ごとの追加料金はありません。大量または異常なデバイス接続には同期保護が適用される場合があります。"},rD={"landing.handle.default":"VIBE_USER","landing.handle.special":"ボルト","landing.screenshot.alt":"TokenTracker ダッシュボードのスクリーンショット","landing.nav.login":"ログイン","landing.nav.signup":"登録","landing.install.command":"npx --yes tokentracker-cli","landing.install.action.copy":"コマンドをコピー","landing.install.action.copied":"コピーしました","landing.meta.title":"Token Tracker — AI Coding CLI のトークン使用状況トラッカー","landing.meta.description":"Claude Code、Cursor、Codex などのツールのトークン使用量を自動的に監視。ローカルファースト、プライバシー重視、設定不要。","landing.meta.og_site_name":"Token Tracker","landing.meta.og_type":"website","landing.meta.og_image":"https://www.tokentracker.cc/og-image.jpg","landing.meta.og_url":"https://www.tokentracker.cc/","landing.meta.twitter_card":"summary_large_image","share.meta.title":"Token Tracker シェア","share.meta.description":"Token Tracker ダッシュボードのスナップショットをシェア。モデル、プロジェクト、期間をまたいだ使用状況のインサイトを含みます。","share.meta.og_site_name":"Token Tracker","share.meta.og_type":"website","share.meta.og_image":"https://www.tokentracker.cc/share-dashboard.jpg","share.meta.og_url":"https://www.tokentracker.cc/share","share.meta.twitter_card":"summary_large_image","landing.handle.placeholder":"「{{handle}}」を試す","landing.rank.expectation":"予想ランク:{{rank}}","landing.rank.singularity":"トップ","landing.rank.unranked":"ランク外","landing.cta.primary":"ダッシュボードへ","landing.cta.secondary":"GitHub","landing.v2.hero.title_line1":"すべての","landing.v2.hero.title_line2":"AIトークンを追跡","landing.v2.install.mac_cta":"macOS 版をダウンロード","landing.v2.install.win_cta":"Windows 版をダウンロード","landing.v2.install.desktop_cta":"デスクトップ版をダウンロード","landing.v2.install.os_macos":"macOS","landing.v2.install.os_windows":"Windows","landing.v2.install.availability":"macOS と Windows に対応","landing.v2.models.title":"対応する AI CLI ツール","landing.v2.compare.kicker":"シームレスな追跡","landing.v2.compare.title":"AI の使用量を当てずっぽうで考えるのはもうやめましょう。","landing.v2.compare.subtitle":"AI CLI ツールは生の履歴データを散らかったローカルファイルに隠しがちです。TokenTracker はそれらをローカルファーストのダッシュボードにリアルタイムで集約します。","landing.v2.distill.body":"100% ローカル処理。prompt やコードは一切アップロードしません。","landing.v2.compare.with.title":"Token Tracker あり","landing.v2.compare.with.p1":"集約された使用状況ダッシュボード","landing.v2.compare.with.p2":"リアルタイムのトークン指標","landing.v2.compare.with.p3":"100% ローカルでプライバシーも安心","landing.v2.compare.with.p4":"マルチクライアントのターミナル監査証跡","landing.v2.compare.without.title":"なし","landing.v2.compare.without.p1":"散らばった JSON ログファイル","landing.v2.compare.without.p2":"トークン消費がまったく見えない","landing.v2.compare.without.p3":"突然の API 請求","landing.v2.compare.without.p4":"過去の監査ログが皆無","landing.v2.leaderboard.kicker":"グローバル TOKEN リーダーボード","landing.v2.leaderboard.title":"AI Token 効率","landing.v2.leaderboard.subtitle":"ローカルの AI Token 使用量を匿名で同期し、グローバル効率リーダーボードに参加できます。世界中のユーザーとモデルのコスト効率や呼び出し頻度を比較できます。","landing.v2.leaderboard.view_more":"リーダーボード全体を見る","landing.v2.footer.line":"Token Tracker — AI を使うすべての人のために。","landing.v2.nav.status":"ステータス","landing.v2.nav.privacy":"プライバシー","landing.v2.nav.github":"GitHub","landing.v2.models.agent.codex":"Codex","landing.v2.models.agent.claude_code":"Claude Code","landing.v2.models.agent.cursor":"Cursor","landing.v2.models.agent.gemini":"Gemini","landing.v2.models.agent.opencode":"OpenCode","landing.v2.models.agent.openclaw":"OpenClaw","landing.v2.cta.primary":"Dashboard","landing.v2.hero.subtagline":"Claude Code、Cursor、Codex などのツールのトークン使用量を自動的に監視。ローカルファースト、プライバシー重視、設定不要。","leaderboard.profile.nav.back":"リーダーボード","leaderboard.profile.nav.download":"ダウンロード","leaderboard.title":"リーダーボード","leaderboard.horizontal_scroll":"リーダーボードの列を横にスクロール","limits.settings.enable_all":"すべて有効にする","limits.settings.disable_all":"すべて無効にする","limits.settings.bulk_visibility":"プロバイダーの表示","limits.settings.enabled_count":"{{total}} 個中 {{enabled}} 個のプロバイダーが有効","limits.zcode.start_grants":"Start プラン","limits.zcode.grant_amount":"残り {{remaining}} / {{total}} トークン","limits.zcode.reset_bank.title":"使用枠のリセット","limits.zcode.reset_bank.count":"{{count}} 回利用可能","limits.zcode.reset_bank.earliest":"最も早い有効期限: {{time}}","leaderboard.range":"UTC {{period}} · {{from}} – {{to}}","leaderboard.range_loading":"UTC {{period}} · …","leaderboard.range.total":"全期間","leaderboard.generated_at":"{{ts}} に更新","leaderboard.period.week":"週","leaderboard.period.month":"月","leaderboard.period.total":"全期間","leaderboard.me_label":"あなた","leaderboard.anon_label":"匿名","leaderboard.error.unknown":"不明なエラー","leaderboard.loading":"読み込み中…","leaderboard.empty":"データがありません","leaderboard.column.rank":"ランク","leaderboard.column.user":"ユーザー","leaderboard.column.total":"合計","leaderboard.column.codex":"Codex","leaderboard.column.claude":"Claude","leaderboard.column.gemini":"Gemini","leaderboard.column.cursor":"Cursor","leaderboard.column.opencode":"OpenCode","leaderboard.column.openclaw":"OpenClaw","leaderboard.column.hermes":"Hermes","leaderboard.column.kiro":"Kiro","leaderboard.column.copilot":"Copilot","leaderboard.column.kimi":"Kimi","leaderboard.column.supplemental":"その他","leaderboard.column.est_cost":"推定支出","leaderboard.signin_prompt":"ログインするとランキングに参加できます","leaderboard.signin_button":"ログイン","leaderboard.sync_prompt":"クラウド同期を有効にするとランキングに参加できます","leaderboard.sync_button.idle":"有効にして同期","leaderboard.sync_button.busy":"同期中…","leaderboard.pagination.page_size_label":"ページあたりの表示数","leaderboard.pagination.prev":"前のページ","leaderboard.pagination.next":"次のページ","leaderboard.pagination.ellipsis":"……","leaderboard.pagination.page_unknown":"{{page}} ページ目","share.modal.title":"あなたのデータをシェア","share.modal.subtitle":"ポスターカードを生成して、どこでもシェア。","share.modal.close":"閉じる","share.modal.action.x":"X にシェア","share.modal.action.download":"ダウンロード","share.modal.action.copy":"画像をコピー","share.modal.hint.x":"画像をツイートに貼り付け","share.modal.hint.copy":"クリップボードへ","share.modal.name_label":"表示名","share.modal.name_placeholder":"名前を入力","share.modal.style_label":"スタイル","share.modal.footer":"データは常にローカルに保持されます。画像はブラウザ内で生成され、アップロードされることはありません。","share.button.label":"シェア","share.button.aria":"シェアカードを開く","share.toast.copied":"画像をクリップボードにコピーしました","share.toast.downloaded":"画像を保存しました","share.toast.failed":"画像の生成に失敗しました","share.toast.working":"生成中…","share.variant.neon":"ネオン","share.variant.broadsheet":"特集号","share.date.month_year":"{{year}} 年 {{month}}","share.issue.all_time":"全期間","share.month_short.jan":"1 月","share.month_short.feb":"2 月","share.month_short.mar":"3 月","share.month_short.apr":"4 月","share.month_short.may":"5 月","share.month_short.jun":"6 月","share.month_short.jul":"7 月","share.month_short.aug":"8 月","share.month_short.sep":"9 月","share.month_short.oct":"10 月","share.month_short.nov":"11 月","share.month_short.dec":"12 月","share.hook.top_loyal":"{{name}} が使用量の {{percent}}% を占めました。","share.hook.days_record":"合計 {{days}} 日を記録。","share.hook.top_led":"{{name}} がリードし、割合は {{percent}}%。","share.hook.multi_models":"{{days}} 日間で {{count}} 個のモデルを使用。","share.hook.days_with_model":"{{name}} が {{days}} 日間付き合ってくれました。","share.hook.new_chapter":"新しい記録が、ここから始まります。","share.card.broadsheet.issue":"号数","share.card.broadsheet.by":"シェアした人","share.card.broadsheet.tracked_since":"追跡開始","share.card.broadsheet.total_tokens":"トークン総数","share.card.broadsheet.estimated_spend":"推定支出","share.card.broadsheet.billable_days":"{{days}} 日のアクティブ日","share.card.broadsheet.heatmap_title":"年間ヒートマップ","share.card.broadsheet.heatmap_days_on_record":"{{active}} / {{total}} 日に記録あり","share.card.broadsheet.roster_title":"モデルランキング","share.card.broadsheet.roster_subtitle":"よく使うモデルのローテーション","share.card.broadsheet.empty":"今週は静かで、まだモデルのデータがありません。","share.card.broadsheet.global_rank":"全体ランク","share.card.broadsheet.active_days":"アクティブ","share.card.broadsheet.days_count":"{{days}} 日","share.card.broadsheet.track_yours":"あなた自身を追跡する","share.card.annual.report_title":"使用状況レポート","share.card.annual.less":"少","share.card.annual.more":"多","share.card.annual.heatmap_title":"トークンヒートマップ","share.card.annual.total_tokens":"トークン総数","share.card.annual.estimated_cost":"推定コスト","share.card.annual.longest_streak":"最長連続","share.card.annual.days_count":"{{days}} 日","share.card.annual.top_model":"人気モデル"},oD={"header.auth.sign_in_aria":"로그인","login.back_home":"홈으로 돌아가기","login.cloud_only":"클라우드 로그인이 설정되지 않았습니다. localhost의 로컬 대시보드를 사용하세요.","login.title":"로그인","login.subtitle":"이메일 또는 연결된 계정을 선택하세요.","login.dismiss":"닫기","login.verify_email_success":"이메일이 인증되었습니다. 아래에서 로그인할 수 있습니다.","login.verify_email_pending":"이메일에서 계정 인증을 완료한 후 로그인하세요.","login.oauth.continue":"{{provider}}(으)로 계속하기","login.oauth.desktop_start_failed":"데스크톱 앱 로그인을 시작하지 못했습니다. 다시 시도해 주세요.","login.divider":"또는","login.tab.sign_in":"로그인","login.tab.sign_up":"계정 만들기","login.field.name":"표시 이름","login.field.name_placeholder":"선택 사항","login.field.email":"이메일","login.field.password":"비밀번호","login.forgot_password":"비밀번호를 잊으셨나요?","login.password_hint":"최소 {{min}}자 이상.","login.submit.sign_in":"이메일로 로그인","login.submit.sign_up":"계정 만들기","reset_password.back_to_sign_in":"로그인으로 돌아가기","reset_password.title":"비밀번호 재설정","reset_password.subtitle":"재설정 링크를 받을 이메일을 입력하세요.","reset_password.request.submit":"재설정 링크 보내기","reset_password.request.sent":"이메일을 확인하고 코드를 입력하세요.","reset_password.field.code":"재설정 코드","reset_password.field.new_password":"새 비밀번호","reset_password.field.confirm_password":"비밀번호 확인","reset_password.reset.submit":"비밀번호 재설정","reset_password.error.password_mismatch":"비밀번호가 일치하지 않습니다.","reset_password.error.missing_token":"재설정 토큰이 없습니다. 새 재설정 링크를 요청하세요.","reset_password.success":"비밀번호가 업데이트되었습니다. 새 비밀번호로 로그인할 수 있습니다.","reset_password.success_cta":"로그인으로 돌아가기","auth.callback.processing":"처리 중…","auth.callback.success":"로그인 성공","auth.callback.redirecting":"TokenTracker로 돌아가는 중…","auth.callback.failed":"로그인을 완료하지 못했습니다. 다시 시도해 주세요.","auth.callback.close":"이 페이지 닫기","login_modal.subtitle":"로그인하여 리더보드에 참여하세요","login_modal.continue_email":"이메일로 계속하기","login_modal.divider_email":"이메일","shared.placeholder.short":"--","shared.unit.percent":"%","shared.unit.thousand_abbrev":"K","shared.unit.million_abbrev":"M","shared.unit.billion_abbrev":"B","shared.unit.trillion_abbrev":"T","shared.data_source":"데이터 출처: {{source}}","shared.error.prefix":"오류: {{error}}","shared.status.unsynced":"—","shared.time.now":"방금","shared.time.m_ago":"{{n}}분 전","shared.time.h_ago":"{{n}}시간 전","shared.time.d_ago":"{{n}}일 전","error.boundary.title":"문제가 발생했습니다","error.boundary.subtitle":"이 화면을 표시하지 못했습니다","error.boundary.hint":"콘솔을 연 다음 페이지를 새로고침하세요","error.boundary.no_details":"오류 세부 정보 없음","error.boundary.action.reload":"새로고침","identity_card.rank_label":"시작일","identity_card.streak_label":"활동 일수","identity_card.rank_placeholder":"—","identity_card.streak_value":"{{days}}일","usage.summary.total":"총 토큰","usage.summary.toggle_aria":"숫자 축약 표시 전환","usage.period.day":"일","usage.period.week":"주","usage.period.month":"월","usage.period.total":"전체","usage.period.custom":"사용자 지정","usage.metric.total":"전체","usage.metric.input":"입력","usage.metric.output":"출력","usage.metric.cached_input":"캐시된 입력","usage.metric.reasoning_output":"추론 출력","usage.button.refresh":"새로고침","usage.overview.tablist_aria":"기간","usage.overview.cost_breakdown_aria":"비용 내역 보기","usage.overview.distribution_aria":"제공자 분포: {{items}}","usage.overview.distribution_item":"{{label}} {{percent}}%","usage.overview.provider_card_aria":"{{provider}}: {{percent}}%, {{tokens}} 토큰, {{cost}}. 클릭하여 세부 정보 {{action}}","usage.overview.expand":"펼치기","usage.overview.collapse":"접기","usage.overview.model_count":"모델 {{count}}개","usage.overview.model_details_aria":"{{provider}} 모델 세부 정보","widgets.page.title":"메뉴 막대 & 위젯","widgets.cta.open_gallery":"위젯 갤러리 열기","widgets.cta.download":"Mac 앱 다운로드","widgets.cta.macos_only":"macOS 전용","widgets.menubar.section.title":"메뉴 막대","widgets.gallery.section.title":"데스크톱 위젯","widgets.summary.name":"사용량 요약","widgets.summary.description":"오늘과 7일간의 사용량을 간결한 추세선으로 보여줍니다.","widgets.heatmap.name":"활동 히트맵","widgets.heatmap.description":"GitHub 스타일의 일별 캘린더. 연속 활동일과 쉬는 날을 한눈에 파악하세요.","widgets.topModels.name":"인기 모델","widgets.topModels.description":"토큰 비율로 정렬한 가장 많이 사용한 모델.","widgets.limits.name":"사용 한도","widgets.limits.description":"Claude, Codex, Cursor, Gemini 등의 실시간 사용 한도 진행 상황.","daily.sort.date.label":"날짜","daily.sort.date.title":"날짜순 정렬","daily.sort.total.label":"전체","daily.sort.total.title":"전체순 정렬","daily.sort.input.label":"입력","daily.sort.input.title":"입력순 정렬","daily.sort.output.label":"출력","daily.sort.output.title":"출력순 정렬","daily.sort.cached.label":"캐시","daily.sort.cached.title":"캐시된 입력순 정렬","daily.sort.reasoning.label":"추론","daily.sort.reasoning.title":"추론 출력순 정렬","daily.sort.conversations.label":"대화 수","daily.sort.conversations.title":"대화순 정렬","details.pagination.prev":"이전","details.pagination.next":"다음","limits.copilot.otelHint.title":"Copilot 토큰 사용량 추적","limits.copilot.otelHint.body":"한도 정보는 GitHub OAuth 토큰을 통해 로드됩니다. 토큰별 사용량도 기록하려면 Copilot의 OpenTelemetry 내보내기를 활성화하고 셸 프로필(~/.zshrc 또는 ~/.bashrc)에 다음 줄을 추가하세요:","limits.copilot.otelHint.copy":"복사","limits.copilot.otelHint.copied":"복사됨","limits.panel.title":"사용 한도","limits.panel.mode_separator":" · ","limits.page.refresh":"한도 새로고침","limits.page.refresh_loading":"한도를 새로고침하는 중…","limits.page.refreshed_at":"한도 업데이트됨: {{time}}","limits.page.refresh_failed":"한도를 새로고침하지 못했습니다.","limits.page.refresh_partial":"{{time}}에 한도를 새로 고쳤지만 일부 데이터는 캐시이거나 업데이트에 실패했습니다.","limits.page.refresh_stale":"새로 고침이 완료되었지만 모든 공급자가 캐시 또는 실패 데이터를 표시합니다.","limits.label.cursor_plan":"플랜","limits.label.cursor_grok_bot":"Grok 봇","limits.label.cursor_auto":"자동","limits.label.cursor_api":"API","limits.label.kiro_month":"월간","limits.label.kiro_bonus":"보너스","limits.label.kiro_tracked_credits":"로컬 사용량: {{credits}} 크레딧 · {{count}}턴","limits.label.kimi_weekly":"주간","limits.label.kimi_5h":"5h","limits.label.kimi_total":"전체","limits.label.kimi_parallel":"동시 실행: {{count}}","limits.explain.used":"{{label}}: {{used}}% 사용","limits.explain.on_track":"{{label}}: 양호, 초기화 전 약 {{pct}}%","limits.explain.ahead_eta":"{{label}}: 빠름, 약 {{eta}} 후 소진","limits.explain.ahead_pct":"{{label}}: 빠름, 초기화 전 약 {{pct}}%","limits.explain.body":"표시선은 균일 페이스 위치이며, 채움이 넘으면 빠른 편입니다.","limits.explain.remaining":"{{label}}: {{used}}% 남음","limits.explain.on_track_remaining":"{{label}}: 양호, 초기화 전 약 {{pct}}% 남음","limits.explain.ahead_pct_remaining":"{{label}}: 빠름, 초기화 전 약 {{pct}}% 남음","limits.explain.body_remaining":"표시선은 균일 페이스 위치이며, 채움이 못 미치면 빠른 편입니다.","limits.label.copilot_premium":"프리미엄","limits.label.copilot_chat":"채팅","limits.label.grok_month":"월간","limits.label.grok_week":"주간","limits.label.grok_day":"일","limits.label.grok_ondemand":"온디맨드","limits.provider.claude":"Claude","limits.provider.codex":"Codex","limits.provider.cursor":"Cursor","limits.provider.gemini":"Gemini","limits.provider.kimi":"Kimi","limits.provider.kiro":"Kiro","limits.provider.grok":"Grok Build","limits.provider.copilot":"GitHub Copilot","limits.provider.antigravity":"Antigravity","limits.provider.zcode":"ZCode","limits.provider.opencode_go":"OpenCode Go","limits.provider.qoder":"Qoder","limits.provider.qoder_cn":"Qoder CN","limits.label.zcode_glm52":"GLM-5.2","limits.label.zcode_glm5t":"GLM-5-Turbo","limits.label.opencode_go_5h":"5h","limits.label.opencode_go_weekly":"Weekly","limits.label.opencode_go_monthly":"Monthly","limits.label.qoder_credits":"크레딧","limits.label.qoder_ultimate":"Ultimate 무료 호출","limits.label.qoder_cn_credits":"크레딧","limits.label.qoder_cn_ultimate":"Ultimate 무료 호출","limits.qoder_calls.detail":"{{used}} / {{limit}}회 사용 · {{remaining}}회 남음","limits.hover.expires_at":"{{time}} 만료","limits.label.claude_5h":"5h","limits.label.claude_7d":"7d","limits.label.claude_opus":"Opus","limits.label.codex_5h":"5h","limits.label.codex_7d":"7d","limits.label.codex_credits":"크레딧","limits.label.codex_spark_5h":"Spark 5h","limits.label.codex_spark_7d":"Spark 7d","limits.codex_credits.detail":"{{used}} / {{limit}} 크레딧 사용 · 남은 {{remaining}}","limits.codex_reset_bank.title":"리셋","limits.codex_reset_bank.row_label":"리셋 {{index}}","limits.codex_reset_bank.count_only":"리셋: {{count}}회 사용 가능 · 만료 시간 확인 불가","limits.label.gemini_pro":"Pro","limits.label.gemini_flash":"Flash","limits.label.gemini_lite":"Lite","limits.label.antigravity_claude_weekly":"Cl 7d","limits.label.antigravity_claude_5h":"Cl 5h","limits.label.antigravity_gemini_weekly":"Gm 7d","limits.label.antigravity_gemini_5h":"Gm 5h","limits.label.antigravity_live":"실시간","limits.label.antigravity_cached":"캐시","limits.provenance.fresh":"실시간","limits.provenance.stale":"오래됨","limits.provenance.tooltip":"출처: {{source}}; 신뢰도: {{confidence}}","limits.reauth.badge":"재로그인 필요","limits.reauth.tooltip":"로그인이 만료되었습니다. 터미널에서 `{{command}}` 를 한 번 실행해 다시 로그인한 뒤 새로고침하세요.","limits.tooltip.antigravity_live":"Antigravity Google 계정에서 가져온 실시간 제한입니다.","limits.tooltip.antigravity_cached":"캐시된 제한입니다. Antigravity 로그인 정보로 새로고침하며 앱을 열 필요는 없습니다.","limits.tooltip.qoder_cached":"캐시된 제한입니다. 업데이트하려면 Qoder를 실행하세요。","limits.bar.sub_one_percent":"<1","limits.status.not_connected":"연결되지 않음","limits.status.no_data":"실시간 한도 데이터가 반환되지 않았습니다","limits.opencodeGo.status.inactive":"OpenCode Go 구독이 비활성 상태입니다","limits.opencodeGo.setupHint.title":"OpenCode Go 연결","limits.opencodeGo.setupHint.subtitle":"공식 API(opencode.ai/zen/go/v1/usage)에서 OpenCode Go 사용량을 읽어옵니다.","limits.opencodeGo.setupHint.step1":"opencode.ai에 로그인하고 Go를 구독합니다.","limits.opencodeGo.setupHint.cta":"opencode.ai 열기","limits.opencodeGo.setupHint.step2":"콘솔에서 API 키를 만들어 복사합니다.","limits.opencodeGo.setupHint.step3":"이 명령어를 실행하고 API 키를 붙여넣은 뒤(입력이 표시되지 않음) TokenTracker를 재시작하세요:","limits.opencodeGo.setupHint.note_app":"macOS 앱: launchctl setenv 줄을 사용한 후 앱을 다시 여세요.","limits.opencodeGo.setupHint.copy":"복사","limits.opencodeGo.setupHint.copied":"복사됨","limits.status.all_hidden":"모든 한도 제공자가 숨겨져 있습니다. 표시 설정을 열어 다시 표시하세요.","nav.usage":"토큰","nav.limits":"한도","nav.widgets":"메뉴 막대 & 위젯","nav.skills":"Skills","nav.leaderboard":"리더보드","nav.collapse":"사이드바 접기","nav.expand":"사이드바 펼치기","nav.menu":"내비게이션 메뉴 열기","nav.close_menu":"내비게이션 메뉴 닫기","nav.aside_label":"주 내비게이션","nav.nav_label":"기본","limits.page.subtitle":"AI 도구 전반의 사용 한도와 할당량 사용 현황.","limits.settings.toggle_visible":"표시 여부 전환","limits.settings.display_mode_label":"사용량 표시","limits.settings.display_mode_used":"사용됨","limits.settings.display_mode_remaining":"남음","limits.page.openSettings":"표시 설정","nav.group.general":"일반","nav.group.tools":"도구","nav.group.account":"계정","nav.settings":"설정","header.auth.open_settings":"설정 열기","settings.page.title":"설정","settings.page.subtitle":"계정, 외관 및 표시 환경설정을 관리하세요.","settings.section.appearance":"외관","settings.section.account":"계정","settings.section.limits":"한도 표시","settings.section.network":"네트워크","settings.network.mode.label":"아웃바운드 프록시","settings.network.mode.hint":"클라우드 동기화에서 Token Tracker가 인터넷에 연결하는 방식을 선택하세요. 앱 업데이트는 항상 시스템 프록시를 따릅니다.","settings.network.mode.system":"시스템","settings.network.mode.manual":"수동","settings.network.mode.off":"끔","settings.network.protocol.label":"프로토콜","settings.network.protocol.http":"HTTP","settings.network.protocol.https":"HTTPS","settings.network.protocol.socks5":"SOCKS5","settings.network.host.label":"호스트","settings.network.host.placeholder":"127.0.0.1","settings.network.port.label":"포트","settings.network.port.placeholder":"7890","settings.network.test":"연결 테스트","settings.network.test.testing":"테스트 중…","settings.network.test.ok":"테스트 URL에 도달했습니다(HTTP {{status}}).","settings.network.test.fail":"연결할 수 없습니다: {{error}}","settings.network.save":"저장","settings.network.saving":"저장 중…","settings.network.saved":"프록시 설정이 저장되었습니다.","settings.network.error.host":"http://나 경로 없이 호스트를 입력하세요.","settings.network.error.port":"1에서 65535 사이의 포트를 입력하세요.","settings.network.effective.manual":"현재 수동 프록시를 사용 중입니다.","settings.network.effective.env":"현재 환경 변수 프록시를 사용 중입니다.","settings.network.effective.system":"현재 시스템 프록시를 사용 중입니다.","settings.network.effective.none":"현재 직접 연결 중입니다.","settings.network.effective.blocked":"아웃바운드 트래픽이 차단되었습니다: 수동 프록시를 적용하지 못했습니다.","settings.network.apply_error":"저장한 프록시를 적용하지 못했습니다: {{error}}. 프록시가 적용되지 않아 아웃바운드가 차단되었습니다. 프록시 설정을 확인하세요.","settings.network.save_error":"프록시 설정을 저장하지 못했습니다: {{error}}","settings.network.save_error_unprotected":"프록시 설정을 저장하지 못했습니다: {{error}}. 아웃바운드가 현재 보호되지 않고 있습니다 — 차단마저 실패했습니다.","settings.limits.providers":"제공업체","settings.appearance.theme.label":"테마","settings.appearance.theme.hint":"대시보드 전반에서 Token Tracker가 표시되는 방식을 선택하세요.","settings.appearance.theme.light":"라이트","settings.appearance.theme.dark":"다크","settings.appearance.theme.system":"시스템","settings.account.displayName":"표시 이름","settings.account.edit":"편집","settings.account.save":"저장","settings.account.saving":"저장 중...","settings.account.cancel":"취소","settings.account.userId":"사용자 ID","settings.account.copyUserId":"사용자 ID 복사","settings.account.copy":"복사","settings.account.copied":"복사됨","settings.account.cloudSync":"클라우드 동기화","settings.account.cloudSyncHint":"이 컴퓨터의 사용량 통계를 동기화하여 모든 기기의 사용량을 모아 보세요. 프롬프트, 코드, 제공업체 인증 정보는 로컬에 보관됩니다.","settings.account.cloudSyncPending":"동기화 시도 중…","settings.account.cloudSyncError":"동기화를 완료하지 못했습니다. 네트워크, 로컬 서비스, 로그인 상태를 확인한 후 다시 시도하세요. 로컬 기록에는 영향이 없습니다.","settings.account.publicProfile":"공개 프로필","settings.account.publicProfileHint":"공개 리더보드에 사용량을 표시합니다.","settings.account.displayNameAnonymousHint":"익명 — 리더보드에서 이름과 아바타가 숨겨집니다","settings.account.displayNameDisabledWhileAnon":"이름을 편집하려면 먼저 스위치를 켜세요","settings.account.githubUrl":"GitHub 프로필","settings.account.githubUrlHint":"리더보드에서 이름 옆에 GitHub 링크를 표시합니다.","settings.account.githubUrlPlaceholder":"사용자명 또는 https://github.com/사용자명","settings.account.githubUrlInvalid":"GitHub 사용자명 또는 https://github.com/사용자명 형식의 URL을 입력하세요.","settings.labs.island.label":"다이나믹 아일랜드","settings.labs.island.hint":"MacBook 노치를 다이나믹 아일랜드로: 오늘의 토큰과 지출을 한눈에 보고, 마우스를 올리면 지출과 한도 상세를 확인할 수 있습니다.","settings.labs.island.aria":"다이나믹 아일랜드 전환","settings.labs.island_hide_menubar.label":"메뉴바 아이콘 숨기기","settings.labs.island_hide_menubar.hint":"상단 메뉴바 아이콘을 숨기고 다이나믹 아일랜드만 사용합니다.","settings.labs.island_hide_menubar.aria":"메뉴바 아이콘 숨김 전환","dashboard.island.title":"다이나믹 아일랜드를 만나보세요","dashboard.island.hint":"MacBook 노치를 실시간 토큰 계기로: 오늘의 토큰과 지출을 한눈에 보고, 마우스를 올리면 상세 정보를 확인할 수 있습니다.","dashboard.island.enable":"지금 켜기","dashboard.island.settings_link":"설정에서 보기","dashboard.island.enabled_toast":"다이나믹 아일랜드가 켜졌습니다. 노치를 올려다보세요","dashboard.island.dismiss_aria":"다이나믹 아일랜드 팁 닫기","dashboard.linux_pet.title":"데스크톱 펫을 만나보세요","dashboard.linux_pet.hint":"데스크톱의 작은 친구예요. 마우스를 올리면 오늘의 토큰·비용·한도를 보여주고, 어디로든 끌어 옮길 수 있어요.","dashboard.linux_pet.show":"펫 표시","dashboard.linux_pet.settings_link":"펫 설정","dashboard.linux_pet.dismiss_aria":"데스크톱 펫 팁 닫기","settings.labs.qpd.label":"개발 가성비 및 PR 비용 분석","settings.labs.qpd.hint":"머지된 PR과 AI 귀속 커밋을 기반으로 모델별 평균 개발 비용과 유효 토큰을 분석합니다.","settings.labs.qpd.aria":"개발 가성비 카드 전환","settings.labs.sessions.label":"세션 효율 분석","settings.labs.sessions.hint":"로컬 메타데이터만 사용해 Claude와 Codex의 편집 커버리지, 최초 완료율, 편집당 비용을 분석합니다.","settings.labs.sessions.aria":"세션 효율 분석 전환","leaderboard.github.aria":"GitHub 프로필 열기","leaderboard.github.tooltipAction":"클릭하여 GitHub 프로필 열기","leaderboard.github.tooltipPrefix":"여기에 표시하려면","leaderboard.github.tooltipSettingsLink":"설정","leaderboard.github.tooltipSuffix":"에서 설정하세요","settings.account.signOut":"로그아웃","settings.account.signIn":"로그인","settings.account.signedOutHint":"로그인하여 공개 프로필과 계정 정보를 관리하세요.","settings.section.account.description":"공개 프로필 및 계정 정보.","settings.section.cloud":"Cloud","settings.nav.group.personal":"개인","settings.section.cloud.description":"Cloud 멤버십, 청구 및 기기 동기화를 관리하세요.","settings.section.menubar":"메뉴 막대 앱","settings.menubar.showStats":"메뉴 막대에 통계 표시","settings.menubar.showStatsHint":"메뉴 막대 아이콘 옆에 오늘의 토큰 수와 비용을 표시합니다.","settings.menubar.iconStyle":"메뉴 막대 아이콘","settings.menubar.iconStyleHint":"메뉴 막대에 살 캐릭터를 선택하세요. AI 도구가 토큰을 소모하는 동안 고양이와 펫이 더 빨리 달립니다.","settings.menubar.iconStyle.clawd":"Clawd","settings.menubar.iconStyle.cat":"고양이","settings.menubar.iconStyle.pet":"내 펫","settings.menubar.iconStyle.static":"정적","pet.menubar.title":"메뉴 막대에서 달리기","pet.menubar.hint":"펫이 메뉴 막대 아이콘을 대신하며, AI 도구가 토큰을 소모하는 동안 전력 질주합니다.","settings.menubar.toastOnReset":"한도 초기화 시 알림 표시","settings.menubar.toastOnResetHint":"사용 한도가 초기화되면 짧은 메시지를 표시합니다.","settings.menubar.confettiOnReset":"한도 초기화 시 색종이","settings.menubar.confettiOnResetHint":"한도에 근접한 뒤 사용 한도가 초기화되면 불꽃놀이로 축하합니다.","settings.menubar.appearance":"메뉴 막대 표시 및 아이콘","settings.menubar.appearanceHint":"통계, 지표 슬롯, 애니메이션 아이콘은 「메뉴 막대 & 위젯」 페이지에서 설정합니다.","settings.menubar.appearanceLink":"열기","settings.menubar.launchAtLogin":"로그인 시 실행","settings.menubar.launchAtLoginHint":"macOS에 로그인할 때 TokenTrackerBar를 자동으로 시작합니다.","settings.menubar.syncNow":"지금 동기화","settings.menubar.syncNowHint":"로컬 AI 도구 로그를 즉시 파싱하고 업로드합니다.","settings.menubar.syncing":"동기화 중…","settings.menubar.updates":"업데이트","settings.menubar.autoUpdate":"자동 업데이트","settings.menubar.autoUpdateHint":"새 버전을 백그라운드에서 자동으로 다운로드하여 설치합니다. 꺼도 수동 업데이트 확인은 계속 사용할 수 있습니다.","settings.menubar.checkUpdates":"업데이트 확인","settings.footer.statusPage":"시스템 상태","menubar.slot.primary":"첫 번째 위치","menubar.slot.secondary":"두 번째 위치","menubar.native_only":"라이브 메뉴 막대 표시를 편집하려면 macOS용 TokenTrackerBar를 여세요.","menubar.metric.today_tokens":"오늘 토큰","menubar.metric.none":"표시 안 함(비우기)","menubar.metric.today_cost":"오늘 비용","menubar.metric.last_7d_tokens":"최근 7일","menubar.metric.total_tokens":"총 토큰","menubar.metric.total_cost":"총 비용","menubar.metric.claude_5h":"Claude 5시간 한도","menubar.metric.claude_7d":"Claude 7일 한도","menubar.metric.codex_5h":"Codex 5시간 한도","menubar.metric.codex_7d":"Codex 7일 한도","menubar.metric.codex_credits":"Codex 크레딧 한도","menubar.metric.codex_spark_5h":"Codex Spark 5시간 한도","menubar.metric.codex_spark_7d":"Codex Spark 7일 한도","nav.ip_check":"Claude IP 확인","nav.service_status":"서비스 상태","status.page.subtitle":"AI 제공업체 공식 상태 페이지의 실시간 장애 상태입니다.","status.page.source_note":"브라우저에서 각 제공업체의 공개 상태 페이지를 직접 읽으며 1분마다 자동 새로고침됩니다.","status.state.checking":"확인 중…","status.state.none":"정상 운영","status.state.minor":"경미한 장애","status.state.major":"주요 장애","status.state.critical":"심각한 중단","status.state.unknown":"접근 불가","status.open_page":"{{provider}} 상태 페이지 열기","status.refresh":"새로고침","status.last_checked":"{{time}}에 확인함","skills.page.title":"Skills","skills.tab.my":"내 Skills","skills.tab.browse":"둘러보기","skills.action.refresh":"새로고침","skills.action.install":"설치","skills.action.choose_targets":"대상 선택","skills.target.menu_label":"설치 위치","skills.target.none":"대상 없음","skills.toast.installed":"{{name}}을(를) {{targets}}에 설치했습니다.","skills.action.remove":"제거","skills.action.search":"검색","skills.action.search_aria":"skills 검색","skills.action.search_clear":"검색 지우기","skills.target.synced_summary":"{{targets}}에 동기화됨","skills.target.synced_none":"어떤 agent에도 동기화되지 않음","skills.row.open_details":"{{name}} 세부 정보 열기","skills.detail.close":"세부 정보 닫기","skills.detail.sync_section_title":"동기화 대상","skills.detail.remove_button":"모든 agent에서 제거","skills.detail.remove_confirm_hint":"모든 agent에서 이 skill의 동기화를 해제하고 로컬 복사본을 삭제합니다.","skills.filter.agent_label":"Agent","skills.filter.agent_all":"모든 agent","skills.filter.clear":"필터 지우기","skills.my.placeholder":"설치된 skills 필터…","skills.filter.result_count":"skill {{filtered}} / {{total}}개","skills.filter.result_count_browse":"결과 {{count}}개","skills.empty.no_match":"현재 필터에 일치하는 skill이 없습니다.","hint.dismiss":"힌트 닫기","hint.dismissible_aria":"닫을 수 있는 힌트","skills.card.installed":"설치됨","skills.card.targets_prefix":"설치 위치:","skills.card.targets_change":"변경","skills.card.installs":"설치 {{count}}회","skills.source.label":"출처","skills.source.all":"모든 저장소","skills.mode.repo":"저장소","skills.mode.skillssh":"skills.sh","skills.browse.placeholder_all":"활성화된 저장소에서 검색…","skills.browse.placeholder_repo":"{{repo}}에서 검색…","skills.browse.placeholder_skillssh":"skills.sh 레지스트리 검색…","skills.browse.empty_sources":"skill을 둘러보려면 아래에서 GitHub 저장소를 추가하세요.","skills.browse.add_repo_hint":"더 많은 skill이 필요하신가요? GitHub 저장소를 추가하세요.","skills.browse.manage_sources":"출처 관리","skills.browse.hint_skillssh":"skills.sh를 검색하려면 2자 이상 입력하세요.","skills.browse.loading_hint":"GitHub에서 skill 메타데이터를 가져오는 중입니다. 첫 로드는 최대 1분이 걸릴 수 있으며, 결과는 캐시됩니다.","skills.error.generic":"Skill 작업에 실패했습니다.","skills.confirm.remove_title":"{{name}}을(를) 제거할까요?","skills.confirm.remove_managed":"이 skill은 연결된 모든 AI 도구에서 제거됩니다. 몇 초 안에 실행을 취소할 수 있습니다.","skills.confirm.remove_local":"연결된 모든 AI 도구에서 디스크의 skill 폴더를 삭제합니다. 이 작업은 취소할 수 없습니다.","skills.toast.removed":"{{name}}을(를) 제거했습니다.","shared.action.undo":"실행 취소","shared.action.cancel":"취소","shared.action.apply":"적용","skills.empty.my":"아직 skill이 없습니다. 둘러보기를 열어 검색하고 설치하세요.","skills.empty.my_cta":"둘러보기","skills.empty.browse":"이 출처에서 skill을 찾을 수 없습니다.","skills.empty.search":"결과가 없습니다. 다른 검색어를 시도해 보세요.","skills.repo.placeholder":"owner/repository","skills.repo.add":"저장소 추가","skills.repo.invalid":"owner/repository 또는 GitHub 저장소 URL을 입력하세요.","skills.repo.remove":"저장소 제거","settings.appearance.language.label":"언어","settings.appearance.language.hint":"시스템을 선택하면 기본적으로 컴퓨터 언어를 따릅니다.","settings.appearance.language.system":"시스템","settings.appearance.language.english":"영어","settings.appearance.language.chinese":"중국어 간체","settings.appearance.language.traditional_chinese":"중국어 번체","settings.appearance.language.japanese":"일본어","settings.appearance.language.korean":"한국어","settings.appearance.language.german":"독일어","settings.appearance.currency.label":"통화","settings.appearance.currency.hint":"사용량 비용에 표시할 통화를 선택하세요.","settings.appearance.token_format.label":"Token 숫자 표시","settings.appearance.token_format.hint":"간단히 또는 전체 숫자를 모든 화면에 적용합니다. 간단히 표시된 값은 마우스를 올리면 정확한 숫자를 볼 수 있습니다.","settings.appearance.token_format.compact":"간단히","settings.appearance.token_format.full":"전체","settings.appearance.token_unit.label":"숫자 단위","settings.appearance.token_unit.hint":"간단히 표시한 숫자는 K/M/B 또는 만/억 단위를 사용합니다. 전체 숫자에는 단위가 표시되지 않습니다.","settings.appearance.token_unit.english":"K/M/B","settings.appearance.token_unit.chinese":"만/억","settings.appearance.currency.opt.usd":"미국 달러 ($)","settings.appearance.currency.opt.eur":"유로 (€)","settings.appearance.currency.opt.gbp":"영국 파운드 (£)","settings.appearance.currency.opt.cny":"중국 위안 (¥)","settings.appearance.currency.opt.jpy":"일본 엔 (¥)","settings.appearance.currency.opt.hkd":"홍콩 달러 (HK$)","settings.appearance.currency.rate_source.default":"내장 기본 환율","settings.appearance.currency.rate_source.fetched":"출처: open.er-api.com","settings.appearance.currency.rate_updated":"{{when}} 업데이트됨","settings.appearance.currency.rate_never":"첫 새로고침 대기 중","qpd.card.title":"개발 가성비 및 PR 비용","qpd.card.badge":"BETA","qpd.card.subtitle":"머지된 PR과 AI 귀속 커밋을 기반으로 각 모델의 평균 개발 비용을 산출합니다.","qpd.card.updating":"업데이트 중…","qpd.card.best_value":"최고 가성비","qpd.card.col_model":"모델","qpd.card.col_cost":"소비 비용","qpd.card.col_accepted":"머지된 PR","qpd.card.col_rate":"채택률","qpd.card.col_qpd":"PR당 비용","qpd.card.qpd_tooltip":"PR 1개를 머지하는 데 소요된 평균 토큰 비용 (총 비용 ÷ 머지된 PR 수)","qpd.card.totals":"머지됨: {{accepted}}/{{outcomes}} PR · 총 소비 {{cost}}","qpd.card.et":"유효 토큰: {{tokens}} (채택률 {{rate}})","qpd.card.et_tooltip":"유효 토큰 (Effective Tokens) — 최종적으로 채택 및 머지된 코드에 소비된 토큰의 비율","qpd.card.sparse_notice":"팁: 데이터 양이 적은 경우 가성비 수치가 왜곡될 수 있습니다. 조회 기간을 좁혀서 확인해 보세요.","sessions.card.title":"세션 효율","sessions.card.subtitle":"Claude와 Codex에 공통 적용되는 편집 턴 지표","sessions.card.loading":"로컬 세션 메타데이터를 분석하는 중…","sessions.card.edit_sessions":"편집 세션","sessions.card.first_pass":"한 번에 완료","sessions.card.cost_edit":"편집당 비용","sessions.card.model":"모델","sessions.card.edit_session_value":"{{edits}} / {{sessions}}","sessions.card.edit_turn_count":"편집 턴 {{count}}회","sessions.card.tokens_edit":"편집당 Token","sessions.card.sample":"세션 {{sessions}}개 · 편집 턴 {{edits}}회","sessions.card.methodology_label":"측정 방식","sessions.card.methodology":"편집 = 관측된 편집 도구가 포함된 사용자 턴입니다. 한 번에 완료 = 편집 턴이 한 번뿐이고 동일 요청이 반복되지 않은 경우입니다.","sessions.card.context":"예상 고정 컨텍스트","sessions.card.context_tooltip":"지침, 설치된 Skills 및 추정 MCP 도구 스키마","sessions.card.privacy":"로컬 메타데이터만 처리하며 프롬프트, 응답, 명령 출력 또는 diff 내용은 보관하지 않습니다.","sessions.card.subagents":"하위 에이전트 실행","sessions.card.subagent_item":"{{name}} · {{calls}}","nav.sessions":"세션","sessions.page.refresh":"세션 새로 고침","sessions.filter.source_aria":"세션 소스로 필터링","sessions.filter.range_aria":"기간으로 필터링","sessions.filter.range_7d":"7일","sessions.filter.range_30d":"30일","sessions.filter.range_90d":"90일","sessions.filter.project_all":"모든 프로젝트","sessions.filter.project_search":"프로젝트 검색…","sessions.filter.project_empty":"일치하는 프로젝트가 없습니다","sessions.filter.project_aria":"프로젝트로 필터링","sessions.filter.result_count":"{{filtered}} / {{total}}","sessions.action.search_aria":"세션 검색","sessions.action.search_clear":"검색 지우기","sessions.search.placeholder":"제목, 프로젝트, 모델 또는 ID 검색…","sessions.loading":"세션 불러오는 중…","sessions.col.tokens":"토큰","sessions.col.cost":"비용","sessions.col.edits":"편집","sessions.badge.first_pass":"한 번에 완료","sessions.badge.reported_cost":"보고된 비용","sessions.badge.partial_usage":"불완전한 사용량","sessions.badge.partial_cost":"비용 불완전","sessions.cost.partial_title":"하한값 — 이 세션의 일부 모델은 공개 요금이 없어 해당 토큰은 $0으로 계산됩니다.","sessions.grok.runtime_breakdown":"모델 호출 {{calls}}회 · API {{seconds}}초 · 도구 {{tools}}회 · 오류 {{errors}}개","sessions.grok.context_breakdown":"컨텍스트 {{used}} / {{window}} ({{percent}}%)","sessions.badge.subagent":"하위 에이전트","sessions.thread.expand":"하위 에이전트 {{count}}개 펼치기","sessions.thread.collapse":"하위 에이전트 {{count}}개 접기","sessions.thread.tokens_summary":"자체 {{own}} · 하위 에이전트 {{subagents}} · 합계 {{combined}}","sessions.thread.result_count":"루트 세션 {{roots}}개 · 하위 에이전트 {{subagents}}개 접힘","sessions.thread.model_usage":"하위 에이전트 모델 사용량","sessions.thread.model_all":"전체 · {{count}}개 · {{tokens}}","sessions.thread.model_item":"{{model}} · {{count}}개 · {{tokens}}","sessions.duration.minutes":"{{minutes}}분","sessions.duration.hours":"{{hours}}시간 {{minutes}}분","sessions.project.unknown":"제목 없는 세션","sessions.model.unknown":"알 수 없는 모델","sessions.resume.copy_aria":"재개 명령 복사: {{command}}","sessions.resume.copied":"재개 명령을 복사했습니다","sessions.resume.copy_failed":"명령을 복사할 수 없습니다","sessions.resume.unavailable":"재개 명령을 사용할 수 없습니다","sessions.empty.title":"아직 세션이 없습니다","sessions.empty.body":"이 컴퓨터에서 Claude Code, Codex 또는 Grok를 실행하면 세션이 여기에 표시됩니다.","sessions.empty.filtered_title":"일치하는 세션이 없습니다","sessions.empty.filtered_body":"다른 검색어를 사용하거나 기간을 넓혀 보세요.","sessions.col.turns":"턴","sessions.project.copy_hint":"클릭하면 경로가 복사됩니다","sessions.project.copy_aria":"{{project}}의 로컬 경로 복사","sessions.project.copied":"프로젝트 경로를 복사했습니다","sessions.project.copy_failed":"경로를 복사할 수 없습니다","sessions.action.load_more":"세션 더 보기","sessions.error.title":"세션을 불러올 수 없습니다","sessions.error.retry":"다시 시도","sessions.error.outdated_app":"이 TokenTracker 버전이 너무 오래되어 세션을 나열할 수 없습니다. 최신 버전으로 업데이트하세요.","sessions.truncated":"전체 {{total}}개 중 최근 {{shown}}개만 표시합니다. 기간을 좁히면 이전 세션도 볼 수 있습니다.","sessions.privacy":"로컬에서 처리됩니다. Prompt와 응답 본문, 명령 출력, diff 내용은 보관하거나 업로드하지 않습니다.","nav.achievements":"업적","limits.alert.enable":"예측 한도 알림 켜기","limits.alert.disable":"예측 한도 알림 끄기","limits.alert.title":"{{provider}} 한도가 일찍 소진될 수 있습니다","limits.alert.body":"현재 속도라면 {{eta}} 후 소진될 수 있습니다({{percent}}% 사용됨).","settings.section.labs":"Labs","limits.alert.blocked":"알림이 꺼져 있음 — 시스템 설정에서 허용하세요","settings.limits.showSubscriptions":"구독을 한도에 표시","settings.limits.showSubscriptionsHint":"수동으로 등록한 구독 갱신 바를 한도와 함께 표시합니다.","settings.appearance.token_grouping.label":"숫자 그룹화","settings.appearance.token_grouping.hint":"정확한 숫자는 3자리 또는 중국어 4자리 그룹을 사용합니다. 간단히 표시한 값의 툴팁에도 적용됩니다.","settings.appearance.token_grouping.thousand":"3자리","settings.appearance.token_grouping.wan":"4자리","leaderboard.pro.badge":"Pro","leaderboard.pro.badge_aria":"TokenTracker Pro 회원"},sD={"cloud.action.resume_order":"결제 계속하기","cloud.restore.title":"주문 찾기","cloud.restore.detail":"주문 ID를 입력해 결제 상태를 확인하거나 결제를 계속하세요.","cloud.billing.title":"청구 및 결제","cloud.membership.transition_until":"전환 기간은 {{date}}까지","cloud.membership.trial_until":"체험 기간은 {{date}}까지","cloud.membership.active_until":"{{date}}까지 유효","cloud.membership.gift_until":"선물 받은 Cloud는 {{date}}까지","cloud.membership.expired_on":"{{date}}에 만료됨","cloud.history.date":"날짜","cloud.history.amount":"금액","cloud.history.status":"상태","cloud.history.paid":"결제 완료","cloud.history.pending":"결제 대기","cloud.membership.tools_title":"도구 및 청구","usage.overview.all_tools":"전체","usage.overview.all_models":"전체 모델","usage.overview.all_models_note":"이름이 같은 모델은 도구 전체에서 합산되어 총사용량순으로 표시됩니다.","usage.overview.week_cross_month_hint":"이 주는 두 개의 달에 걸쳐 있으므로 합계를 한 달 사용량과 직접 비교할 수 없습니다","usage.overview.all_tools_card_aria":"전체 도구: {{tokens}} 토큰, {{cost}}, 모델 {{count}}개. 통합 모델 순위 표시","usage.overview.antigravity_notice_title":"토큰 상세 정보","usage.overview.cache_hit_rate_label":"캐시 적중률","usage.overview.cache_hit_rate_detail":"{{reused}} 재사용 / {{input}} 입력","usage.overview.antigravity_notice_body":"사용 가능한 경우 Antigravity 로컬 세션 메타데이터에서 정확한 토큰 수와 프롬프트 캐시 히트를 파싱합니다. 메타데이터가 없는 세션은 텍스트 길이(약 4자/토큰)로 추정합니다.","usage.overview.devin_notice_title":"비용 미산정","usage.overview.devin_notice_body":"Devin은 실제 로컬 토큰 사용량을 보고하지만, 이 빌드에는 swe-2, swe-2-high, compactor의 가격 정보가 없어 달러 추정치에서 제외됩니다. $0로 표시돼도 무료 사용을 의미하지는 않습니다.","stats.period.today":"오늘","stats.period.week":"이번 주","stats.period.month":"이번 달","stats.period.all":"전체","stats.period.last_7d":"7일","stats.period.last_30d":"30일","stats.period.avg":"평균","stats.period.convs":"대화","dashboard.core_index.collapse_label":"▾","dashboard.core_index.expand_label":"▸","dashboard.core_index.collapse_aria":"모델 분석 접기","dashboard.core_index.expand_aria":"모델 분석 펼치기","dashboard.rolling.title":"최근 활동","dashboard.rolling.last_7d":"최근 7일","dashboard.rolling.last_30d":"최근 30일","dashboard.rolling.avg_active_day":"일 평균","dashboard.projects.title":"프로젝트 사용량","dashboard.projects.limit_aria":"표시할 프로젝트 수 선택","dashboard.projects.limit_top_3":"TOP 3","dashboard.projects.limit_top_6":"TOP 6","dashboard.projects.limit_top_10":"TOP 10","dashboard.projects.empty":"아직 프로젝트 사용량이 없습니다. git 저장소 안에서 지원되는 CLI를 사용하면 사용량이 여기에 표시됩니다.","dashboard.projects.detail.close_aria":"프로젝트 상세 닫기","dashboard.projects.detail.error":"프로젝트 상세를 불러오지 못했습니다","dashboard.projects.detail.empty_range":"선택한 기간에 사용량이 없습니다","dashboard.projects.detail.stat_total":"총 토큰","dashboard.projects.detail.stat_conversations":"대화 수","dashboard.projects.detail.stat_active_days":"활동 일수","dashboard.projects.detail.stat_avg_day":"일평균(활동일)","dashboard.projects.detail.stat_cache_hit":"캐시 적중률","dashboard.projects.detail.stat_share":"전체 사용량 비중","dashboard.projects.detail.section_trend":"일별 활동","dashboard.projects.detail.section_composition":"토큰 구성","dashboard.projects.detail.section_sources":"소스별","dashboard.projects.detail.comp_input":"입력","dashboard.projects.detail.comp_cached":"캐시 읽기","dashboard.projects.detail.comp_cache_write":"캐시 쓰기","dashboard.projects.detail.comp_output":"출력","dashboard.projects.detail.comp_reasoning":"추론","dashboard.projects.detail.source_days":"{{n}}일","dashboard.projects.detail.source_conv":"대화 {{n}}회","dashboard.widgets.title":"데스크톱 위젯","dashboard.widgets.hint":'데스크톱 우클릭 → 위젯 편집 → "TokenTracker" 검색',"dashboard.widgets.dismiss_aria":"위젯 소개 닫기","dashboard.linux_topbar.title":"상단 바에서 사용량 확인","dashboard.linux_topbar.hint":"GNOME에서는 TokenTracker 확장이 상단 바의 Clawd 옆에 오늘의 토큰과 비용을 보여주고, 드롭다운에서 한도와 추세를 확인할 수 있어요.","dashboard.linux_topbar.setup":"설정하기","dashboard.linux_topbar.dismiss_aria":"상단 바 팁 닫기","dashboard.cost_breakdown.title":"비용 내역","dashboard.cost_breakdown.total_label":"예상 총비용","dashboard.cost_breakdown.close":"닫기","trend.monitor.label":"사용 추세","trend.monitor.predicted":"예측값","trend.zoom.open_aria":"전체 화면으로 확대","trend.zoom.close_aria":"닫기","trend.zoom.badge":"트렌드 인사이트","trend.zoom.desc":"막대에 마우스를 올리면 토큰, 비용, 대화 수를 확인할 수 있습니다. 단위를 전환해 월에서 30분까지 살펴보세요.","trend.zoom.insight_badge":"인사이트","trend.zoom.tooltip.cost":"비용","trend.zoom.tooltip.conversations":"대화","trend.zoom.stats.tokens":"총 토큰","trend.zoom.stats.cost":"총 비용","trend.zoom.stats.conversations":"대화 수","trend.zoom.stats.peak":"최대 구간","trend.zoom.gran.aria":"단위","trend.zoom.gran.30min":"30분","trend.zoom.gran.day":"일","trend.zoom.gran.month":"월","trend.zoom.prev_day":"이전 날","trend.zoom.next_day":"다음 날","trend.zoom.loading":"불러오는 중…","trend.zoom.pick_day":"날짜 선택","trend.zoom.pick_range":"기간 선택","trend.zoom.insight.empty":"조용한 구간. 토큰이 단 하나도 흐르지 않았습니다.","trend.zoom.insight.calm":"가벼운 사용. 모델은 대부분 대기하다 필요할 때만 깨어났습니다.","trend.zoom.insight.steady":"{{active}}개 활성 구간에서 안정적인 리듬, 최대 {{peak}}. 요란하지 않게 일을 끝내는 페이스입니다.","trend.zoom.insight.heavy":"본격 가동: {{active}}개 구간이 뜨겁게 돌아가고 최대 {{peak}}. 흐름을 기다리지 않고 직접 만들어내는 사람의 출력입니다.","trend.zoom.insight.massive":"산업 규모. {{peak}} 피크와 식지 않는 처리량. 이 정도면 모델을 쓰는 게 아니라 공장을 돌리는 셈입니다.","heatmap.title":"활동 히트맵","heatmap.empty":"아직 활동 데이터가 없습니다.","heatmap.legend.less":"적음","heatmap.legend.more":"많음","heatmap.legend.utc":"UTC","heatmap.tooltip":"{{day}} • {{value}} {{unit}} • {{tz}}","heatmap.unit.tokens":"토큰","heatmap.month.jan":"1월","heatmap.month.feb":"2월","heatmap.month.mar":"3월","heatmap.month.apr":"4월","heatmap.month.may":"5월","heatmap.month.jun":"6월","heatmap.month.jul":"7월","heatmap.month.aug":"8월","heatmap.month.sep":"9월","heatmap.month.oct":"10월","heatmap.month.nov":"11월","heatmap.month.dec":"12월","heatmap.day.sun":"일","heatmap.day.mon":"월","heatmap.day.tue":"화","heatmap.day.wed":"수","heatmap.day.thu":"목","heatmap.day.fri":"금","heatmap.day.sat":"토","dashboard.session_expired.copy_label":"npx --yes tokentracker-cli init 실행","dashboard.session_expired.copied":"복사됨","dashboard.install.prompt":"Node.js 18+ 설치 후 실행:","dashboard.install.cmd.init":"npx --yes tokentracker-cli init","dashboard.install.cmd.init_link_code":"npx --yes tokentracker-cli init --link-code {{link_code}}","dashboard.install.copy":"설치 명령 복사","dashboard.install.copy_base":"init 명령 복사","dashboard.install.copied":"클립보드에 복사됨","dashboard.install.link_code.loading":"전용 코드 생성 중...","dashboard.install.link_code.failed":"전용 코드를 사용할 수 없음","dashboard.install.cmd.sync":"npx --yes tokentracker-cli sync","dashboard.daily.title":"일별 내역","dashboard.daily.empty":"아직 데이터가 없습니다. AI CLI를 사용한 다음 {{cmd}}을(를) 실행하세요.","dashboard.identity.title":"내 프로필","dashboard.identity.subtitle":"코딩 여정을 기록하세요","dashboard.identity.fallback":"익명","dashboard.overview.layout.drag_handle":"드래그하여 순서 변경","dashboard.overview.layout.reset":"레이아웃 재설정","dashboard.screenshot.twitter_text":"기록된 {{total_tokens}} 토큰.\\n{{model_name}}이(가) {{model_percent}}%로 1위.\\n\\n검증되지 않은 나의 AI 사용량 →","heatmap.3d.hover_tip":"클릭하여 3D 전체 화면 회전 분석 모드로 진입","heatmap.3d.modal.title":"토큰 3D 투시","heatmap.3d.modal.desc":"마우스 왼쪽 버튼으로 드래그하여 회전하세요. 마우스를 올리면 일별 활동과 다차원 지표를 확인할 수 있습니다.","heatmap.3d.modal.stats.total_tokens":"연간 총 토큰","heatmap.3d.modal.stats.precision_total_tokens":"정확한 연간 소비량","heatmap.3d.modal.stats.estimated_cost":"연간 예상 비용","heatmap.3d.modal.stats.active_rate_days":"활동 비율 / 일수","heatmap.3d.modal.stats.max_streak":"최장 연속 활동","heatmap.3d.modal.stats.days_suffix":"일","heatmap.3d.modal.stats.peak_day":"단일 최고 폭발","heatmap.3d.modal.stats.precision_peak_value":"정확한 일일 최고치","heatmap.3d.modal.stats.no_data":"데이터 없음","heatmap.3d.modal.legend.title":"활동 단계","heatmap.3d.modal.palette.emerald":"에메랄드 시티","heatmap.3d.modal.palette.ocean":"심해의 심연","heatmap.3d.modal.palette.neon":"사이버 네온","heatmap.3d.modal.palette.amber":"타오르는 호박빛","heatmap.3d.modal.control.play":"느린 자동 회전 시작","heatmap.3d.modal.control.pause":"자동 회전 일시정지","heatmap.3d.modal.control.reset":"3D 시점 초기화","heatmap.3d.modal.footer.tip":"핀치 확대 / 스크롤 확대 / 드래그로 3D 차트 회전","heatmap.3d.modal.ai.title.default":"꾸준한 창작자","heatmap.3d.modal.ai.eval.default":"당신은 꾸준히 행동하며 앞으로 나아가고 있습니다. 작은 활동 하나하나가 생각하고 탐구한 순간을 기록합니다. 그 불꽃들이 모여 결국 당신만의 결과물이 됩니다.","heatmap.3d.modal.ai.title.peak":"최고 기여자","heatmap.3d.modal.ai.eval.peak":"올 한 해, 당신의 토큰 활동은 탁월한 수준에 도달했습니다. 높은 집중력과 추진력으로 복잡한 아이디어를 구체적인 결과로 계속 바꾸어 왔습니다. 지속적인 창의성의 증거입니다.","heatmap.3d.modal.ai.title.heavy":"고빈도 크리에이터","heatmap.3d.modal.ai.eval.heavy":"탁월한 지속적 산출입니다. 누적된 토큰은 방대한 조사, 창작, 문제 해결의 과정을 보여줍니다. 이 안정적인 속도는 인상적인 집중력과 실행력을 증명합니다.","heatmap.3d.modal.ai.title.core":"핵심 생산성 전문가","heatmap.3d.modal.ai.eval.core":"매우 견고한 장기적 헌신입니다. 지난 한 해 동안 안정적이고 강한 리듬을 유지하며 AI와의 협업을 지속적인 결과로 바꾸어 왔습니다. 진정한 핵심 생산성입니다.","heatmap.3d.modal.ai.title.steady":"꾸준한 크리에이터","heatmap.3d.modal.ai.eval.steady":"꾸준하고 집중력 있게 앞으로 나아가고 있습니다. 쌓여 가는 토큰 하나하나는 아이디어를 가치 있는 결과로 바꾼 발걸음입니다. 이 안정적인 리듬이 오래가는 전문성을 만듭니다.","heatmap.3d.voxel.joke.1":"🔥 완전 미쳤어요! {{value}} tokens 산출! 대형 언어 모델을 훈련하는 건가요, 아니면 직접 컴파일러를 만드는 건가요?","heatmap.3d.voxel.joke.2":"🚀 서사시급 산출! 총 {{value}} tokens. 오늘의 산출량이면 지구를 한 바퀴 돌 수 있어요. AI마저 당신에게 놀랐습니다!","heatmap.3d.voxel.joke.3":"⚡ 폭발의 날! {{value}} tokens. 코드가 샘솟아 키보드에서 연기가 나기 시작합니다!","heatmap.3d.voxel.level3":"⚡ 생산성 대폭발 ({{value}} tokens)! 높은 효율과 집중력, 이 최고의 상태를 계속 유지하세요!","heatmap.3d.voxel.level2":"🌱 점점 무르익는 중 ({{value}} tokens)! 꾸준한 산출, 키 입력 하나하나가 아키텍처에 기여하고 있습니다.","heatmap.3d.voxel.level1":"🍃 티끌 모아 태산 ({{value}} tokens). 작은 커밋도 미래에 대한 투자입니다. 복리의 힘을 받아들이세요!","heatmap.3d.voxel.level0":"💤 재충전 중. 코딩하지 않는 날에도 영감은 조용히 자라납니다.","ipcheck.page.title":"Claude IP 확인","ipcheck.page.subtitle":"Claude에 접속하는 출구 IP와 함께 평판, 지리 정보, 로그인에 영향을 주거나 사용 제한을 유발할 수 있는 위험 신호를 점검하세요.","ipcheck.mask.toggle":"IP 숨기기","ipcheck.ipv6.warn":"IPv6가 감지되었습니다. IPv6로 Claude Code에 접속하는 것은 권장하지 않으며, 일부 검사 결과가 불완전할 수 있습니다.","ipcheck.ip.cn":"중국 출구 IPv4","ipcheck.ip.cloudflare":"Cloudflare 출구","ipcheck.ip.claude":"Claude 출구","ipcheck.ip.failed":"가져올 수 없음","ipcheck.ip.loading":"불러오는 중...","ipcheck.trust.title":"신뢰 점수","ipcheck.trust.subtitle":"Claude 위험 관리 관점에서의 IP 청결도","ipcheck.trust.no_data":"데이터 없음","ipcheck.trust.no_ip":"Claude 출구 IP가 감지되지 않아 점수를 매길 수 없습니다","ipcheck.trust.no_score":"이 IP에 대한 점수 데이터가 없습니다","ipcheck.trust.gauge.low":"0 고위험","ipcheck.trust.gauge.high":"100 신뢰됨","ipcheck.trust.label.pristine":"매우 깨끗함","ipcheck.trust.label.clean":"깨끗함","ipcheck.trust.label.good":"양호","ipcheck.trust.label.neutral":"중립","ipcheck.trust.label.suspicious":"의심스러움","ipcheck.trust.label.unreachable":"접근 불가","ipcheck.trust.text.excellent":"평판이 매우 우수함","ipcheck.trust.text.great":"평판이 우수함","ipcheck.trust.text.minor":"경미한 위험","ipcheck.trust.text.moderate":"보통 수준의 위험","ipcheck.trust.text.severe":"심각한 위험","ipcheck.trust.text.restricted":"제한 지역 — Claude가 엄격한 위험 관리를 적용합니다","ipcheck.trust.region_warn.title":"Claude 출구 IP가 {{region}}에 있습니다","ipcheck.trust.region_warn.body":"로그인을 피하세요. 계정 플래그 처리를 유발할 가능성이 높습니다.","ipcheck.trust.region_support":"Claude 지원 지역","ipcheck.trust.region.accessible":"접근 가능","ipcheck.common.unknown":"알 수 없음","ipcheck.props.title":"IP 속성","ipcheck.props.region":"지역","ipcheck.props.city":"도시","ipcheck.props.type":"유형","ipcheck.props.asn":"ASN","ipcheck.props.org":"ISP","ipcheck.props.residential":"가정용","ipcheck.props.datacenter":"데이터센터","ipcheck.security.title":"보안 검사","ipcheck.security.vpn":"VPN","ipcheck.security.proxy":"프록시","ipcheck.security.tor":"Tor","ipcheck.security.crawler":"크롤러","ipcheck.security.abuser":"악용 이력","ipcheck.security.proxy_flag":"프록시","ipcheck.security.crawler_yes":"예","ipcheck.security.crawler_no":"아니요","ipcheck.security.abuser_yes":"기록 있음","ipcheck.security.abuser_no":"기록 없음","ipcheck.security.clean":"감지되지 않음","ipcheck.avail.title":"Claude 가용성","ipcheck.avail.tooltip":"Claude 서버는 미국에 있으므로 아시아에서 100ms를 초과하는 지연은 정상입니다.","ipcheck.avail.refresh":"새로고침","ipcheck.avail.svc_row":"서비스 상태","ipcheck.avail.latency.normal":"정상","ipcheck.avail.latency.good":"양호","ipcheck.avail.latency.slow":"느림","ipcheck.avail.latency.unreachable":"접근 불가","ipcheck.avail.svc.none":"모든 시스템 정상","ipcheck.avail.svc.minor":"경미한 장애","ipcheck.avail.svc.major":"주요 장애","ipcheck.avail.svc.critical":"심각한 장애","ipcheck.avail.svc.maintenance":"점검 중","ipcheck.avail.svc.other":"서비스 이상","ipcheck.dns.title":"DNS 누출","ipcheck.dns.status":"상태","ipcheck.dns.outlet":"DNS 출구","ipcheck.dns.outlet_ip":"DNS 출구 IP","ipcheck.dns.isp":"제공업체","ipcheck.dns.leaked":"누출 가능성 있음","ipcheck.dns.no_leak":"누출이 감지되지 않음","ipcheck.dns.encrypted":"DNS 암호화 또는 비노출","ipcheck.dns.cn_tag":"중국 DNS","ipcheck.udp.title":"WebRTC UDP 누출","ipcheck.udp.status":"상태","ipcheck.udp.outlet":"UDP 출구","ipcheck.udp.outlet_ip":"UDP 출구 IP","ipcheck.udp.origin":"출처","ipcheck.udp.disabled":"WebRTC 비활성화됨","ipcheck.udp.no_leak":"누출이 감지되지 않음","ipcheck.udp.leaked":"누출 가능성 있음","ipcheck.udp.anomaly":"이상","ipcheck.device.title":"기기 정보","ipcheck.device.tz":"시간대","ipcheck.device.lang":"언어","ipcheck.device.os":"OS / 브라우저","ipcheck.device.touch":"터치","ipcheck.device.net":"네트워크 유형","ipcheck.device.dnt":"Do Not Track","ipcheck.device.webgl_render":"WebGL 렌더러","ipcheck.device.canvas_fp":"Canvas 지문","ipcheck.device.webgl_fp":"WebGL 지문","ipcheck.device.match":"일치","ipcheck.device.mismatch":"불일치","ipcheck.device.local":"로컬","ipcheck.device.estimate_suffix":"(추정)","ipcheck.device.diff_equal":"약간의 오차","ipcheck.device.diff_ahead":"Claude가 {{h}}시간 빠름","ipcheck.device.diff_behind":"Claude가 {{h}}시간 느림","ipcheck.device.lang_expected":"Claude 지역 일반적","ipcheck.device.touch_yes":"예","ipcheck.device.touch_no":"아니요","ipcheck.device.dnt_on":"켜짐","ipcheck.device.dnt_off":"꺼짐","ipcheck.device.dnt_unset":"설정 안 됨","ipcheck.device.net_unsupported":"감지되지 않음","ipcheck.device.unsupported":"지원되지 않음","ipcheck.history.title":"Claude 출구 IP 기록","ipcheck.history.subtitle":"이 브라우저에만 저장되며 최대 6개까지 보관됩니다","ipcheck.history.clear":"지우기","ipcheck.history.empty":"아직 기록이 없습니다","ipcheck.history.current":"현재","ipcheck.region.CN":"중국 본토","ipcheck.region.HK":"홍콩","ipcheck.region.MO":"마카오","ipcheck.region.RU":"러시아","ipcheck.region.KP":"북한","ipcheck.region.IR":"이란","ipcheck.region.SY":"시리아","ipcheck.region.CU":"쿠바","ipcheck.region.BY":"벨라루스","ipcheck.region.VE":"베네수엘라","leaderboard.profile_modal.close":"닫기","leaderboard.profile_modal.loading":"프로필 불러오는 중…","leaderboard.profile_modal.error":"프로필을 불러오지 못했습니다.","leaderboard.profile_modal.empty":"이 프로필은 공개되지 않았습니다.","leaderboard.profile_modal.row_aria":"{{name}}의 프로필 열기","leaderboard.profile_modal.rank":"#{{rank}}","leaderboard.profile.hero.rank_label":"순위","leaderboard.profile_modal.hero.total_tokens":"총 토큰","leaderboard.profile_modal.hero.total_cost":"총비용","leaderboard.profile_modal.hero.github":"GitHub 프로필","leaderboard.profile_modal.stat.total_cost":"총비용","leaderboard.profile_modal.stat.total_tokens":"총 토큰","leaderboard.profile_modal.stat.active_days":"활동 일수","leaderboard.profile_modal.stat.avg_per_day":"일 평균","leaderboard.profile_modal.streak.current":"현재 연속","leaderboard.profile_modal.streak.longest":"최장 연속","leaderboard.profile_modal.streak.days":"{{count}}일","leaderboard.profile_modal.best_day.title":"최고의 날","leaderboard.profile_modal.best_day.none":"—","leaderboard.profile_modal.models.count":"{{count}}개 모델 사용","leaderboard.profile_modal.models.favorite":"최애 모델","leaderboard.profile_modal.models.none":"추적된 모델 없음","leaderboard.profile_modal.heatmap.title":"활동 (최근 365일)","leaderboard.profile_modal.providers.title":"제공자별","leaderboard.profile_modal.providers.none":"이 기간에는 사용 데이터가 없습니다.","leaderboard.profile_modal.view_full":"전체 프로필 보기","local_only.title":"앱에서 사용 가능","local_only.body":"이 페이지는 사용자의 컴퓨터에 있는 데이터를 읽으므로 Mac 앱 또는 CLI 대시보드에서만 작동합니다.","local_only.open_app":"Mac 앱에서 열기","local_only.download":"Mac 앱 받기","dashboard.auth_gate.title":"Token Tracker 로그인","dashboard.auth_gate.subtitle":"로그인하여 클라우드에서 API 사용량, 비용 및 토큰 소비 트렌드를 동기화하고 확인하세요.","dashboard.auth_gate.button":"로그인","dashboard.expired_gate.title":"세션 만료됨","dashboard.expired_gate.subtitle":"세션이 만료되었습니다. 클라우드 대시보드를 계속 보려면 다시 로그인하세요.","dashboard.expired_gate.button":"다시 로그인","shared.app_name":"Token Tracker","dashboard.auth_gate.hero_title":"AI 에이전트의 모든 토큰 소비","dashboard.auth_gate.hero_subtitle":"명확하고 투명한 멀티 엔드포인트 제어","dashboard.auth_gate.desc":"Claude Code, Cursor, Gemini CLI 등 모든 주류 에이전트의 토큰 쿼터, 동시 실행 비용 및 대기 시간 통계를 퍼블릭 클라우드에서 안전하게 동기화하여 전례 없는 종합 시각화 분석을 제공합니다.","dashboard.auth_gate.feature.sync.title":"실시간 클라우드 동기화","dashboard.auth_gate.feature.sync.desc":"각 엔드포인트의 실행 비용을 자동으로 수집하고 프라이빗 클라우드에 단 몇 초 만에 안전하게 아카이브합니다.","dashboard.auth_gate.feature.anal.title":"다차원 대시보드 분석","dashboard.auth_gate.feature.anal.desc":"모델 분류, 시간 프레임별로 토큰 분포를 통계하여 비용 급증 및 소비 구성을 언제든지 추적할 수 있습니다.","dashboard.auth_gate.feature.guard.title":"로컬 우선의 자율성","dashboard.auth_gate.feature.guard.desc":"Localhost 모드에서는 모든 로그인 인증을 자동으로 건너뛰어 로컬 오프라인 디버깅 경험을 완벽하게 보호합니다.","dashboard.expired_gate.hero_title":"클라우드 세션 만료됨","dashboard.expired_gate.desc":"개인 정보 및 클라우드 드라이브 보안을 위해 활성 세션은 일정 기간 후 자동으로 종료됩니다. 대시보드를 즉시 복원하려면 다시 인증해 주세요.","dashboard.expired_gate.feature.sec.title":"안전한 보호","dashboard.expired_gate.feature.sec.desc":"암호화된 자격 증명은 만료 시 자동으로 파기되어 토큰 자산의 개인 정보를 철저히 보호합니다.","dashboard.expired_gate.feature.restore.title":"원활한 데이터 복원","dashboard.expired_gate.feature.restore.desc":"다시 로그인하면 터미널 훅을 재구성할 필요 없이 멀티 디바이스 실시간 대시보드가 자동으로 복원됩니다.","dashboard.expired_gate.feature.cloud.title":"교차 장치 동기화","dashboard.expired_gate.feature.cloud.desc":"동기화된 대시보드를 통해 어디서나 토큰 로그를 간편하게 확인하고 지출을 관리할 수 있습니다.","dashboard.device_filter.all":"모든 기기","dashboard.device_filter.aria":"기기별 필터","dashboard.device_card.title":"기기별","dashboard.device_card.current":"현재 기기","dashboard.device_card.unnamed":"이름 없는 기기","nav.pet":"데스크톱 펫","pet.page.eyebrow":"데스크톱 동반자","pet.page.title":"펫","pet.page.subtitle":"동반자를 선택하고 실제 AI 활동에 어떻게 반응하는지 미리 보세요.","pet.preview.states":"펫 상태 미리보기","pet.controls.title":"데스크톱 제어","pet.controls.show":"데스크톱 펫 표시","pet.controls.show_hint":"동반자를 다른 창 위에 유지합니다.","pet.controls.size":"펫 크기","pet.controls.native_only":"실제 펫을 제어하려면 TokenTracker 데스크톱 앱에서 이 페이지를 여세요.","pet.characters.title":"동반자 선택","pet.characters.subtitle":"모든 캐릭터는 전체 상태 시스템과 고유한 색상 및 실루엣을 갖습니다.","pet.character.clawd":"Clawd","pet.character.clawd_desc":"집게발 실루엣의 오리지널 토큰 키퍼.","pet.character.sprout":"Sprout","pet.character.sprout_desc":"잎사귀 귀와 작은 뿌리발을 가진 새싹 정령.","pet.character.byte":"Byte","pet.character.byte_desc":"표정 화면과 호버 추진기를 가진 터미널 로봇.","pet.character.ember":"Ember","pet.character.ember_desc":"불꽃 꼬리로 생산성 연속 기록을 축하하는 여우 정령.","pet.state.calm":"차분함","pet.state.focus":"집중","pet.state.multitask":"멀티 모델","pet.state.streak":"연속 활동","pet.state.celebrate":"새 사용량","pet.state.rest":"휴식","pet.size.small":"작게","pet.size.medium":"보통","pet.size.large":"크게","pet.import.title":"Codex 펫 가져오기","pet.import.subtitle":"codex-pets.net 링크를 붙여넣거나 .zip을 선택하세요.","pet.import.add":"추가","pet.import.zip":"패키지 선택","pet.import.remove":"펫 삭제","pet.import.success":"펫을 가져와 선택했습니다.","pet.import.failed":"이 펫을 가져올 수 없습니다.","pet.import.busy":"가져오는 중…","pet.format.v2":"V2","pet.import.removed":"펫을 삭제했습니다.","pet.import.url_label":"Codex Pets URL 또는 펫 ID","dashboard.projects.detail.badge":"프로젝트","achievements.section.title":"업적","achievements.page.title":"업적","achievements.page.local_note":"프로젝트·올빼미 배지는 이 기기에만 저장됩니다.","achievements.signin.prompt":"로그인하면 클라우드 업적을 획득하고 리더보드에 표시할 수 있습니다.","achievements.mini.tooltip":"{{name}} — {{tier}}","achievements.badge.aria":"{{name}} — {{tier}}","achievements.tier.bronze":"브론즈","achievements.tier.silver":"실버","achievements.tier.gold":"골드","achievements.tier.diamond":"다이아몬드","achievements.modal.locked":"잠김","achievements.modal.achieved_label":"달성일","achievements.modal.value_label":"현재 값","achievements.modal.progress_to_next":"{{tier}}까지 진행률","achievements.modal.max_tier":"최고 티어 달성","achievements.modal.close":"닫기","achievements.modal.tier_history":"티어 히스토리","achievements.modal.coin_aria":"{{name}} 배지 — 드래그하거나 방향키로 회전","achievements.modal.issue_number":"No.{{number}}","achievements.badge.token_titan.name":"토큰 타이탄","achievements.badge.token_titan.desc":"모든 AI 도구에서 누적 토큰을 쌓아 올리세요.","achievements.badge.big_day.name":"빅 데이","achievements.badge.big_day.desc":"하루에 엄청난 양의 토큰을 소모하세요.","achievements.badge.wordsmith.name":"글솜씨 장인","achievements.badge.wordsmith.desc":"AI가 실제로 작성한 코드와 글 — 출력 토큰을 쌓아보세요.","achievements.badge.marathoner.name":"마라토너","achievements.badge.marathoner.desc":"활동한 날을 차곡차곡 쌓으세요.","achievements.badge.streak.name":"연속 기록","achievements.badge.streak.desc":"매일 끊기지 않는 사용 기록을 이어가세요.","achievements.badge.weekend_warrior.name":"주말 전사","achievements.badge.weekend_warrior.desc":"토요일과 일요일에도 계속 개발하세요.","achievements.badge.momentum.name":"모멘텀","achievements.badge.momentum.desc":"주간 사용량을 전주 대비 크게 늘리세요.","achievements.badge.polyglot.name":"모델 폴리글랏","achievements.badge.polyglot.desc":"다양한 모델을 자유자재로 다루세요.","achievements.badge.trendsetter.name":"트렌드세터","achievements.badge.trendsetter.desc":"새 모델을 출시 1주일 안에 사용해 보세요.","achievements.badge.multitool.name":"멀티툴","achievements.badge.multitool.desc":"여러 AI 코딩 도구의 사용량을 기록하세요.","achievements.badge.podium.name":"포디움","achievements.badge.podium.desc":"전체 리더보드를 오르세요.","achievements.badge.veteran.name":"베테랑","achievements.badge.veteran.desc":"첫 기록일부터 꾸준히 함께하세요.","achievements.badge.project_hopper.name":"프로젝트 호퍼","achievements.badge.project_hopper.desc":"여러 프로젝트에 토큰을 뿌리세요.","achievements.badge.project_devotion.name":"프로젝트 헌신","achievements.badge.project_devotion.desc":"사랑하는 하나의 프로젝트에 토큰을 쏟아부으세요.","achievements.badge.night_owl.name":"올빼미","achievements.badge.night_owl.desc":"자정부터 새벽 6시 사이에 코딩하세요.","achievements.signin.action":"로그인","achievements.scope.local":"로컬","achievements.page.suggest":"새 배지 아이디어가 있나요?","achievements.page.suggest_link":"GitHub에서 제안하기","dashboard.context_breakdown.empty_grok":"선택한 기간에 Grok Build 활동이 없습니다.","dashboard.context_breakdown.error_grok":"이 보기에 필요한 Grok Build 로그를 읽을 수 없습니다.","dashboard.context_breakdown.footnote_grok":"Grok는 겹치지 않는 토큰 버킷을 사용합니다. 도구/실행 드릴다운은 동일 턴에 대한 휴리스틱 귀속이며 turn_completed.usage를 기준으로 합니다.","dashboard.context_breakdown.heading":"컨텍스트 분석","dashboard.context_breakdown.heading_claude":"Claude 컨텍스트 분석","dashboard.context_breakdown.heading_codex":"Codex 컨텍스트 분석","dashboard.context_breakdown.heading_grok":"Grok 컨텍스트 분석","cloud.action.open_app":"TokenTracker에서 열기","cloud.checkout.return_app_hint":"데스크톱 앱에 로그인한 계정으로 이 주문을 확인하세요. 서버가 이용 권한을 확인합니다.","cloud.gift.redeem_action":"Cloud 코드 사용","cloud.gift.detail":"선물에는 모든 Cloud 기능이 포함되며 자동 갱신이 생성되지 않습니다. 기존 구독은 별도로 관리합니다.","cloud.gift.code_label":"Cloud 선물 코드","cloud.gift.confirm":"코드 사용","cloud.gift.redeeming":"사용 중…","cloud.gift.redeemed":"코드 사용 완료","cloud.gift.already_redeemed":"이미 사용한 코드입니다. 해당 선물이 계정에 표시됩니다.","cloud.gift.refresh_needed":"코드는 사용되었지만 회원 상태를 새로고침하지 못했습니다. 계정을 새로고침하여 권한과 날짜를 확인하세요.","cloud.gift.redeem_another":"다른 코드 사용","cloud.gift.membership_label":"선물 받은 Cloud","cloud.gift.history_title":"Cloud 선물","cloud.gift.duration":"Cloud {{days}}일","cloud.gift.term":"Cloud {{days}}일, {{start}}부터 {{end}}까지.","cloud.gift.state_active":"사용 중","cloud.gift.state_pending":"현재 이용 기간 후 시작","cloud.gift.state_expired":"만료됨","cloud.gift.state_revoked":"취소됨","cloud.gift.error_unavailable":"사용할 수 없는 코드입니다. 입력을 확인하거나 코드를 준 사람에게 문의하세요.","cloud.gift.error_rate_limit":"시도 횟수가 많습니다. 잠시 후 다시 시도하세요.","cloud.gift.error_not_available":"이 인스턴스에서는 아직 선물 코드를 사용할 수 없습니다.","cloud.gift.error_renewal":"코드를 사용하기 전에 ‘구독 관리’에서 자동 갱신을 끄세요.","cloud.gift.error_checkout":"코드를 사용하기 전에 ‘청구 및 결제’에서 대기 중인 결제를 완료하세요.","cloud.gift.error_active":"사용 중이거나 예정된 Cloud 선물이 있습니다. 새 결제를 시작하기 전에 계정에서 확인하세요.","cloud.gift.error_network":"코드 사용 결과를 확인하지 못했습니다. 같은 코드로 다시 시도하세요. 기록된 선물은 중복으로 추가되지 않습니다.","cloud.prompt.deadline_gift":"선물 받은 Cloud는 {{date}}에 종료됩니다. 선물 자체는 자동 갱신되지 않으며 종료 후에도 로컬 데이터를 사용할 수 있습니다.","leaderboard.pro.tooltip":"Pro 회원입니다. 순위는 계속 사용량을 기준으로 합니다.","cloud.feature.pro_identity":"Cloud 아바타 테두리와 배지. 순위는 계속 사용량을 기준으로 합니다.","cloud.prompt.deadline_active":"Cloud는 {{date}}까지 사용할 수 있습니다. 갱신 상태는 계정 청구 정보를 확인하세요. 이용 기간이 끝나도 로컬 데이터를 사용할 수 있습니다.","sessions.filter.model_all":"모든 모델","sessions.filter.model_search":"모델 검색…","sessions.filter.model_empty":"일치하는 모델 없음","sessions.filter.model_aria":"세션 모델로 필터링","sessions.filter.range_custom":"직접 지정","sessions.filter.from":"시작 날짜","sessions.filter.to":"종료 날짜","sessions.filter.clear":"필터 초기화","sessions.group.aria":"세션 그룹화","sessions.group.time":"날짜별","sessions.group.project":"프로젝트별","sessions.group.unknown_date":"날짜 알 수 없음","sessions.sort.aria":"세션 정렬","sessions.sort.recent":"최근순","sessions.sort.cost":"비용 높은 순","sessions.sort.tokens":"토큰 많은 순","sessions.summary.count":"일치하는 세션","sessions.summary.scope":"시간별 사용량이 있는 세션은 선택한 날짜의 토큰과 비용을 합산합니다. 사용량 버킷이 없으면 전체 기간 합계를 유지합니다. 턴 수, 시간, 성능은 전체 세션을 설명합니다. 각 세션과 하위 에이전트는 한 번만 집계합니다.","sessions.summary.speed":"추정 속도","sessions.performance.speed":"약 {{speed}} tok/s","sessions.performance.samples":"유효한 요청 시간 샘플 {{count}}개","sessions.performance.method":"출력 토큰 ÷ 추정 요청 시간입니다. 응답 대기는 포함하고 도구 실행과 유휴 시간은 제외합니다. 순수 생성 속도는 아닙니다.","sessions.performance.first_response":"첫 응답 대기","sessions.performance.first_response_value":"{{seconds}}초 · 샘플 {{count}}개","sessions.performance.first_response_method":"도구가 보고한 첫 토큰 대기 시간의 평균입니다. Codex는 턴 전체를 측정하며 한 턴에 여러 모델 호출이 포함될 수 있습니다.","sessions.detail.open_aria":"{{title}} 통계 보기","sessions.detail.title":"세션 통계","sessions.detail.close":"세션 통계 닫기","sessions.detail.tokens":"토큰 구성","sessions.detail.models":"모델과 비용","sessions.detail.own":"현재 세션","sessions.detail.subagents":"하위 에이전트","sessions.detail.signals":"기록된 활동","sessions.detail.retries":"반복 요청","sessions.detail.tools":"도구 호출","sessions.detail.tool_failures":"도구 실패","sessions.detail.errors":"오류","sessions.detail.model_calls":"모델 호출","sessions.detail.compactions":"컨텍스트 압축","sessions.detail.cost_source":"비용 출처","sessions.detail.cost_reported":"도구 보고","sessions.detail.cost_estimated":"모델 가격으로 추정","sessions.detail.cost_mixed":"도구 보고와 가격 추정 혼합","sessions.detail.cost_unknown":"보고되지 않음","sessions.detail.pricing_unpriced":"공개 가격 없음","sessions.detail.pricing_free":"무료 모델","sessions.detail.pricing_rates":"기본 요금, USD / 100만 토큰 · 입력 {{input}} · 출력 {{output}} · 캐시 읽기 {{cacheRead}} · 캐시 쓰기 {{cacheWrite}}. 구간별 요금과 우선 처리 요금은 다를 수 있습니다.","sessions.detail.reasoning_note":"추론 토큰은 참고용이며 출력 토큰에 이미 포함될 수 있습니다.","sessions.detail.no_speed":"신뢰할 수 있는 시간 샘플 없음","usage.filter.source_all":"모든 도구","dashboard.cost_breakdown.method":"모델 요금은 API에 해당하는 비용을 추정하며 구독 지출을 의미하지 않습니다. 도구가 보고한 비용을 우선하고, 요금이 없는 사용량은 비용에서 제외합니다.","dashboard.cost_breakdown.reported":"도구가 보고한 비용","dashboard.cost_breakdown.mixed":"도구 보고 비용과 모델 추정 혼합","dashboard.cost_breakdown.estimated":"모델 가격으로 추정","dashboard.cost_breakdown.unpriced":"요금을 찾지 못했습니다. 토큰 수는 유지되지만 비용은 알 수 없습니다.","dashboard.cost_breakdown.no_token_charge":"이 데이터 출처 또는 모델에는 토큰 요금이 없습니다","dashboard.cost_breakdown.unpriced_label":"가격 미정","dashboard.cost_breakdown.token_mix":"입력 {{input}} · 출력 {{output}} · 캐시 읽기 {{read}} · 캐시 쓰기 {{write}}","dashboard.cost_breakdown.rates":"기본 요금, USD / 100만 토큰 · 입력 {{input}} · 출력 {{output}} · 캐시 읽기 {{read}} · 캐시 쓰기 {{write}}. 구간별 요금과 우선 처리 요금은 다를 수 있습니다.","dashboard.cost_breakdown.known_subtotal":"확인된 비용 소계","dashboard.cost_breakdown.rate_unknown":"요금 정보 없음","sessions.detail.not_recorded":"기록되지 않음","sessions.detail.pricing_litellm":"LiteLLM 요금","sessions.detail.pricing_curated":"관리되는 요금표","sessions.page.summary":"로컬 세션, 사용량과 예상 비용.","sessions.filter.range_label_all":"전체 기간","sessions.summary.scope_help":"집계 기준 보기","sessions.col.session":"세션 / 프로젝트","sessions.col.speed":"속도","sessions.col.actions":"작업","sessions.detail.consumption":"사용량과 비용","sessions.detail.pricing_details":"요금 상세","sessions.detail.identifiers":"세션 식별 정보","sessions.detail.session_id":"세션 ID","sessions.detail.local_path":"로컬 경로","sessions.detail.resume_command":"재개 명령","sessions.performance.first_response_value_single":"{{seconds}}초 · 표본 {{count}}개","cloud.export.open":"Cloud 사용량 내보내기","cloud.export.description":"일별 합계 · UTC 날짜 · USD 비용 추정","cloud.export.from":"시작 날짜 (UTC)","cloud.export.to":"종료 날짜 (UTC)","cloud.export.csv":"CSV 다운로드","cloud.export.json":"JSON 다운로드","cloud.export.busy":"Cloud 권한을 확인하고 파일을 준비하고 있습니다…","cloud.export.error_auth":"다시 로그인한 후 내보내기를 재시도하세요.","cloud.export.error_access":"이 Cloud 기록은 더 이상 내보낼 수 없습니다.","cloud.export.error_dates":"유효한 날짜 범위를 선택하세요.","cloud.export.error_changed":"계정, 백엔드, 날짜 또는 권한이 변경되었습니다. 내보내기를 다시 시도하세요.","cloud.export.error_failed":"내보내기에 실패했습니다. CSV 또는 JSON을 다시 시도하세요.","cloud.export.success":"{{from}}~{{to}}의 기록이 있는 {{count}}일을 다운로드했습니다 (UTC).","cloud.export.empty":"기록이 있는 날짜가 없습니다. 파일에는 범위 정보만 있고 사용량 행은 없습니다.","cloud.export.truncated":"읽을 수 있는 {{from}}~{{to}} (UTC)만 다운로드했습니다. 원래 선택한 범위도 파일에 기록됩니다.","cloud.export.dashboard":"대시보드 보기","cloud.renewal.auto":"자동 갱신됩니다. 언제든 취소할 수 있으며 결제한 기간은 유지됩니다.","cloud.renewal.manual":"한 번만 결제합니다. 자동 갱신되지 않습니다.","cloud.action.create_checkout":"결제하기 · {{amount}}","cloud.checkout.review":"요금제와 결제 조건을 확인하세요. Waffo에서 결제 전에 최종 금액을 표시합니다.","cloud.action.buy_pro":"Cloud 구매","cloud.price.fixed_monthly_total":"한 번 결제하여 한 달간 이용합니다.","cloud.price.fixed_annual_total":"한 번 결제하여 일 년간 이용합니다. 월 {{equivalent}}에 해당합니다.","cloud.checkout.help_title":"결제에 문제가 있나요?","cloud.faq.cost_title":"Cloud는 왜 유료인가요?","cloud.faq.cost_body":"사용량이 늘어나면 공식 호스팅 동기화, 저장 공간, 대역폭, 백업 및 유지 관리에 지속적인 자원이 필요합니다. Cloud 구독은 이 서비스와 장기적인 유지 관리를 지원합니다. 로컬 앱의 모든 기능은 계속 무료이며 오픈 소스입니다.","cloud.plan.local_community":"리더보드, 업적 및 공개 프로필","cloud.plan.monthly_equivalent":"월 {{equivalent}} 상당","cloud.plan.sync":"{{minutes}}분마다 자동 동기화","cloud.plan.hourly_history":"{{days}}일간 시간별 사용량 내역","cloud.plan.daily_history":"{{months}}개월 일별 기록 및 내보내기","cloud.plan.identity":"Cloud 아바타 프레임 및 배지","cloud.plan.faq_title":"요금제에 대해 궁금한 점","cloud.plan.details_title":"Cloud에는 어떤 기능이 포함되나요?","cloud.plan.self_host_summary":"자체 서버에 배포할 수 있습니다. 소프트웨어는 무료이며 호스팅과 유지보수는 직접 관리합니다. 기술 프리뷰입니다.","cloud.page.title":"요금제 선택","cloud.page.subtitle":"로컬 통계는 무료입니다. Cloud로 기기 간 동기화와 기록을 관리하세요.","cloud.action.try":"{{days}}일 무료 체험","cloud.plan.renewal_hint":"· 언제든 취소 가능","cloud.plan.renewal_off":"· 일회성 결제","cloud.feature.analysis_detail":"기기별 사용량을 집계하고 브라우저에서 비용 추정, 추세, 제공업체 및 모델별 내역을 확인하세요.","cloud.faq.platform_body":"하나의 멤버십으로 동일 계정의 CLI, macOS, Windows, Linux 및 웹을 이용할 수 있습니다. 플랫폼별 결제는 필요하지 않습니다.","cloud.prompt.sync":"Cloud는 각 기기의 변경된 사용량을 15분마다 동기화합니다. 무료 커뮤니티 업로드는 선택한 1개 기기에서 매일 계속됩니다.","cloud.prompt.devices":"무료 커뮤니티 업로드는 선택한 1개 기기를 사용합니다. Cloud는 여러 기기 동기화를 지원하며 기기를 일시 중지해 무료 업로드를 계속할 수도 있습니다.","cloud.plan.skip_trial":"Cloud 구매","cloud.plan.anywhere":"모든 기기의 사용량을 브라우저에서 확인","cloud.plan.retained_history":"{{days}}일간 시간별 내역 · {{months}}개월 일별 기록","cloud.onboarding.local_next":"설정 → 개인 → Cloud에서 동기화를 켜면 이 기기를 연결할 수 있습니다. 다른 컴퓨터에서도 같은 계정으로 로그인하면 사용량을 모아 볼 수 있습니다.","cloud.onboarding.web_next":"각 컴퓨터의 TokenTracker 앱에서 이 계정으로 로그인하고 설정 → 개인 → Cloud에서 동기화를 켜면 사용량이 여기에 표시됩니다.","cloud.error.subscription_exists":"이미 활성 구독이 있습니다. 다른 요금제를 선택하기 전에 설정 → 개인 → Cloud에서 관리하세요.","cloud.error.request_conflict":"이전 구매가 아직 확인되지 않았습니다. 다른 구매를 시작하기 전에 설정 → 개인 → Cloud에서 해당 주문을 재개하세요.","cloud.error.machines":"이 계정이 Cloud 동기화 기기 한도에 도달했습니다. 설정 → 개인 → Cloud에서 기기 목록을 확인하세요.","cloud.error.machine_paused":"이 기기는 일시 중지되었습니다. 다시 동기화하기 전에 설정 → 개인 → Cloud에서 재개하세요.","cloud.checkout.refunded_detail":"이 결제의 전액 환불이 서버에서 확인되었습니다. 설정 → 개인 → Cloud에서 현재 이용 권한과 결제 내역을 확인하세요.","cloud.action.setup_sync":"Cloud 동기화 설정","cloud.login.trial_context":"로그인하여 Cloud 체험을 시작하세요. 선택한 요금제가 저장되어 있습니다.","cloud.login.purchase_context":"로그인하여 Cloud 구매를 계속하세요. 선택한 요금제가 저장되어 있습니다.","cloud.membership.payment_due":"갱신 결제를 확인해야 합니다. 청구서에서 결제 상태를 확인하거나 결제 수단을 업데이트하세요.","cloud.plan.trial_setup_hint":"체험을 시작한 뒤 컴퓨터에서 Cloud 동기화를 켜세요.","cloud.trial.disclosure":"{{date}}까지 {{days}}일 동안 Cloud를 무료로 체험하세요. 자동 결제는 없습니다.","cloud.trial.used_hint":"무료 체험을 이미 사용했어요. Cloud 요금제를 선택하고 계속 이용하세요.","cloud.gift.done":"완료","cloud.free.device_scope":"현재 기기의 사용량만 집계","cloud.plan.includes_local":"무료 로컬 기능 모두 포함","cloud.plan.device_sync":"기기 수 제한 없이 사용량 통합·동기화","cloud.plan.device_fair_use":"일상적인 개인 사용은 기기 수 제한이나 기기별 추가 요금이 없습니다. 대량 또는 비정상적인 기기 연결에는 동기화 보호가 적용될 수 있습니다."},iD={"landing.handle.default":"VIBE_USER","landing.handle.special":"VOLT","landing.screenshot.alt":"TokenTracker 대시보드 스크린샷","landing.nav.login":"로그인","landing.nav.signup":"회원가입","landing.install.command":"npx --yes tokentracker-cli","landing.install.action.copy":"명령 복사","landing.install.action.copied":"복사됨","landing.meta.title":"Token Tracker — AI Agent CLI를 위한 토큰 사용량 추적기","landing.meta.description":"Claude Code, Cursor, Codex 등의 토큰 사용량을 자동으로 모니터링하세요. 로컬 우선, 개인정보 보호 중심, 수동 설정 불필요.","landing.meta.og_site_name":"Token Tracker","landing.meta.og_type":"website","landing.meta.og_image":"https://www.tokentracker.cc/dashboard-dark.png","landing.meta.og_url":"https://www.tokentracker.cc/","landing.meta.twitter_card":"summary_large_image","share.meta.title":"Token Tracker 공유","share.meta.description":"모델, 프로젝트, 기간별 토큰 사용량 인사이트가 담긴 Token Tracker 대시보드 스냅샷을 공유하세요.","share.meta.og_site_name":"Token Tracker","share.meta.og_type":"website","share.meta.og_image":"https://www.tokentracker.cc/dashboard-dark.png","share.meta.og_url":"https://www.tokentracker.cc/share","share.meta.twitter_card":"summary_large_image","landing.handle.placeholder":"'{{handle}}' 입력해 보기","landing.rank.expectation":"예상 순위: {{rank}}","landing.rank.singularity":"정점","landing.rank.unranked":"순위 없음","landing.cta.primary":"대시보드 보기","landing.cta.secondary":"GitHub","landing.v2.hero.title_line1":"모든 AI 토큰을","landing.v2.hero.title_line2":"한눈에 추적","landing.v2.install.mac_cta":"macOS용 다운로드","landing.v2.install.win_cta":"Windows용 다운로드","landing.v2.install.desktop_cta":"데스크톱 앱 다운로드","landing.v2.install.os_macos":"macOS","landing.v2.install.os_windows":"Windows","landing.v2.install.availability":"macOS 및 Windows 지원","landing.v2.models.title":"지원하는 AI CLI 도구","landing.v2.compare.kicker":"매끄러운 추적","landing.v2.compare.title":"AI 사용량을 더 이상 추측하지 마세요.","landing.v2.compare.subtitle":"AI CLI 도구는 원본 사용량 데이터를 흩어진 로컬 파일에 숨겨둡니다. TokenTracker는 이를 로컬 퍼스트 대시보드로 실시간 정리합니다.","landing.v2.distill.body":"100% 로컬 처리. 프롬프트나 코드는 절대 수집하지 않습니다.","landing.v2.compare.with.title":"TOKEN TRACKER 사용 시","landing.v2.compare.with.p1":"통합된 사용량 대시보드","landing.v2.compare.with.p2":"실시간 토큰 지표","landing.v2.compare.with.p3":"100% 로컬, 개인정보 보장","landing.v2.compare.with.p4":"멀티 클라이언트 터미널 감사 추적","landing.v2.compare.without.title":"사용하지 않을 때","landing.v2.compare.without.p1":"흩어진 JSON 로그 파일","landing.v2.compare.without.p2":"토큰 소비량에 대한 깜깜이","landing.v2.compare.without.p3":"예상치 못한 API 청구서","landing.v2.compare.without.p4":"과거 감사 로그 부재","landing.v2.leaderboard.kicker":"글로벌 TOKEN 리더보드","landing.v2.leaderboard.title":"AI Token 효율성","landing.v2.leaderboard.subtitle":"로컬 AI Token 사용량을 익명으로 동기화하여 글로벌 효율성 리더보드에 참여할 수 있습니다. 전 세계 사용자들과 함께 모델 비용 효율성 및 호출 빈도를 벤치마킹하세요.","landing.v2.leaderboard.view_more":"전체 리더보드 보기","landing.v2.footer.line":"Token Tracker — AI를 사용하는 모든 사람을 위해.","landing.v2.nav.status":"상태","landing.v2.nav.privacy":"개인정보","landing.v2.nav.github":"GitHub","landing.v2.models.agent.codex":"CODEX","landing.v2.models.agent.claude_code":"CLAUDE CODE","landing.v2.models.agent.cursor":"CURSOR","landing.v2.models.agent.gemini":"GEMINI","landing.v2.models.agent.opencode":"OPENCODE","landing.v2.models.agent.openclaw":"OPENCLAW","landing.v2.cta.primary":"Dashboard","landing.v2.hero.subtagline":"Claude Code, Cursor, Codex 등의 토큰 사용량을 자동으로 모니터링하세요. 로컬 우선, 개인정보 보호 중심, 수동 설정 불필요.","leaderboard.profile.nav.back":"리더보드","leaderboard.profile.nav.download":"다운로드","leaderboard.title":"리더보드","leaderboard.horizontal_scroll":"리더보드 열을 가로로 스크롤","limits.settings.enable_all":"모두 켜기","limits.settings.disable_all":"모두 끄기","limits.settings.bulk_visibility":"서비스 표시","limits.settings.enabled_count":"서비스 {{total}}개 중 {{enabled}}개 켜짐","limits.zcode.start_grants":"Start 플랜","limits.zcode.grant_amount":"남은 토큰 {{remaining}} / {{total}}","limits.zcode.reset_bank.title":"한도 초기화","limits.zcode.reset_bank.count":"{{count}}회 사용 가능","limits.zcode.reset_bank.earliest":"가장 빠른 만료: {{time}}","leaderboard.range":"UTC {{period}} · {{from}} – {{to}}","leaderboard.range_loading":"UTC {{period}} · …","leaderboard.range.total":"전체 기간","leaderboard.generated_at":"{{ts}} 업데이트됨","leaderboard.period.week":"주","leaderboard.period.month":"월","leaderboard.period.total":"전체","leaderboard.me_label":"나","leaderboard.anon_label":"익명","leaderboard.error.unknown":"알 수 없는 오류","leaderboard.loading":"불러오는 중…","leaderboard.empty":"데이터 없음","leaderboard.column.rank":"순위","leaderboard.column.user":"사용자","leaderboard.column.total":"전체","leaderboard.column.codex":"Codex","leaderboard.column.claude":"Claude","leaderboard.column.gemini":"Gemini","leaderboard.column.cursor":"Cursor","leaderboard.column.opencode":"OpenCode","leaderboard.column.openclaw":"OpenClaw","leaderboard.column.hermes":"Hermes","leaderboard.column.kiro":"Kiro","leaderboard.column.copilot":"GitHub Copilot","leaderboard.column.kimi":"Kimi Code","leaderboard.column.supplemental":"기타","leaderboard.column.est_cost":"예상 비용","leaderboard.signin_prompt":"로그인하여 리더보드에 참여하세요","leaderboard.signin_button":"로그인","leaderboard.sync_prompt":"클라우드 동기화를 켜면 순위에 표시됩니다","leaderboard.sync_button.idle":"켜고 동기화","leaderboard.sync_button.busy":"동기화 중...","leaderboard.pagination.page_size_label":"페이지당 행 수","leaderboard.pagination.prev":"이전","leaderboard.pagination.next":"다음","leaderboard.pagination.ellipsis":"…","leaderboard.pagination.page_unknown":"{{page}} 페이지","share.modal.title":"내 통계 공유","share.modal.subtitle":"포스터 스타일 카드를 생성해 어디든 공유하세요.","share.modal.close":"닫기","share.modal.action.x":"X에 공유","share.modal.action.download":"다운로드","share.modal.action.copy":"이미지 복사","share.modal.hint.x":"트윗에 이미지 붙여넣기","share.modal.hint.copy":"클립보드로","share.modal.name_label":"표시 이름","share.modal.name_placeholder":"이름을 입력하세요","share.modal.style_label":"스타일","share.modal.footer":"데이터는 항상 로컬에 보관됩니다 — 이미지는 브라우저에서 생성되며 절대 업로드되지 않습니다.","share.button.label":"공유","share.button.aria":"공유 카드 열기","share.toast.copied":"이미지가 클립보드에 복사되었습니다","share.toast.downloaded":"이미지가 저장되었습니다","share.toast.failed":"이미지를 생성하지 못했습니다","share.toast.working":"생성 중…","share.variant.neon":"네온","share.variant.broadsheet":"특집","share.date.month_year":"{{year}}년 {{month}}","share.issue.all_time":"전체 기간","share.month_short.jan":"1월","share.month_short.feb":"2월","share.month_short.mar":"3월","share.month_short.apr":"4월","share.month_short.may":"5월","share.month_short.jun":"6월","share.month_short.jul":"7월","share.month_short.aug":"8월","share.month_short.sep":"9월","share.month_short.oct":"10월","share.month_short.nov":"11월","share.month_short.dec":"12월","share.hook.top_loyal":"{{percent}}%를 {{name}}에 집중.","share.hook.days_record":"{{days}}일 기록.","share.hook.top_led":"{{name}} 선두 ({{percent}}%).","share.hook.multi_models":"{{count}}개 모델, {{days}}일에 걸쳐.","share.hook.days_with_model":"{{name}}와(과) 함께한 {{days}}일.","share.hook.new_chapter":"새로운 장의 시작.","share.card.broadsheet.issue":"호","share.card.broadsheet.by":"작성자","share.card.broadsheet.tracked_since":"추적 시작","share.card.broadsheet.total_tokens":"총 토큰","share.card.broadsheet.estimated_spend":"예상 지출","share.card.broadsheet.billable_days":"활동 {{days}}일","share.card.broadsheet.heatmap_title":"올해의 인쇄본","share.card.broadsheet.heatmap_days_on_record":"{{active}} / {{total}}일 기록","share.card.broadsheet.roster_title":"모델 명단","share.card.broadsheet.roster_subtitle":"정기적으로 사용하는 모델","share.card.broadsheet.empty":"한산한 한 주 — 윤전기가 조용했습니다.","share.card.broadsheet.global_rank":"전체 순위","share.card.broadsheet.active_days":"활동","share.card.broadsheet.days_count":"{{days}}일","share.card.broadsheet.track_yours":"내 것도 추적하기","share.card.annual.report_title":"토큰 리포트","share.card.annual.less":"적음","share.card.annual.more":"많음","share.card.annual.heatmap_title":"토큰 사용량 히트맵","share.card.annual.total_tokens":"총 토큰","share.card.annual.estimated_cost":"예상 비용","share.card.annual.longest_streak":"최장 연속","share.card.annual.days_count":"{{days}}일","share.card.annual.top_model":"인기 모델"},lD={"header.auth.sign_in_aria":"Anmelden","login.back_home":"Zurück zur Startseite","login.cloud_only":"Kein Cloud-Login konfiguriert. Nutze das lokale Dashboard unter localhost.","login.title":"Anmelden","login.subtitle":"Wähle E-Mail oder ein verbundenes Konto.","login.dismiss":"Schließen","login.verify_email_success":"E-Mail-Adresse bestätigt. Du kannst dich jetzt anmelden.","login.verify_email_pending":"Bitte schließe die E-Mail-Bestätigung vor der Anmeldung ab.","login.oauth.continue":"Weiter mit {{provider}}","login.oauth.desktop_start_failed":"Die Desktop-Anmeldung konnte nicht gestartet werden. Bitte versuche es erneut.","login.divider":"oder","login.tab.sign_in":"Anmelden","login.tab.sign_up":"Registrieren","login.field.name":"Anzeigename","login.field.name_placeholder":"Optional","login.field.email":"E-Mail-Adresse","login.field.password":"Passwort","login.password_hint":"Mindestens {{min}} Zeichen.","login.submit.sign_in":"Per E-Mail anmelden","login.submit.sign_up":"Konto erstellen","auth.callback.processing":"Verarbeitung läuft…","auth.callback.success":"Erfolgreich angemeldet","auth.callback.redirecting":"Weiterleitung zu TokenTracker…","auth.callback.failed":"Anmeldung fehlgeschlagen. Bitte versuche es erneut.","auth.callback.close":"Diese Seite schließen","login_modal.subtitle":"Anmelden, um am Leaderboard teilzunehmen","login_modal.continue_email":"Per E-Mail fortfahren","login_modal.divider_email":"E-Mail","shared.placeholder.short":"--","shared.unit.percent":"%","shared.unit.thousand_abbrev":"K","shared.unit.million_abbrev":"Mio.","shared.unit.billion_abbrev":"Mrd.","shared.unit.trillion_abbrev":"Bio.","shared.data_source":"Datenquelle: {{source}}","shared.error.prefix":"Fehler: {{error}}","shared.status.unsynced":"—","shared.time.now":"Gerade eben","error.boundary.title":"Ein Fehler ist aufgetreten","error.boundary.subtitle":"Diese Ansicht konnte nicht gerendert werden","error.boundary.hint":"Öffne die Konsole und lade die Seite neu","error.boundary.no_details":"Keine Fehlerdetails verfügbar","error.boundary.action.reload":"Neu laden","identity_card.rank_label":"Beginn","identity_card.streak_label":"Aktive Tage","identity_card.rank_placeholder":"—","identity_card.streak_value":"{{days}} Tage","usage.summary.total":"Token insgesamt","usage.period.day":"Tag","usage.period.week":"Woche","usage.period.month":"Monat","usage.period.total":"Gesamt","usage.period.custom":"Benutzerdefiniert","usage.metric.total":"Gesamt","usage.metric.input":"Eingabe","usage.metric.output":"Ausgabe","usage.metric.cached_input":"Zwischengespeicherte Eingabe","usage.metric.reasoning_output":"Reasoning-Ausgabe","usage.button.refresh":"Aktualisieren","usage.overview.tablist_aria":"Zeitraum","usage.overview.cost_breakdown_aria":"Kostenaufschlüsselung anzeigen","usage.overview.distribution_aria":"Verteilung nach Quelle: {{items}}","usage.overview.distribution_item":"{{label}} {{percent}}%","usage.overview.provider_card_aria":"{{provider}}: {{percent}}%, {{tokens}} Token, {{cost}}. Klicken für {{action}}-Details","usage.overview.expand":"Ausklappen","usage.overview.collapse":"Einklappen","usage.overview.model_count":"{{count}} Modelle","usage.overview.model_details_aria":"Modelldetails für {{provider}}","widgets.page.title":"Menüleiste & Widgets","widgets.cta.open_gallery":"Widget-Galerie öffnen","widgets.cta.download":"Mac App herunterladen","widgets.cta.macos_only":"Nur macOS","widgets.menubar.section.title":"Menüleiste","widgets.gallery.section.title":"Desktop-Widgets","widgets.summary.name":"Nutzungsübersicht","widgets.summary.description":"Nutzung von heute und den letzten 7 Tagen mit kompaktem Trend.","widgets.heatmap.name":"Heatmap","widgets.heatmap.description":"Aktive und inaktive Tage auf einen Blick, ähnlich wie bei GitHub.","widgets.topModels.name":"Top-Modelle","widgets.topModels.description":"Häufig genutzte Modelle, sortiert nach Token-Anteil.","widgets.limits.name":"Nutzungslimits","widgets.limits.description":"Echtzeit-Rate-Limit-Status für Claude, Codex, Cursor, Gemini u. a.","daily.sort.date.label":"Datum","daily.sort.date.title":"Nach Datum sortieren","daily.sort.total.label":"Gesamt","daily.sort.total.title":"Nach Gesamtwert sortieren","daily.sort.input.label":"Eingabe","daily.sort.input.title":"Nach Eingabe sortieren","daily.sort.output.label":"Ausgabe","daily.sort.output.title":"Nach Ausgabe sortieren","daily.sort.cached.label":"Cache","daily.sort.cached.title":"Nach Cache sortieren","daily.sort.reasoning.label":"Reasoning","daily.sort.reasoning.title":"Nach Reasoning sortieren","daily.sort.conversations.label":"Gespräche","daily.sort.conversations.title":"Nach Gesprächen sortieren","details.pagination.prev":"Vorherige Seite","details.pagination.next":"Nächste Seite","limits.copilot.otelHint.title":"Copilot-Token-Nutzung verfolgen","limits.copilot.otelHint.body":"Limit-Informationen werden über das GitHub OAuth-Token gelesen. Um die Token-Nutzung pro Token aufzuzeichnen, aktiviere den OpenTelemetry-Export von Copilot und füge Folgendes zu deiner Shell-Konfigurationsdatei (~/.zshrc oder ~/.bashrc) hinzu:","limits.copilot.otelHint.copy":"Kopieren","limits.copilot.otelHint.copied":"Kopiert","limits.panel.title":"Nutzungslimits","limits.panel.mode_separator":" · ","limits.page.refresh":"Limits aktualisieren","limits.page.refresh_loading":"Limits werden aktualisiert…","limits.page.refreshed_at":"Limits aktualisiert: {{time}}","limits.page.refresh_failed":"Limits konnten nicht aktualisiert werden.","limits.page.refresh_partial":"Limits um {{time}} aktualisiert, aber einige Daten stammen noch aus dem Cache oder konnten nicht aktualisiert werden.","limits.page.refresh_stale":"Aktualisierung abgeschlossen, aber alle Anbieter melden weiterhin Cache- oder Fehlerdaten.","limits.label.cursor_plan":"Plan","limits.label.cursor_grok_bot":"Grok-Bot","limits.label.cursor_auto":"Auto","limits.label.cursor_api":"API","limits.label.kiro_month":"Monatlich","limits.label.kiro_bonus":"Bonus","limits.label.kiro_tracked_credits":"Lokale Nutzung: {{credits}} Credits · {{count}} Turns","limits.label.kimi_weekly":"Woche","limits.label.kimi_5h":"5h","limits.label.kimi_total":"Gesamt","limits.label.kimi_parallel":"Parallel: {{count}}","limits.label.copilot_premium":"Premium","limits.label.copilot_chat":"Chat","limits.status.not_connected":"Nicht verbunden","limits.status.no_data":"Keine Echtzeit-Limitdaten zurückgegeben","limits.opencodeGo.status.inactive":"Das OpenCode-Go-Abonnement ist inaktiv","limits.opencodeGo.setupHint.title":"OpenCode Go verbinden","limits.opencodeGo.setupHint.subtitle":"Liest deine OpenCode-Go-Nutzung über die offizielle API (opencode.ai/zen/go/v1/usage).","limits.opencodeGo.setupHint.step1":"Melde dich bei opencode.ai an und abonniere Go.","limits.opencodeGo.setupHint.cta":"opencode.ai öffnen","limits.opencodeGo.setupHint.step2":"Erstelle in der Konsole einen API-Schlüssel und kopiere ihn.","limits.opencodeGo.setupHint.step3":"Führe diesen Befehl aus, füge deinen Schlüssel ein (die Eingabe bleibt unsichtbar) und starte TokenTracker neu:","limits.opencodeGo.setupHint.note_app":"macOS-App: die launchctl-setenv-Zeile verwenden, dann die App neu öffnen.","limits.opencodeGo.setupHint.copy":"Kopieren","limits.opencodeGo.setupHint.copied":"Kopiert","limits.status.all_hidden":"Alle Limit-Anbieter sind ausgeblendet. Öffne die Anzeigeeinstellungen, um sie wieder einzublenden.","nav.usage":"Nutzung","nav.limits":"Limits","nav.widgets":"Menüleiste & Widgets","nav.skills":"Skills","nav.leaderboard":"Leaderboard","nav.collapse":"Seitenleiste einklappen","nav.expand":"Seitenleiste ausklappen","nav.menu":"Navigationsmenü öffnen","nav.close_menu":"Navigationsmenü schließen","nav.aside_label":"Hauptnavigation","nav.nav_label":"Navigation","limits.page.subtitle":"Rate-Limits und Kontingentnutzung deiner KI-Tools.","limits.settings.toggle_visible":"Sichtbarkeit umschalten","limits.settings.display_mode_label":"Nutzungsanzeige","limits.settings.display_mode_used":"Verbraucht","limits.settings.display_mode_remaining":"Verbleibend","limits.page.openSettings":"Anzeigeeinstellungen","nav.group.general":"Allgemein","nav.group.tools":"Tools","nav.group.account":"Konto","nav.settings":"Einstellungen","header.auth.open_settings":"Einstellungen öffnen","settings.page.title":"Einstellungen","settings.page.subtitle":"Verwalte dein Konto, Erscheinungsbild und Anzeigeeinstellungen.","settings.section.appearance":"Erscheinungsbild","settings.section.account":"Konto","settings.section.limits":"Limit-Anzeige","settings.section.network":"Netzwerk","settings.network.mode.label":"Ausgehender Proxy","settings.network.mode.hint":"Lege fest, wie Token Tracker für Cloud-Sync ins Internet geht. App-Updates folgen immer dem System-Proxy.","settings.network.mode.system":"System","settings.network.mode.manual":"Manuell","settings.network.mode.off":"Aus","settings.network.protocol.label":"Protokoll","settings.network.protocol.http":"HTTP","settings.network.protocol.https":"HTTPS","settings.network.protocol.socks5":"SOCKS5","settings.network.host.label":"Host","settings.network.host.placeholder":"127.0.0.1","settings.network.port.label":"Port","settings.network.port.placeholder":"7890","settings.network.test":"Verbindung testen","settings.network.test.testing":"Teste…","settings.network.test.ok":"Test-URL erreicht (HTTP {{status}}).","settings.network.test.fail":"Keine Verbindung: {{error}}","settings.network.save":"Speichern","settings.network.saving":"Speichern…","settings.network.saved":"Proxy-Einstellungen gespeichert.","settings.network.error.host":"Host ohne http:// und ohne Pfad eingeben.","settings.network.error.port":"Port zwischen 1 und 65535 eingeben.","settings.network.effective.manual":"Der manuelle Proxy wird verwendet.","settings.network.effective.env":"Ein Proxy aus Umgebungsvariablen wird verwendet.","settings.network.effective.system":"Der System-Proxy wird verwendet.","settings.network.effective.none":"Aktuell direkte Verbindung.","settings.network.effective.blocked":"Ausgehender Verkehr ist blockiert: Der manuelle Proxy konnte nicht angewendet werden.","settings.network.apply_error":"Der gespeicherte Proxy konnte nicht angewendet werden: {{error}}. Der Proxy ist nicht wirksam und ausgehender Verkehr ist blockiert. Prüfe die Proxy-Einstellungen.","settings.network.save_error":"Proxy-Einstellungen konnten nicht gespeichert werden: {{error}}","settings.network.save_error_unprotected":"Proxy-Einstellungen konnten nicht gespeichert werden: {{error}}. Der ausgehende Verkehr ist aktuell ungeschützt – selbst die Blockierung ist fehlgeschlagen.","settings.limits.providers":"Anbieter","settings.appearance.theme.label":"Design","settings.appearance.theme.hint":"Wähle, wie das TokenTracker-Dashboard dargestellt werden soll.","settings.appearance.theme.light":"Hell","settings.appearance.theme.dark":"Dunkel","settings.appearance.theme.system":"System","settings.appearance.language.label":"Sprache","settings.appearance.language.hint":"Bei „System“ wird standardmäßig die Sprache des Terminals verwendet.","settings.appearance.language.system":"System","settings.appearance.language.english":"Englisch","settings.appearance.language.german":"Deutsch","settings.appearance.language.chinese":"Chinesisch (Vereinfacht)","settings.appearance.language.traditional_chinese":"Chinesisch (Traditionell)","settings.appearance.language.japanese":"Japanisch","settings.appearance.language.korean":"Koreanisch","settings.appearance.currency.label":"Währung","settings.appearance.currency.hint":"Wähle die Währung für die Anzeige der Nutzungskosten.","settings.appearance.token_format.label":"Token-Zahlen","settings.appearance.token_format.hint":"Verwende kompakte oder vollständige Zahlen überall. Bei kompakten Werten zeigt Hover die exakte Zahl.","settings.appearance.token_format.compact":"Kompakt","settings.appearance.token_format.full":"Vollständig","settings.appearance.token_unit.label":"Zahlen-Einheiten","settings.appearance.token_unit.hint":"Kompakte Zahlen nutzen K/M/B oder Wan/Yi. Vollständige Zahlen verwenden keine Einheiten.","settings.appearance.token_unit.english":"K/M/B","settings.appearance.token_unit.chinese":"Wan/Yi (chinesisch)","settings.appearance.currency.opt.usd":"US-Dollar ($)","settings.appearance.currency.opt.eur":"Euro (€)","settings.appearance.currency.opt.gbp":"Britisches Pfund (£)","settings.appearance.currency.opt.cny":"Chinesischer Yuan (¥)","settings.appearance.currency.opt.jpy":"Japanischer Yen (¥)","settings.appearance.currency.opt.hkd":"Hongkong-Dollar (HK$)","settings.appearance.currency.rate_source.default":"Integrierte Standard-Wechselkurse","settings.appearance.currency.rate_source.fetched":"Datenquelle: open.er-api.com","settings.appearance.currency.rate_updated":"Aktualisiert {{when}}","settings.appearance.currency.rate_never":"Noch nicht aktualisiert","settings.account.displayName":"Anzeigename","settings.account.edit":"Bearbeiten","settings.account.save":"Speichern","settings.account.saving":"Wird gespeichert…","settings.account.cancel":"Abbrechen","settings.account.userId":"Benutzer-ID","settings.account.copyUserId":"Benutzer-ID kopieren","settings.account.copy":"Kopieren","settings.account.copied":"Kopiert","settings.account.cloudSync":"Cloud-Synchronisation","settings.account.cloudSyncHint":"Synchronisiere die Nutzungsdaten dieses Computers, um alle Geräte gemeinsam auszuwerten. Prompts, Code und Zugangsdaten der Anbieter bleiben lokal.","settings.account.cloudSyncPending":"Synchronisierung wird versucht…","settings.account.cloudSyncError":"Die Synchronisierung konnte nicht abgeschlossen werden. Prüfe Netzwerkverbindung, lokalen Dienst und Anmeldung und versuche es erneut. Lokale Aufzeichnungen bleiben erhalten.","settings.account.publicProfile":"Öffentliches Profil","settings.account.publicProfileHint":"Zeige deine Nutzung auf dem öffentlichen Leaderboard an.","settings.account.displayNameAnonymousHint":"Im anonymen Modus werden dein Name und Avatar auf dem Leaderboard ausgeblendet","settings.account.displayNameDisabledWhileAnon":"Deaktiviere den anonymen Modus, bevor du deinen Namen bearbeitest","settings.account.githubUrl":"GitHub-Profil","settings.account.githubUrlHint":"Zeige einen GitHub-Link neben deinem Namen auf dem Leaderboard an.","settings.account.githubUrlPlaceholder":"Benutzername oder https://github.com/benutzername","settings.account.githubUrlInvalid":"Gib einen GitHub-Benutzernamen oder https://github.com/benutzername ein","settings.account.signOut":"Abmelden","settings.account.signIn":"Anmelden","settings.account.signedOutHint":"Melde dich an, um dein öffentliches Profil und deine Kontodaten zu verwalten.","settings.section.account.description":"Öffentliches Profil und Kontodaten.","settings.section.cloud":"Cloud","settings.nav.group.personal":"Persönlich","settings.section.cloud.description":"Cloud-Mitgliedschaft, Abrechnung und Gerätesynchronisierung verwalten.","settings.section.menubar":"Menüleiste","settings.menubar.showStats":"Statistiken in der Menüleiste anzeigen","settings.menubar.showStatsHint":"Zeige heutige Token und Kosten neben dem Menüleistensymbol an.","settings.menubar.iconStyle":"Menüleisten-Icon","settings.menubar.iconStyleHint":"Wähle, wer in der Menüleiste wohnt. Katze und Haustier laufen schneller, während deine KI-Tools Tokens verbrauchen.","settings.menubar.iconStyle.clawd":"Clawd","settings.menubar.iconStyle.cat":"Katze","settings.menubar.iconStyle.pet":"Mein Haustier","settings.menubar.iconStyle.static":"Statisch","pet.menubar.title":"In der Menüleiste laufen lassen","pet.menubar.hint":"Dein Haustier ersetzt das Menüleisten-Icon und sprintet, während deine KI-Tools Tokens verbrauchen.","settings.menubar.appearance":"Menüleisten-Anzeige & Icon","settings.menubar.appearanceHint":"Statistiken, Slots und das animierte Icon werden auf der Seite „Menüleiste & Widgets“ konfiguriert.","settings.menubar.appearanceLink":"Öffnen","settings.menubar.launchAtLogin":"Beim Anmelden starten","settings.menubar.launchAtLoginHint":"Starte TokenTrackerBar automatisch beim Anmelden an macOS.","settings.menubar.syncNow":"Jetzt synchronisieren","settings.menubar.syncNowHint":"Analysiere und lade lokale KI-Tool-Protokolle sofort hoch.","settings.menubar.syncing":"Synchronisiere…","settings.menubar.updates":"Updates","settings.menubar.autoUpdate":"Automatische Updates","settings.menubar.autoUpdateHint":"Neue Versionen im Hintergrund automatisch herunterladen und installieren. Die manuelle Suche bleibt auch deaktiviert verfügbar.","settings.menubar.checkUpdates":"Nach Updates suchen","settings.footer.statusPage":"Systemstatus","leaderboard.github.aria":"GitHub-Profil öffnen","leaderboard.github.tooltipAction":"Klicken, um GitHub-Profil anzuzeigen","leaderboard.github.tooltipPrefix":"Konfiguriere dies in den","leaderboard.github.tooltipSettingsLink":"Einstellungen","leaderboard.github.tooltipSuffix":"","menubar.slot.primary":"Position 1","menubar.slot.secondary":"Position 2","menubar.native_only":"Öffne TokenTrackerBar für macOS, um die Menüleistenanzeige zu bearbeiten.","menubar.metric.today_tokens":"Heutige Token","menubar.metric.none":"Keine (Slot ausblenden)","menubar.metric.today_cost":"Heutige Kosten","menubar.metric.last_7d_tokens":"Letzte 7 Tage Token","menubar.metric.total_tokens":"Token insgesamt","menubar.metric.total_cost":"Kosten insgesamt","menubar.metric.claude_5h":"Claude 5-Stunden-Limit","menubar.metric.claude_7d":"Claude 7-Tage-Limit","menubar.metric.codex_5h":"Codex 5-Stunden-Limit","menubar.metric.codex_7d":"Codex 7-Tage-Limit","nav.ip_check":"Claude IP-Check","nav.service_status":"Service-Status","status.page.subtitle":"Live-Störungsstatus von den offiziellen Statusseiten deiner KI-Anbieter.","status.page.source_note":"Wird direkt im Browser von der öffentlichen Statusseite jedes Anbieters gelesen. Automatische Aktualisierung jede Minute.","status.state.checking":"Prüfe…","status.state.none":"Betriebsbereit","status.state.minor":"Kleinere Störung","status.state.major":"Größere Störung","status.state.critical":"Kritischer Ausfall","status.state.unknown":"Nicht erreichbar","status.open_page":"{{provider}}-Statusseite öffnen","status.refresh":"Aktualisieren","status.last_checked":"Geprüft um {{time}}","skills.page.title":"Skills","skills.tab.my":"Meine","skills.tab.browse":"Durchsuchen","skills.action.refresh":"Aktualisieren","skills.action.install":"Installieren","skills.action.choose_targets":"Ziele auswählen","skills.target.menu_label":"Installationsziel","skills.target.none":"Kein Ziel ausgewählt","skills.toast.installed":"{{name}} in {{targets}} installiert.","skills.action.remove":"Entfernen","skills.action.search":"Suchen","skills.action.search_aria":"Skills durchsuchen","skills.target.synced_summary":"Mit {{targets}} synchronisiert","skills.target.synced_none":"Noch mit keinem Agent synchronisiert","skills.row.open_details":"Details zu {{name}} anzeigen","skills.detail.close":"Details schließen","skills.detail.sync_section_title":"Synchronisationsziele","skills.detail.remove_button":"Von allen Agents entfernen","skills.detail.remove_confirm_hint":"Dadurch wird die Synchronisierung mit jedem Agent aufgehoben und die lokale Kopie gelöscht.","skills.filter.agent_label":"Agent","skills.filter.agent_all":"Alle Agents","skills.filter.clear":"Filter zurücksetzen","skills.filter.result_count":"{{filtered}} / {{total}} Skills","skills.filter.result_count_browse":"{{count}} Ergebnisse","skills.empty.no_match":"Keine Skills entsprechen den aktuellen Filtern.","hint.dismiss":"Hinweis schließen","hint.dismissible_aria":"Schließbarer Hinweis","skills.card.installed":"Installiert","skills.card.targets_prefix":"Installiert in:","skills.card.targets_change":"Ändern","skills.card.installs":"{{count}} Installationen","skills.source.label":"Quelle","skills.source.all":"Alle Repositories","skills.mode.repo":"Repository","skills.mode.skillssh":"skills.sh","skills.browse.placeholder_all":"In allen aktiven Repositories suchen…","skills.browse.placeholder_repo":"In {{repo}} suchen…","skills.browse.placeholder_skillssh":"In skills.sh-Repositories suchen…","skills.browse.empty_sources":"Füge GitHub-Repositories hinzu, um Skills zu durchsuchen.","skills.browse.add_repo_hint":"Mehr Skills gewünscht? Füge ein GitHub-Repository hinzu.","skills.browse.manage_sources":"Quellen verwalten","skills.browse.hint_skillssh":"Gib mindestens 2 Zeichen ein, um in skills.sh zu suchen.","skills.browse.loading_hint":"Rufe Skill-Informationen von GitHub ab. Der erste Ladevorgang kann etwa eine Minute dauern; Ergebnisse werden zwischengespeichert.","skills.error.generic":"Skill-Vorgang fehlgeschlagen.","skills.confirm.remove_title":"{{name}} entfernen?","skills.confirm.remove_managed":"Dieser Skill wird von allen verbundenen KI-Tools entfernt. Dies kann innerhalb weniger Sekunden rückgängig gemacht werden.","skills.confirm.remove_local":"Der Skill-Ordner wird aus allen KI-Tool-Verzeichnissen gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.","skills.toast.removed":"{{name}} entfernt.","shared.action.undo":"Rückgängig","shared.action.cancel":"Abbrechen","skills.empty.my":"Noch keine Skills. Suche oder installiere welche unter „Durchsuchen“.","skills.empty.my_cta":"Zum Durchsuchen","skills.empty.browse":"Keine Skills in dieser Quelle gefunden.","skills.empty.search":"Keine Ergebnisse. Versuche es mit anderen Suchbegriffen.","skills.repo.placeholder":"owner/repository","skills.repo.add":"Repository hinzufügen","skills.repo.invalid":"Gib owner/repository oder eine GitHub-Repository-URL ein.","skills.repo.remove":"Repository entfernen","limits.bar.sub_one_percent":"<1","limits.codex_reset_bank.count_only":"Reset-Bank: {{count}} verfügbar · Ablauf unbekannt","limits.codex_reset_bank.row_label":"Reset {{index}}","limits.codex_reset_bank.title":"Resets","limits.explain.ahead_eta":"{{label}}: schneller als nötig, ~{{eta}} bis Limit","limits.explain.ahead_pct":"{{label}}: schneller als nötig, ~{{pct}}% bis Reset","limits.explain.ahead_pct_remaining":"{{label}}: schneller als nötig, ~{{pct}}% übrig bis Reset","limits.explain.body":"Die Markierung zeigt das gleichmäßige Tempo an; wenn die Füllung darüber liegt, bist du schneller.","limits.explain.body_remaining":"Die Markierung zeigt das gleichmäßige Tempo an; wenn die Füllung darunter liegt, bist du schneller.","limits.explain.on_track":"{{label}}: auf Kurs, ~{{pct}}% bis Reset","limits.explain.on_track_remaining":"{{label}}: auf Kurs, ~{{pct}}% übrig bis Reset","limits.explain.remaining":"{{label}}: {{used}}% übrig","limits.explain.used":"{{label}}: {{used}}% verbraucht","limits.label.antigravity_cached":"Zwischengespeichert","limits.label.antigravity_claude_5h":"Cl 5h","limits.label.antigravity_claude_weekly":"Cl 7d","limits.label.antigravity_gemini_5h":"Gm 5h","limits.label.antigravity_gemini_weekly":"Gm 7d","limits.label.antigravity_live":"live","limits.provenance.fresh":"Live","limits.provenance.stale":"Veraltet","limits.provenance.tooltip":"Quelle: {{source}}; Konfidenz: {{confidence}}","limits.reauth.badge":"Neu anmelden","limits.reauth.tooltip":"Anmeldung abgelaufen — führe einmal `{{command}}` im Terminal aus und aktualisiere dann.","limits.label.claude_5h":"5h","limits.label.claude_7d":"7d","limits.label.claude_opus":"Opus","limits.label.codex_5h":"5h","limits.label.codex_7d":"7d","limits.label.codex_spark_5h":"Spark 5h","limits.label.codex_spark_7d":"Spark 7d","limits.label.gemini_flash":"Flash","limits.label.gemini_lite":"Lite","limits.label.gemini_pro":"Pro","limits.label.grok_month":"Monat","limits.label.grok_week":"Woche","limits.label.grok_day":"Tag","limits.label.grok_ondemand":"On-Demand","limits.label.opencode_go_5h":"5h","limits.label.opencode_go_monthly":"Monatlich","limits.label.qoder_credits":"Credits","limits.label.qoder_ultimate":"Ultimate Gratisaufrufe","limits.label.qoder_cn_credits":"Credits","limits.label.qoder_cn_ultimate":"Ultimate Gratisaufrufe","limits.qoder_calls.detail":"{{used}} / {{limit}} Aufrufe genutzt · {{remaining}} übrig","limits.hover.expires_at":"Läuft {{time}} ab","limits.label.opencode_go_weekly":"Wöchentlich","limits.label.zcode_glm52":"GLM-5.2","limits.label.zcode_glm5t":"GLM-5-Turbo","limits.provider.antigravity":"Antigravity","limits.provider.claude":"Claude","limits.provider.codex":"Codex","limits.provider.copilot":"GitHub Copilot","limits.provider.cursor":"Cursor","limits.provider.gemini":"Gemini","limits.provider.grok":"Grok Build","limits.provider.kimi":"Kimi","limits.provider.kiro":"Kiro","limits.provider.opencode_go":"OpenCode Go","limits.provider.qoder":"Qoder","limits.provider.qoder_cn":"Qoder CN","limits.provider.zcode":"ZCode","limits.tooltip.antigravity_cached":"Zwischengespeicherte Limits. Aktualisierung über die Antigravity-Anmeldung, die App muss nicht geöffnet sein.","limits.tooltip.antigravity_live":"Echtzeit-Limits von deinem Antigravity-Google-Konto.","limits.tooltip.qoder_cached":"Zwischengespeicherte Limits. Starte Qoder, um sie zu aktualisieren.","login.forgot_password":"Passwort vergessen?","menubar.metric.codex_spark_5h":"Codex Spark 5h-Limit","menubar.metric.codex_spark_7d":"Codex Spark 7d-Limit","qpd.card.badge":"BETA","qpd.card.best_value":"Bestes Preis-Leistungs-Verhältnis","qpd.card.col_accepted":"PRs/Gesamt","qpd.card.col_cost":"Ausgaben","qpd.card.col_model":"Modell","qpd.card.col_qpd":"Kosten/PR","qpd.card.col_rate":"Akzeptanzrate","qpd.card.et":"Effektiv: {{tokens}} ({{rate}})","qpd.card.et_tooltip":"Effektive Tokens – der Anteil der Tokens, der in akzeptierte Arbeit statt Nachbesserung geflossen ist.","qpd.card.qpd_tooltip":"Durchschnittliche Token-Kosten pro akzeptiertem Ergebnis (Gesamtausgaben ÷ akzeptierte Ergebnisse).","qpd.card.sparse_notice":"Hinweis: Bei wenig Daten können die Verhältnisse verzerrt sein. Versuche einen engeren Zeitraum.","qpd.card.subtitle":"Durchschnittliche Token-Kosten pro Lieferung, aus gemergten PRs und KI-zugeordneten Commits.","qpd.card.title":"Qualität & durchschnittliche Kosten/PR","qpd.card.totals":"Gemergt {{accepted}}/{{outcomes}} PRs · Kosten {{cost}}","qpd.card.updating":"Aktualisiere …","reset_password.back_to_sign_in":"Zurück zur Anmeldung","reset_password.error.missing_token":"Reset-Token fehlt. Fordere einen neuen Reset-Link an.","reset_password.error.password_mismatch":"Passwörter stimmen nicht überein.","reset_password.field.code":"Reset-Code","reset_password.field.confirm_password":"Passwort bestätigen","reset_password.field.new_password":"Neues Passwort","reset_password.request.sent":"Prüfe deine E-Mails auf den Reset-Link und den Code.","reset_password.request.submit":"Reset-Link senden","reset_password.reset.submit":"Passwort zurücksetzen","reset_password.subtitle":"Gib deine E-Mail-Adresse ein, um einen Reset-Link zu erhalten.","reset_password.success":"Passwort aktualisiert. Du kannst dich mit dem neuen Passwort anmelden.","reset_password.success_cta":"Zurück zur Anmeldung","reset_password.title":"Passwort zurücksetzen","settings.labs.island.label":"Dynamic Island","settings.labs.island.hint":"Verwandelt die MacBook-Notch in eine Dynamic Island: heutige Tokens und Ausgaben auf einen Blick, Details zu Ausgaben und Limits beim Hover.","settings.labs.island.aria":"Dynamic Island umschalten","settings.labs.island_hide_menubar.label":"Menüleisten-Symbol ausblenden","settings.labs.island_hide_menubar.hint":"Blendet das Symbol in der Menüleiste aus und nutzt ausschließlich die Dynamic Island.","settings.labs.island_hide_menubar.aria":"Menüleisten-Symbol ausblenden umschalten","dashboard.island.title":"Entdecke die Dynamic Island","dashboard.island.hint":"Verwandelt die MacBook-Notch in einen Live-Token-Zähler: heutige Tokens und Ausgaben auf einen Blick, Details beim Hover.","dashboard.island.enable":"Jetzt aktivieren","dashboard.island.settings_link":"In den Einstellungen ansehen","dashboard.island.enabled_toast":"Dynamic Island ist aktiv — wirf einen Blick auf die Notch","dashboard.island.dismiss_aria":"Dynamic-Island-Hinweis schließen","dashboard.linux_pet.title":"Lerne dein Desktop-Haustier kennen","dashboard.linux_pet.hint":"Ein kleiner Begleiter auf deinem Desktop – fahre darüber für heutige Tokens, Ausgaben und Limits, und zieh ihn, wohin du willst.","dashboard.linux_pet.show":"Haustier anzeigen","dashboard.linux_pet.settings_link":"Haustier-Einstellungen","dashboard.linux_pet.dismiss_aria":"Desktop-Haustier-Hinweis schließen","settings.labs.qpd.aria":"PR-Kosten-Effizienz-Analyse umschalten","settings.labs.qpd.hint":"Analysiert durchschnittliche Lieferkosten und effektive Tokens pro Modell aus gemergten PRs und KI-zugeordneten Commits.","settings.labs.qpd.label":"PR-Kosten-Effizienz analysieren","settings.labs.sessions.label":"Sitzungseffizienz analysieren","settings.labs.sessions.hint":"Analysiert nur lokale Metadaten zu Bearbeitungsabdeckung, Erstabschluss und Kosten pro Bearbeitung für Claude und Codex.","settings.labs.sessions.aria":"Sitzungseffizienz-Analyse umschalten","settings.menubar.toastOnReset":"Hinweis beim Limit-Reset","settings.menubar.toastOnResetHint":"Zeigt eine kurze Meldung an, wenn ein Nutzungslimit zurückgesetzt wird.","settings.menubar.confettiOnReset":"Konfetti beim Reset","settings.menubar.confettiOnResetHint":"Zeigt ein Feuerwerk an, wenn ein Nutzungslimit zurücksetzt, nachdem du nah dran warst.","shared.action.apply":"Übernehmen","shared.time.d_ago":"vor {{n}} T","shared.time.h_ago":"vor {{n}} Std","shared.time.m_ago":"vor {{n}} Min","skills.action.search_clear":"Suche zurücksetzen","skills.my.placeholder":"Installierte Skills filtern …","usage.summary.toggle_aria":"Kompaktes Zahlenformat umschalten","sessions.card.title":"Sitzungseffizienz","sessions.card.subtitle":"Vergleichbare Bearbeitungsrunden für Claude und Codex","sessions.card.loading":"Lokale Sitzungsmetadaten werden analysiert…","sessions.card.edit_sessions":"Sitzungen mit Änderungen","sessions.card.first_pass":"Im ersten Durchlauf","sessions.card.cost_edit":"Kosten je Änderung","sessions.card.model":"Modell","sessions.card.edit_session_value":"{{edits}} / {{sessions}}","sessions.card.edit_turn_count":"{{count}} Bearbeitungsrunden","sessions.card.tokens_edit":"Token je Änderung","sessions.card.sample":"{{sessions}} Sitzungen · {{edits}} Bearbeitungsrunden","sessions.card.methodology_label":"Messmethode","sessions.card.methodology":"Änderung = eine Benutzerrunde mit einem beobachteten Bearbeitungswerkzeug. Erster Durchlauf = genau eine Bearbeitungsrunde ohne wiederholte Anfrage.","sessions.card.context":"Geschätzter fester Kontext","sessions.card.context_tooltip":"Anweisungen, installierte Skills und abgeleitete MCP-Werkzeugschemata","sessions.card.privacy":"Es werden nur lokale Metadaten verarbeitet; Prompts, Antworten, Befehlsausgaben und Diff-Inhalte werden nicht gespeichert.","sessions.card.subagents":"Subagent-Aufrufe","sessions.card.subagent_item":"{{name}} · {{calls}}","nav.sessions":"Sitzungen","sessions.page.refresh":"Sitzungen aktualisieren","sessions.filter.source_aria":"Nach Sitzungsquelle filtern","sessions.filter.range_aria":"Nach Zeitraum filtern","sessions.filter.range_7d":"7 Tage","sessions.filter.range_30d":"30 Tage","sessions.filter.range_90d":"90 Tage","sessions.filter.project_all":"Alle Projekte","sessions.filter.project_search":"Projekte suchen…","sessions.filter.project_empty":"Keine passenden Projekte","sessions.filter.project_aria":"Nach Projekt filtern","sessions.filter.result_count":"{{filtered}} von {{total}}","sessions.action.search_aria":"Sitzungen durchsuchen","sessions.action.search_clear":"Suche zurücksetzen","sessions.search.placeholder":"Titel, Projekt, Modell oder ID suchen…","sessions.loading":"Sitzungen werden geladen…","sessions.col.tokens":"Tokens","sessions.col.cost":"Kosten","sessions.col.edits":"Bearbeitungen","sessions.badge.first_pass":"Erster Versuch","sessions.badge.reported_cost":"Gemeldete Kosten","sessions.badge.partial_usage":"Unvollständige Nutzung","sessions.badge.partial_cost":"Teilkosten","sessions.cost.partial_title":"Untergrenze — für einige Modelle dieser Sitzung gibt es keinen öffentlichen Tarif, ihre Tokens zählen hier $0.","sessions.grok.runtime_breakdown":"Modellaufrufe {{calls}} · API {{seconds}} s · Tools {{tools}} · Fehler {{errors}}","sessions.grok.context_breakdown":"Kontext {{used}} / {{window}} ({{percent}} %)","sessions.badge.subagent":"Subagent","sessions.thread.expand":"{{count}} Subagents anzeigen","sessions.thread.collapse":"{{count}} Subagents einklappen","sessions.thread.tokens_summary":"Eigen {{own}} · Subagents {{subagents}} · Gesamt {{combined}}","sessions.thread.result_count":"{{roots}} Hauptsitzungen · {{subagents}} Subagents eingeklappt","sessions.thread.model_usage":"Modellnutzung der Subagents","sessions.thread.model_all":"Alle · {{count}} Agenten · {{tokens}}","sessions.thread.model_item":"{{model}} · {{count}} Agenten · {{tokens}}","sessions.duration.minutes":"{{minutes}} Min.","sessions.duration.hours":"{{hours}} Std. {{minutes}} Min.","sessions.project.unknown":"Unbenannte Sitzung","sessions.model.unknown":"Unbekanntes Modell","sessions.resume.copy_aria":"Fortsetzungsbefehl kopieren: {{command}}","sessions.resume.copied":"Fortsetzungsbefehl kopiert","sessions.resume.copy_failed":"Befehl konnte nicht kopiert werden","sessions.resume.unavailable":"Fortsetzungsbefehl nicht verfügbar","sessions.empty.title":"Noch keine Sitzungen","sessions.empty.body":"Führe Claude Code, Codex oder Grok auf diesem Rechner aus, dann erscheinen deine Sitzungen hier.","sessions.empty.filtered_title":"Keine passenden Sitzungen","sessions.empty.filtered_body":"Andere Suche versuchen oder den Zeitraum erweitern.","sessions.col.turns":"Runden","sessions.project.copy_hint":"Klicken, um den Pfad zu kopieren","sessions.project.copy_aria":"Lokalen Pfad für {{project}} kopieren","sessions.project.copied":"Projektpfad kopiert","sessions.project.copy_failed":"Pfad konnte nicht kopiert werden","sessions.action.load_more":"Weitere Sitzungen anzeigen","sessions.error.title":"Sitzungen konnten nicht geladen werden","sessions.error.retry":"Erneut versuchen","sessions.error.outdated_app":"Diese TokenTracker-Version ist zu alt, um Sitzungen aufzulisten. Bitte aktualisieren.","sessions.truncated":"Es werden die {{shown}} neuesten von {{total}} Sitzungen angezeigt. Zeitraum einschränken, um ältere zu sehen.","sessions.privacy":"Wird lokal verarbeitet. Prompt- und Antwortinhalte, Befehlsausgabe und Diff-Inhalte werden weder gespeichert noch hochgeladen.","nav.achievements":"Erfolge","limits.alert.enable":"Vorausschauende Limit-Benachrichtigungen aktivieren","limits.alert.disable":"Vorausschauende Limit-Benachrichtigungen deaktivieren","limits.alert.title":"{{provider}}-Limit könnte vorzeitig aufgebraucht sein","limits.alert.body":"Beim aktuellen Tempo könnte das Kontingent in {{eta}} aufgebraucht sein ({{percent}}% verbraucht).","settings.section.labs":"Labs","limits.alert.blocked":"Benachrichtigungen sind aus – in den Systemeinstellungen erlauben","settings.limits.showSubscriptions":"Abos in Limits anzeigen","settings.limits.showSubscriptionsHint":"Zeige manuell eingetragene Abo-Verlängerungen zusammen mit den Limits an.","settings.appearance.token_grouping.label":"Zahlengruppierung","settings.appearance.token_grouping.hint":"Genaue Zahlen verwenden 3- oder chinesische 4-Ziffer-Gruppen. Tooltips folgen dieser Einstellung.","settings.appearance.token_grouping.thousand":"3er","settings.appearance.token_grouping.wan":"4er","leaderboard.pro.badge":"Pro","leaderboard.pro.badge_aria":"TokenTracker Pro-Mitglied"},cD={"cloud.action.resume_order":"Zahlung fortsetzen","cloud.restore.title":"Bestellung suchen","cloud.restore.detail":"Gib deine Bestellnummer ein, um den Zahlungsstatus zu prüfen oder die Zahlung fortzusetzen.","cloud.billing.title":"Abrechnung & Zahlungen","cloud.membership.transition_until":"Übergangszeit bis {{date}}","cloud.membership.trial_until":"Testphase bis {{date}}","cloud.membership.active_until":"Aktiv bis {{date}}","cloud.membership.gift_until":"Cloud-Geschenk bis {{date}}","cloud.membership.expired_on":"Abgelaufen am {{date}}","cloud.history.date":"Datum","cloud.history.amount":"Betrag","cloud.history.status":"Status","cloud.history.paid":"Bezahlt","cloud.history.pending":"Zahlung ausstehend","cloud.membership.tools_title":"Tools und Abrechnung","usage.overview.all_tools":"Alle","usage.overview.all_models":"Alle Modelle","usage.overview.all_models_note":"Gleichnamige Modelle werden werkzeugübergreifend zusammengeführt und nach Gesamtnutzung sortiert.","usage.overview.week_cross_month_hint":"Diese Woche umfasst zwei Kalendermonate, sodass die Summe nicht direkt mit dem Verbrauch eines einzelnen Monats vergleichbar ist","usage.overview.all_tools_card_aria":"Alle Werkzeuge: {{tokens}} Token, {{cost}}, {{count}} Modelle. Zusammengeführte Modellrangliste anzeigen","usage.overview.antigravity_notice_title":"Token-Details","usage.overview.antigravity_notice_body":"Genaue Token-Werte und Prompt-Cache-Treffer werden aus den lokalen Antigravity-Sitzungsmetadaten ausgelesen, sofern vorhanden. Transkripte ohne Metadaten werden anhand der Textlänge (~4 Zeichen/Token) geschätzt.","usage.overview.devin_notice_title":"Kosten nicht geschätzt","usage.overview.devin_notice_body":"Devin meldet echte lokale Token-Zählungen, aber für swe-2, swe-2-high und compactor liegen in diesem Build keine Preisdaten vor. Diese Nutzung fließt daher nicht in die Dollar-Schätzung ein – ein angezeigter Wert von $0 bedeutet nicht, dass die Nutzung kostenlos war.","stats.period.today":"Heute","stats.period.week":"Diese Woche","stats.period.month":"Dieser Monat","stats.period.all":"Alle","stats.period.convs":"Gespräche","dashboard.core_index.collapse_label":"▾","dashboard.core_index.expand_label":"▸","dashboard.core_index.collapse_aria":"Modellaufschlüsselung einklappen","dashboard.core_index.expand_aria":"Modellaufschlüsselung ausklappen","dashboard.rolling.title":"Letzte Aktivität","dashboard.rolling.last_7d":"Letzte 7 Tage","dashboard.rolling.last_30d":"Letzte 30 Tage","dashboard.rolling.avg_active_day":"Täglicher Durchschnitt","dashboard.projects.title":"Projektnutzung","dashboard.projects.limit_aria":"Anzahl der anzuzeigenden Projekte wählen","dashboard.projects.limit_top_3":"Top 3","dashboard.projects.limit_top_6":"Top 6","dashboard.projects.limit_top_10":"Top 10","dashboard.projects.empty":"Noch keine Projektnutzung. Wird ein unterstütztes CLI in einem Git-Repository ausgeführt, erscheint die Nutzung hier.","dashboard.projects.detail.close_aria":"Projektdetails schließen","dashboard.projects.detail.error":"Projektdetails konnten nicht geladen werden","dashboard.projects.detail.empty_range":"Keine Nutzung im gewählten Zeitraum","dashboard.projects.detail.stat_total":"Token gesamt","dashboard.projects.detail.stat_conversations":"Unterhaltungen","dashboard.projects.detail.stat_active_days":"Aktive Tage","dashboard.projects.detail.stat_avg_day":"Ø / aktiver Tag","dashboard.projects.detail.stat_cache_hit":"Cache-Trefferquote","dashboard.projects.detail.stat_share":"Anteil an Gesamtnutzung","dashboard.projects.detail.section_trend":"Tägliche Aktivität","dashboard.projects.detail.section_composition":"Token-Zusammensetzung","dashboard.projects.detail.section_sources":"Nach Quelle","dashboard.projects.detail.comp_input":"Eingabe","dashboard.projects.detail.comp_cached":"Cache-Lesen","dashboard.projects.detail.comp_cache_write":"Cache-Schreiben","dashboard.projects.detail.comp_output":"Ausgabe","dashboard.projects.detail.comp_reasoning":"Reasoning","dashboard.projects.detail.source_days":"{{n}} T","dashboard.projects.detail.source_conv":"{{n}} Unterh.","dashboard.widgets.title":"Desktop-Widgets","dashboard.widgets.hint":"Rechtsklick auf den Desktop → Widgets bearbeiten → Nach „TokenTracker“ suchen","dashboard.widgets.dismiss_aria":"Widget-Einführung schließen","dashboard.linux_topbar.title":"Nutzung in der oberen Leiste","dashboard.linux_topbar.hint":"Unter GNOME zeigt die TokenTracker-Erweiterung die heutigen Tokens und Ausgaben neben Clawd in der oberen Leiste an – mit einem Dropdown für Limits und Trends.","dashboard.linux_topbar.setup":"Einrichten","dashboard.linux_topbar.dismiss_aria":"Hinweis zur oberen Leiste schließen","dashboard.cost_breakdown.title":"Kostenaufschlüsselung","dashboard.cost_breakdown.total_label":"Geschätzte Gesamtkosten","dashboard.cost_breakdown.close":"Schließen","trend.monitor.label":"Nutzungstrend","trend.monitor.predicted":"Prognose","trend.zoom.open_aria":"Vollbild öffnen","trend.zoom.close_aria":"Schließen","trend.zoom.badge":"Trendanalyse","trend.zoom.desc":"Fahre mit der Maus über die Balken, um Token, Kosten und Gespräche anzuzeigen. Wechsel die Granularität von Monaten bis zu 30-Minuten-Intervallen.","trend.zoom.insight_badge":"Analyse","trend.zoom.tooltip.cost":"Kosten","trend.zoom.tooltip.conversations":"Gespräche","trend.zoom.stats.tokens":"Token gesamt","trend.zoom.stats.cost":"Kosten gesamt","trend.zoom.stats.conversations":"Gespräche","trend.zoom.stats.peak":"Spitzenzeit","trend.zoom.gran.aria":"Granularität","trend.zoom.gran.30min":"30 Min.","trend.zoom.gran.day":"Tag","trend.zoom.gran.month":"Monat","trend.zoom.prev_day":"Vorheriger Tag","trend.zoom.next_day":"Nächster Tag","trend.zoom.loading":"Laden…","trend.zoom.pick_day":"Datum wählen","trend.zoom.pick_range":"Zeitraum wählen","trend.zoom.insight.empty":"Ruhige Zeit. Kein Token ist geflossen.","trend.zoom.insight.calm":"Zurückhaltende Nutzung. Die Modelle haben meist gewartet und nur bei Bedarf gearbeitet.","trend.zoom.insight.steady":"Stabiler Rhythmus mit {{active}} aktiven Abschnitten, Spitze bei {{peak}}. Ein Tempo, das Dinge erledigt, ohne Aufsehen zu erregen.","trend.zoom.insight.heavy":"Ernsthafte Betriebsamkeit: {{active}} Abschnitte unter Hochlast, Spitze bei {{peak}}. Die Leistung von jemandem, der nicht auf Dynamik wartet, sondern sie selbst erzeugt.","trend.zoom.insight.massive":"Industrielles Ausmaß. Spitze bei {{peak}} mit ungebrochenem Durchsatz. Bei dieser Menge betreibt man kein Modell mehr, sondern eine Fabrik.","heatmap.title":"Heatmap","heatmap.empty":"Noch keine Aktivitätsdaten vorhanden.","heatmap.legend.less":"Weniger","heatmap.legend.more":"Mehr","heatmap.legend.utc":"UTC","heatmap.tooltip":"{{day}} • {{value}} {{unit}} • {{tz}}","heatmap.unit.tokens":"Token","heatmap.month.jan":"Januar","heatmap.month.feb":"Februar","heatmap.month.mar":"März","heatmap.month.apr":"April","heatmap.month.may":"Mai","heatmap.month.jun":"Juni","heatmap.month.jul":"Juli","heatmap.month.aug":"August","heatmap.month.sep":"September","heatmap.month.oct":"Oktober","heatmap.month.nov":"November","heatmap.month.dec":"Dezember","heatmap.day.sun":"So","heatmap.day.mon":"Mo","heatmap.day.tue":"Di","heatmap.day.wed":"Mi","heatmap.day.thu":"Do","heatmap.day.fri":"Fr","heatmap.day.sat":"Sa","dashboard.session_expired.copy_label":"npx --yes tokentracker-cli init ausführen","dashboard.session_expired.copied":"Kopiert","dashboard.install.prompt":"Node.js 18+ installieren und dann ausführen:","dashboard.install.cmd.init":"npx --yes tokentracker-cli init","dashboard.install.cmd.init_link_code":"npx --yes tokentracker-cli init --link-code {{link_code}}","dashboard.install.copy":"Installationsbefehl kopieren","dashboard.install.copy_base":"Initialisierungsbefehl kopieren","dashboard.install.copied":"In die Zwischenablage kopiert","dashboard.install.link_code.loading":"Linking-Code wird generiert…","dashboard.install.link_code.failed":"Linking-Code nicht verfügbar","dashboard.install.cmd.sync":"npx --yes tokentracker-cli sync","dashboard.daily.title":"Tägliche Aufschlüsselung","dashboard.daily.empty":"Noch keine Daten. Nutze zuerst ein KI-CLI und führe dann {{cmd}} aus.","dashboard.identity.title":"Dein Profil","dashboard.identity.subtitle":"Verfolge deine Coding-Reise","dashboard.identity.fallback":"Anonymer Benutzer","dashboard.screenshot.title_line1":"AI-Coding-Assistenten","dashboard.screenshot.title_line2":"Jahresrückblick 2025","dashboard.screenshot.twitter_button":"Auf X teilen","dashboard.screenshot.twitter_label":"Auf X teilen","dashboard.screenshot.twitter_hint":"Bild wird automatisch in die Zwischenablage kopiert","dashboard.screenshot.twitter_text":"{{total_tokens}} aufgezeichnete Token.\\n{{model_name}} führt mit {{model_percent}}%.\\n\\nMeine AI-Nutzung, ungeprüft →\\ntokentracker.cc","heatmap.3d.hover_tip":"Klicke für den 3D-Vollbild-Analysemodus","heatmap.3d.modal.title":"3D-Ansicht der Token","heatmap.3d.modal.desc":"Ziehe mit gedrückter Maustaste, um frei zu rotieren, und fahre mit der Maus über Elemente, um tägliche Aktivitäten und Statistiken anzuzeigen.","heatmap.3d.modal.stats.total_tokens":"Jährliche Token-Gesamtmenge","heatmap.3d.modal.stats.precision_total_tokens":"Jährlicher genauer Verbrauch","heatmap.3d.modal.stats.estimated_cost":"Geschätzte Jahreskosten","heatmap.3d.modal.stats.active_rate_days":"Aktivitätsrate / Tage","heatmap.3d.modal.stats.max_streak":"Längste aktive Serie","heatmap.3d.modal.stats.days_suffix":"Tage","heatmap.3d.modal.stats.peak_day":"Täglicher Spitzenwert","heatmap.3d.modal.stats.precision_peak_value":"Genauer täglicher Spitzenwert","heatmap.3d.modal.stats.no_data":"Keine Daten","heatmap.3d.modal.legend.title":"Aktivitätsstufen","heatmap.3d.modal.palette.emerald":"Smaragdstadt","heatmap.3d.modal.palette.ocean":"Tiefer Ozean","heatmap.3d.modal.palette.neon":"Cyber-Neon","heatmap.3d.modal.palette.amber":"Glühende Abendröte","heatmap.3d.modal.control.play":"Langsame Autorotation starten","heatmap.3d.modal.control.pause":"Autorotation pausieren","heatmap.3d.modal.control.reset":"3D-Ansicht zurücksetzen","heatmap.3d.modal.footer.tip":"Zum Zoomen kneifen / Mausrad / Maus ziehen, um das 3D-Diagramm zu drehen","heatmap.3d.modal.ai.title.default":"Beständiger Entwickler","heatmap.3d.modal.ai.eval.default":"Du entwickelst kontinuierlich weiter. Nicht jeder Coding-Tag ist spektakulär, aber jede Aktivität zeigt, wie dein Projekt wächst.","heatmap.3d.modal.ai.title.peak":"Top-Performer","heatmap.3d.modal.ai.eval.peak":"Dein Token-Output war dieses Jahr außergewöhnlich hoch. Diese Entwicklungsleistung deutet auf intensive Arbeit an komplexen Systemen hin – mit viel Fokus, Ausdauer und technischer Tiefe.","heatmap.3d.modal.ai.title.heavy":"Vielproduzent","heatmap.3d.modal.ai.eval.heavy":"Millionen Token – ein starkes Jahr. Dein Coding-Rhythmus zeigt hohe Umsetzungskraft und konstante Arbeit an deinen Projekten.","heatmap.3d.modal.ai.title.core":"Zuverlässiger Entwickler","heatmap.3d.modal.ai.eval.core":"Äußerst beharrliches Langzeitengagement. Im vergangenen Jahr hast du über lange Zeiträume hinweg stabil eine hohe Entwicklungsintensität gehalten. Mit soliden Code-Zeilen und Token-Produktion baust du leise die Kernarchitektur des Projekts auf – du bist das Rückgrat der Entwicklung.","heatmap.3d.modal.ai.title.steady":"Stetig wachsender Ingenieur","heatmap.3d.modal.ai.eval.steady":"Solide und beständige technische Arbeit. Mit jedem Token legst du das Fundament für zukünftigen Code. Dieser langfristige Rhythmus ist der Weg, den jeder gute Entwickler gehen muss.","heatmap.3d.voxel.joke.1":"🔥 Unglaublich! {{value}} Token produziert! Trainierst du ein großes Modell oder schreibst du einen Compiler von Hand?","heatmap.3d.voxel.joke.2":"🚀 Epische Leistung! Insgesamt {{value}} Token. Deine heutige Produktion könnte die Erde umrunden – selbst die AI staunt über dich!","heatmap.3d.voxel.joke.3":"⚡ Explosiver Tag! {{value}} Token. Der Code sprudelt wie aus einer Quelle und deine Tastatur beginnt zu rauchen!","heatmap.3d.voxel.level3":"⚡ Produktivitätsexplosion ({{value}} Token)! Hoch effiziente, fokussierte Goldene Stunde – halt diesen Spitzenzustand!","heatmap.3d.voxel.level2":"🌱 Es läuft rund ({{value}} Token)! Stetige Leistung, jeder Tastendruck fügt einen weiteren Baustein zu einem großen Gebäude hinzu.","heatmap.3d.voxel.level1":"🍃 Kleinvieh macht auch Mist ({{value}} Token). Jeder kleine Commit ist eine Investition in die Zukunft – nutze den Zinseszinseffekt!","heatmap.3d.voxel.level0":"💤 Ein Tag zum Kräftesammeln. Auch an Tagen ohne Code wachsen die Ideen leise weiter.","ipcheck.page.title":"Claude IP-Check","ipcheck.page.subtitle":"Prüfe die aktuelle Ausgangs-IP, die IP-Reputation und Risikosignale deines Claude-Zugriffs, um Faktoren zu erkennen, die den Login beeinflussen können.","ipcheck.mask.toggle":"IP verbergen","ipcheck.ipv6.warn":"Du nutzt eine IPv6-Umgebung. Der Zugriff auf Claude Code per IPv6 wird nicht empfohlen; einige Ergebnisse können unvollständig sein.","ipcheck.ip.cn":"Chinesische Ausgangs-IPv4","ipcheck.ip.cloudflare":"Cloudflare-Ausgang","ipcheck.ip.claude":"Claude-Ausgang","ipcheck.ip.failed":"Abruf fehlgeschlagen","ipcheck.ip.loading":"Laden…","ipcheck.trust.title":"Vertrauenswürdigkeit","ipcheck.trust.subtitle":"IP-Reputation aus Sicht des Claude-Risikomanagements","ipcheck.trust.no_data":"Keine Daten","ipcheck.trust.no_ip":"Claude-Ausgangs-IP nicht ermittelbar, daher kein Score berechenbar","ipcheck.trust.no_score":"Noch keine Score-Daten für diese IP","ipcheck.trust.gauge.low":"0 Hohes Risiko","ipcheck.trust.gauge.high":"100 Vertrauenswürdig","ipcheck.trust.label.pristine":"Sehr sauber","ipcheck.trust.label.clean":"Sauber","ipcheck.trust.label.good":"Gut","ipcheck.trust.label.neutral":"Neutral","ipcheck.trust.label.suspicious":"Verdächtig","ipcheck.trust.label.unreachable":"Nicht erreichbar","ipcheck.trust.text.excellent":"Der Ruf dieser IP ist sehr gut","ipcheck.trust.text.great":"Der Ruf dieser IP ist ausgezeichnet","ipcheck.trust.text.minor":"Diese IP birgt geringfügige Risiken","ipcheck.trust.text.moderate":"Diese IP birgt gewisse Risiken","ipcheck.trust.text.severe":"Diese IP ist extrem risikoreich","ipcheck.trust.text.restricted":"Befindet sich in einer nicht zugänglichen Region; Claude handhabt das Risikomanagement streng","ipcheck.trust.region_warn.title":"Claude-Ausgangs-IP befindet sich in {{region}}","ipcheck.trust.region_warn.body":"Die Anmeldung bei Claude wird nicht empfohlen. Dies kann eher das Risikomanagement einer Kontosperrung auslösen.","ipcheck.trust.region_support":"Von Claude unterstützte Regionen","ipcheck.trust.region.accessible":"Zugänglich","ipcheck.common.unknown":"Unbekannt","ipcheck.props.title":"IP-Eigenschaften","ipcheck.props.region":"Region","ipcheck.props.city":"Stadt","ipcheck.props.type":"Typ","ipcheck.props.asn":"ASN","ipcheck.props.org":"Provider","ipcheck.props.residential":"Privatanschluss","ipcheck.props.datacenter":"Rechenzentrum","ipcheck.security.title":"Sicherheitserkennung","ipcheck.security.vpn":"VPN","ipcheck.security.proxy":"Proxy","ipcheck.security.tor":"Tor","ipcheck.security.crawler":"Bot (Crawler)","ipcheck.security.abuser":"Missbrauchsaufzeichnung","ipcheck.security.proxy_flag":"Proxy","ipcheck.security.crawler_yes":"Ja","ipcheck.security.crawler_no":"Nein","ipcheck.security.abuser_yes":"Aufzeichnung vorhanden","ipcheck.security.abuser_no":"Keine Aufzeichnung","ipcheck.security.clean":"Nicht erkannt","ipcheck.avail.title":"Claude-Verfügbarkeit","ipcheck.avail.tooltip":"Die Claude-Server befinden sich in den USA. Latenzen über 100 ms aus Asien sind normal.","ipcheck.avail.refresh":"Aktualisieren","ipcheck.avail.svc_row":"Dienststatus","ipcheck.avail.latency.normal":"Normal","ipcheck.avail.latency.good":"Gut","ipcheck.avail.latency.slow":"Etwas langsam","ipcheck.avail.latency.unreachable":"Nicht erreichbar","ipcheck.avail.svc.none":"Alles in Ordnung","ipcheck.avail.svc.minor":"Geringfügige Störung","ipcheck.avail.svc.major":"Schwerwiegende Störung","ipcheck.avail.svc.critical":"Kritische Störung","ipcheck.avail.svc.maintenance":"Wartungsarbeiten","ipcheck.avail.svc.other":"Dienstanomalie","ipcheck.dns.title":"DNS-Leck-Erkennung","ipcheck.dns.status":"Status","ipcheck.dns.outlet":"DNS-Ausgang","ipcheck.dns.outlet_ip":"DNS-Ausgangs-IP","ipcheck.dns.isp":"Provider","ipcheck.dns.leaked":"Mögliches Leck","ipcheck.dns.no_leak":"Kein Leck erkannt","ipcheck.dns.encrypted":"DNS ist verschlüsselt oder privat","ipcheck.dns.cn_tag":"China-DNS","ipcheck.udp.title":"WebRTC-UDP-Leck","ipcheck.udp.status":"Status","ipcheck.udp.outlet":"UDP-Ausgang","ipcheck.udp.outlet_ip":"UDP-Ausgangs-IP","ipcheck.udp.origin":"Standort","ipcheck.udp.disabled":"WebRTC ist deaktiviert","ipcheck.udp.no_leak":"Kein Leck erkannt","ipcheck.udp.leaked":"Mögliches Leck","ipcheck.udp.anomaly":"Anomalie","ipcheck.device.title":"Geräteinformationen","ipcheck.device.tz":"Zeitzone","ipcheck.device.lang":"Sprache","ipcheck.device.os":"OS / Browser","ipcheck.device.touch":"Touchscreen","ipcheck.device.net":"Netzwerktyp","ipcheck.device.dnt":"Do Not Track","ipcheck.device.webgl_render":"WebGL-Renderer","ipcheck.device.canvas_fp":"Canvas-Fingerabdruck","ipcheck.device.webgl_fp":"WebGL-Fingerabdruck","ipcheck.device.match":"Übereinstimmung","ipcheck.device.mismatch":"Keine Übereinstimmung","ipcheck.device.local":"Lokal","ipcheck.device.estimate_suffix":"(geschätzt)","ipcheck.device.diff_equal":"Geringfügige Abweichung im Offset","ipcheck.device.diff_ahead":"Claude ist {{h}} Stunden voraus","ipcheck.device.diff_behind":"Claude ist {{h}} Stunden zurück","ipcheck.device.lang_expected":"Häufig verwendete Sprache am Claude-Ausgang","ipcheck.device.touch_yes":"Ja","ipcheck.device.touch_no":"Nein","ipcheck.device.dnt_on":"Ein","ipcheck.device.dnt_off":"Aus","ipcheck.device.dnt_unset":"Nicht festgelegt","ipcheck.device.net_unsupported":"Erkennung nicht unterstützt","ipcheck.device.unsupported":"Nicht unterstützt","ipcheck.history.title":"Claude-Ausgangs-IP-Verlauf","ipcheck.history.subtitle":"Wird nur lokal im Browser gespeichert, max. 6 Einträge","ipcheck.history.clear":"Löschen","ipcheck.history.empty":"Noch kein Verlauf","ipcheck.history.current":"Aktuell","ipcheck.region.CN":"China","ipcheck.region.HK":"Hongkong","ipcheck.region.MO":"Macau","ipcheck.region.RU":"Russland","ipcheck.region.KP":"Nordkorea","ipcheck.region.IR":"Iran","ipcheck.region.SY":"Syrien","ipcheck.region.CU":"Kuba","ipcheck.region.BY":"Weißrussland","ipcheck.region.VE":"Venezuela","leaderboard.profile_modal.close":"Schließen","leaderboard.profile_modal.loading":"Benutzerprofil wird geladen…","leaderboard.profile_modal.error":"Fehler beim Laden des Benutzerprofils.","leaderboard.profile_modal.empty":"Das Profil dieses Benutzers ist nicht öffentlich.","leaderboard.profile_modal.row_aria":"Profil von {{name}} anzeigen","leaderboard.profile_modal.rank":"#{{rank}}","leaderboard.profile.hero.rank_label":"Rang","leaderboard.profile_modal.hero.total_tokens":"Token gesamt","leaderboard.profile_modal.hero.total_cost":"Ausgaben gesamt","leaderboard.profile_modal.hero.github":"GitHub-Profil","leaderboard.profile_modal.stat.total_cost":"Ausgaben gesamt","leaderboard.profile_modal.stat.total_tokens":"Token gesamt","leaderboard.profile_modal.stat.active_days":"Aktive Tage","leaderboard.profile_modal.stat.avg_per_day":"Durchschnittliche Ausgaben pro Tag","leaderboard.profile_modal.streak.current":"Aktuelle Serie","leaderboard.profile_modal.streak.longest":"Längste Serie","leaderboard.profile_modal.streak.days":"{{count}} Tage","leaderboard.profile_modal.best_day.title":"Bester Tag","leaderboard.profile_modal.best_day.none":"—","leaderboard.profile_modal.models.count":"{{count}} Modelle verwendet","leaderboard.profile_modal.models.favorite":"Lieblingsmodell","leaderboard.profile_modal.models.none":"Noch keine Modellaufzeichnungen","leaderboard.profile_modal.heatmap.title":"Aktivität (letzte 365 Tage)","leaderboard.profile_modal.providers.title":"Verteilung nach Anbieter","leaderboard.profile_modal.providers.none":"Keine Nutzungsdaten für diesen Zeitraum.","leaderboard.profile_modal.view_full":"Vollständiges Profil anzeigen","local_only.title":"Bitte im Client nutzen","local_only.body":"Diese Seite lädt Daten von deinem Gerät und kann daher nur in der Mac-App oder über das Dashboard in der Befehlszeile angezeigt werden.","local_only.open_app":"In der Mac-App öffnen","local_only.download":"Mac-App herunterladen","dashboard.auth_gate.title":"Bei Token Tracker anmelden","dashboard.auth_gate.subtitle":"Melde dich an, um deine API-Nutzung, Kosten und Token-Trends in der Cloud zu synchronisieren.","dashboard.auth_gate.button":"Jetzt anmelden","dashboard.expired_gate.title":"Sitzung abgelaufen","dashboard.expired_gate.subtitle":"Deine Sitzung ist abgelaufen. Bitte melde dich erneut an, um das Cloud-Dashboard weiter zu nutzen.","dashboard.expired_gate.button":"Erneut anmelden","shared.app_name":"Token Tracker","dashboard.auth_gate.hero_title":"Der gesamte Token-Verbrauch deines KI-Agenten","dashboard.auth_gate.hero_subtitle":"Klar, transparent, mit Multi-Endpoint-Kontrolle","dashboard.auth_gate.desc":"Synchronisiere Token-Kontingente, Kosten und Latenzstatistiken aller gängigen Agenten wie Claude Code, Cursor und Gemini CLI sicher in der Cloud und erhalte eine umfassende Visualisierungsanalyse.","dashboard.auth_gate.feature.sync.title":"Echtzeit-Cloud-Synchronisation","dashboard.auth_gate.feature.sync.desc":"Sammelt automatisch die Ausführungskosten jedes Endpunkts und archiviert sie sicher innerhalb weniger Sekunden in der privaten Cloud.","dashboard.auth_gate.feature.anal.title":"Mehrdimensionales Dashboard","dashboard.auth_gate.feature.anal.desc":"Zeigt die Token-Verteilung nach Modell und Zeitfenster an, sodass du Kostenanstiege und Verbrauchszusammensetzung jederzeit verfolgen kannst.","dashboard.auth_gate.feature.guard.title":"Lokale Autonomie","dashboard.auth_gate.feature.guard.desc":"Überspringe alle Login-Schritte im Localhost-Modus. So bleibt lokales Debugging schnell.","dashboard.expired_gate.hero_title":"Cloud-Sitzung abgelaufen","dashboard.expired_gate.desc":"Aus Gründen der Privatsphäre und Cloud-Sicherheit wird deine Sitzung nach einer gewissen Zeit beendet. Zur sofortigen Wiederherstellung des Dashboards melde dich bitte erneut an.","dashboard.expired_gate.feature.sec.title":"Sicherer Schutz","dashboard.expired_gate.feature.sec.desc":"Verschlüsselte Tokens rotieren automatisch und schützen so deine Daten.","dashboard.expired_gate.feature.restore.title":"Nahtlose Wiederherstellung","dashboard.expired_gate.feature.restore.desc":"Setze deine Charts sofort fort – ohne Terminal-Hooks neu zu konfigurieren.","dashboard.expired_gate.feature.cloud.title":"Geräteübergreifende Synchronisation","dashboard.expired_gate.feature.cloud.desc":"Über das synchronisierte Dashboard kannst du Token-Logs von überall einsehen.","dashboard.device_card.title":"Nach Gerät","dashboard.device_card.current":"Dieses Gerät","dashboard.device_card.unnamed":"Unbekanntes Gerät","dashboard.device_filter.all":"Alle Geräte","dashboard.device_filter.aria":"Nach Gerät filtern","stats.period.avg":"⌀","stats.period.last_30d":"30 T","stats.period.last_7d":"7 T","usage.overview.cache_hit_rate_detail":"{{reused}} wiederverwendet / {{input}} Input","usage.overview.cache_hit_rate_label":"Cache-Trefferquote","dashboard.device_card.empty":"Keine aktiven Geräte gefunden","dashboard.device_card.account_scope":"Kontoweit","dashboard.device_card.account_scope_tip":"Über die Konto-API des Anbieters synchronisiert — keinem einzelnen Gerät zugeordnet","dashboard.device_card.rename_aria":"Gerät umbenennen","dashboard.device_card.rename_cancel":"Abbrechen","dashboard.device_card.rename_error":"Umbenennung fehlgeschlagen – dieser Name wird möglicherweise bereits verwendet.","dashboard.device_card.rename_placeholder":"Gerätename","dashboard.device_card.rename_save":"Namen speichern","nav.pet":"Desktop-Tier","pet.page.eyebrow":"Desktop-Begleiter","pet.page.title":"Pet","pet.page.subtitle":"Wähle einen Begleiter und sieh, wie er auf deine echte KI-Aktivität reagiert.","pet.preview.states":"Pet-Zustände ansehen","pet.controls.title":"Desktop-Steuerung","pet.controls.show":"Desktop-Pet anzeigen","pet.controls.show_hint":"Den Begleiter über anderen Fenstern halten.","pet.controls.size":"Pet-Größe","pet.controls.native_only":"Öffne diese Seite in der TokenTracker-Desktop-App, um das echte Pet zu steuern.","pet.characters.title":"Wähle deinen Begleiter","pet.characters.subtitle":"Jeder Charakter nutzt das vollständige Zustandssystem mit eigener Farbe und Silhouette.","pet.character.clawd":"Clawd","pet.character.clawd_desc":"Der originale Token-Hüter mit Scheren-Silhouette.","pet.character.sprout":"Sprout","pet.character.sprout_desc":"Ein Keimling-Geist mit Blattohren und kleinen Wurzelfüßen.","pet.character.byte":"Byte","pet.character.byte_desc":"Ein schwebender Terminal-Roboter mit ausdrucksstarken Bildschirmaugen.","pet.character.ember":"Ember","pet.character.ember_desc":"Ein Fuchsgeist mit Flammenschweif für produktive Serien.","pet.state.calm":"Ruhig","pet.state.focus":"Fokus","pet.state.multitask":"Multi-Modell","pet.state.streak":"Serie","pet.state.celebrate":"Neue Nutzung","pet.state.rest":"Pause","pet.size.small":"Klein","pet.size.medium":"Mittel","pet.size.large":"Groß","pet.import.title":"Codex-Pet importieren","pet.import.subtitle":"codex-pets.net-Link einfügen oder .zip-Paket wählen.","pet.import.add":"Hinzufügen","pet.import.zip":"Paket auswählen","pet.import.remove":"Pet entfernen","pet.import.success":"Pet importiert und ausgewählt.","pet.import.failed":"Dieses Pet konnte nicht importiert werden.","pet.import.busy":"Wird importiert…","pet.format.v2":"V2","pet.import.removed":"Pet entfernt.","pet.import.url_label":"Codex-Pets-URL oder Pet-ID","dashboard.projects.detail.badge":"Projekt","achievements.section.title":"Erfolge","achievements.page.title":"Erfolge","achievements.page.local_note":"Projekt- und Nachteulen-Abzeichen bleiben auf diesem Gerät.","achievements.signin.prompt":"Melde dich an, um Cloud-Erfolge zu verdienen und sie auf dem Leaderboard zu zeigen.","achievements.mini.tooltip":"{{name}} — {{tier}}","achievements.badge.aria":"{{name}} — {{tier}}","achievements.tier.bronze":"Bronze","achievements.tier.silver":"Silber","achievements.tier.gold":"Gold","achievements.tier.diamond":"Diamant","achievements.modal.locked":"Gesperrt","achievements.modal.achieved_label":"Erreicht am","achievements.modal.value_label":"Aktueller Wert","achievements.modal.progress_to_next":"Fortschritt zu {{tier}}","achievements.modal.max_tier":"Höchste Stufe erreicht","achievements.modal.close":"Schließen","achievements.modal.tier_history":"Stufenverlauf","achievements.modal.coin_aria":"{{name}}-Abzeichen — zum Drehen ziehen oder Pfeiltasten nutzen","achievements.modal.issue_number":"Nr.{{number}}","achievements.badge.token_titan.name":"Token-Titan","achievements.badge.token_titan.desc":"Sammle Tokens über alle deine KI-Tools hinweg.","achievements.badge.big_day.name":"Großer Tag","achievements.badge.big_day.desc":"Verbrenne an einem einzigen Tag enorm viele Tokens.","achievements.badge.wordsmith.name":"Wortschmied","achievements.badge.wordsmith.desc":"Sammle Output-Tokens — den Code und Text, den deine KI tatsächlich schreibt.","achievements.badge.marathoner.name":"Marathonläufer","achievements.badge.marathoner.desc":"Sammle aktive Tage über deine gesamte Historie.","achievements.badge.streak.name":"Serie","achievements.badge.streak.desc":"Halte eine ununterbrochene tägliche Serie am Leben.","achievements.badge.weekend_warrior.name":"Wochenendkrieger","achievements.badge.weekend_warrior.desc":"Bleib auch samstags und sonntags am Ball.","achievements.badge.momentum.name":"Momentum","achievements.badge.momentum.desc":"Vervielfache deine Wochennutzung gegenüber der Vorwoche.","achievements.badge.polyglot.name":"Modell-Polyglott","achievements.badge.polyglot.desc":"Setze viele verschiedene Modelle ein.","achievements.badge.trendsetter.name":"Trendsetter","achievements.badge.trendsetter.desc":"Nutze neue Modelle innerhalb ihrer ersten Woche.","achievements.badge.multitool.name":"Multitool","achievements.badge.multitool.desc":"Erfasse Nutzung über viele KI-Coding-Tools.","achievements.badge.podium.name":"Podium","achievements.badge.podium.desc":"Erklimme das Allzeit-Leaderboard.","achievements.badge.veteran.name":"Veteran","achievements.badge.veteran.desc":"Bleib dabei — gezählt ab deinem ersten erfassten Tag.","achievements.badge.project_hopper.name":"Projekt-Hopper","achievements.badge.project_hopper.desc":"Verteile deine Tokens auf viele Projekte.","achievements.badge.project_devotion.name":"Projekt-Hingabe","achievements.badge.project_devotion.desc":"Stecke deine Tokens in ein einziges Herzensprojekt.","achievements.badge.night_owl.name":"Nachteule","achievements.badge.night_owl.desc":"Programmiere in den frühen Stunden zwischen Mitternacht und 6 Uhr.","achievements.signin.action":"Anmelden","achievements.scope.local":"Lokal","achievements.page.suggest":"Eine Idee für ein neues Abzeichen?","achievements.page.suggest_link":"Auf GitHub vorschlagen","dashboard.context_breakdown.empty_grok":"Keine Grok-Build-Aktivität im ausgewählten Zeitraum.","dashboard.context_breakdown.error_grok":"Grok-Build-Logs für diese Ansicht konnten nicht gelesen werden.","dashboard.context_breakdown.footnote_grok":"Grok nutzt hier nicht-überlappende Token-Buckets. Tool- und Exec-Details sind separate heuristische Zuordnungen über dieselben Turns, mit turn_completed.usage als autoritativer Gesamtsumme.","dashboard.context_breakdown.heading":"Kontextaufschlüsselung","dashboard.context_breakdown.heading_claude":"Claude Kontextaufschlüsselung","dashboard.context_breakdown.heading_codex":"Codex Kontextaufschlüsselung","dashboard.context_breakdown.heading_grok":"Grok Kontextaufschlüsselung","cloud.action.open_app":"In TokenTracker öffnen","cloud.checkout.return_app_hint":"Prüfe diese Bestellung mit dem Konto in deiner Desktop-App. Der Server bestätigt den Zugang.","cloud.gift.redeem_action":"Cloud-Code einlösen","cloud.gift.detail":"Das Geschenk umfasst alle Cloud-Funktionen und richtet keine automatische Verlängerung ein. Bestehende Abonnements werden separat verwaltet.","cloud.gift.code_label":"Cloud-Geschenkcode","cloud.gift.confirm":"Code einlösen","cloud.gift.redeeming":"Wird eingelöst…","cloud.gift.redeemed":"Code eingelöst","cloud.gift.already_redeemed":"Du hast diesen Code bereits eingelöst. Das Geschenk wird in deinem Konto angezeigt.","cloud.gift.refresh_needed":"Der Code wurde eingelöst, die Mitgliedschaft konnte aber nicht aktualisiert werden. Aktualisiere dein Konto, um Zugang und Laufzeit zu bestätigen.","cloud.gift.redeem_another":"Weiteren Code einlösen","cloud.gift.membership_label":"Cloud als Geschenk","cloud.gift.history_title":"Cloud-Geschenke","cloud.gift.duration":"{{days}} Tage Cloud","cloud.gift.term":"{{days}} Tage Cloud, von {{start}} bis {{end}}.","cloud.gift.state_active":"Aktiv","cloud.gift.state_pending":"Beginnt nach dem aktuellen Zugang","cloud.gift.state_expired":"Abgelaufen","cloud.gift.state_revoked":"Widerrufen","cloud.gift.error_unavailable":"Dieser Code ist nicht verfügbar. Prüfe die Eingabe oder kontaktiere die Person, die ihn dir gegeben hat.","cloud.gift.error_rate_limit":"Zu viele Versuche. Warte etwas, bevor du es erneut versuchst.","cloud.gift.error_not_available":"Geschenkcodes können auf dieser Instanz noch nicht eingelöst werden.","cloud.gift.error_renewal":"Deaktiviere vor dem Einlösen die automatische Verlängerung unter „Abo verwalten“.","cloud.gift.error_checkout":"Schließe vor dem Einlösen die ausstehende Zahlung unter „Abrechnung & Zahlungen“ ab.","cloud.gift.error_active":"Du hast ein aktives oder bevorstehendes Cloud-Geschenk. Prüfe es in deinem Konto, bevor du eine neue Zahlung startest.","cloud.gift.error_network":"Das Ergebnis konnte nicht bestätigt werden. Versuche denselben Code erneut; ein erfasstes Geschenk wird nicht doppelt hinzugefügt.","cloud.prompt.deadline_gift":"Dein geschenkter Cloud-Zugang endet am {{date}}. Das Geschenk verlängert sich nicht automatisch. Deine lokalen Daten bleiben anschließend verfügbar.","leaderboard.pro.tooltip":"Pro-Mitglied. Ranglisten basieren weiterhin auf der Nutzung.","cloud.feature.pro_identity":"Cloud-Avatarrahmen und Abzeichen. Ranglisten basieren weiterhin auf der Nutzung.","cloud.prompt.deadline_active":"Dein Cloud-Zugang bleibt bis {{date}} verfügbar. Prüfe den Verlängerungsstatus in der Kontoabrechnung. Deine lokalen Daten bleiben danach verfügbar.","sessions.filter.model_all":"Alle Modelle","sessions.filter.model_search":"Modelle suchen…","sessions.filter.model_empty":"Keine passenden Modelle","sessions.filter.model_aria":"Sitzungen nach Modell filtern","sessions.filter.range_custom":"Benutzerdefiniert","sessions.filter.from":"Sitzungen ab","sessions.filter.to":"Sitzungen bis","sessions.filter.clear":"Filter zurücksetzen","sessions.group.aria":"Sitzungen gruppieren","sessions.group.time":"Nach Datum","sessions.group.project":"Nach Projekt","sessions.group.unknown_date":"Unbekanntes Datum","sessions.sort.aria":"Sitzungen sortieren","sessions.sort.recent":"Zuletzt aktiv","sessions.sort.cost":"Höchste Kosten","sessions.sort.tokens":"Meiste Tokens","sessions.summary.count":"Passende Sitzungen","sessions.summary.scope":"Token- und Kostensummen verwenden die gewählten Daten, wenn zeitgestempelte Nutzung vorliegt. Ohne Nutzungsintervalle bleibt die Gesamtnutzung erhalten. Runden, Dauer und Leistung beziehen sich auf die gesamte Sitzung. Jede Sitzung und jeder Unteragent wird einmal gezählt.","sessions.summary.speed":"Geschätzte Geschwindigkeit","sessions.performance.speed":"Ca. {{speed}} tok/s","sessions.performance.samples":"{{count}} gemessene Anfragen","sessions.performance.method":"Ausgabe-Tokens / geschätzte Anfragezeit, einschließlich Antwortwartezeit. Werkzeugausführung und Leerlauf sind ausgeschlossen. Dies ist nicht die reine Generierungsgeschwindigkeit.","sessions.performance.first_response":"Wartezeit bis zur ersten Antwort","sessions.performance.first_response_value":"{{seconds}} s · {{count}} Messungen","sessions.performance.first_response_method":"Durchschnittliche gemeldete Zeit bis zum ersten Token. Codex misst ganze Turns, die mehrere Modellaufrufe enthalten können.","sessions.detail.open_aria":"Statistiken für {{title}} anzeigen","sessions.detail.title":"Sitzungsstatistiken","sessions.detail.close":"Sitzungsstatistiken schließen","sessions.detail.tokens":"Token-Zusammensetzung","sessions.detail.models":"Modelle und Kosten","sessions.detail.own":"Diese Sitzung","sessions.detail.subagents":"Unteragenten","sessions.detail.signals":"Erfasste Aktivitäten","sessions.detail.retries":"Wiederholte Anfragen","sessions.detail.tools":"Werkzeugaufrufe","sessions.detail.tool_failures":"Werkzeugfehler","sessions.detail.errors":"Fehler","sessions.detail.model_calls":"Modellaufrufe","sessions.detail.compactions":"Kontextkomprimierungen","sessions.detail.cost_source":"Kostenquelle","sessions.detail.cost_reported":"Vom Werkzeug gemeldet","sessions.detail.cost_estimated":"Schätzung anhand der Modellpreise","sessions.detail.cost_mixed":"Gemeldete und geschätzte Kosten","sessions.detail.cost_unknown":"Nicht gemeldet","sessions.detail.pricing_unpriced":"Kein veröffentlichter Preis","sessions.detail.pricing_free":"Kostenloses Modell","sessions.detail.pricing_rates":"Basispreis in USD / Million Tokens · Eingabe {{input}} · Ausgabe {{output}} · Cache-Lesen {{cacheRead}} · Cache-Schreiben {{cacheWrite}}. Staffel- und Prioritätspreise können abweichen.","sessions.detail.reasoning_note":"Reasoning-Tokens dienen zur Information und können bereits in den Ausgabe-Tokens enthalten sein.","sessions.detail.no_speed":"Keine verlässlichen Zeitmessungen","usage.filter.source_all":"Alle Werkzeuge","dashboard.cost_breakdown.method":"Modellpreise schätzen API-äquivalente Kosten, keine Abonnementausgaben. Vom Werkzeug gemeldete Kosten haben Vorrang; Nutzung ohne Preise wird ausgeschlossen.","dashboard.cost_breakdown.reported":"Vom Werkzeug gemeldete Kosten","dashboard.cost_breakdown.mixed":"Gemeldete Kosten und Modellschätzungen","dashboard.cost_breakdown.estimated":"Aus Modellpreisen geschätzt","dashboard.cost_breakdown.unpriced":"Kein Preis gefunden. Diese Tokens bleiben erfasst, ihre Kosten sind jedoch unbekannt.","dashboard.cost_breakdown.no_token_charge":"Für diese Quelle oder dieses Modell fallen keine Token-Kosten an","dashboard.cost_breakdown.unpriced_label":"Ohne Preis","dashboard.cost_breakdown.token_mix":"Eingabe {{input}} · Ausgabe {{output}} · Cache-Lesen {{read}} · Cache-Schreiben {{write}}","dashboard.cost_breakdown.rates":"Basispreis in USD / Million Tokens · Eingabe {{input}} · Ausgabe {{output}} · Cache-Lesen {{read}} · Cache-Schreiben {{write}}. Staffel- und Prioritätspreise können abweichen.","dashboard.cost_breakdown.known_subtotal":"Bekannte Kosten","dashboard.cost_breakdown.rate_unknown":"Tarif unbekannt","sessions.detail.not_recorded":"Nicht erfasst","sessions.detail.pricing_litellm":"LiteLLM-Preise","sessions.detail.pricing_curated":"Gepflegte Preistabelle","sessions.page.summary":"Lokale Sitzungen, Nutzung und geschätzte Kosten.","sessions.filter.range_label_all":"Alle Zeiträume","sessions.summary.scope_help":"Über diese Summen","sessions.col.session":"Sitzung / Projekt","sessions.col.speed":"Geschwindigkeit","sessions.col.actions":"Aktionen","sessions.detail.consumption":"Nutzung und Kosten","sessions.detail.pricing_details":"Preisdetails","sessions.detail.identifiers":"Sitzungskennungen","sessions.detail.session_id":"Sitzungs-ID","sessions.detail.local_path":"Lokaler Pfad","sessions.detail.resume_command":"Fortsetzungsbefehl","sessions.performance.first_response_value_single":"{{seconds}}s · {{count}} Messung","cloud.export.open":"Cloud-Nutzung exportieren","cloud.export.description":"Tagessummen · UTC-Daten · USD-Schätzwerte","cloud.export.from":"Von (UTC)","cloud.export.to":"Bis (UTC)","cloud.export.csv":"CSV herunterladen","cloud.export.json":"JSON herunterladen","cloud.export.busy":"Cloud-Zugriff wird geprüft und die Datei vorbereitet…","cloud.export.error_auth":"Melde dich erneut an und wiederhole den Export.","cloud.export.error_access":"Dieser Cloud-Verlauf kann nicht mehr exportiert werden.","cloud.export.error_dates":"Wähle einen gültigen Zeitraum.","cloud.export.error_changed":"Konto, Backend, Zeitraum oder Zugriff haben sich geändert. Wiederhole den Export.","cloud.export.error_failed":"Export fehlgeschlagen. Versuche CSV oder JSON erneut.","cloud.export.success":"{{count}} erfasste Tage von {{from}} bis {{to}} (UTC) heruntergeladen.","cloud.export.empty":"Keine erfassten Tage. Die Datei enthält Angaben zum Umfang, aber keine Nutzungszeilen.","cloud.export.truncated":"Nur der verfügbare Zeitraum {{from}} bis {{to}} (UTC) wurde heruntergeladen. Die Datei enthält auch deine ursprüngliche Auswahl.","cloud.export.dashboard":"Dashboard anzeigen","cloud.renewal.auto":"Automatische Verlängerung. Jederzeit kündbar; der bezahlte Zeitraum bleibt erhalten.","cloud.renewal.manual":"Einmal zahlen. Keine automatische Verlängerung.","cloud.action.create_checkout":"Zur Zahlung · {{amount}}","cloud.checkout.review":"Prüfe Tarif und Zahlungsbedingungen. Waffo zeigt den endgültigen Betrag vor der Zahlung.","cloud.action.buy_pro":"Cloud kaufen","cloud.price.fixed_monthly_total":"Einmalzahlung für einen Monat.","cloud.price.fixed_annual_total":"Einmalzahlung für ein Jahr. Entspricht {{equivalent}}/Monat.","cloud.checkout.help_title":"Probleme mit der Zahlung?","cloud.faq.cost_title":"Warum ist Cloud kostenpflichtig?","cloud.faq.cost_body":"Die offiziell gehostete Synchronisierung, Speicherung, Bandbreite, Sicherungen und Wartung benötigen mit wachsender Nutzung laufende Ressourcen. Cloud-Abonnements unterstützen diesen Dienst und seine langfristige Wartung. Die vollständige lokale App bleibt kostenlos und Open Source.","cloud.plan.local_community":"Rangliste, Erfolge und öffentliches Profil","cloud.plan.monthly_equivalent":"Entspricht {{equivalent}}/Monat","cloud.plan.sync":"Automatische Synchronisierung alle {{minutes}} Minuten","cloud.plan.hourly_history":"{{days}} Tage stündliche Nutzungsdetails","cloud.plan.daily_history":"{{months}} Monate täglicher Verlauf und Exporte","cloud.plan.identity":"Cloud-Avatarrahmen und Abzeichen","cloud.plan.faq_title":"Fragen zu den Tarifen","cloud.plan.details_title":"Was ist in Cloud enthalten?","cloud.plan.self_host_summary":"Auf eigenem Server betreiben. Kostenlose Software; Hosting und Wartung liegen bei dir. Technische Vorschau.","cloud.page.title":"Wähle deinen Tarif","cloud.page.subtitle":"Lokale Statistiken kostenlos. Cloud bietet geräteübergreifende Synchronisierung und Verlauf.","cloud.action.try":"{{days}} Tage kostenlos testen","cloud.plan.renewal_hint":"· Jederzeit kündbar","cloud.plan.renewal_off":"· Einmalzahlung","cloud.feature.analysis_detail":"Nutzung deiner Geräte zusammenführen. Kosten, Trends sowie Anbieter- und Modellvergleiche in jedem Browser ansehen.","cloud.faq.platform_body":"Eine Mitgliedschaft gilt für dein Konto auf CLI, macOS, Windows, Linux und im Web. Keine separate Zahlung je Plattform.","cloud.prompt.sync":"Cloud synchronisiert Änderungen deiner Geräte alle 15 Minuten. Kostenlose Community-Uploads erfolgen täglich von einem ausgewählten Gerät.","cloud.prompt.devices":"Kostenlose Community-Uploads nutzen ein ausgewähltes Gerät. Cloud bietet Synchronisierung mehrerer Geräte; du kannst auch Geräte pausieren und kostenlose Uploads weiter nutzen.","cloud.plan.skip_trial":"Cloud kaufen","cloud.plan.anywhere":"Die Nutzung aller Geräte in einem Browser-Dashboard","cloud.plan.retained_history":"{{days}} Tage stündliche Details · {{months}} Monate täglicher Verlauf","cloud.onboarding.local_next":"Aktiviere die Synchronisierung unter Einstellungen → Persönlich → Cloud, um dieses Gerät zu verbinden. Melde dich auf deinen anderen Computern mit demselben Konto an, um die Nutzung zusammenzuführen.","cloud.onboarding.web_next":"Melde dich in der TokenTracker-App auf jedem Computer mit diesem Konto an und aktiviere die Synchronisierung unter Einstellungen → Persönlich → Cloud. Deine Nutzung erscheint dann hier.","cloud.error.subscription_exists":"Ein aktives Abonnement besteht bereits. Verwalte es unter Einstellungen → Persönlich → Cloud, bevor du einen anderen Tarif auswählst.","cloud.error.request_conflict":"Ein vorheriger Kauf ist noch ungeklärt. Setze die Bestellung unter Einstellungen → Persönlich → Cloud fort, bevor du einen anderen Kauf beginnst.","cloud.error.machines":"Dieses Konto hat das Gerätelimit für die Cloud-Synchronisierung erreicht. Prüfe die Geräte unter Einstellungen → Persönlich → Cloud.","cloud.error.machine_paused":"Dieses Gerät ist pausiert. Setze es unter Einstellungen → Persönlich → Cloud fort, bevor du erneut synchronisierst.","cloud.checkout.refunded_detail":"Der Server hat die vollständige Rückerstattung dieser Zahlung bestätigt. Prüfe deinen aktuellen Zugang und Zahlungsverlauf unter Einstellungen → Persönlich → Cloud.","cloud.action.setup_sync":"Cloud-Synchronisierung einrichten","cloud.login.trial_context":"Melde dich an, um Cloud zu testen. Deine Tarifauswahl ist gespeichert.","cloud.login.purchase_context":"Melde dich an, um den Cloud-Kauf fortzusetzen. Deine Tarifauswahl ist gespeichert.","cloud.membership.payment_due":"Die Zahlung für die Verlängerung benötigt Aufmerksamkeit. Prüfe den Zahlungsstatus in der Rechnung oder aktualisiere deine Zahlungsmethode.","cloud.plan.trial_setup_hint":"Starte die Testphase und richte dann die Synchronisierung auf deinen Computern ein.","cloud.trial.disclosure":"Cloud {{days}} Tage kostenlos testen, bis {{date}}. Keine automatische Abbuchung.","cloud.trial.used_hint":"Deine kostenlose Testphase wurde bereits genutzt. Wähle einen Cloud-Tarif, um fortzufahren.","cloud.gift.done":"Fertig","cloud.free.device_scope":"Nutzungsstatistiken nur für dieses Gerät","cloud.plan.includes_local":"Alle kostenlosen lokalen Funktionen enthalten","cloud.plan.device_sync":"Unbegrenzte Geräte · geräteübergreifende Synchronisierung","cloud.plan.device_fair_use":"Unbegrenzte Geräte für die alltägliche persönliche Nutzung, ohne Gebühren pro Gerät. Viele oder ungewöhnliche Geräteverbindungen können den Synchronisierungsschutz auslösen."},dD={"landing.handle.default":"VIBE_USER","landing.handle.special":"BOLT","landing.screenshot.alt":"Screenshot des TokenTracker-Dashboards","landing.nav.login":"Anmelden","landing.nav.signup":"Registrieren","landing.install.command":"npx --yes tokentracker-cli","landing.install.action.copy":"Befehl kopieren","landing.install.action.copied":"Kopiert","landing.meta.title":"Token Tracker — KI-Token-Verbrauch für Coding-CLIs","landing.meta.description":"Überwache automatisch den Token-Verbrauch deiner KI-Entwicklungswerkzeuge wie Claude Code, Cursor und Codex. Lokal first, datenschutzorientiert, keine Konfiguration nötig.","landing.meta.og_site_name":"Token Tracker","landing.meta.og_type":"website","landing.meta.og_image":"https://www.tokentracker.cc/og-image.jpg","landing.meta.og_url":"https://www.tokentracker.cc/","landing.meta.twitter_card":"summary_large_image","share.meta.title":"Token Tracker – Teilen","share.meta.description":"Teile einen Schnappschuss deines TokenTracker-Dashboards mit Einblicken in die Nutzung nach Modell, Projekt und Zeitraum.","share.meta.og_site_name":"Token Tracker","share.meta.og_type":"website","share.meta.og_image":"https://www.tokentracker.cc/share-dashboard.jpg","share.meta.og_url":"https://www.tokentracker.cc/share","share.meta.twitter_card":"summary_large_image","landing.handle.placeholder":"Probiere ‚{{handle}}‘ aus","landing.rank.expectation":"Erwarteter Rang: {{rank}}","landing.rank.singularity":"Top","landing.rank.unranked":"Nicht platziert","landing.cta.primary":"Zum Dashboard","landing.cta.secondary":"GitHub","landing.v2.hero.title_line1":"Jeden KI-Token","landing.v2.hero.title_line2":"im Blick","landing.v2.install.mac_cta":"Für macOS herunterladen","landing.v2.install.win_cta":"Für Windows herunterladen","landing.v2.install.desktop_cta":"Desktop-App herunterladen","landing.v2.install.os_macos":"macOS","landing.v2.install.os_windows":"Windows","landing.v2.install.availability":"Verfügbar für macOS und Windows","landing.v2.models.title":"Unterstützte KI-CLI-Tools","landing.v2.compare.kicker":"Nahtloses Tracking","landing.v2.compare.title":"Hör auf, über deinen KI-Verbrauch zu raten.","landing.v2.compare.subtitle":"KI-CLI-Tools verstecken rohe Verlaufsdaten oft in unübersichtlichen lokalen Dateien. TokenTracker fasst sie in Echtzeit in einem lokalen Dashboard zusammen.","landing.v2.distill.body":"100 % lokal verarbeitet. Weder Prompts noch Code werden hochgeladen.","landing.v2.compare.with.title":"Mit Token Tracker","landing.v2.compare.with.p1":"Zentrales Nutzungs-Dashboard","landing.v2.compare.with.p2":"Echtzeit-Token-Metriken","landing.v2.compare.with.p3":"100 % lokal und datenschutzsicher","landing.v2.compare.with.p4":"Multi-Client-Terminal-Prüfpfad","landing.v2.compare.without.title":"Ohne","landing.v2.compare.without.p1":"Verstreute JSON-Logdateien","landing.v2.compare.without.p2":"Keinerlei Transparenz über Token-Verbrauch","landing.v2.compare.without.p3":"Plötzliche API-Rechnungen","landing.v2.compare.without.p4":"Keinerlei historische Prüflogs","landing.v2.leaderboard.kicker":"GLOBALE TOKEN-RANGLISTE","landing.v2.leaderboard.title":"KI-Token-Effizienz","landing.v2.leaderboard.subtitle":"Synchronisiere deine lokalen KI-Token-Daten anonym und nimm an der globalen Effizienz-Rangliste teil. Vergleiche Kosten und Nutzungsfrequenz mit Entwicklern und Modellen weltweit.","landing.v2.leaderboard.view_more":"Gesamte Rangliste anzeigen","landing.v2.footer.line":"Token Tracker — von Entwicklern, für Entwickler.","landing.v2.nav.status":"Status","landing.v2.nav.privacy":"Datenschutz","landing.v2.nav.github":"GitHub","landing.v2.models.agent.codex":"Codex","landing.v2.models.agent.claude_code":"Claude Code","landing.v2.models.agent.cursor":"Cursor","landing.v2.models.agent.gemini":"Gemini","landing.v2.models.agent.opencode":"OpenCode","landing.v2.models.agent.openclaw":"OpenClaw","landing.v2.cta.primary":"Dashboard","landing.v2.hero.subtagline":"Überwache automatisch den Token-Verbrauch deiner KI-Entwicklungswerkzeuge wie Claude Code, Cursor und Codex. Lokal first, datenschutzorientiert, keine Konfiguration nötig.","leaderboard.profile.nav.back":"Rangliste","leaderboard.title":"Rangliste","leaderboard.horizontal_scroll":"Ranglistenspalten horizontal scrollen","limits.settings.enable_all":"Alle aktivieren","limits.settings.disable_all":"Alle deaktivieren","limits.settings.bulk_visibility":"Anbieteranzeige","limits.settings.enabled_count":"{{enabled}} / {{total}} Anbieter aktiviert","limits.zcode.start_grants":"Start-Tarif","limits.zcode.grant_amount":"{{remaining}} / {{total}} Token verbleibend","limits.zcode.reset_bank.title":"Kontingent-Zurücksetzungen","limits.zcode.reset_bank.count":"{{count}} verfügbar","limits.zcode.reset_bank.earliest":"Frühester Ablauf: {{time}}","leaderboard.range":"UTC {{period}} · {{from}} – {{to}}","leaderboard.range_loading":"UTC {{period}} · …","leaderboard.range.total":"Gesamter Zeitraum","leaderboard.generated_at":"Aktualisiert {{ts}}","leaderboard.period.week":"Woche","leaderboard.period.month":"Monat","leaderboard.period.total":"Gesamter Zeitraum","leaderboard.me_label":"Ich","leaderboard.anon_label":"Anonym","leaderboard.error.unknown":"Unbekannter Fehler","leaderboard.loading":"Laden…","leaderboard.empty":"Noch keine Daten","leaderboard.column.rank":"Rang","leaderboard.column.user":"Benutzer","leaderboard.column.total":"Gesamt","leaderboard.column.codex":"Codex","leaderboard.column.claude":"Claude","leaderboard.column.gemini":"Gemini","leaderboard.column.cursor":"Cursor","leaderboard.column.opencode":"OpenCode","leaderboard.column.openclaw":"OpenClaw","leaderboard.column.hermes":"Hermes","leaderboard.column.kiro":"Kiro","leaderboard.column.copilot":"Copilot","leaderboard.column.kimi":"Kimi","leaderboard.column.supplemental":"Sonstige","leaderboard.column.est_cost":"Geschätzte Kosten","leaderboard.signin_prompt":"Melde dich an, um am Ranking teilzunehmen","leaderboard.signin_button":"Anmelden","leaderboard.sync_prompt":"Aktiviere Cloud-Sync, um am Ranking teilzunehmen","leaderboard.sync_button.idle":"Aktivieren & synchronisieren","leaderboard.sync_button.busy":"Synchronisiere…","leaderboard.pagination.page_size_label":"Einträge pro Seite","leaderboard.pagination.prev":"Vorherige Seite","leaderboard.pagination.next":"Nächste Seite","leaderboard.pagination.ellipsis":"……","leaderboard.pagination.page_unknown":"Seite {{page}}","share.modal.title":"Teile deine Daten","share.modal.subtitle":"Erstelle eine Poster-Karte zum Teilen.","share.modal.close":"Schließen","share.modal.action.x":"Auf X teilen","share.modal.action.download":"Herunterladen","share.modal.action.copy":"Bild kopieren","share.modal.hint.x":"Bild in Tweet einfügen","share.modal.hint.copy":"In Zwischenablage","share.modal.name_label":"Anzeigename","share.modal.name_placeholder":"Namen eingeben","share.modal.style_label":"Stil","share.modal.footer":"Deine Daten bleiben lokal – Bilder werden in deinem Browser erzeugt, nie hochgeladen.","share.button.label":"Teilen","share.button.aria":"Teile-Karte öffnen","share.toast.copied":"Bild in Zwischenablage kopiert","share.toast.downloaded":"Bild gespeichert","share.toast.failed":"Bildgenerierung fehlgeschlagen","share.toast.working":"Generiere…","share.variant.neon":"Neon","share.variant.broadsheet":"Zeitung","share.date.month_year":"{{month}} {{year}}","share.issue.all_time":"Gesamter Zeitraum","share.month_short.jan":"Jan","share.month_short.feb":"Feb","share.month_short.mar":"Mär","share.month_short.apr":"Apr","share.month_short.may":"Mai","share.month_short.jun":"Jun","share.month_short.jul":"Jul","share.month_short.aug":"Aug","share.month_short.sep":"Sep","share.month_short.oct":"Okt","share.month_short.nov":"Nov","share.month_short.dec":"Dez","share.hook.top_loyal":"{{name}} machte {{percent}} % deines Verbrauchs aus.","share.hook.days_record":"Insgesamt {{days}} Tage aufgezeichnet.","share.hook.top_led":"{{name}} führte mit {{percent}} %.","share.hook.multi_models":"{{count}} Modelle in {{days}} Tagen genutzt.","share.hook.days_with_model":"{{name}} war {{days}} Tage lang an deiner Seite.","share.hook.new_chapter":"Eine neue Aufzeichnung beginnt hier.","share.card.broadsheet.issue":"Ausgabe","share.card.broadsheet.by":"Geteilt von","share.card.broadsheet.tracked_since":"Verfolgt seit","share.card.broadsheet.total_tokens":"Token gesamt","share.card.broadsheet.estimated_spend":"Geschätzte Ausgaben","share.card.broadsheet.billable_days":"{{days}} aktive Tage","share.card.broadsheet.heatmap_title":"Jahresübersicht","share.card.broadsheet.heatmap_days_on_record":"{{active}} / {{total}} Tagen mit Daten","share.card.broadsheet.roster_title":"Modell-Ranking","share.card.broadsheet.roster_subtitle":"Deine meistgenutzten Modelle","share.card.broadsheet.empty":"Diese Woche war ruhig – noch keine Modelldaten.","share.card.broadsheet.global_rank":"Globaler Rang","share.card.broadsheet.active_days":"Aktiv","share.card.broadsheet.days_count":"{{days}} Tage","share.card.broadsheet.track_yours":"Erstelle deine eigene","share.card.annual.report_title":"Nutzungsbericht","share.card.annual.less":"Weniger","share.card.annual.more":"Mehr","share.card.annual.heatmap_title":"Token-Heatmap","share.card.annual.total_tokens":"Token gesamt","share.card.annual.estimated_cost":"Geschätzte Kosten","share.card.annual.longest_streak":"Längste Serie","share.card.annual.days_count":"{{days}} Tage","share.card.annual.top_model":"Top-Modell","leaderboard.profile.nav.download":"Herunterladen"},Mw="tokentracker-locale",Vs="system",Pd="en",zw="zh-CN",jw="zh-TW",Uw="ja",Hw="ko",Fw="de",uD=/^zh[-_](hant|tw|hk|mo)\b/i;function Bw(e){return/^zh(?:[-_]|$)/i.test(e)?uD.test(e)?jw:zw:/^ja(?:[-_]|$)/i.test(e)?Uw:/^ko(?:[-_]|$)/i.test(e)?Hw:/^de(?:[-_]|$)/i.test(e)?Fw:null}function Gw(e){return typeof e!="string"?Pd:Bw(e.trim())||Pd}function Qd(e){return e===Vs?Vs:Gw(e)}function pD(){return typeof navigator>"u"?[]:Array.isArray(navigator.languages)&&navigator.languages.length?navigator.languages.filter(e=>typeof e=="string"):typeof navigator.language=="string"?[navigator.language]:[]}function Rd(e,t=pD()){const a=Qd(e);if(a!==Vs)return a;const o=t.map(s=>typeof s=="string"?s.trim():"").find(s=>s.length>0);return o&&Bw(o)||Pd}function Qh(){return Qd(ol(Mw)||Vs)}function mD(e){return sl(Mw,Qd(e))}const hD={[zw]:{...ZN,...QN,...JN},[jw]:{...XN,...eD,...tD},[Uw]:{...nD,...aD,...rD},[Hw]:{...oD,...sD,...iD},[Fw]:{...lD,...cD,...dD}};let Jh=Rd(Qh());function fD(){return hD[Jh]||{}}function gD(e){const t=fD()[String(e)];return typeof t=="string"&&t.trim()?t:null}function _D(e,t){return t?e.replace(/\{\{(\w+)\}\}/g,(a,o)=>t[o]==null?a:String(t[o])):e}function bD(e){return String(e).replace(/\\n/g,`
45
- `)}function yD(e){Jh=Gw(e)}function $w(){return Jh}function K(e,t){const a=String(e),o=Object.hasOwn(yy,a)?yy[a]:void 0,s=gD(a)||o||a;return _D(bD(s),t)}const ky="tokentracker_native_app";let qw=null;const Wm=new Set;typeof window<"u"&&window.addEventListener("native:systemAppearanceChanged",e=>{const t=e?.detail?.isDark;if(typeof t=="boolean"){qw=t;try{const a=document.documentElement;t?a.classList.add("dark"):a.classList.remove("dark")}catch{}Wm.forEach(a=>{try{a(t)}catch{}})}});function vy(){return qw}function kD(e){return Wm.add(e),()=>Wm.delete(e)}function ri(){if(typeof window>"u")return!1;try{if(new URLSearchParams(window.location.search).get("app")==="1"){try{window.localStorage.setItem(ky,"1")}catch{}return!0}return window.localStorage.getItem(ky)==="1"}catch{return!1}}function xn(){return typeof window>"u"?!1:!!window.webkit?.messageHandlers?.nativeBridge}function oi(){return typeof window>"u"?!1:!!window.chrome?.webview&&ri()}function Rl(){return typeof window>"u"?!1:!!window.__TAURI_INTERNALS__}function Kw(){if(typeof window>"u")return null;const e=window.webkit?.messageHandlers?.nativeOAuth;if(e)return e;const t=window.__TAURI_INTERNALS__?.invoke;return typeof t!="function"?null:{postMessage:a=>t("open_oauth",{url:a})}}function Vw(){return typeof window>"u"?null:window.webkit?.messageHandlers?.nativeBridge??null}function fj(){return typeof window>"u"?!1:!!(Vw()||window.chrome?.webview)}function si(e){const t=Vw();if(t)try{return t.postMessage(e),!0}catch(a){return console.warn("[tokentracker] nativeBridge post failed:",a),!1}if(typeof window<"u"&&window.chrome?.webview)try{return window.chrome.webview.postMessage(typeof e=="string"?e:JSON.stringify(e)),!0}catch{return!1}return!1}function Ww(e){return si(e)}const wy="tokentracker:cloud-export-result",vD=5*1024*1024,wD=/^tokentracker-cloud-[A-Za-z0-9][A-Za-z0-9_-]{0,150}\.(csv|json)$/;function Ss(e){const t=new Error(e);return t.code=e,t}function gj({filename:e,content:t,format:a,signal:o}){if(!(typeof window<"u"&&(xn()||oi()||Rl()||ri())))return Promise.resolve(null);if(o?.aborted)return Promise.reject(new DOMException("Aborted","AbortError"));if(a!=="csv"&&a!=="json"||typeof e!="string"||!wD.test(e)||!e.endsWith(`.${a}`)||typeof t!="string"||!t||t.includes("\0")||new TextEncoder().encode(t).byteLength>vD)return Promise.reject(Ss("invalid_export"));const i=window.webkit?.messageHandlers?.nativeBridge,c=window.chrome?.webview,u=window.__TAURI_INTERNALS__?.invoke;if(window.__TOKENTRACKER_CLOUD_EXPORT__!==!0||!(typeof i?.postMessage=="function"||typeof c?.postMessage=="function"||typeof u=="function"))return Promise.reject(Ss("unsupported"));const m=crypto.randomUUID(),f=e.slice(0,-(a.length+1)),g={type:"saveCloudUsageExport",requestId:m,filename:e,content:t,format:a};return new Promise((b,w)=>{let x=!1,S;const E=(M,D)=>{x||(x=!0,clearTimeout(S),window.removeEventListener(wy,L),o?.removeEventListener("abort",C),M?w(M):b(D))},C=()=>E(new DOMException("Aborted","AbortError")),U=M=>{if(!M||M.requestId!==m)return;const D=M.filename,Y=typeof D=="string"&&D.startsWith(`${f}-`)&&/^-[1-9]\d{0,2}\.(csv|json)$/.test(D.slice(f.length))&&D.endsWith(`.${a}`);if(M.saved===!0&&(D===e||Y))E(null,{saved:!0,filename:M.filename});else{const J=["invalid_export","forbidden_source","save_failed","unsupported"].includes(M.errorCode)?M.errorCode:"save_failed";E(Ss(J))}},L=M=>U(M.detail);if(window.addEventListener(wy,L),o?.addEventListener("abort",C,{once:!0}),S=setTimeout(()=>E(Ss("save_timeout")),15e3),o?.aborted){C();return}try{typeof i?.postMessage=="function"?i.postMessage(g):typeof c?.postMessage=="function"?c.postMessage(JSON.stringify(g)):Promise.resolve(u("save_cloud_usage_export",{message:g})).then(U,()=>E(Ss("save_failed")))}catch{E(Ss("save_failed"))}})}function _j({title:e,body:t,id:a}){return Ww({type:"notify",title:e,body:t,id:a})}function bj(){return si({type:"getSettings"})}function zs(e,t){return si({type:"setSetting",key:e,value:t})}function yj(e){return si({type:"action",name:e})}function xD(){return si({type:"getSystemAppearance"})}function SD(e,t){if(!xn())return;si({type:"setChromeAppearance",isDark:e==="dark",theme:t??"system"})}function kj(e){if(typeof window>"u")return()=>{};const t=a=>{a&&a.detail&&typeof a.detail=="object"&&e(a.detail)};return window.addEventListener("native:settings",t),()=>window.removeEventListener("native:settings",t)}function vj(){return typeof window>"u"?!1:!!(window.webkit?.messageHandlers?.nativeBridge||window.chrome?.webview||Rl())}function Xh(e){if(typeof window>"u")return!1;const t=window.webkit?.messageHandlers?.nativeBridge;if(t)try{return t.postMessage(e),!0}catch{return!1}if(window.chrome?.webview)try{return window.chrome.webview.postMessage(JSON.stringify(e)),!0}catch{return!1}if(Rl())try{return window.__TAURI_INTERNALS__.invoke("pet_bridge",{message:e})?.catch?.(()=>{}),!0}catch{return!1}return!1}function wj(){return Xh({type:"getPetSettings"})}function xj(e,t){return Xh({type:"setPetSetting",key:e,value:t})}function Sj(){return Xh({type:"refreshPetCatalog"})}function Cj(e){if(typeof window>"u")return()=>{};const t=a=>{a?.detail&&typeof a.detail=="object"&&e(a.detail)};return window.addEventListener("native:petSettings",t),()=>window.removeEventListener("native:petSettings",t)}const CD=150,TD=e=>new Promise(t=>setTimeout(t,e));function xy(e){if(!e)return!0;const t=Number(e.statusCode??e.status);return t===401||t===403}async function ED(e,t={}){const a=Math.max(0,Number(t.settleDelayMs??CD)||0),o=t.wait??TD,s=t.isActive??(()=>!0);let i=await e.getCurrentUser();return i?.data?.user||!xy(i?.error)||!s()||!i?.error&&a>0&&(await o(a),!s()||(i=await e.getCurrentUser(),i?.data?.user||!xy(i?.error)))||!s()||typeof e.refreshSession!="function"||(await e.refreshSession())?.error?i:e.getCurrentUser()}const Yw=k.createContext(null);function AD(e){if(!e||typeof e!="object")return"";const t=e.user_metadata&&typeof e.user_metadata=="object"?e.user_metadata:{},a=e.profile&&typeof e.profile=="object"?e.profile:{},o=t.full_name||t.name||a.name||t.user_name||t.preferred_username;return typeof o=="string"&&o.trim()?o.trim():typeof e.email=="string"&&e.email.includes("@")?e.email.split("@")[0].trim()||e.email.trim():typeof e.email=="string"?e.email.trim():""}function PD(e){if(!e||typeof e!="object")return null;const t=e,a=t.session&&typeof t.session=="object"?t.session:null,o=typeof t.accessToken=="string"&&t.accessToken||typeof t.access_token=="string"&&t.access_token||a&&typeof a.accessToken=="string"&&a.accessToken||a&&typeof a.access_token=="string"&&a.access_token||null;return o&&o.length>0?o:null}async function im(e,t={}){if(!e)return null;const a=Math.max(0,Math.floor(Number(t.skewMs)||6e4)),o=e.tokenManager,s=()=>o?.getAccessToken?.()??o?.getSession?.()?.accessToken??null,i=(...u)=>u.find(m=>m&&!ly(m,a))??null;let c=s();if(!c||ly(c,a)){const{data:u}=await e.auth.refreshSession(),m=PD(u);if(c=i(s(),m),!c&&typeof e.auth.getCurrentUser=="function")try{await e.auth.getCurrentUser(),c=i(s(),m)}catch{}}return c||null}function RD({children:e}){const[t,a]=k.useState(null),[o,s]=k.useState(null),[i,c]=k.useState(!0);k.useEffect(()=>{const $=()=>{s(null),a(null),c(!1),Zr(),fl(),qm(),zN()};return window.addEventListener(pl,$),()=>window.removeEventListener(pl,$)},[]),k.useEffect(()=>{Zr()},[o?.id]),k.useEffect(()=>{if(!tm()){a(null),s(null),c(!1);return}a(MI())},[]),k.useEffect(()=>{if(!t)return;if(!LI()){s(null),c(!1);return}let $=!0;return c(!0),(async()=>{try{const{data:ae,error:Ee}=await ED(t.auth,{isActive:()=>$});if(!$)return;if(Ee){s(null);return}s(ae?.user??null)}catch{$&&s(null)}finally{$&&c(!1)}})(),()=>{$=!1}},[t]);const u=k.useCallback(async()=>{if(!(!t||!hn(t)))try{let{data:$,error:ae}=await t.auth.getCurrentUser();if(!ae&&!$?.user){await new Promise(ye=>setTimeout(ye,150));const Ee=await t.auth.getCurrentUser();$=Ee.data,ae=Ee.error}if(ae){hn(t)&&s(null);return}hn(t)&&s($?.user??null)}catch{hn(t)&&s(null)}},[t]),m=k.useCallback(async($,ae)=>{if(!t||!hn(t))return{error:new Error(K("instance.configuration.changed"))};const Ee=Kw();if(typeof Ee?.postMessage!="function"&&(ri()||xn()||oi()||Rl()))return{error:new Error(K("login.oauth.desktop_start_failed"))};if(Ee){const Se=await t.auth.signInWithOAuth({provider:$,redirectTo:"tokentracker://auth/callback",skipBrowserRedirect:!0});if(!hn(t))return{error:new Error(K("instance.configuration.changed"))};if(Se.data?.url)try{await Ee.postMessage(Se.data.url)}catch(Me){return{error:Me instanceof Error?Me:new Error(String(Me))}}return Se}const ye=typeof ae=="string"&&ae.trim()?ae.trim():typeof window<"u"?`${window.location.origin}/dashboard`:void 0;return await t.auth.signInWithOAuth({provider:$,redirectTo:ye})},[t]),f=k.useCallback(async $=>{if(!t||!hn(t))return{data:null,error:new Error(K("instance.configuration.changed"))};const{data:ae,error:Ee}=await t.auth.signInWithPassword($);return hn(t)?(ae?.user&&(sy(),s(ae.user)),{data:ae,error:Ee}):{data:null,error:new Error(K("instance.configuration.changed"))}},[t]),g=k.useCallback(async $=>{if(!t||!hn(t))return{data:null,error:new Error(K("instance.configuration.changed"))};const{data:ae,error:Ee}=await t.auth.signUp($);return hn(t)?(ae?.user&&ae?.accessToken&&(sy(),s(ae.user)),{data:ae,error:Ee}):{data:null,error:new Error(K("instance.configuration.changed"))}},[t]),b=k.useCallback(async $=>!t||!hn(t)?{data:null,error:new Error(K("instance.configuration.changed"))}:t.auth.sendResetPasswordEmail($),[t]),w=k.useCallback(async $=>!t||!hn(t)?{data:null,error:new Error(K("instance.configuration.changed"))}:t.auth.exchangeResetPasswordToken($),[t]),x=k.useCallback(async $=>!t||!hn(t)?{data:null,error:new Error(K("instance.configuration.changed"))}:t.auth.resetPassword($),[t]),S=k.useCallback(async()=>!t||!hn(t)?{data:null,error:new Error(K("instance.configuration.changed"))}:t.auth.getPublicAuthConfig(),[t]),E=k.useCallback(async()=>{t&&(Zr(),await t.auth.signOut(),fl(),Zd(!1),window.dispatchEvent(new Event("tt.cloudSyncChanged")),qm(),s(null))},[t]),C=k.useCallback(async()=>{if(!t||!hn(t))return null;const $=await im(t);return!hn(t)||o?.id&&Nw($)!==o.id?null:$},[t,o?.id]),[U,L]=k.useState(null),[M,D]=k.useState(!1),Y=k.useMemo(()=>AD(o),[o]);k.useEffect(()=>{if(!o||!t||!rw()){L(null),D(!1);return}let $=!0;return(async()=>{try{const ae=await im(t);if(!$||!ae){$&&D(!0);return}const Ee=await by({accessToken:ae});$&&Ee?.display_name&&L(Ee.display_name)}catch{}$&&D(!0)})(),()=>{$=!1}},[o,t]);const J=M?U||Y:"",Q=k.useCallback(async()=>{if(t)try{const $=await im(t);if(!$)return;const ae=await by({accessToken:$});ae?.display_name&&L(ae.display_name)}catch{}},[t]),T=k.useMemo(()=>!tm()||!t?{enabled:!1,configurationError:aw(),connectionHost:ry(),client:null,user:null,signedIn:!1,loading:tm()&&i,displayName:"",refreshUser:async()=>{},refreshDisplayName:async()=>{},signInWithOAuth:async()=>({error:new Error("InsForge not configured")}),signInWithPassword:async()=>({data:null,error:new Error("InsForge not configured")}),signUp:async()=>({data:null,error:new Error("InsForge not configured")}),sendResetPasswordEmail:async()=>({data:null,error:new Error("InsForge not configured")}),exchangeResetPasswordToken:async()=>({data:null,error:new Error("InsForge not configured")}),resetPassword:async()=>({data:null,error:new Error("InsForge not configured")}),getPublicAuthConfig:async()=>({data:null,error:new Error("InsForge not configured")}),signOut:async()=>{},getAccessToken:async()=>null}:{enabled:!0,configurationError:null,connectionHost:ry(),client:t,user:o,signedIn:!!o,loading:i,displayName:J,refreshUser:u,refreshDisplayName:Q,signInWithOAuth:m,signInWithPassword:f,signUp:g,sendResetPasswordEmail:b,exchangeResetPasswordToken:w,resetPassword:x,getPublicAuthConfig:S,signOut:E,getAccessToken:C},[t,o,i,J,u,Q,m,f,g,b,w,x,S,E,C]);return R.jsx(Yw.Provider,{value:T,children:e})}function ii(){return k.useContext(Yw)}const Zw=k.createContext(null),Sy="tt.cloudSyncChanged";function ID({children:e}){const t=ii(),a=!!t?.signedIn,o=!!t?.enabled,s=!!t?.loading,[i,c]=k.useState(()=>hl()),[u,m]=k.useState(()=>za()),[f,g]=k.useState(()=>Bm()),[b,w]=k.useState(0),x=No.useRef(f);k.useEffect(()=>{c(hl()),iw()},[]),k.useEffect(()=>{if(typeof window>"u")return;const M=()=>{const D=za(),Y=Bm();m(J=>J===D?J:D),x.current=Y,g(J=>J===Y?J:Y)};return window.addEventListener(Sy,M),window.addEventListener("storage",M),()=>{window.removeEventListener(Sy,M),window.removeEventListener("storage",M)}},[]),k.useEffect(()=>{if(typeof window>"u")return;const M=()=>{if(Zr(),x.current){w(D=>D+1);return}x.current=!0,g(!0)};return window.addEventListener(Fm,M),()=>window.removeEventListener(Fm,M)},[]);const S=k.useMemo(()=>!o||!a?!1:i?u&&f:!0,[o,a,i,u,f]),E=No.useRef(S);k.useEffect(()=>{E.current!==S&&(Zr(),E.current=S,w(M=>M+1))},[S]);const U=s&&(o&&(!i||u&&f)),L=k.useMemo(()=>({accountView:S,revision:b,localHost:i,resolving:U}),[S,b,i,U]);return R.jsx(Zw.Provider,{value:L,children:e})}function Tj(){const e=k.useContext(Zw);return e||{accountView:!1,revision:0,localHost:!0,resolving:!1}}const Qw=k.createContext(null);function ND(){return Rd(Qh())}function DD(e){typeof document>"u"||(document.documentElement.lang=e)}function Cy(e,t){yD(e),t(a=>a===e?a:e)}function OD({children:e}){const[t,a]=k.useState(Qh),[o,s]=k.useState(ND);k.useLayoutEffect(()=>{DD(o)},[o]),k.useLayoutEffect(()=>{xn()&&zs("locale",t)},[t]),k.useLayoutEffect(()=>{if(t!==Vs||typeof window>"u")return;const u=()=>Cy(Rd(Vs),s);return window.addEventListener("languagechange",u),()=>window.removeEventListener("languagechange",u)},[t]);const i=k.useCallback(u=>{const m=Qd(u);Cy(Rd(m),s),a(m),mD(m),xn()&&zs("locale",m)},[]),c=k.useMemo(()=>({locale:t,setLocale:i,resolvedLocale:o}),[t,o,i]);return R.jsx(Qw.Provider,{value:c,children:e})}const LD="https://open.er-api.com/v6/latest/USD",MD=1440*60*1e3,zD=5e3;function jD(e,t=MD,a=Date.now()){return!e||!Number.isFinite(e)?!0:a-e>t}async function UD(e={}){const{timeoutMs:t=zD,fetchImpl:a,url:o=LD,codes:s=Gh}=e,i=a??(typeof fetch<"u"?fetch:null);if(!i)throw new Error("fetch is not available");const c=typeof AbortController<"u"?new AbortController:null,u=c?setTimeout(()=>c.abort(),t):null;try{const m=await i(o,c?{signal:c.signal}:void 0);if(!m||!m.ok)throw new Error(`exchange rate fetch failed: ${m?.status??"no-response"}`);const g=(await m.json())?.rates;if(!g||typeof g!="object")throw new Error("exchange rate response missing rates");const b={USD:1};for(const w of s){if(w==="USD")continue;const x=g[w];Td(x)&&(b[w]=x)}if(Object.keys(b).length<=1)throw new Error("no supported currency rates in response");return{rates:b,fetchedAt:Date.now()}}finally{u&&clearTimeout(u)}}const HD=k.createContext(null);function Ty(e,t,a){xn()&&(zs("currency",e),zs("currencySymbol",a),Td(t)&&zs("exchangeRate",t))}function FD({children:e}){const[t,a]=k.useState(YI),o=k.useMemo(()=>JI(),[]),[s,i]=k.useState(o.rates),[c,u]=k.useState(o.source),[m,f]=k.useState(o.fetchedAt),g=k.useRef(!1),b=k.useRef(!1),w=k.useCallback((L,M,D)=>{i(L),u(M),f(D),XI({rates:L,source:M,fetchedAt:D})},[]),x=k.useCallback(async()=>{if(!g.current){g.current=!0;try{const{rates:L,fetchedAt:M}=await UD();w({...$h,...L},"fetched",M)}catch{}finally{g.current=!1}}},[w]),S=k.useCallback(L=>{const M=qh(L);a(M),ZI(M);const D=am(s,M),Y=id(M);Ty(M,D,Y)},[s]);k.useEffect(()=>{b.current||t!==gl&&jD(m)&&(b.current=!0,x())},[t,m,x]),k.useEffect(()=>{const L=am(s,t),M=id(t);Ty(t,L,M)},[t,s]);const E=k.useMemo(()=>am(s,t),[s,t]),C=k.useMemo(()=>id(t),[t]),U=k.useMemo(()=>({currency:t,rate:E,symbol:C,rates:s,rateSource:c,rateFetchedAt:m,setCurrency:S}),[t,E,C,s,c,m,S]);return R.jsx(HD.Provider,{value:U,children:e})}function Il(){const e=k.useContext(Qw);if(e===null)throw new Error("useLocale must be used within a LocaleProvider");return e}const La=Object.freeze({COMPACT:"compact",FULL:"full"}),Sn=Object.freeze({ENGLISH:"english",CHINESE:"chinese"}),Ws="tt.tokenFormat",Jd="tt.tokenUnitSystem",ef="tt.tokenGrouping",js=Object.freeze({THOUSAND:"thousand",WAN:"wan"});function Nl(e){return e===Sn.CHINESE?La.COMPACT:e===La.FULL?La.FULL:La.COMPACT}function Xd(e){return e===Sn.CHINESE?Sn.CHINESE:Sn.ENGLISH}function tf(e){return e===js.WAN?js.WAN:js.THOUSAND}function BD(){if(typeof window>"u")return La.COMPACT;try{return Nl(window.localStorage?.getItem(Ws))}catch{return La.COMPACT}}function GD(e){const t=Nl(e);if(typeof window>"u")return t;try{window.localStorage?.setItem(Ws,t)}catch{}return t}function Jw(){if(typeof window>"u")return Sn.ENGLISH;try{const e=window.localStorage?.getItem(Jd);return e?Xd(e):window.localStorage?.getItem(Ws)===Sn.CHINESE?Sn.CHINESE:Sn.ENGLISH}catch{return Sn.ENGLISH}}function Xw(){if(typeof window>"u")return js.THOUSAND;try{return tf(window.localStorage?.getItem(ef))}catch{return js.THOUSAND}}function $D(e){const t=Xd(e);if(typeof window>"u")return t;try{window.localStorage?.setItem(Jd,t)}catch{}return t}function qD(e){const t=tf(e);if(typeof window>"u")return t;try{window.localStorage?.setItem(ef,t)}catch{}return t}function KD(){if(typeof window>"u")return!1;try{return window.localStorage?.getItem(Ws)!==Sn.CHINESE?!1:(window.localStorage?.setItem(Jd,Sn.CHINESE),window.localStorage?.setItem(Ws,La.COMPACT),!0)}catch{return!1}}function Id(e,{mode:t=La.COMPACT,unitSystem:a,grouping:o,forceFull:s=!1,decimals:i=1,thousandSuffix:c="K",millionSuffix:u="M",billionSuffix:m="B",trillionSuffix:f="T"}={}){return s||Nl(t)===La.FULL?nN(e,{groupSize:o===js.WAN?4:3}):t===Sn.CHINESE||Xd(a)===Sn.CHINESE?rN(e,{decimals:i}):aN(e,{decimals:i,thousandSuffix:c,millionSuffix:u,billionSuffix:m,trillionSuffix:f})}function e0(e,t={}){const a=Id(e,{...t,mode:La.FULL,forceFull:!0}),o=Id(e,t);return o===a||o==="-"||a==="-"?a:`${o} · ${a}`}const Ym=k.createContext(null);function VD({children:e}){const{resolvedLocale:t}=Il(),[a,o]=k.useState(()=>(KD(),BD())),[s,i]=k.useState(Jw),[c,u]=k.useState(Xw);k.useEffect(()=>{const E=C=>{C.key===Ws&&(o(Nl(C.newValue)),C.newValue===Sn.CHINESE&&i(Sn.CHINESE)),C.key===Jd&&i(Xd(C.newValue)),C.key===ef&&u(tf(C.newValue))};return window.addEventListener("storage",E),()=>window.removeEventListener("storage",E)},[]),k.useEffect(()=>{(xn()||oi())&&zs("tokenUnitSystem",s)},[s]);const m=k.useCallback(E=>{const C=GD(E);o(C)},[]),f=k.useCallback(E=>{const C=$D(E);i(C)},[]),g=k.useCallback(E=>{const C=qD(E);u(C)},[]),b=k.useMemo(()=>({thousandSuffix:K("shared.unit.thousand_abbrev"),millionSuffix:K("shared.unit.million_abbrev"),billionSuffix:K("shared.unit.billion_abbrev"),trillionSuffix:K("shared.unit.trillion_abbrev")}),[t]),w=k.useCallback((E,C={})=>Id(E,{mode:a,unitSystem:s,grouping:c,...b,...C}),[c,a,b,s]),x=k.useCallback((E,C={})=>e0(E,{mode:a,unitSystem:s,grouping:c,...b,...C}),[c,a,b,s]),S=k.useMemo(()=>({grouping:c,mode:a,setGrouping:g,setMode:m,setUnitSystem:f,unitSystem:s,formatTokens:w,formatTokensTooltip:x}),[w,x,c,a,g,m,f,s]);return R.jsx(Ym.Provider,{value:S,children:e})}function Ej({children:e,mode:t}){const a=k.useContext(Ym),o=Nl(t),s=a?.unitSystem??Jw(),i=a?.grouping??Xw(),c=k.useCallback((f,g={})=>a?a.formatTokens(f,{...g,mode:o}):Id(f,{unitSystem:s,grouping:i,...g,mode:o}),[a,o,s]),u=k.useCallback((f,g={})=>a?a.formatTokensTooltip(f,{...g,mode:o}):e0(f,{unitSystem:s,grouping:i,...g,mode:o}),[a,o,s]),m=k.useMemo(()=>({mode:o,unitSystem:s,grouping:i,setMode:a?.setMode??(()=>{}),setGrouping:a?.setGrouping??(()=>{}),setUnitSystem:a?.setUnitSystem??(()=>{}),formatTokens:c,formatTokensTooltip:u}),[c,u,a?.setGrouping,a?.setMode,a?.setUnitSystem,i,s,o]);return R.jsx(Ym.Provider,{value:m,children:e})}const WD=e=>e?.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();function YD(e,t,a=[]){if(t==null)throw new Error("[lucide]: iconNode is required when icon name is used");return{name:WD(e),size:24,node:t,...a.length>0?{aliases:a}:{}}}const ZD=e=>{let t="",a=!1;for(const o of e){if(o==="-"||o==="_"||o<=" "){a=t.length>0;continue}t.length===0?t+=o.toLowerCase():t+=a?o.toUpperCase():o,a=!1}return t};const QD=e=>{const t=ZD(e);return t.charAt(0).toUpperCase()+t.slice(1)};const Zm=(...e)=>e.filter((t,a,o)=>!!t&&t.trim()!==""&&o.indexOf(t)===a).join(" ").trim();const vo={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};function lm(e){return e!=null}function JD(e,t={}){const a=t.attributeNames??{},o=w=>a[w]??w,s=e.size??e.width??vo.width,i=e.size??e.height??vo.height,c=e.aliases?.filter(w=>typeof w=="string"&&w.trim()!=="").map(w=>`lucide-${w}`)??[],u=[...e.name?[`lucide-${e.name}`]:[],...c],m=t.className?.split(" ").filter(Boolean)??[],f=t.includeDefaultClasses===!1?Zm(...m):Zm("lucide",...u,...m),g=t.absoluteStrokeWidth?Number(t.strokeWidth??vo["stroke-width"])*Number(e.size??e.width??vo.width)/Number(t.size??t.width??vo.width):t.strokeWidth??vo["stroke-width"];return["svg",{...Object.entries(vo).reduce((w,[x,S])=>(w[o(x)]=S,w),{}),..."color"in t&&t.color&&{[o("stroke")]:t.color},..."size"in t&&lm(t.size)&&{[o("width")]:t.size,[o("height")]:t.size},..."width"in t&&lm(t.width)&&{[o("width")]:t.width},..."height"in t&&lm(t.height)&&{[o("height")]:t.height},[o("stroke-width")]:g,...f&&{[o("class")]:f},[o("viewBox")]:`0 0 ${s} ${i}`,...t.hasA11yProp===!1?{[o("aria-hidden")]:"true"}:{},..."attributes"in t&&t.attributes},e.node.map(w=>{const[x,S,E]=w,C=t.nonScalingStroke?{[o("vector-effect")]:"non-scaling-stroke",...S}:S;return E?[x,C,E]:[x,C]})]}function XD(e,t={}){return JD(e,{...t,attributeNames:{...t.attributeNames,class:"className","stroke-width":"strokeWidth","stroke-linecap":"strokeLinecap","stroke-linejoin":"strokeLinejoin","vector-effect":"vectorEffect"}})}const eO=e=>{for(const t in e)if(t.startsWith("aria-")||t==="role"||t==="title")return!0;return!1},tO=k.createContext({}),nO=()=>k.useContext(tO),aO=k.forwardRef(({color:e,size:t,width:a,height:o,strokeWidth:s,absoluteStrokeWidth:i,nonScalingStroke:c,className:u="",children:m,iconNode:f=[],icon:g={node:f,aliases:[],size:24},...b},w)=>{const{size:x=24,strokeWidth:S=2,absoluteStrokeWidth:E=!1,nonScalingStroke:C=!1,color:U="currentColor",className:L=""}=nO()??{},M=!!m||eO(b),[D,Y,J=[]]=XD(g,{color:e??U,width:a??t??x,height:o??t??x,strokeWidth:s??S,absoluteStrokeWidth:i??E,nonScalingStroke:c??C,className:Zm(L,u),hasA11yProp:M,attributes:b});return k.createElement(D,{ref:w,...Y},[...J.map(([Q,T])=>k.createElement(Q,T)),...Array.isArray(m)?m:[m]])});function Lt(e,t=[],a=[]){const o=typeof e=="string"?YD(e,t,a):e,s=k.forwardRef(({className:i,...c},u)=>k.createElement(aO,{ref:u,icon:o,className:i,...c}));return o.name&&(s.displayName=QD(o.name)),s}const t0={name:"activity",size:24,node:[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]};t0.node;const rO=Lt(t0);const n0={name:"award",size:24,node:[["path",{d:"m15.477 12.89 1.515 8.526a.5.5 0 0 1-.81.47l-3.58-2.687a1 1 0 0 0-1.197 0l-3.586 2.686a.5.5 0 0 1-.81-.469l1.514-8.526",key:"1yiouv"}],["circle",{cx:"12",cy:"8",r:"6",key:"1vp47v"}]]};n0.node;const oO=Lt(n0);const a0={name:"chart-column",size:24,node:[["path",{d:"M3 3v16a2 2 0 0 0 2 2h16",key:"c24i48"}],["path",{d:"M18 17V9",key:"2bz60n"}],["path",{d:"M13 17V5",key:"1frdt8"}],["path",{d:"M8 17v-3",key:"17ska0"}]],aliases:["bar-chart-3"]};a0.node;const r0=Lt(a0);const o0={name:"chevron-left",size:24,node:[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]]};o0.node;const sO=Lt(o0);const s0={name:"chevron-right",size:24,node:[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]};s0.node;const iO=Lt(s0);const i0={name:"circle-alert",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],aliases:["alert-circle"]};i0.node;const lO=Lt(i0);const l0={name:"cloud",size:24,node:[["path",{d:"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z",key:"p7xjir"}]]};l0.node;const nf=Lt(l0);const c0={name:"gauge",size:24,node:[["path",{d:"m12 14 4-4",key:"9kzdfg"}],["path",{d:"M3.34 19a10 10 0 1 1 17.32 0",key:"19p75a"}]]};c0.node;const cO=Lt(c0);const d0={name:"globe",size:24,node:[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]]};d0.node;const dO=Lt(d0);const u0={name:"layout-grid",size:24,node:[["rect",{width:"7",height:"7",x:"3",y:"3",rx:"1",key:"1g98yp"}],["rect",{width:"7",height:"7",x:"14",y:"3",rx:"1",key:"6d4xhi"}],["rect",{width:"7",height:"7",x:"14",y:"14",rx:"1",key:"nxv5o0"}],["rect",{width:"7",height:"7",x:"3",y:"14",rx:"1",key:"1bb6yr"}]]};u0.node;const uO=Lt(u0);const p0={name:"menu",size:24,node:[["path",{d:"M4 5h16",key:"1tepv9"}],["path",{d:"M4 12h16",key:"1lakjw"}],["path",{d:"M4 19h16",key:"1djgab"}]]};p0.node;const pO=Lt(p0);const m0={name:"monitor",size:24,node:[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]]};m0.node;const mO=Lt(m0);const h0={name:"moon",size:24,node:[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]]};h0.node;const Ey=Lt(h0);const f0={name:"paw-print",size:24,node:[["circle",{cx:"11",cy:"4",r:"2",key:"vol9p0"}],["circle",{cx:"18",cy:"8",r:"2",key:"17gozi"}],["circle",{cx:"20",cy:"16",r:"2",key:"1v9bxh"}],["path",{d:"M9 10a5 5 0 0 1 5 5v3.5a3.5 3.5 0 0 1-6.84 1.045Q6.52 17.48 4.46 16.84A3.5 3.5 0 0 1 5.5 10Z",key:"1ydw1z"}]]};f0.node;const hO=Lt(f0);const g0={name:"puzzle",size:24,node:[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]]};g0.node;const fO=Lt(g0);const _0={name:"refresh-cw",size:24,node:[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]};_0.node;const gO=Lt(_0);const b0={name:"rotate-ccw-clock",size:24,node:[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],aliases:["history"]};b0.node;const y0=Lt(b0);const k0={name:"settings",size:24,node:[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]};k0.node;const _O=Lt(k0);const v0={name:"sun",size:24,node:[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]]};v0.node;const Ay=Lt(v0);const w0={name:"triangle-alert",size:24,node:[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]],aliases:["alert-triangle"]};w0.node;const bO=Lt(w0);const x0={name:"trophy",size:24,node:[["path",{d:"M10 14.66V17a1 1 0 0 1-1 1 2 2 0 0 0-2 2v2",key:"pwuv1l"}],["path",{d:"M14 14.66V17a1 1 0 0 0 1 1 2 2 0 0 1 2 2v2",key:"1y54w1"}],["path",{d:"M17.916 10H19.5A2.5 2.5 0 0 0 22 7.5V5a1 1 0 0 0-1-1h-3",key:"e30mpu"}],["path",{d:"M4 22h16",key:"57wxv0"}],["path",{d:"M6 9a6 6 0 0 0 12 0V3a1 1 0 0 0-1-1H7a1 1 0 0 0-1 1z",key:"1mhfuq"}],["path",{d:"M6.084 10H4.5A2.5 2.5 0 0 1 2 7.5V5a1 1 0 0 1 1-1h3",key:"i0yafy"}]]};x0.node;const yO=Lt(x0);const S0={name:"x",size:24,node:[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]};S0.node;const af=Lt(S0);function Fo({children:e,variant:t="primary",size:a="md",onClick:o,disabled:s=!1,className:i="",as:c="button",...u}){const m="inline-flex items-center justify-center font-medium transition-all duration-200 rounded-md focus:outline-none focus:ring-2 focus:ring-oai-blue/30 active:scale-[0.98] active:duration-100",f={primary:"bg-oai-black dark:bg-oai-white text-white dark:text-oai-black border border-transparent hover:bg-oai-gray-800 dark:hover:bg-oai-gray-200 active:bg-oai-gray-900 dark:active:bg-oai-gray-300 disabled:bg-oai-gray-300 dark:disabled:bg-oai-gray-700 disabled:text-oai-gray-500 dark:disabled:text-oai-gray-400 focus:ring-oai-brand/30 transition-colors duration-200",secondary:"bg-oai-white dark:bg-oai-gray-900 text-oai-black dark:text-oai-white border border-oai-gray-300 dark:border-oai-gray-700 hover:border-oai-brand hover:text-oai-brand active:bg-oai-gray-50 dark:active:bg-oai-gray-800 active:border-oai-brand-dark disabled:text-oai-gray-400 dark:disabled:text-oai-gray-500 disabled:border-oai-gray-200 dark:disabled:border-oai-gray-700 focus:ring-oai-brand/30 transition-colors duration-200",ghost:"bg-transparent text-oai-gray-600 dark:text-oai-gray-300 border border-transparent hover:text-oai-brand hover:bg-oai-brand-50/50 dark:hover:bg-oai-brand-950/30 active:bg-oai-brand-50 dark:active:bg-oai-brand-900/50 disabled:text-oai-gray-400 dark:disabled:text-oai-gray-500 focus:ring-oai-brand/30 transition-colors duration-200"},g={sm:"h-8 px-3 text-sm",md:"h-10 px-4 text-sm",lg:"h-12 px-6 text-base"},b=s?"cursor-not-allowed opacity-60":"cursor-pointer",w=`${m} ${f[t]} ${g[a]} ${b} ${i}`;return R.jsx(c,{className:w,onClick:o,disabled:s,...u,children:e})}class kO extends No.Component{constructor(t){super(t),this.state={error:null},this.handleReload=this.handleReload.bind(this)}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,a){console.error("ErrorBoundary caught an error:",t)}handleReload(){typeof window>"u"||window.location.reload()}render(){const{error:t}=this.state;if(!t)return this.props.children;const a=String(t?.message||t||""),o=a?K("shared.error.prefix",{error:a}):K("error.boundary.no_details");return R.jsx("div",{className:"flex min-h-screen items-center justify-center bg-oai-white p-6 font-oai text-oai-black antialiased dark:bg-oai-gray-950 dark:text-oai-white",children:R.jsxs("div",{className:"w-full max-w-lg rounded-xl border border-oai-gray-200 bg-white p-6 text-center shadow-sm dark:border-oai-gray-800 dark:bg-oai-gray-900",children:[R.jsx("div",{className:"mx-auto flex h-10 w-10 items-center justify-center rounded-full bg-amber-50 text-amber-600 dark:bg-amber-950/30 dark:text-amber-300",children:R.jsx(bO,{className:"h-5 w-5","aria-hidden":!0})}),R.jsx("div",{className:"mt-4 text-xs font-medium uppercase text-oai-gray-500 dark:text-oai-gray-400",children:K("error.boundary.title")}),R.jsx("h1",{className:"mt-2 text-xl font-semibold text-oai-black dark:text-white",children:K("error.boundary.subtitle")}),R.jsx("p",{className:"mt-2 text-sm text-oai-gray-500 dark:text-oai-gray-400",children:K("error.boundary.hint")}),R.jsx("div",{className:"mt-4 max-h-32 overflow-auto rounded-lg border border-oai-gray-200 bg-oai-gray-50 px-3 py-2 text-left text-xs leading-5 text-oai-gray-600 dark:border-oai-gray-800 dark:bg-oai-gray-950 dark:text-oai-gray-300",children:o}),R.jsxs(Fo,{type:"button",size:"md",onClick:this.handleReload,className:"mt-5",children:[R.jsx(gO,{className:"mr-2 h-4 w-4","aria-hidden":!0}),K("error.boundary.action.reload")]})]})})}}const Qm="tokentracker-theme",C0=k.createContext(null);function vO(){if(typeof window>"u")return"system";try{const e=localStorage.getItem(Qm);if(e==="light"||e==="dark"||e==="system")return e}catch{}return"system"}function qc(){return typeof window>"u"?"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function wO(e){if(typeof document>"u")return;const t=document.documentElement;e==="dark"?t.classList.add("dark"):t.classList.remove("dark")}function xO({children:e}){const[t,a]=k.useState(vO),[o,s]=k.useState(()=>{if(t!=="system")return t;if(xn()){const f=vy();if(typeof f=="boolean")return f?"dark":"light"}return qc()}),i=k.useRef(t);k.useEffect(()=>{i.current=t},[t]),k.useEffect(()=>{wO(o)},[o]),k.useLayoutEffect(()=>{if(t==="system"){if(xn()){const f=vy();s(typeof f=="boolean"?f?"dark":"light":qc()),xD();return}s(qc())}else s(t)},[t]),k.useEffect(()=>xn()?kD(g=>{i.current==="system"&&s(g?"dark":"light")}):void 0,[]),k.useEffect(()=>{if(typeof window>"u"||t!=="system"||xn())return;const f=window.matchMedia("(prefers-color-scheme: dark)"),g=b=>{const w=b.matches?"dark":"light";s(w)};return f.addEventListener?(f.addEventListener("change",g),()=>f.removeEventListener("change",g)):(f.addListener(g),()=>f.removeListener(g))},[t]),k.useEffect(()=>{const f=t==="system"&&!xn()?qc():o;SD(f,t)},[o,t]);const c=k.useCallback(f=>{if(a(f),typeof window<"u")try{localStorage.setItem(Qm,f)}catch{}},[]),u=k.useCallback(()=>{c(f=>{const g=f==="dark"?"light":"dark";if(typeof window<"u")try{localStorage.setItem(Qm,g)}catch{}return g})},[]),m=k.useMemo(()=>({theme:t,setTheme:c,toggleTheme:u,resolvedTheme:o}),[t,c,u,o]);return R.jsx(C0.Provider,{value:m,children:e})}const Jm="tt.cloud.action",SO=1800*1e3,T0=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;let Rs=null,Xm=!1;function E0(){if(Xm)return Rs;let e;try{e=window.sessionStorage.getItem(Jm)}catch{return Rs}try{Rs=JSON.parse(e||"null")}catch{Rs=null}return Rs}function rf(e){Rs=e;try{e?window.sessionStorage.setItem(Jm,JSON.stringify(e)):window.sessionStorage.removeItem(Jm),Xm=!1}catch{Xm=!0}}function A0(e,t,a){e.set("flow",crypto.randomUUID());const o=`/billing/checkout?${e}`;return rf({nextPath:o,...t,ownerId:typeof a=="string"&&a?a:null,backend:ml(),createdAt:Date.now()}),o}function CO({trial:e,sku:t,userId:a}){if(typeof t!="string"||!t.trim())throw new TypeError("invalid_cloud_action_sku");const o=new URLSearchParams;return e===!0&&o.set("intent","trial"),o.set("sku",t),A0(o,{trial:e===!0,sku:t},a)}function Aj({orderId:e,userId:t}){if(typeof e!="string"||!T0.test(e))throw new TypeError("invalid_cloud_action_order");const a=new URLSearchParams({order:e});return A0(a,{trial:!1,sku:null,orderId:e},t)}function TO(e,t){if(typeof e!="string"||!e.startsWith("/billing/checkout?"))return null;const a=E0();if(!a||typeof a!="object"||Array.isArray(a)||a.nextPath!==e||typeof a.backend!="string"||!a.backend||a.backend!==ml()||a.ownerId!==null&&(typeof a.ownerId!="string"||!a.ownerId||a.ownerId!==t)||!Number.isFinite(a.createdAt))return null;const o=typeof a.sku=="string"&&!!a.sku.trim()&&typeof a.trial=="boolean"&&a.orderId===void 0,s=a.trial===!1&&a.sku===null&&typeof a.orderId=="string"&&T0.test(a.orderId);if(!o&&!s)return null;const i=Date.now()-a.createdAt;return i<0||i>=SO?null:{...a}}function Pj(e,t){if(typeof t!="string"||!t)return null;const a=TO(e,t);return a?(rf(null),a):null}function Py(e){typeof e!="string"||!e||E0()?.nextPath===e&&rf(null)}function EO(e){return typeof e!="string"||!/^\/(cloud|billing\/checkout)(\?|$)/.test(e)||e.includes("\\")||Array.from(e).some(t=>t.charCodeAt(0)<32||t.charCodeAt(0)===127)?null:e}function cm(e){if(e?.nextPath)try{window.sessionStorage.getItem("tt.cloud.return")===e.nextPath&&window.sessionStorage.removeItem("tt.cloud.return")}catch{}}const P0=k.createContext({isOpen:!1,request:null,openLoginModal:()=>{},closeLoginModal:()=>{},completeLoginModal:()=>{}});function AO({children:e}){const t=Xr(),a=An(),o=k.useRef(a.key);o.current=a.key;const[s,i]=k.useState(!1),[c,u]=k.useState(null),m=k.useRef(null),f=k.useRef(0),g=k.useCallback(x=>{Py(m.current?.nextPath),cm(m.current);const S={id:++f.current,locationKey:o.current,nextPath:EO(x?.nextPath),subtitle:typeof x?.subtitle=="string"?x.subtitle:void 0,closePath:x?.closePath==="/cloud"?"/cloud":null};m.current=S,u(S),i(!0)},[]),b=k.useCallback(x=>{const S=m.current;!S||typeof x=="number"&&S.id!==x||(m.current=null,Py(S.nextPath),cm(S),i(!1),S.closePath&&S.locationKey===o.current&&t(S.closePath,{replace:!0}))},[t]),w=k.useCallback(x=>{const S=m.current;if(!(!S||S.id!==x)){if(S.locationKey!==o.current){b(x);return}m.current=null,cm(S),i(!1),S.nextPath&&t(S.nextPath,{replace:!0})}},[t,b]);return k.useEffect(()=>{const x=m.current;x&&x.locationKey!==a.key&&b(x.id)},[a.key,b]),R.jsx(P0.Provider,{value:{isOpen:s,request:c,openLoginModal:g,closeLoginModal:b,completeLoginModal:w},children:e})}function PO(){return k.useContext(P0)}const Rj="https://tokentracker.statuspage.io/",RO="https://github.com/xiufengsun/TokenTracker",R0=`${RO}/releases/latest`,Ij=`${R0}/download/TokenTrackerBar.dmg`,Nj=`${R0}/download/TokenTracker-Setup.exe`;function IO(){return typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1")?"":Wt()}function NO(){return Wt()}function DO(e=""){if(typeof e!="string"||e.length===0)return!1;const t=new URLSearchParams(e),a=String(t.get("screenshot")||"").toLowerCase();return a==="1"||a==="true"}const Nd=900*1e3,OO=720*60*1e3,Kc=new Map;function Us(e){try{const t=JSON.parse(atob(e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/")));if(typeof t.sub=="string"&&t.sub)return t.sub}catch{}return""}function I0(e){return typeof e=="string"&&/^https?:\/\//i.test(e.trim())}function LO(e,t=Date.now()){if(!e?.localSessionId||!e?.deviceId||!e?.issuedAt)return!0;const a=Date.parse(e.issuedAt);return Number.isFinite(a)?a+OO<=t:!0}async function MO(e){const t=Wt();if(!I0(t)||!e)return null;const a=await Pl(),o=await fetch("/functions/tokentracker-cloud-session",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",...a,Authorization:`Bearer ${e}`},body:JSON.stringify({expectedOwnerId:Us(e),insforgeBaseUrl:t})}),s=await o.json().catch(()=>({}));if(!o.ok)throw Object.assign(new Error(s.error||`HTTP ${o.status}`),{status:o.status,code:s.code,recoveryUrl:s.recovery_url});return typeof s.session_id!="string"||typeof s.device_id!="string"?null:{localSessionId:s.session_id,deviceId:s.device_id,issuedAt:s.created_at||new Date().toISOString()}}async function Ry(e){const{session:t,insforgeBaseUrl:a,drain:o}=e,s={cloudSessionId:t.localSessionId||"",expectedOwnerId:t.ownerId||""};e.auto?s.auto=!0:s.recheckCloudAccess=!0,o===!0&&(s.drain=!0);const i=a||Wt();I0(i)&&(s.insforgeBaseUrl=i.trim());const c=await Pl();if(!e.isCurrent())return null;const u=await fetch("/functions/tokentracker-local-sync",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json",...c},body:JSON.stringify(s)}),m=await u.json().catch(()=>({}));if(!u.ok){const f=typeof m.error=="string"?m.error:`HTTP ${u.status}`,g=Date.parse(String(m.next_allowed_at||""));throw Number.isFinite(g)&&Xi(g-Nd),Object.assign(new Error(f),{status:u.status,code:m.code??null})}return m}async function Iy(e,t){const a=await e();if(!za()||!a||Us(a)!==t)return null;let o=lw();o&&o.ownerId!==t&&(fl(),o=null);const s=cw();if(o&&!LO(o))return o;const i=`${Wt()}\0${t}\0${s}`;let c=Kc.get(i);c||(c=(async()=>{const u=await MO(a);if(!u)return null;const m=await e();if(!m||Us(m)!==t)return null;const f={...u,ownerId:t,generation:s};return HI(f,s)?f:null})(),Kc.set(i,c));try{return await c}finally{Kc.get(i)===c&&Kc.delete(i)}}async function N0(e,t={}){let a=await e();if(!za()||!a||(await iw(),!za()))return null;const o=Us(a);if(!o)return null;let s=await Iy(e,o);if(!s)return null;const i=()=>s?.generation===cw()&&lw()?.ownerId===o&&za(),c=async()=>{const u=await e();return u&&Us(u)===o&&i()?u:null};try{if(a=await c(),!a)return null;const u=await Ry({session:s,auto:t.auto===!0,insforgeBaseUrl:Wt(),drain:t.drain===!0,isCurrent:i});if(!u||!await c())return null;const m=Date.parse(u.next_allowed_at);return Number.isFinite(m)?Xi(m-Nd):u.uploaded===!0&&Xi(Date.now()),u.pending!==!0&&u.uploaded===!0&&iy(),a}catch(u){if(!await c())return null;if(!["CLOUD_DEVICE_TOKEN_REJECTED","auth_session_changed"].includes(u?.code))throw u;if(fl(),a=await e(),!a||Us(a)!==o||(s=await Iy(e,o),!s))return null;const m=await Ry({session:s,auto:t.auto===!0,insforgeBaseUrl:Wt(),drain:t.drain===!0,isCurrent:i});if(!m||!await c())return null;const f=Date.parse(m.next_allowed_at);return Number.isFinite(f)?Xi(f-Nd):m.uploaded===!0&&Xi(Date.now()),m.pending!==!0&&m.uploaded===!0&&iy(),a}}async function zO(e){const t=dw(),a=Bm();t>0&&Date.now()-t<Nd||await N0(e,{drain:!a,auto:!0})}async function Dj(e){await N0(e,{drain:!0})}function jO(e){const t=e.replace(/\/+$/,"")||"/";return t==="/share"||t==="/share.html"||t.startsWith("/share/")}function UO(e){const t=e.replace(/\/+$/,"")||"/";return t==="/login"||t==="/landing"||jO(t)?!1:t==="/"||t==="/dashboard"||t.startsWith("/leaderboard")}function HO(){const e=An(),t=ii(),a=k.useRef(null),[o,s]=k.useState(za);k.useEffect(()=>{const i=()=>s(za());return window.addEventListener("tt.cloudSyncChanged",i),window.addEventListener("storage",i),()=>{window.removeEventListener("tt.cloudSyncChanged",i),window.removeEventListener("storage",i)}},[]),k.useEffect(()=>{if(!hl()||!UO(e.pathname||"/")||!t.enabled||!t.signedIn||t.loading||!o)return;let i=!1,c;const u=async()=>{if(i||a.current||document.visibilityState==="hidden"||!za())return;window.clearTimeout(c);const f=Symbol("cloud-sync");a.current=f;try{await zO(()=>t.getAccessToken())}catch(g){console.warn("[tokentracker] cloud usage sync:",g)}finally{if(a.current===f&&(a.current=null),!i){const g=dw()+9e5-Date.now(),b=g>0?g+1e3:900*1e3;c=window.setTimeout(()=>{u()},b)}}};c=window.setTimeout(()=>{u()},2500);const m=()=>{document.visibilityState==="visible"&&u()};return document.addEventListener("visibilitychange",m),()=>{i=!0,a.current=null,window.clearTimeout(c),document.removeEventListener("visibilitychange",m)}},[e.pathname,o,t.enabled,t.signedIn,t.loading,t.getAccessToken])}function FO(e,t){const a=e?.code||e?.message;return a==="instance_changed"?K("instance.configuration.changed"):a==="gift_code_unavailable"?K("cloud.gift.error_unavailable"):["gift_rate_limited","gift_redemption_rate_limited"].includes(a)?K("cloud.gift.error_rate_limit"):a==="gift_not_available"?K("cloud.gift.error_not_available"):a==="gift_requires_renewal_cancel"?K("cloud.gift.error_renewal"):a==="gift_checkout_pending"?K("cloud.gift.error_checkout"):a==="gift_membership_active"?K("cloud.gift.error_active"):a==="billing_catalog_unavailable"?K("cloud.error.catalog"):a==="billing_devices_unavailable"?K("cloud.error.devices"):["authentication_required","invalid_token","invalid_authentication"].includes(a)?K("cloud.error.auth"):["checkout_not_launched","trial_not_launched","billing_not_configured","billing_configuration_invalid"].includes(a)?K("cloud.error.unavailable"):["payment_provider_not_configured","waffo_not_configured","paddle_not_configured","wechat_not_configured","alipay_not_configured"].includes(a)?K(t==="account"?"cloud.error.account_provider":"cloud.error.provider"):a==="subscription_already_exists"?K("cloud.error.subscription_exists"):a==="fixed_term_still_active"?K("cloud.error.fixed_term"):["checkout_confirmation_pending","waffo_notification_pending"].includes(a)?K("cloud.checkout.verification_pending"):a==="checkout_already_paid"?K("cloud.checkout.received"):a==="trial_unavailable"?K("cloud.error.trial"):a==="order_not_found"?K("cloud.error.order_not_found"):["checkout_expired","order_expired"].includes(a)?K("cloud.error.expired"):["checkout_request_conflict","pending_checkout_exists"].includes(a)?K("cloud.error.request_conflict"):a==="billing_network_error"?K(t==="gift"?"cloud.gift.error_network":t==="account"?"cloud.error.account_network":"cloud.error.network"):["invalid_provider_checkout_url","browser_open_failed"].includes(a)?K("cloud.error.browser"):["machine_limit_exceeded","cloud_machine_limit"].includes(a)?K("cloud.error.machines"):a==="cloud_machine_paused"?K("cloud.error.machine_paused"):["cloud_membership_required","cloud_read_only_expired"].includes(a)?K("cloud.error.membership"):K("cloud.error.generic")}function BO({children:e,error:t,onRetry:a,context:o,role:s}){return R.jsxs("div",{className:"flex items-start gap-3 rounded-lg border border-oai-gray-200 bg-oai-gray-50 p-4 text-sm leading-6 text-oai-gray-600 dark:border-oai-gray-800 dark:bg-oai-gray-900 dark:text-oai-gray-300",role:t?"alert":s||"status",children:[R.jsx(lO,{size:18,className:"mt-0.5 shrink-0","aria-hidden":!0}),R.jsx("div",{className:"min-w-0 flex-1",children:t?FO(t,o):e}),a?R.jsx(Fo,{variant:"ghost",onClick:a,className:"shrink-0",children:K("cloud.action.retry")}):null]})}function Oj({showBillingLink:e=!0}){return R.jsxs(BO,{role:"alert",children:[R.jsx("p",{children:K("cloud.checkout.duplicate_payment")}),e?R.jsx(Fo,{as:Qr,to:"/settings?section=cloud",variant:"secondary",className:"mt-3 no-underline",children:K("cloud.action.view_bills")}):null]})}function GO(e){const t=new Date(e);return e&&Number.isFinite(t.getTime())?new Intl.DateTimeFormat($w(),{year:"numeric",month:"short",day:"numeric"}).format(t):K("cloud.date.unknown")}function Lj(e){const t=new Date(e);return e&&Number.isFinite(t.getTime())?new Intl.DateTimeFormat($w(),{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"}).format(t):K("cloud.date.unknown")}function Mj(e){return{legacy_free:K("cloud.status.legacy_free"),active:K("cloud.status.active"),trial:K("cloud.status.trial"),transition:K("cloud.status.transition"),expired:K("cloud.status.expired"),free:K("cloud.status.free"),self_hosted:K("cloud.status.self_hosted")}[e]||K("cloud.status.unknown")}function zj(){return R.jsx("div",{className:"tt-cloud-theme flex flex-1 flex-col font-oai text-oai-black dark:text-oai-white",children:R.jsxs("main",{className:"mx-auto w-full max-w-3xl space-y-5 px-4 py-8 sm:px-6 sm:py-12",children:[R.jsx("h1",{className:"text-3xl font-semibold tracking-tight",children:K("cloud.self_host.instance_title")}),R.jsx("p",{className:"text-sm leading-6 text-oai-gray-600 dark:text-oai-gray-300",children:K("cloud.self_host.instance_body")}),R.jsx("p",{className:"text-sm leading-6 text-oai-gray-600 dark:text-oai-gray-300",children:K("cloud.self_host.instance_retention")}),R.jsxs("div",{className:"flex flex-wrap gap-3",children:[R.jsx(Fo,{as:Qr,to:"/dashboard",className:"no-underline",children:K("cloud.action.open_dashboard")}),R.jsx(Fo,{as:Qr,to:"/settings?section=cloud",variant:"secondary",className:"no-underline",children:K("cloud.self_host.manage_devices")})]})]})})}function jj(e){return{waffo:K("cloud.provider.waffo"),paddle:K("cloud.provider.paddle"),wechat:K("cloud.provider.wechat"),alipay:K("cloud.provider.alipay")}[e]||K("cloud.provider.unknown")}function Uj({limits:e}){const t=[{Icon:r0,label:K("cloud.feature.analysis"),detail:K("cloud.feature.analysis_detail")},{Icon:y0,label:K("cloud.feature.history_title"),detail:K("cloud.feature.history",{days:e?.hourly_history_days||90,months:e?.daily_history_months||24})},{Icon:nf,label:K("cloud.feature.sync_title"),detail:K("cloud.feature.sync",{minutes:e?.sync_minutes||15})}];return R.jsx("ul",{className:"space-y-4",children:t.map(({Icon:a,label:o,detail:s})=>R.jsxs("li",{className:"flex items-start gap-3",children:[R.jsx(a,{size:17,className:"mt-0.5 shrink-0 text-oai-gray-600 dark:text-oai-gray-300","aria-hidden":!0}),R.jsxs("div",{children:[R.jsx("p",{className:"text-sm font-medium",children:o}),R.jsx("p",{className:"mt-1 text-xs leading-5 text-oai-gray-500 dark:text-oai-gray-400",children:s})]})]},o))})}function D0(e){return k.useSyncExternalStore(LN,MN,()=>0),Iw(e)}function O0({userId:e,decision:t,onContinueLocal:a,localHost:o,onTrialClick:s}){if(!t)return null;const i=t.kind==="deadline";return R.jsx("section",{className:"tt-cloud-theme rounded-lg border border-oai-gray-200 bg-oai-gray-50 p-4 dark:border-oai-gray-800 dark:bg-oai-gray-900","aria-label":K("cloud.prompt.label"),children:R.jsxs("div",{className:"flex items-start gap-3",children:[R.jsx(nf,{size:17,className:"mt-0.5 shrink-0 text-oai-gray-600 dark:text-oai-gray-300","aria-hidden":!0}),R.jsxs("div",{className:"min-w-0 flex-1",children:[R.jsx("p",{className:"text-sm leading-6 text-oai-gray-700 dark:text-oai-gray-200",children:K(t.bodyKey,i?{date:GO(t.date)}:void 0)}),i?null:R.jsx("p",{className:"mt-2 text-xs leading-5 text-oai-gray-600 dark:text-oai-gray-400",children:K("cloud.prompt.free")}),i?null:R.jsxs("div",{className:"mt-3 flex flex-wrap gap-2",children:[R.jsx(Fo,{as:Qr,to:s?"/cloud":t.href,onClick:s,variant:"secondary",className:"no-underline",children:K(t.ctaKey)}),o&&a?R.jsx(Fo,{onClick:a,variant:"ghost",children:K("cloud.prompt.local")}):null]})]}),R.jsx("button",{type:"button",onClick:()=>HN(e,t.scene),"aria-label":K("cloud.prompt.dismiss"),className:"inline-flex min-h-10 min-w-10 shrink-0 items-center justify-center rounded-md text-oai-gray-500 hover:bg-oai-gray-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-oai-gray-500 dark:text-oai-gray-400 dark:hover:bg-oai-gray-800",children:R.jsx(af,{size:16,"aria-hidden":!0})})]})})}function $O({userId:e,panel:t="dashboard",onContinueLocal:a,localHost:o=!1,className:s}){const i=Xr(),c=D0(e),u=!!(c.intent&&(t!=="sync"||c.intent==="sync")),m=_y({...c,userId:e,scene:c.intent,intentional:u});if(!m)return null;const f=m.kind==="promotion"&&m.ctaKey==="cloud.prompt.try"?b=>{if(b.defaultPrevented||b.button!==0||b.metaKey||b.ctrlKey||b.shiftKey||b.altKey)return;b.preventDefault();const w=Iw(e),x=_y({...w,userId:e,scene:w.intent,intentional:!!(w.intent&&(t!=="sync"||w.intent==="sync"))}),S=Array.isArray(w.catalog?.prices)?w.catalog.prices.filter(C=>typeof C?.sku=="string"&&C.sku.trim()&&Number.isFinite(C.amount_cents)&&C.amount_cents>0&&["USD","CNY"].includes(C.currency)&&[1,12].includes(C.term_months)&&["recurring","fixed"].includes(C.billing_mode)):[],E=S.find(C=>C.term_months===12&&C.billing_mode==="recurring")||S[0];i(x?.ctaKey==="cloud.prompt.try"&&E?CO({trial:!0,sku:E.sku,userId:e}):"/cloud")}:void 0,g=R.jsx(O0,{userId:e,decision:m,onContinueLocal:a,localHost:o,onTrialClick:f});return s?R.jsx("div",{className:s,children:g}):g}function Hj({userId:e,membership:t,subscriptions:a,className:o}){D0(e);const s=BN({userId:e,membership:t,subscriptions:a});if(!s)return null;const i=R.jsx(O0,{userId:e,decision:s});return o?R.jsx("div",{className:o,children:i}):i}function L0(e){var t,a,o="";if(typeof e=="string"||typeof e=="number")o+=e;else if(typeof e=="object")if(Array.isArray(e)){var s=e.length;for(t=0;t<s;t++)e[t]&&(a=L0(e[t]))&&(o&&(o+=" "),o+=a)}else for(a in e)e[a]&&(o&&(o+=" "),o+=a);return o}function qO(){for(var e,t,a=0,o="",s=arguments.length;a<s;a++)(e=arguments[a])&&(t=L0(e))&&(o&&(o+=" "),o+=t);return o}const KO=(e,t)=>{const a=new Array(e.length+t.length);for(let o=0;o<e.length;o++)a[o]=e[o];for(let o=0;o<t.length;o++)a[e.length+o]=t[o];return a},VO=(e,t)=>({classGroupId:e,validator:t}),M0=(e=new Map,t=null,a)=>({nextPart:e,validators:t,classGroupId:a}),Dd="-",Ny=[],WO="arbitrary..",YO=e=>{const t=QO(e),{conflictingClassGroups:a,conflictingClassGroupModifiers:o}=e;return{getClassGroupId:c=>{if(c.startsWith("[")&&c.endsWith("]"))return ZO(c);const u=c.split(Dd),m=u[0]===""&&u.length>1?1:0;return z0(u,m,t)},getConflictingClassGroupIds:(c,u)=>{if(u){const m=o[c],f=a[c];return m?f?KO(f,m):m:f||Ny}return a[c]||Ny}}},z0=(e,t,a)=>{if(e.length-t===0)return a.classGroupId;const s=e[t],i=a.nextPart.get(s);if(i){const f=z0(e,t+1,i);if(f)return f}const c=a.validators;if(c===null)return;const u=t===0?e.join(Dd):e.slice(t).join(Dd),m=c.length;for(let f=0;f<m;f++){const g=c[f];if(g.validator(u))return g.classGroupId}},ZO=e=>e.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const t=e.slice(1,-1),a=t.indexOf(":"),o=t.slice(0,a);return o?WO+o:void 0})(),QO=e=>{const{theme:t,classGroups:a}=e;return JO(a,t)},JO=(e,t)=>{const a=M0();for(const o in e){const s=e[o];of(s,a,o,t)}return a},of=(e,t,a,o)=>{const s=e.length;for(let i=0;i<s;i++){const c=e[i];XO(c,t,a,o)}},XO=(e,t,a,o)=>{if(typeof e=="string"){eL(e,t,a);return}if(typeof e=="function"){tL(e,t,a,o);return}nL(e,t,a,o)},eL=(e,t,a)=>{const o=e===""?t:j0(t,e);o.classGroupId=a},tL=(e,t,a,o)=>{if(aL(e)){of(e(o),t,a,o);return}t.validators===null&&(t.validators=[]),t.validators.push(VO(a,e))},nL=(e,t,a,o)=>{const s=Object.entries(e),i=s.length;for(let c=0;c<i;c++){const[u,m]=s[c];of(m,j0(t,u),a,o)}},j0=(e,t)=>{let a=e;const o=t.split(Dd),s=o.length;for(let i=0;i<s;i++){const c=o[i];let u=a.nextPart.get(c);u||(u=M0(),a.nextPart.set(c,u)),a=u}return a},aL=e=>"isThemeGetter"in e&&e.isThemeGetter===!0,rL=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,a=Object.create(null),o=Object.create(null);const s=(i,c)=>{a[i]=c,t++,t>e&&(t=0,o=a,a=Object.create(null))};return{get(i){let c=a[i];if(c!==void 0)return c;if((c=o[i])!==void 0)return s(i,c),c},set(i,c){i in a?a[i]=c:s(i,c)}}},eh="!",Dy=":",oL=[],Oy=(e,t,a,o,s)=>({modifiers:e,hasImportantModifier:t,baseClassName:a,maybePostfixModifierPosition:o,isExternal:s}),sL=e=>{const{prefix:t,experimentalParseClassName:a}=e;let o=s=>{const i=[];let c=0,u=0,m=0,f;const g=s.length;for(let E=0;E<g;E++){const C=s[E];if(c===0&&u===0){if(C===Dy){i.push(s.slice(m,E)),m=E+1;continue}if(C==="/"){f=E;continue}}C==="["?c++:C==="]"?c--:C==="("?u++:C===")"&&u--}const b=i.length===0?s:s.slice(m);let w=b,x=!1;b.endsWith(eh)?(w=b.slice(0,-1),x=!0):b.startsWith(eh)&&(w=b.slice(1),x=!0);const S=f&&f>m?f-m:void 0;return Oy(i,x,w,S)};if(t){const s=t+Dy,i=o;o=c=>c.startsWith(s)?i(c.slice(s.length)):Oy(oL,!1,c,void 0,!0)}if(a){const s=o;o=i=>a({className:i,parseClassName:s})}return o},iL=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((a,o)=>{t.set(a,1e6+o)}),a=>{const o=[];let s=[];for(let i=0;i<a.length;i++){const c=a[i],u=c[0]==="[",m=t.has(c);u||m?(s.length>0&&(s.sort(),o.push(...s),s=[]),o.push(c)):s.push(c)}return s.length>0&&(s.sort(),o.push(...s)),o}},lL=e=>({cache:rL(e.cacheSize),parseClassName:sL(e),sortModifiers:iL(e),postfixLookupClassGroupIds:cL(e),...YO(e)}),cL=e=>{const t=Object.create(null),a=e.postfixLookupClassGroups;if(a)for(let o=0;o<a.length;o++)t[a[o]]=!0;return t},dL=/\s+/,uL=(e,t)=>{const{parseClassName:a,getClassGroupId:o,getConflictingClassGroupIds:s,sortModifiers:i,postfixLookupClassGroupIds:c}=t,u=[],m=e.trim().split(dL);let f="";for(let g=m.length-1;g>=0;g-=1){const b=m[g],{isExternal:w,modifiers:x,hasImportantModifier:S,baseClassName:E,maybePostfixModifierPosition:C}=a(b);if(w){f=b+(f.length>0?" "+f:f);continue}let U=!!C,L;if(U){const Q=E.substring(0,C);L=o(Q);const T=L&&c[L]?o(E):void 0;T&&T!==L&&(L=T,U=!1)}else L=o(E);if(!L){if(!U){f=b+(f.length>0?" "+f:f);continue}if(L=o(E),!L){f=b+(f.length>0?" "+f:f);continue}U=!1}const M=x.length===0?"":x.length===1?x[0]:i(x).join(":"),D=S?M+eh:M,Y=D+L;if(u.indexOf(Y)>-1)continue;u.push(Y);const J=s(L,U);for(let Q=0;Q<J.length;++Q){const T=J[Q];u.push(D+T)}f=b+(f.length>0?" "+f:f)}return f},pL=(...e)=>{let t=0,a,o,s="";for(;t<e.length;)(a=e[t++])&&(o=U0(a))&&(s&&(s+=" "),s+=o);return s},U0=e=>{if(typeof e=="string")return e;let t,a="";for(let o=0;o<e.length;o++)e[o]&&(t=U0(e[o]))&&(a&&(a+=" "),a+=t);return a},mL=(e,...t)=>{let a,o,s,i;const c=m=>{const f=t.reduce((g,b)=>b(g),e());return a=lL(f),o=a.cache.get,s=a.cache.set,i=u,u(m)},u=m=>{const f=o(m);if(f)return f;const g=uL(m,a);return s(m,g),g};return i=c,(...m)=>i(pL(...m))},hL=[],Vt=e=>{const t=a=>a[e]||hL;return t.isThemeGetter=!0,t.themeKey=e,t},H0=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,F0=/^\((?:(\w[\w-]*):)?(.+)\)$/i,fL=/^\d+(?:\.\d+)?\/\d+(?:\.\d+)?$/,gL=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,_L=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,bL=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix|color|light-dark)\(.+\)$/,yL=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,kL=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Br=e=>fL.test(e),tt=e=>!!e&&!Number.isNaN(Number(e)),Ia=e=>!!e&&Number.isInteger(Number(e)),dm=e=>e.endsWith("%")&&tt(e.slice(0,-1)),rr=e=>gL.test(e),B0=()=>!0,vL=e=>_L.test(e)&&!bL.test(e),sf=()=>!1,wL=e=>yL.test(e),xL=e=>kL.test(e),SL=e=>!ke(e)&&!we(e),CL=e=>e.startsWith("@container")&&(e[10]==="/"&&e[11]!==void 0||e[11]==="s"&&e[16]!==void 0&&e.startsWith("-size/",10)||e[11]==="n"&&e[18]!==void 0&&e.startsWith("-normal/",10)),TL=e=>no(e,q0,sf),ke=e=>H0.test(e),wo=e=>no(e,K0,vL),Ly=e=>no(e,OL,tt),EL=e=>no(e,W0,B0),AL=e=>no(e,V0,sf),My=e=>no(e,G0,sf),PL=e=>no(e,$0,xL),Vc=e=>no(e,Y0,wL),we=e=>F0.test(e),Vi=e=>Ko(e,K0),RL=e=>Ko(e,V0),zy=e=>Ko(e,G0),IL=e=>Ko(e,q0),NL=e=>Ko(e,$0),Wc=e=>Ko(e,Y0,!0),DL=e=>Ko(e,W0,!0),no=(e,t,a)=>{const o=H0.exec(e);return o?o[1]?t(o[1]):a(o[2]):!1},Ko=(e,t,a=!1)=>{const o=F0.exec(e);return o?o[1]?t(o[1]):a:!1},G0=e=>e==="position"||e==="percentage",$0=e=>e==="image"||e==="url",q0=e=>e==="length"||e==="size"||e==="bg-size",K0=e=>e==="length",OL=e=>e==="number",V0=e=>e==="family-name",W0=e=>e==="number"||e==="weight",Y0=e=>e==="shadow",LL=()=>{const e=Vt("color"),t=Vt("font"),a=Vt("text"),o=Vt("font-weight"),s=Vt("tracking"),i=Vt("leading"),c=Vt("breakpoint"),u=Vt("container"),m=Vt("spacing"),f=Vt("radius"),g=Vt("shadow"),b=Vt("inset-shadow"),w=Vt("text-shadow"),x=Vt("drop-shadow"),S=Vt("blur"),E=Vt("perspective"),C=Vt("aspect"),U=Vt("ease"),L=Vt("animate"),M=()=>["auto","avoid","all","avoid-page","page","left","right","column"],D=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],Y=()=>[...D(),we,ke],J=()=>["auto","hidden","clip","visible","scroll"],Q=()=>["auto","contain","none"],T=()=>[we,ke,m],$=()=>[Br,"full","auto",...T()],ae=()=>[Ia,"none","subgrid",we,ke],Ee=()=>["auto",{span:["full",Ia,we,ke]},Ia,we,ke],ye=()=>[Ia,"auto",we,ke],ze=()=>["auto","min","max","fr",we,ke],Se=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],Me=()=>["start","end","center","stretch","center-safe","end-safe"],_e=()=>["auto",...T()],de=()=>[Br,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...T()],ne=()=>[u,Br,"screen","full","dvw","lvw","svw","min","max","fit",...T()],Z=()=>[Br,"screen","full","lh","dvh","lvh","svh","min","max","fit",...T()],H=()=>[e,we,ke],N=()=>[...D(),zy,My,{position:[we,ke]}],W=()=>["no-repeat",{repeat:["","x","y","space","round"]}],ue=()=>["auto","cover","contain",IL,TL,{size:[we,ke]}],be=()=>[dm,Vi,wo],ce=()=>["","none","full",f,we,ke],pe=()=>["",tt,Vi,wo],Ge=()=>["solid","dashed","dotted","double"],Ye=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],De=()=>[tt,dm,zy,My],et=()=>["","none",S,we,ke],Mt=()=>["none",tt,we,ke],Wn=()=>["none",tt,we,ke],Je=()=>[tt,we,ke],Ht=()=>[Br,"full",...T()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[rr],breakpoint:[rr],color:[B0],container:[rr],"drop-shadow":[rr],ease:["in","out","in-out"],font:[SL],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[rr],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[rr],shadow:[rr],spacing:["px",tt],text:[rr],"text-shadow":[rr],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",Br,ke,we,C]}],container:["container"],"container-type":[{"@container":["","normal","size",we,ke]}],"container-named":[CL],columns:[{columns:[tt,"auto",ke,we,u]}],"break-after":[{"break-after":M()}],"break-before":[{"break-before":M()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:Y()}],overflow:[{overflow:J()}],"overflow-x":[{"overflow-x":J()}],"overflow-y":[{"overflow-y":J()}],overscroll:[{overscroll:Q()}],"overscroll-x":[{"overscroll-x":Q()}],"overscroll-y":[{"overscroll-y":Q()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:$()}],"inset-x":[{"inset-x":$()}],"inset-y":[{"inset-y":$()}],start:[{"inset-s":$(),start:$()}],end:[{"inset-e":$(),end:$()}],"inset-bs":[{"inset-bs":$()}],"inset-be":[{"inset-be":$()}],top:[{top:$()}],right:[{right:$()}],bottom:[{bottom:$()}],left:[{left:$()}],visibility:["visible","invisible","collapse"],z:[{z:[Ia,"auto",we,ke]}],basis:[{basis:[Br,"full","auto",u,...T()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[tt,Br,"auto","initial","none",ke]}],grow:[{grow:["",tt,we,ke]}],shrink:[{shrink:["",tt,we,ke]}],order:[{order:[Ia,"first","last","none",we,ke]}],"grid-cols":[{"grid-cols":ae()}],"col-start-end":[{col:Ee()}],"col-start":[{"col-start":ye()}],"col-end":[{"col-end":ye()}],"grid-rows":[{"grid-rows":ae()}],"row-start-end":[{row:Ee()}],"row-start":[{"row-start":ye()}],"row-end":[{"row-end":ye()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":ze()}],"auto-rows":[{"auto-rows":ze()}],gap:[{gap:T()}],"gap-x":[{"gap-x":T()}],"gap-y":[{"gap-y":T()}],"justify-content":[{justify:[...Se(),"normal"]}],"justify-items":[{"justify-items":[...Me(),"normal"]}],"justify-self":[{"justify-self":["auto",...Me()]}],"align-content":[{content:["normal",...Se()]}],"align-items":[{items:[...Me(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...Me(),{baseline:["","last"]}]}],"place-content":[{"place-content":Se()}],"place-items":[{"place-items":[...Me(),"baseline"]}],"place-self":[{"place-self":["auto",...Me()]}],p:[{p:T()}],px:[{px:T()}],py:[{py:T()}],ps:[{ps:T()}],pe:[{pe:T()}],pbs:[{pbs:T()}],pbe:[{pbe:T()}],pt:[{pt:T()}],pr:[{pr:T()}],pb:[{pb:T()}],pl:[{pl:T()}],m:[{m:_e()}],mx:[{mx:_e()}],my:[{my:_e()}],ms:[{ms:_e()}],me:[{me:_e()}],mbs:[{mbs:_e()}],mbe:[{mbe:_e()}],mt:[{mt:_e()}],mr:[{mr:_e()}],mb:[{mb:_e()}],ml:[{ml:_e()}],"space-x":[{"space-x":T()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":T()}],"space-y-reverse":["space-y-reverse"],size:[{size:de()}],"inline-size":[{inline:["auto",...ne()]}],"min-inline-size":[{"min-inline":["auto",...ne()]}],"max-inline-size":[{"max-inline":["none",...ne()]}],"block-size":[{block:["auto",...Z()]}],"min-block-size":[{"min-block":["auto",...Z()]}],"max-block-size":[{"max-block":["none",...Z()]}],w:[{w:[u,"screen",...de()]}],"min-w":[{"min-w":[u,"screen","none",...de()]}],"max-w":[{"max-w":[u,"screen","none","prose",{screen:[c]},...de()]}],h:[{h:["screen","lh",...de()]}],"min-h":[{"min-h":["screen","lh","none",...de()]}],"max-h":[{"max-h":["screen","lh","none",...de()]}],"font-size":[{text:["base",a,Vi,wo]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[o,DL,EL]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",dm,ke]}],"font-family":[{font:[RL,AL,t]}],"font-features":[{"font-features":[ke]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[s,we,ke]}],"line-clamp":[{"line-clamp":[tt,"none",we,Ly]}],leading:[{leading:["none",i,...T()]}],"list-image":[{"list-image":["none",we,ke]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",we,ke]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:H()}],"text-color":[{text:H()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...Ge(),"wavy"]}],"text-decoration-thickness":[{decoration:[tt,"from-font","auto",we,wo]}],"text-decoration-color":[{decoration:H()}],"underline-offset":[{"underline-offset":[tt,"auto",we,ke]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:T()}],"tab-size":[{tab:[Ia,we,ke]}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",we,ke]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",we,ke]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:N()}],"bg-repeat":[{bg:W()}],"bg-size":[{bg:ue()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},Ia,we,ke],radial:["",we,ke],conic:["",Ia,we,ke]},NL,PL]}],"bg-color":[{bg:H()}],"gradient-from-pos":[{from:be()}],"gradient-via-pos":[{via:be()}],"gradient-to-pos":[{to:be()}],"gradient-from":[{from:H()}],"gradient-via":[{via:H()}],"gradient-to":[{to:H()}],rounded:[{rounded:ce()}],"rounded-s":[{"rounded-s":ce()}],"rounded-e":[{"rounded-e":ce()}],"rounded-t":[{"rounded-t":ce()}],"rounded-r":[{"rounded-r":ce()}],"rounded-b":[{"rounded-b":ce()}],"rounded-l":[{"rounded-l":ce()}],"rounded-ss":[{"rounded-ss":ce()}],"rounded-se":[{"rounded-se":ce()}],"rounded-ee":[{"rounded-ee":ce()}],"rounded-es":[{"rounded-es":ce()}],"rounded-tl":[{"rounded-tl":ce()}],"rounded-tr":[{"rounded-tr":ce()}],"rounded-br":[{"rounded-br":ce()}],"rounded-bl":[{"rounded-bl":ce()}],"border-w":[{border:pe()}],"border-w-x":[{"border-x":pe()}],"border-w-y":[{"border-y":pe()}],"border-w-s":[{"border-s":pe()}],"border-w-e":[{"border-e":pe()}],"border-w-bs":[{"border-bs":pe()}],"border-w-be":[{"border-be":pe()}],"border-w-t":[{"border-t":pe()}],"border-w-r":[{"border-r":pe()}],"border-w-b":[{"border-b":pe()}],"border-w-l":[{"border-l":pe()}],"divide-x":[{"divide-x":pe()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":pe()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...Ge(),"hidden","none"]}],"divide-style":[{divide:[...Ge(),"hidden","none"]}],"border-color":[{border:H()}],"border-color-x":[{"border-x":H()}],"border-color-y":[{"border-y":H()}],"border-color-s":[{"border-s":H()}],"border-color-e":[{"border-e":H()}],"border-color-bs":[{"border-bs":H()}],"border-color-be":[{"border-be":H()}],"border-color-t":[{"border-t":H()}],"border-color-r":[{"border-r":H()}],"border-color-b":[{"border-b":H()}],"border-color-l":[{"border-l":H()}],"divide-color":[{divide:H()}],"outline-style":[{outline:[...Ge(),"none","hidden"]}],"outline-offset":[{"outline-offset":[tt,we,ke]}],"outline-w":[{outline:["",tt,Vi,wo]}],"outline-color":[{outline:H()}],shadow:[{shadow:["","inner","none",g,Wc,Vc]}],"shadow-color":[{shadow:H()}],"inset-shadow":[{"inset-shadow":["none",b,Wc,Vc]}],"inset-shadow-color":[{"inset-shadow":H()}],"ring-w":[{ring:pe()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:H()}],"ring-offset-w":[{"ring-offset":[tt,wo]}],"ring-offset-color":[{"ring-offset":H()}],"inset-ring-w":[{"inset-ring":pe()}],"inset-ring-color":[{"inset-ring":H()}],"text-shadow":[{"text-shadow":["none",w,Wc,Vc]}],"text-shadow-color":[{"text-shadow":H()}],opacity:[{opacity:[tt,we,ke]}],"mix-blend":[{"mix-blend":[...Ye(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":Ye()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[tt]}],"mask-image-linear-from-pos":[{"mask-linear-from":De()}],"mask-image-linear-to-pos":[{"mask-linear-to":De()}],"mask-image-linear-from-color":[{"mask-linear-from":H()}],"mask-image-linear-to-color":[{"mask-linear-to":H()}],"mask-image-t-from-pos":[{"mask-t-from":De()}],"mask-image-t-to-pos":[{"mask-t-to":De()}],"mask-image-t-from-color":[{"mask-t-from":H()}],"mask-image-t-to-color":[{"mask-t-to":H()}],"mask-image-r-from-pos":[{"mask-r-from":De()}],"mask-image-r-to-pos":[{"mask-r-to":De()}],"mask-image-r-from-color":[{"mask-r-from":H()}],"mask-image-r-to-color":[{"mask-r-to":H()}],"mask-image-b-from-pos":[{"mask-b-from":De()}],"mask-image-b-to-pos":[{"mask-b-to":De()}],"mask-image-b-from-color":[{"mask-b-from":H()}],"mask-image-b-to-color":[{"mask-b-to":H()}],"mask-image-l-from-pos":[{"mask-l-from":De()}],"mask-image-l-to-pos":[{"mask-l-to":De()}],"mask-image-l-from-color":[{"mask-l-from":H()}],"mask-image-l-to-color":[{"mask-l-to":H()}],"mask-image-x-from-pos":[{"mask-x-from":De()}],"mask-image-x-to-pos":[{"mask-x-to":De()}],"mask-image-x-from-color":[{"mask-x-from":H()}],"mask-image-x-to-color":[{"mask-x-to":H()}],"mask-image-y-from-pos":[{"mask-y-from":De()}],"mask-image-y-to-pos":[{"mask-y-to":De()}],"mask-image-y-from-color":[{"mask-y-from":H()}],"mask-image-y-to-color":[{"mask-y-to":H()}],"mask-image-radial":[{"mask-radial":[we,ke]}],"mask-image-radial-from-pos":[{"mask-radial-from":De()}],"mask-image-radial-to-pos":[{"mask-radial-to":De()}],"mask-image-radial-from-color":[{"mask-radial-from":H()}],"mask-image-radial-to-color":[{"mask-radial-to":H()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":D()}],"mask-image-conic-pos":[{"mask-conic":[tt]}],"mask-image-conic-from-pos":[{"mask-conic-from":De()}],"mask-image-conic-to-pos":[{"mask-conic-to":De()}],"mask-image-conic-from-color":[{"mask-conic-from":H()}],"mask-image-conic-to-color":[{"mask-conic-to":H()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:N()}],"mask-repeat":[{mask:W()}],"mask-size":[{mask:ue()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",we,ke]}],filter:[{filter:["","none",we,ke]}],blur:[{blur:et()}],brightness:[{brightness:[tt,we,ke]}],contrast:[{contrast:[tt,we,ke]}],"drop-shadow":[{"drop-shadow":["","none",x,Wc,Vc]}],"drop-shadow-color":[{"drop-shadow":H()}],grayscale:[{grayscale:["",tt,we,ke]}],"hue-rotate":[{"hue-rotate":[tt,we,ke]}],invert:[{invert:["",tt,we,ke]}],saturate:[{saturate:[tt,we,ke]}],sepia:[{sepia:["",tt,we,ke]}],"backdrop-filter":[{"backdrop-filter":["","none",we,ke]}],"backdrop-blur":[{"backdrop-blur":et()}],"backdrop-brightness":[{"backdrop-brightness":[tt,we,ke]}],"backdrop-contrast":[{"backdrop-contrast":[tt,we,ke]}],"backdrop-grayscale":[{"backdrop-grayscale":["",tt,we,ke]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[tt,we,ke]}],"backdrop-invert":[{"backdrop-invert":["",tt,we,ke]}],"backdrop-opacity":[{"backdrop-opacity":[tt,we,ke]}],"backdrop-saturate":[{"backdrop-saturate":[tt,we,ke]}],"backdrop-sepia":[{"backdrop-sepia":["",tt,we,ke]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":T()}],"border-spacing-x":[{"border-spacing-x":T()}],"border-spacing-y":[{"border-spacing-y":T()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",we,ke]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[tt,"initial",we,ke]}],ease:[{ease:["linear","initial",U,we,ke]}],delay:[{delay:[tt,we,ke]}],animate:[{animate:["none",L,we,ke]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[E,we,ke]}],"perspective-origin":[{"perspective-origin":Y()}],rotate:[{rotate:Mt()}],"rotate-x":[{"rotate-x":Mt()}],"rotate-y":[{"rotate-y":Mt()}],"rotate-z":[{"rotate-z":Mt()}],scale:[{scale:Wn()}],"scale-x":[{"scale-x":Wn()}],"scale-y":[{"scale-y":Wn()}],"scale-z":[{"scale-z":Wn()}],"scale-3d":["scale-3d"],skew:[{skew:Je()}],"skew-x":[{"skew-x":Je()}],"skew-y":[{"skew-y":Je()}],transform:[{transform:[we,ke,"","none","gpu","cpu"]}],"transform-origin":[{origin:Y()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:Ht()}],"translate-x":[{"translate-x":Ht()}],"translate-y":[{"translate-y":Ht()}],"translate-z":[{"translate-z":Ht()}],"translate-none":["translate-none"],zoom:[{zoom:[Ia,we,ke]}],accent:[{accent:H()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:H()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",we,ke]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scrollbar-thumb-color":[{"scrollbar-thumb":H()}],"scrollbar-track-color":[{"scrollbar-track":H()}],"scrollbar-gutter":[{"scrollbar-gutter":["auto","stable","both"]}],"scrollbar-w":[{scrollbar:["auto","thin","none"]}],"scroll-m":[{"scroll-m":T()}],"scroll-mx":[{"scroll-mx":T()}],"scroll-my":[{"scroll-my":T()}],"scroll-ms":[{"scroll-ms":T()}],"scroll-me":[{"scroll-me":T()}],"scroll-mbs":[{"scroll-mbs":T()}],"scroll-mbe":[{"scroll-mbe":T()}],"scroll-mt":[{"scroll-mt":T()}],"scroll-mr":[{"scroll-mr":T()}],"scroll-mb":[{"scroll-mb":T()}],"scroll-ml":[{"scroll-ml":T()}],"scroll-p":[{"scroll-p":T()}],"scroll-px":[{"scroll-px":T()}],"scroll-py":[{"scroll-py":T()}],"scroll-ps":[{"scroll-ps":T()}],"scroll-pe":[{"scroll-pe":T()}],"scroll-pbs":[{"scroll-pbs":T()}],"scroll-pbe":[{"scroll-pbe":T()}],"scroll-pt":[{"scroll-pt":T()}],"scroll-pr":[{"scroll-pr":T()}],"scroll-pb":[{"scroll-pb":T()}],"scroll-pl":[{"scroll-pl":T()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",we,ke]}],fill:[{fill:["none",...H()]}],"stroke-w":[{stroke:[tt,Vi,wo,Ly]}],stroke:[{stroke:["none",...H()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{"container-named":["container-type"],overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","inset-bs","inset-be","start","end","top","right","bottom","left"],"inset-x":["start","end","right","left"],"inset-y":["inset-bs","inset-be","top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pbs","pbe","pt","pr","pb","pl"],px:["ps","pe","pr","pl"],py:["pbs","pbe","pt","pb"],m:["mx","my","ms","me","mbs","mbe","mt","mr","mb","ml"],mx:["ms","me","mr","ml"],my:["mbs","mbe","mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-bs","border-w-be","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-s","border-w-e","border-w-r","border-w-l"],"border-w-y":["border-w-bs","border-w-be","border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-bs","border-color-be","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-s","border-color-e","border-color-r","border-color-l"],"border-color-y":["border-color-bs","border-color-be","border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mbs","scroll-mbe","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-ms","scroll-me","scroll-mr","scroll-ml"],"scroll-my":["scroll-mbs","scroll-mbe","scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pbs","scroll-pbe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-ps","scroll-pe","scroll-pr","scroll-pl"],"scroll-py":["scroll-pbs","scroll-pbe","scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},postfixLookupClassGroups:["container-type"],orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},ML=mL(LL);function Nt(...e){return ML(qO(e))}function zL(){const e=k.useContext(C0);if(e===null)throw new Error("useTheme must be used within a ThemeProvider");return e}function jL({prefersReducedMotion:e,screenshotCapture:t}){return!(t||e)}class Wi extends Error{constructor(t,a=0){super(t),this.code=t,this.status=a}code;status}async function Z0(e,{auth:t,body:a,params:o,signal:s}={}){const i=Wt(),c=Uo(),u=()=>{if(i!==Wt()||c!==Uo())throw new Wi("instance_changed",409)},m={apikey:c};if(e!=="catalog"){const w=await Bh(t);if(u(),!Al(w))throw new Wi("authentication_required",401);m.Authorization=`Bearer ${w}`}const f=new URL(El(i,"tokentracker-billing"));f.searchParams.set("action",e);for(const[w,x]of Object.entries(o||{}))f.searchParams.set(w,x);a&&(m["Content-Type"]="application/json");let g;try{u(),g=await Yd(f.toString(),{method:a?"POST":"GET",headers:m,body:a?JSON.stringify(a):void 0,signal:s||AbortSignal.timeout(25e3)})}catch(w){throw u(),e==="catalog"&&Gc(e,null,null),s?.aborted?w:new Wi("billing_network_error")}u();const b=await g.json().catch(()=>null);if(u(),!g.ok||b?.ok===!1||typeof b?.error=="string"&&g.status!==202)throw e==="catalog"&&Gc(e,null,null),new Wi(b?.code||b?.error||"billing_operation_failed",g.status);if(!b||typeof b!="object")throw e==="catalog"&&Gc(e,null,null),new Wi("billing_operation_failed",g.status);return Gc(e,b,Nw(m.Authorization?.slice(7))),u(),b}function Fj(e){if(!e||e.policy?.phase!=="active")return!1;const t=Date.parse(e.policy.launch_at||"");return Number.isFinite(t)&&t<=Date.now()}function Bj(e,t){return new Intl.NumberFormat(void 0,{style:"currency",currency:t,minimumFractionDigits:e%100===0?0:2}).format(e/100)}function Gj(e,t){return!e||!t||e.currency!==t.currency||e.amount_cents<=0?0:Math.max(0,Math.round((1-t.amount_cents/(e.amount_cents*12))*100))}function $j(){const[e,t]=k.useState(null),[a,o]=k.useState(!0),[s,i]=k.useState(null),[c,u]=k.useState(0);return k.useEffect(()=>{const m=new AbortController;return o(!0),Z0("catalog",{signal:m.signal}).then(f=>{m.signal.aborted||(t(f),i(null))}).catch(f=>{m.signal.aborted||(t(null),i({...f,code:"billing_catalog_unavailable"}))}).finally(()=>{m.signal.aborted||o(!1)}),()=>m.abort()},[c]),{catalog:e,loading:a,error:s,refresh:()=>u(m=>m+1)}}const Od={account:null,loading:!1,error:null},UL=3e4,jy=new WeakMap,Ds=new Set,HL=()=>()=>{},Uy=()=>Od;function ud(e,t){e.snapshot=t,e.listeners.forEach(a=>a())}function Q0(e){e.generation+=1,e.pending=null,e.updatedAt=0,clearTimeout(e.timer),ud(e,Od)}function eu(e,t=!1){if(!e.listeners.size||e.backend!==ml())return Promise.resolve(null);if(e.pending&&!t)return e.pending;const a=++e.generation;clearTimeout(e.timer);const o=()=>a===e.generation&&e.listeners.size>0&&e.backend===ml();return e.pending=Promise.resolve().then(()=>o()?Z0("account",{auth:e.getAccessToken}):null).then(s=>{if(!o()||(e.updatedAt=Date.now(),ud(e,{account:s,loading:!1,error:null}),!o()))return null;const i=Date.now(),c=[s?.membership?.expires_at,...(Array.isArray(s?.payments)?s.payments:[]).flatMap(u=>[u?.starts_at,u?.ends_at]),...(Array.isArray(s?.gifts)?s.gifts:[]).flatMap(u=>[u?.starts_at,u?.ends_at])].map(u=>typeof u=="string"?Date.parse(u):NaN).filter(u=>Number.isFinite(u)&&u>i);return c.length&&(e.timer=setTimeout(()=>{eu(e)},Math.min(Math.min(...c)-i+10,2147483647))),s},s=>{if(o()){const i=s?.code==="billing_network_error"||s?.status>=500||s?.status===408||s?.status===429;ud(e,{account:i?e.snapshot.account:null,loading:!1,error:s})}return null}).finally(()=>{a===e.generation&&(e.pending=null)}),ud(e,{...e.snapshot,loading:!0,error:null}),e.pending}function Yc(){document.visibilityState==="visible"&&Ds.forEach(e=>{eu(e)})}function Hy(){Ds.forEach(Q0)}function FL(e,t,a){let o=jy.get(t);o||(o=new Map,jy.set(t,o));const s=JSON.stringify([a,e]);if(!o.has(s)){const i={userId:e,getAccessToken:t,backend:a,snapshot:Od,listeners:new Set,generation:0,pending:null,timer:null,updatedAt:0};i.getSnapshot=()=>i.snapshot,i.subscribe=c=>{const u=Ds.size===0;return i.listeners.add(c),Ds.add(i),u&&(window.addEventListener("focus",Yc),document.addEventListener("visibilitychange",Yc),window.addEventListener(pl,Hy)),(i.snapshot===Od||i.snapshot.error||Date.now()-i.updatedAt>UL)&&eu(i),()=>{i.listeners.delete(c),!i.listeners.size&&(Q0(i),Ds.delete(i),Ds.size||(window.removeEventListener("focus",Yc),document.removeEventListener("visibilitychange",Yc),window.removeEventListener(pl,Hy)))}},o.set(s,i)}return o.get(s)}function BL({enabled:e=!0}={}){const t=ii(),a=t?.signedIn?t.user?.id:null,o=t?.getAccessToken,s=e&&a&&typeof o=="function"?FL(a,o,ml()):null,i=k.useSyncExternalStore(s?.subscribe||HL,s?.getSnapshot||Uy,Uy),c=k.useCallback(()=>s?eu(s,!0):Promise.resolve(null),[s]);return{...i,refresh:c,auth:t}}function GL(e){if(!e||typeof e!="object")return null;const t=e.user_metadata&&typeof e.user_metadata=="object"?e.user_metadata:{},a=e.profile&&typeof e.profile=="object"?e.profile:{},o=t.avatar_url||t.picture||a.avatar_url||e.avatar_url;return typeof o=="string"&&o.trim()?o.trim():null}function $L(e){return e?ri()?`/api/avatar-proxy?url=${encodeURIComponent(e)}`:e:null}function Zc(e){const t=String(e||"").trim();if(!t)return"?";const a=t.split(/\s+/).filter(Boolean);return a.length>=2?(a[0][0]+a[a.length-1][0]).toUpperCase():t.slice(0,2).toUpperCase()}function qL(e,t=Date.now()){const a=e?.membership;return e?.environment!=="live"||a?.environment!=="live"||a.phase!=="active"||a.status!=="active"||![void 0,"hosted"].includes(a.hosting_mode)||typeof a.expires_at!="string"||!Number.isFinite(Date.parse(a.expires_at))||Date.parse(a.expires_at)<=t?!1:["payment","gift","mixed"].includes(a.access_source)}function KL({className:e,variant:t="header",collapsed:a=!1,onAfterAction:o}){Il();const s=t==="sidebar",{enabled:i,loading:c,signedIn:u,user:m,displayName:f}=ii(),g=BL({enabled:s&&i&&!c&&u&&rw()}),b=s&&!g.error&&qL(g.account),{openLoginModal:w}=PO(),x=Xr(),S=k.useMemo(()=>GL(m),[m]),E=k.useMemo(()=>$L(S),[S]),[C,U]=No.useState(!1);if(No.useEffect(()=>{U(!1)},[E]),!i)return null;if(c)return R.jsx("div",{className:Nt("h-9 w-9 shrink-0 rounded-full bg-oai-gray-200 dark:bg-oai-gray-800 animate-pulse",e),"aria-hidden":!0});if(!u)return s?R.jsxs("button",{type:"button",onClick:()=>{w(),o?.()},className:Nt("flex items-center gap-2 rounded-md px-2 py-1.5 text-[13px] font-medium text-oai-gray-700 dark:text-oai-gray-300 hover:bg-oai-gray-200/60 dark:hover:bg-oai-gray-800 hover:text-oai-black dark:hover:text-white transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500 min-w-0",a?"h-8 w-8 justify-center px-0":"w-full",e),"aria-label":K("header.auth.sign_in_aria"),title:a?K("header.auth.sign_in_aria"):void 0,children:[R.jsx("span",{className:"flex h-5 w-5 shrink-0 items-center justify-center",children:R.jsx("img",{src:"/app-icon.png",alt:"",width:18,height:18,className:"h-[18px] w-[18px] rounded"})}),!a&&R.jsx("span",{className:"truncate flex-1 text-left",children:K("header.auth.sign_in_aria")})]}):R.jsx("button",{type:"button",onClick:w,className:Nt("shrink-0 inline-flex h-9 items-center justify-center gap-1.5 rounded-md px-4 text-sm font-medium transition-colors duration-200 ease-out shadow-sm ring-1 ring-oai-gray-200 dark:ring-white/10 bg-oai-gray-900 text-white hover:bg-oai-gray-800 active:bg-oai-gray-950 dark:bg-white dark:text-oai-gray-900 dark:hover:bg-oai-gray-100 dark:active:bg-oai-gray-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-oai-gray-950",e),"aria-label":K("header.auth.sign_in_aria"),children:K("header.auth.sign_in_aria")});const L=()=>{x("/settings"),o?.()};return R.jsx("div",{className:Nt(s?"relative flex w-full shrink-0 items-center":"relative flex shrink-0 items-center",e),children:R.jsxs("button",{type:"button",onClick:L,className:Nt(s?Nt("tt-sidebar-account-control flex w-full items-center gap-2 rounded-md px-2 py-1.5 hover:bg-oai-gray-200/60 dark:hover:bg-oai-gray-800 transition-colors min-w-0","focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",a&&"justify-center px-0 py-0 h-9 w-9"):"flex items-center gap-2 rounded-md pl-1 pr-2 py-1 border border-transparent hover:bg-oai-gray-100 dark:hover:bg-oai-gray-900/80 hover:border-oai-gray-200 dark:hover:border-oai-gray-800 transition-colors"),"aria-label":b?`${K("header.auth.open_settings")}, ${K("leaderboard.pro.badge_aria")}`:K("header.auth.open_settings"),title:s&&a?b?`${f}, ${K("leaderboard.pro.badge_aria")}`:f:void 0,children:[s?R.jsxs("span",{className:Nt("relative flex h-5 w-5 shrink-0 items-center justify-center rounded-full",b&&"leaderboard-pro-avatar"),children:[E&&!C?R.jsx("img",{src:E,alt:"",width:20,height:20,className:"h-5 w-5 rounded-full object-cover ring-1 ring-oai-gray-300 dark:ring-oai-gray-700",referrerPolicy:"no-referrer",onError:()=>U(!0)}):Zc(f)==="?"?R.jsx("span",{className:Nt("flex h-5 w-5 items-center justify-center rounded-full text-white ring-1",b?"tt-sidebar-pro-fallback":"bg-oai-brand-600/30 ring-oai-brand-500/50"),children:R.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:"w-3 h-3 opacity-80",children:R.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}):R.jsx("span",{className:Nt("flex h-5 w-5 items-center justify-center rounded-full text-[9px] font-semibold text-white ring-1",b?"tt-sidebar-pro-fallback":"bg-oai-brand-600 ring-oai-brand-500/50"),children:Zc(f)}),b&&a&&R.jsx("span",{"aria-hidden":!0,title:K("leaderboard.pro.badge_aria"),className:"leaderboard-pro-badge absolute -bottom-1.5 left-1/2 -translate-x-1/2 !px-0.5 !text-[8px] !leading-[10px]",children:K("leaderboard.pro.badge")})]}):E&&!C?R.jsx("img",{src:E,alt:"",width:32,height:32,className:"h-8 w-8 rounded-full object-cover ring-1 ring-oai-gray-300 dark:ring-oai-gray-700 shrink-0",referrerPolicy:"no-referrer",onError:()=>U(!0)}):Zc(f)==="?"?R.jsx("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-oai-brand-600/30 text-white ring-1 ring-oai-brand-500/50",children:R.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:"w-4 h-4 opacity-80",children:R.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z"})})}):R.jsx("span",{className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-oai-brand-600 text-xs font-semibold text-white ring-1 ring-oai-brand-500/50",children:Zc(f)}),s?!a&&R.jsx("span",{className:"truncate text-[13px] font-medium text-oai-gray-900 dark:text-oai-gray-200 text-left min-w-0",children:f}):R.jsx("span",{className:"hidden sm:inline truncate text-sm font-medium text-oai-gray-900 dark:text-oai-gray-200 max-w-[120px]",children:f}),b&&!a&&R.jsx("span",{"aria-hidden":!0,title:K("leaderboard.pro.badge_aria"),className:"leaderboard-pro-badge shrink-0",children:K("leaderboard.pro.badge")})]})})}const th="tt.sidebarCollapsed";function VL(){return[{id:"general",label:K("nav.group.general"),items:[{id:"usage",to:"/dashboard",icon:r0,label:K("nav.usage")},{id:"sessions",to:"/sessions",icon:y0,label:K("nav.sessions")},{id:"limits",to:"/limits",icon:cO,label:K("nav.limits")},{id:"leaderboard",to:"/leaderboard",icon:yO,label:K("nav.leaderboard")},{id:"achievements",to:"/achievements",icon:oO,label:K("nav.achievements")}]},{id:"tools",label:K("nav.group.tools"),items:[{id:"widgets",to:"/widgets",icon:uO,label:K("nav.widgets")},{id:"pet",to:"/pet-settings",icon:hO,label:K("nav.pet")},{id:"skills",to:"/skills",icon:fO,label:K("nav.skills")},{id:"ip-check",to:"/ip-check",icon:dO,label:K("nav.ip_check")},{id:"service-status",to:"/service-status",icon:rO,label:K("nav.service_status")}]},{id:"account",label:K("nav.group.account"),items:[{id:"cloud",to:"/cloud",icon:nf,label:K("cloud.nav")},{id:"settings",to:"/settings",icon:_O,label:K("nav.settings")}]}]}function WL(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(th)==="1"}catch{return!1}}function YL(){const[e,t]=k.useState(WL),a=k.useCallback(()=>{t(o=>{const s=!o;try{typeof window<"u"&&window.localStorage.setItem(th,s?"1":"0")}catch{}return s})},[]);return k.useEffect(()=>{if(typeof window>"u")return;const o=s=>{s.key===th&&t(s.newValue==="1")};return window.addEventListener("storage",o),()=>window.removeEventListener("storage",o)},[]),{collapsed:e,toggle:a}}function ZL(e,t){const a=e.replace(/\/+$/,"")||"/";return t==="/dashboard"?a==="/dashboard"||a==="/":t==="/leaderboard"?a==="/leaderboard"||a.startsWith("/leaderboard/"):a===t}function QL({label:e,collapsed:t,first:a}){return t?a?null:R.jsx("div",{className:"mx-2 my-2 h-px bg-oai-gray-200/70 dark:bg-oai-gray-800/70","aria-hidden":!0}):R.jsx("div",{className:Nt("px-3 pb-1 text-[10px] uppercase tracking-wider text-oai-gray-500 dark:text-oai-gray-500",a?"pt-2":"pt-4"),children:e})}function JL({item:e,collapsed:t,active:a,onClick:o}){const s=e.icon;return R.jsxs(Qr,{to:e.to,onClick:o,title:t?e.label:void 0,"aria-label":t?e.label:void 0,"aria-current":a?"page":void 0,className:Nt("flex items-center gap-2 rounded-md px-2 py-1.5 text-[13px] no-underline transition-colors",t&&"justify-center px-0 py-2",a?"bg-oai-gray-200/70 text-oai-black font-medium dark:bg-oai-gray-800 dark:text-white":"text-oai-gray-600 dark:text-oai-gray-400 hover:bg-oai-gray-200/50 hover:text-oai-black dark:hover:bg-oai-gray-800/60 dark:hover:text-white"),children:[R.jsx("span",{className:"flex h-5 w-5 shrink-0 items-center justify-center",children:R.jsx(s,{className:"h-[15px] w-[15px]","aria-hidden":!0})}),!t&&R.jsx("span",{className:"truncate",children:e.label})]})}function XL({as:e="button",buttonRef:t,title:a,onClick:o,href:s,children:i,className:c,...u}){const m=Nt("flex h-10 w-10 items-center justify-center rounded-lg text-oai-gray-600 dark:text-oai-gray-400 hover:bg-oai-gray-200/60 dark:hover:bg-oai-gray-800 hover:text-oai-black dark:hover:text-white transition-colors no-underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",c);return e==="a"?R.jsx("a",{href:s,target:"_blank",rel:"noopener noreferrer",title:a,"aria-label":a,className:m,...u,children:i}):R.jsx("button",{ref:t,type:"button",title:a,"aria-label":a,onClick:o,className:m,...u,children:i})}function eM({repo:e="xiufengsun/TokenTracker",glassChrome:t=!1}){const[a,o]=k.useState(null);return k.useEffect(()=>{if(typeof window>"u")return;const s=typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches;jL({prefersReducedMotion:s,screenshotCapture:!1})&&fetch(`https://api.github.com/repos/${e}`).then(i=>i.json()).then(i=>{i&&typeof i.stargazers_count=="number"&&o(i.stargazers_count)}).catch(()=>{})},[e]),R.jsx("a",{href:`https://github.com/${e}`,target:"_blank",rel:"noopener noreferrer","aria-label":a!==null?`Star on GitHub (${a})`:"Star on GitHub",className:"tt-sidebar-star inline-flex shrink-0 items-center rounded-full no-underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",children:R.jsxs("span",{className:Nt("tt-sidebar-pill inline-flex items-center gap-1.5 rounded-full px-2.5 text-xs font-medium transition-colors",t?"border border-gray-500/20 dark:border-gray-500/30 bg-gray-500/[0.04] dark:bg-gray-500/[0.06] backdrop-blur-[2px] text-oai-gray-700 dark:text-oai-gray-300 hover:bg-gray-500/10 dark:hover:bg-gray-500/12 hover:border-gray-500/30 dark:hover:border-gray-500/40 hover:text-oai-black dark:hover:text-white":"border border-oai-gray-200 dark:border-oai-gray-700 text-oai-gray-600 dark:text-oai-gray-400 hover:bg-oai-gray-200/60 dark:hover:bg-oai-gray-800 hover:text-oai-black dark:hover:text-white hover:border-oai-gray-300 dark:hover:border-oai-gray-600"),children:[R.jsx("svg",{height:"12",viewBox:"0 0 16 16",width:"12",className:"shrink-0 fill-current",children:R.jsx("path",{d:"M8 0c4.42 0 8 3.58 8 8a8.013 8.013 0 0 1-5.45 7.59c-.4.08-.55-.17-.55-.38 0-.27.01-1.13.01-2.2 0-.75-.25-1.23-.54-1.48 1.78-.2 3.65-.88 3.65-3.95 0-.88-.31-1.59-.82-2.15.08-.2.36-1.02-.08-2.12 0 0-.67-.22-2.2.82-.64-.18-1.32-.27-2-.27-.68 0-1.36.09-2 .27-1.53-1.03-2.2-.82-2.2-.82-.44 1.1-.16 1.92-.08 2.12-.51.56-.82 1.28-.82 2.15 0 3.06 1.86 3.75 3.64 3.95-.23.2-.44.55-.51 1.07-.46.21-1.61.55-2.33-.66-.15-.24-.6-.83-1.23-.82-.67.01-.27.38.01.53.34.19.73.9.82 1.13.16.45.68 1.31 2.69.94 0 .67.01 1.3.01 1.49 0 .21-.15.45-.55.38A7.995 7.995 0 0 1 0 8c0-4.42 3.58-8 8-8Z"})}),R.jsx("span",{children:K("shared.github.star")}),a!==null&&R.jsx("span",{className:"text-[10px] text-oai-gray-500 dark:text-oai-gray-500 tabular-nums",children:a})]})})}function tM({theme:e,resolvedTheme:t,onSetTheme:a,glassChrome:o=!1}){const[s,i]=k.useState(!1),c=k.useRef(null),u=t==="dark"?Ey:Ay,m=[{value:"light",label:K("settings.appearance.theme.light"),Icon:Ay},{value:"dark",label:K("settings.appearance.theme.dark"),Icon:Ey},{value:"system",label:K("settings.appearance.theme.system"),Icon:mO}];return k.useEffect(()=>{if(!s)return;const f=b=>{c.current&&!c.current.contains(b.target)&&i(!1)},g=b=>{b.key==="Escape"&&i(!1)};return document.addEventListener("mousedown",f),document.addEventListener("keydown",g),()=>{document.removeEventListener("mousedown",f),document.removeEventListener("keydown",g)}},[s]),R.jsxs("div",{ref:c,className:"relative",children:[R.jsx("button",{type:"button","aria-label":K("settings.appearance.theme.label"),"aria-expanded":s,"aria-haspopup":"menu",title:K("settings.appearance.theme.label"),onClick:()=>i(f=>!f),className:"tt-sidebar-theme inline-flex items-center justify-center rounded-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",children:R.jsx("span",{className:Nt("tt-sidebar-pill tt-sidebar-theme-face inline-flex items-center justify-center rounded-full transition-colors",o?"border border-gray-500/20 dark:border-gray-500/30 bg-gray-500/[0.04] dark:bg-gray-500/[0.06] backdrop-blur-[2px] text-oai-gray-700 dark:text-oai-gray-300 hover:bg-gray-500/10 dark:hover:bg-gray-500/12 hover:border-gray-500/30 dark:hover:border-gray-500/40 hover:text-oai-black dark:hover:text-white":"border border-oai-gray-200 dark:border-oai-gray-700 text-oai-gray-600 dark:text-oai-gray-400 hover:bg-oai-gray-200/60 dark:hover:bg-oai-gray-800 hover:text-oai-black dark:hover:text-white hover:border-oai-gray-300 dark:hover:border-oai-gray-600"),children:R.jsx(u,{className:"h-3.5 w-3.5","aria-hidden":!0})})}),s&&R.jsx("div",{role:"menu",className:"absolute bottom-full left-0 mb-2 z-50 min-w-[140px] py-1 rounded-lg border border-oai-gray-200 dark:border-oai-gray-800 bg-white dark:bg-oai-gray-900 shadow-lg",children:m.map(({value:f,label:g,Icon:b})=>{const w=e===f;return R.jsxs("button",{type:"button",role:"menuitem",onClick:()=>{a(f),i(!1)},className:Nt("flex w-full items-center gap-2.5 px-3 py-1.5 text-[13px] transition-colors",w?"text-oai-black dark:text-white bg-oai-gray-100 dark:bg-oai-gray-800":"text-oai-gray-600 dark:text-oai-gray-400 hover:bg-oai-gray-50 dark:hover:bg-oai-gray-800/60 hover:text-oai-black dark:hover:text-white"),children:[R.jsx(b,{className:"h-3.5 w-3.5 shrink-0","aria-hidden":!0}),R.jsx("span",{children:g})]},f)})})]})}function J0({collapsed:e,onToggleCollapsed:t,onItemClick:a,showCloseButton:o=!1,onClose:s,closeButtonRef:i,glassChrome:c=!1}){const m=An()?.pathname||"/",{theme:f,resolvedTheme:g,setTheme:b}=zL(),{resolvedLocale:w}=Il(),x=k.useMemo(()=>VL(),[w]);return R.jsxs(R.Fragment,{children:[R.jsxs("div",{className:Nt("tt-sidebar-header flex px-2 pt-2 pb-2",e?"flex-col items-center":"items-center gap-1"),children:[R.jsx("div",{className:Nt("min-w-0",!e&&"flex-1"),children:R.jsx(KL,{variant:"sidebar",collapsed:e,onAfterAction:a})}),o?R.jsx("button",{ref:i,type:"button",onClick:s,"aria-label":K("nav.close_menu"),title:K("nav.close_menu"),className:"tt-sidebar-toggle flex shrink-0 items-center justify-center rounded-lg text-oai-gray-500 dark:text-oai-gray-500 hover:bg-oai-gray-200/60 dark:hover:bg-oai-gray-800 hover:text-oai-gray-900 dark:hover:text-oai-gray-200 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",children:R.jsx(af,{className:"h-4 w-4",strokeWidth:1.75,"aria-hidden":!0})}):R.jsx("button",{type:"button",onClick:t,"aria-label":K(e?"nav.expand":"nav.collapse"),title:K(e?"nav.expand":"nav.collapse"),"aria-expanded":!e,"aria-controls":"app-sidebar",className:"tt-sidebar-toggle flex shrink-0 items-center justify-center rounded-lg text-oai-gray-500 dark:text-oai-gray-500 hover:bg-oai-gray-200/60 dark:hover:bg-oai-gray-800 hover:text-oai-gray-900 dark:hover:text-oai-gray-200 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-oai-brand-500",children:e?R.jsx(iO,{className:"h-4 w-4",strokeWidth:1.5,"aria-hidden":!0}):R.jsx(sO,{className:"h-4 w-4",strokeWidth:1.5,"aria-hidden":!0})})]}),R.jsx("nav",{"aria-label":K("nav.nav_label"),className:"flex-1 px-2 pb-2 flex flex-col overflow-y-auto",children:x.map((S,E)=>R.jsxs("div",{className:"flex flex-col",children:[R.jsx(QL,{label:S.label,collapsed:e,first:E===0}),R.jsx("div",{className:"flex flex-col gap-0.5",children:S.items.filter(C=>!(C.to==="/widgets"&&(oi()||Rl()))).map(C=>R.jsx(JL,{item:C,collapsed:e,active:ZL(m,C.to),onClick:a},C.id))})]},S.id))}),R.jsxs("div",{className:Nt("tt-sidebar-utilities flex items-center px-2 py-2",e?"flex-col justify-center gap-2":"justify-between gap-2"),children:[R.jsx(tM,{theme:f,resolvedTheme:g,onSetTheme:b,glassChrome:c}),!e&&R.jsx(eM,{glassChrome:c})]})]})}function nM({collapsed:e,onToggleCollapsed:t}){const a=k.useMemo(()=>typeof window>"u"?!1:xn()||ri(),[]);return R.jsx("aside",{"data-native-sidebar":!0,id:"app-sidebar","data-sidebar-state":e?"collapsed":"expanded","aria-label":K("nav.aside_label"),className:Nt("hidden lg:flex flex-col shrink-0 h-full min-h-0 transition-[width] duration-200",e?"w-[72px]":"w-[220px]"),children:R.jsx(J0,{collapsed:e,onToggleCollapsed:t,glassChrome:a})})}function aM({open:e,onClose:t,onDesktopBreakpointClose:a}){const o=k.useRef(null),s=k.useRef(null);return k.useEffect(()=>{e&&s.current?.focus()},[e]),k.useEffect(()=>{if(!e)return;const i=c=>{if(c.key==="Escape"&&t(),c.key!=="Tab")return;const u=o.current;if(!u)return;const m=u.querySelectorAll('a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])');if(!m.length)return;const f=m[0],g=m[m.length-1];c.shiftKey&&document.activeElement===f?(c.preventDefault(),g.focus()):!c.shiftKey&&document.activeElement===g&&(c.preventDefault(),f.focus())};return document.addEventListener("keydown",i),()=>document.removeEventListener("keydown",i)},[e,t]),k.useEffect(()=>{if(!e||typeof window>"u"||typeof window.matchMedia!="function")return;const i=window.matchMedia("(min-width: 1024px)"),c=u=>{u.matches&&a()};if(i.matches){a();return}return i.addEventListener?(i.addEventListener("change",c),()=>i.removeEventListener("change",c)):(i.addListener?.(c),()=>i.removeListener?.(c))},[e,a]),k.useEffect(()=>{if(!e)return;const i=document.body.style.overflow;return document.body.style.overflow="hidden",()=>{document.body.style.overflow=i}},[e]),e?R.jsxs("div",{className:"lg:hidden fixed inset-0 z-[80] flex",children:[R.jsx("div",{className:"absolute inset-0 bg-black/40 backdrop-blur-sm",onClick:t,"aria-hidden":!0}),R.jsx("aside",{ref:o,id:"mobile-navigation-drawer",role:"dialog","aria-modal":"true","aria-label":K("nav.aside_label"),className:"relative w-[260px] max-w-[80vw] flex flex-col bg-oai-white dark:bg-oai-gray-900 border-r border-oai-gray-200 dark:border-oai-gray-800 shadow-2xl",children:R.jsx(J0,{collapsed:!1,showCloseButton:!0,onClose:t,closeButtonRef:s,onItemClick:t})})]}):null}function rM({open:e,onOpenDrawer:t,menuButtonRef:a}){return R.jsxs("div",{className:"lg:hidden flex items-center justify-between gap-2 px-3 h-14 border-b border-oai-gray-200 dark:border-oai-gray-800",children:[R.jsx(XL,{buttonRef:a,title:K("nav.menu"),onClick:t,"aria-expanded":e,"aria-controls":"mobile-navigation-drawer",children:R.jsx(pO,{className:"h-5 w-5","aria-hidden":!0})}),R.jsxs(Qr,{to:"/landing",className:"flex items-center gap-2 no-underline hover:opacity-80 transition-opacity","aria-label":"Token Tracker",children:[R.jsx("img",{src:"/app-icon.png",alt:"",width:24,height:24,className:"rounded-md"}),R.jsx("span",{className:"text-sm font-semibold text-oai-black dark:text-oai-white",children:"Token Tracker"})]}),R.jsx("div",{className:"w-10 shrink-0","aria-hidden":!0})]})}function oM({children:e}){const{collapsed:t,toggle:a}=YL(),[o,s]=k.useState(!1),i=k.useRef(null),c=k.useRef(null),u=k.useCallback(()=>s(!0),[]),m=k.useCallback(()=>{s(!1),i.current?.focus()},[]),f=k.useCallback(()=>{s(!1);const b=()=>c.current?.focus();typeof window<"u"&&typeof window.requestAnimationFrame=="function"?window.requestAnimationFrame(b):b()},[]),g=k.useMemo(()=>typeof window>"u"?!1:xn()||ri(),[]);return R.jsxs("div",{className:Nt("fixed inset-0 flex flex-col text-oai-black dark:text-oai-white font-sans overflow-hidden",oi()&&"tt-native-glass-shell",g?"bg-transparent":"bg-oai-gray-100 dark:bg-oai-gray-950"),children:[g&&R.jsx("div",{className:"h-7 shrink-0",style:{WebkitAppRegion:"drag"},"aria-hidden":!0}),R.jsxs("div",{className:"flex-1 min-h-0 flex",children:[R.jsx(nM,{collapsed:t,onToggleCollapsed:a}),R.jsx(aM,{open:o,onClose:m,onDesktopBreakpointClose:f}),R.jsx("div",{className:"flex-1 min-w-0 min-h-0 p-2 lg:pl-0 lg:pr-3 lg:pb-3 flex flex-col",children:R.jsxs("div",{className:Nt("flex-1 min-h-0 flex flex-col bg-oai-white dark:bg-oai-gray-900 border border-oai-gray-200 dark:border-oai-gray-800 overflow-hidden",g?"tt-native-main-card":"rounded-2xl",!g&&"shadow-sm"),children:[R.jsx(rM,{open:o,onOpenDrawer:u,menuButtonRef:i}),R.jsx("div",{ref:c,id:"app-main-content",tabIndex:-1,className:"flex-1 min-h-0 overflow-y-auto",children:e})]})})]})]})}function Fy(){return R.jsxs("nav",{className:"flex flex-wrap items-center justify-center gap-x-6 gap-y-3 text-sm text-oai-gray-400",children:[R.jsx("a",{href:"/pricing.html",className:"hover:underline",children:K("legal.nav.pricing")}),R.jsx("a",{href:"/terms.html",className:"hover:underline",children:K("legal.nav.terms")}),R.jsx("a",{href:"/privacy.html",className:"hover:underline",children:K("landing.v2.nav.privacy")}),R.jsx("a",{href:"mailto:rynnsun0509@gmail.com",className:"hover:underline",children:K("legal.nav.support")})]})}function sM(){}const iM=Object.freeze([]),Po=Object.freeze({});function lf(e){k.useEffect(e,iM)}const By={};function Vo(e,t){const a=k.useRef(By);return a.current===By&&(a.current=e(t)),a}const lM=()=>{},ra=typeof document<"u"?k.useLayoutEffect:lM;function cM(e,t){return function(o,...s){const i=new URL(e);return i.searchParams.set("code",o.toString()),s.forEach(c=>i.searchParams.append("args[]",c)),`${t} error #${o}; visit ${i} for the full message.`}}const tu=cM("https://base-ui.com/production-error","Base UI"),X0=k.createContext(void 0);function nu(){const e=k.useContext(X0);if(!e)throw new Error(tu(73));return e}var um={exports:{}},pm={};var Gy;function dM(){if(Gy)return pm;Gy=1;var e=kl();function t(b,w){return b===w&&(b!==0||1/b===1/w)||b!==b&&w!==w}var a=typeof Object.is=="function"?Object.is:t,o=e.useState,s=e.useEffect,i=e.useLayoutEffect,c=e.useDebugValue;function u(b,w){var x=w(),S=o({inst:{value:x,getSnapshot:w}}),E=S[0].inst,C=S[1];return i(function(){E.value=x,E.getSnapshot=w,m(E)&&C({inst:E})},[b,x,w]),s(function(){return m(E)&&C({inst:E}),b(function(){m(E)&&C({inst:E})})},[b]),c(x),x}function m(b){var w=b.getSnapshot;b=b.value;try{var x=w();return!a(b,x)}catch{return!0}}function f(b,w){return w()}var g=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?f:u;return pm.useSyncExternalStore=e.useSyncExternalStore!==void 0?e.useSyncExternalStore:g,pm}var $y;function ex(){return $y||($y=1,um.exports=dM()),um.exports}var tx=ex(),mm={exports:{}},hm={};var qy;function uM(){if(qy)return hm;qy=1;var e=kl(),t=ex();function a(f,g){return f===g&&(f!==0||1/f===1/g)||f!==f&&g!==g}var o=typeof Object.is=="function"?Object.is:a,s=t.useSyncExternalStore,i=e.useRef,c=e.useEffect,u=e.useMemo,m=e.useDebugValue;return hm.useSyncExternalStoreWithSelector=function(f,g,b,w,x){var S=i(null);if(S.current===null){var E={hasValue:!1,value:null};S.current=E}else E=S.current;S=u(function(){function U(J){if(!L){if(L=!0,M=J,J=w(J),x!==void 0&&E.hasValue){var Q=E.value;if(x(Q,J))return D=Q}return D=J}if(Q=D,o(M,J))return Q;var T=w(J);return x!==void 0&&x(Q,T)?(M=J,Q):(M=J,D=T)}var L=!1,M,D,Y=b===void 0?null:b;return[function(){return U(g())},Y===null?void 0:function(){return U(Y())}]},[g,b,w,x]);var C=s(f,S[0],S[1]);return c(function(){E.hasValue=!0,E.value=C},[C]),m(C),C},hm}var Ky;function pM(){return Ky||(Ky=1,mm.exports=uM()),mm.exports}var mM=pM();const hM=parseInt(k.version,10);function cf(e){return hM>=e}const nh=[];let ah;function fM(){return ah}function gM(e){nh.push(e)}function _M(e){const t=(a,o)=>{const s=Vo(bM).current;let i;try{ah=s;for(const c of nh)c.before(s);i=e(a,o);for(const c of nh)c.after(s);s.didInitialize=!0}finally{ah=void 0}return i};return t.displayName=e.displayName||e.name,t}function qj(e){return k.forwardRef(_M(e))}function bM(){return{didInitialize:!1}}const yM=cf(19),kM=yM?wM:xM;function nx(e,t,a,o,s){return kM(e,t,a,o,s)}function vM(e,t,a,o,s){const i=k.useCallback(()=>t(e.getSnapshot(),a,o,s),[e,t,a,o,s]);return tx.useSyncExternalStore(e.subscribe,i,i)}gM({before(e){e.syncIndex=0,e.didInitialize||(e.syncTick=1,e.syncHooks=[],e.didChangeStore=!0,e.getSnapshot=()=>{let t=!1;for(let a=0;a<e.syncHooks.length;a+=1){const o=e.syncHooks[a],s=o.selector(o.store.state,o.a1,o.a2,o.a3);Object.is(o.value,s)||(t=!0,o.value=s)}return t&&(e.syncTick+=1),e.syncTick})},after(e){e.syncHooks.length>0&&(e.didChangeStore&&(e.didChangeStore=!1,e.subscribe=t=>{const a=new Set;for(const s of e.syncHooks)a.add(s.store);const o=[];for(const s of a)o.push(s.subscribe(t));return()=>{for(const s of o)s()}}),tx.useSyncExternalStore(e.subscribe,e.getSnapshot,e.getSnapshot))}});function wM(e,t,a,o,s){const i=fM();if(!i)return vM(e,t,a,o,s);const c=i.syncIndex;i.syncIndex+=1;let u;return i.didInitialize?(u=i.syncHooks[c],(u.store!==e||u.selector!==t||!Object.is(u.a1,a)||!Object.is(u.a2,o)||!Object.is(u.a3,s))&&(u.store!==e&&(i.didChangeStore=!0),u.store=e,u.selector=t,u.a1=a,u.a2=o,u.a3=s,u.value=t(e.getSnapshot(),a,o,s))):(u={store:e,selector:t,a1:a,a2:o,a3:s,value:t(e.getSnapshot(),a,o,s)},i.syncHooks.push(u)),u.value}function xM(e,t,a,o,s){return mM.useSyncExternalStoreWithSelector(e.subscribe,e.getSnapshot,e.getSnapshot,i=>t(i,a,o,s))}class SM{static create(t){return new this(t)}constructor(t){this.state=t,this.listeners=new Set,this.updateTick=0}subscribe=t=>(this.listeners.add(t),()=>{this.listeners.delete(t)});getSnapshot=()=>this.state;setState(t){if(this.state===t)return;this.state=t,this.updateTick+=1;const a=this.updateTick;for(const o of this.listeners){if(a!==this.updateTick)return;o(t)}}update(t){for(const a in t)if(!Object.is(this.state[a],t[a])){this.setState({...this.state,...t});return}}set(t,a){Object.is(this.state[t],a)||this.setState({...this.state,[t]:a})}notifyAll(){const t={...this.state};this.setState(t)}use(t,a,o,s){return nx(this,t,a,o,s)}}const df={...mk},fm=df.useInsertionEffect,CM=fm&&fm!==df.useLayoutEffect?fm:e=>e();function Bo(e){const t=Vo(TM).current;return t.next=e,CM(t.effect),t.trampoline}function TM(){const e={next:void 0,callback:EM,trampoline:(...t)=>e.callback?.(...t),effect:()=>{e.callback=e.next}};return e}function EM(){}class AM extends SM{constructor(t,a={},o){super(t),this.context=a,this.selectors=o}useSyncedValue(t,a){k.useDebugValue(t);const o=this;ra(()=>{o.state[t]!==a&&o.set(t,a)},[o,t,a])}useSyncedValueWithCleanup(t,a){const o=this;ra(()=>(o.state[t]!==a&&o.set(t,a),()=>{o.set(t,void 0)}),[o,t,a])}useSyncedValues(t){const a=this,o=Object.values(t);ra(()=>{a.update(t)},[a,...o])}useControlledProp(t,a){k.useDebugValue(t);const o=this,s=a!==void 0;ra(()=>{s&&!Object.is(o.state[t],a)&&o.setState({...o.state,[t]:a})},[o,t,a,s])}select(t,a,o,s){const i=this.selectors[t];return i(this.state,a,o,s)}useState(t,a,o,s){return k.useDebugValue(t),nx(this,this.selectors[t],a,o,s)}useContextCallback(t,a){k.useDebugValue(t);const o=Bo(a??sM);this.context[t]=o}useStateSetter(t){const a=k.useRef(void 0);return a.current===void 0&&(a.current=o=>{this.set(t,o)}),a.current}observe(t,a){let o;typeof t=="function"?o=t:o=this.selectors[t];let s=o(this.state);return a(s,s,this),this.subscribe(i=>{const c=o(i);if(!Object.is(s,c)){const u=s;s=c,a(c,u,this)}})}}function au(){return typeof window<"u"}function va(e){return uf(e)?(e.nodeName||"").toLowerCase():"#document"}function hr(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function PM(e){var t;return(t=(uf(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function uf(e){return au()?e instanceof Node||e instanceof hr(e).Node:!1}function pf(e){return au()?e instanceof Element||e instanceof hr(e).Element:!1}function ur(e){return au()?e instanceof HTMLElement||e instanceof hr(e).HTMLElement:!1}function Ld(e){return!au()||typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||e instanceof hr(e).ShadowRoot}function ax(e){const{overflow:t,overflowX:a,overflowY:o,display:s}=ru(e);return/auto|scroll|overlay|hidden|clip/.test(t+o+a)&&s!=="inline"&&s!=="contents"}function Kj(e){return/^(table|td|th)$/.test(va(e))}function RM(e){try{if(e.matches(":popover-open"))return!0}catch{}try{return e.matches(":modal")}catch{return!1}}const IM=/transform|translate|scale|rotate|perspective|filter/,NM=/paint|layout|strict|content/,xo=e=>!!e&&e!=="none";let gm;function DM(e){const t=pf(e)?ru(e):e;return xo(t.transform)||xo(t.translate)||xo(t.scale)||xo(t.rotate)||xo(t.perspective)||!OM()&&(xo(t.backdropFilter)||xo(t.filter))||IM.test(t.willChange||"")||NM.test(t.contain||"")}function Vj(e){let t=rh(e);for(;ur(t)&&!rx(t);){if(DM(t))return t;if(RM(t))return null;t=rh(t)}return null}function OM(){return gm==null&&(gm=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),gm}function rx(e){return/^(html|body|#document)$/.test(va(e))}function ru(e){return hr(e).getComputedStyle(e)}function Wj(e){return pf(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function rh(e){if(va(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Ld(e)&&e.host||PM(e);return Ld(t)?t.host:t}function ox(e){const t=rh(e);return rx(t)?(e.ownerDocument||e).body:ur(t)&&ax(t)?t:ox(t)}function Vy(e,t,a){var o;t===void 0&&(t=[]),a===void 0&&(a=!0);const s=ox(e),i=s===((o=e.ownerDocument)==null?void 0:o.body),c=hr(s);if(i){const u=LM(c);return t.concat(c,c.visualViewport||[],ax(s)?s:[],u&&a?Vy(u):[])}else return t.concat(s,Vy(s,[],a))}function LM(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function sx(...e){return()=>{for(let t=0;t<e.length;t+=1){const a=e[t];a&&a()}}}function ja(e){return e?.ownerDocument||document}function Ro(e,t,a,o){return e.addEventListener(t,a,o),()=>{e.removeEventListener(t,a,o)}}const Qc=null;class MM{callbacks=[];callbacksCount=0;nextId=1;startId=1;isScheduled=!1;tick=t=>{this.isScheduled=!1;const a=this.callbacks,o=this.callbacksCount;if(this.callbacks=[],this.callbacksCount=0,this.startId=this.nextId,o>0)for(let s=0;s<a.length;s+=1)a[s]?.(t)};request(t){const a=this.nextId;return this.nextId+=1,this.callbacks.push(t),this.callbacksCount+=1,!this.isScheduled&&(requestAnimationFrame(this.tick),this.isScheduled=!0),a}cancel(t){const a=t-this.startId;a<0||a>=this.callbacks.length||this.callbacks[a]!==null&&(this.callbacks[a]=null,this.callbacksCount-=1)}}let Jc=new MM;class mf{static create(){return new mf}static request(t){return Jc.request(t)}static cancel(t){return Jc.cancel(t)}currentId=Qc;request(t){this.cancel(),this.currentId=Jc.request(()=>{this.currentId=Qc,t()})}cancel=()=>{this.currentId!==Qc&&(Jc.cancel(this.currentId),this.currentId=Qc)};disposeEffect=()=>this.cancel}function zM(){const e=Vo(mf.create).current;return lf(e.disposeEffect),e}const Yi=0;class bl{static create(){return new bl}currentId=Yi;start(t,a){this.clear(),this.currentId=setTimeout(()=>{this.currentId=Yi,a()},t)}isStarted(){return this.currentId!==Yi}clear=()=>{this.currentId!==Yi&&(clearTimeout(this.currentId),this.currentId=Yi)};disposeEffect=()=>this.clear}function jM(){const e=Vo(bl.create).current;return lf(e.disposeEffect),e}let Wy=0;function ix(e){return Wy+=1,`${e}-${Math.random().toString(36).slice(2,6)}-${Wy}`}function _m(e,t){if(typeof e=="string")return{description:e};if(typeof e=="function"){const a=e(t);return typeof a=="string"?{description:a}:a}return e}function UM(){return typeof navigator>"u"?{userAgent:"",platform:"",maxTouchPoints:0}:{userAgent:navigator.userAgent,platform:navigator.platform??"",maxTouchPoints:navigator.maxTouchPoints??0}}const{userAgent:HM,platform:FM,maxTouchPoints:BM}=UM(),ou=HM.toLowerCase(),yl=FM.toLowerCase(),lx=/^i(os$|p)/.test(yl)||yl==="macintel"&&BM>1,Yy="android",Yj=yl===Yy||ou.includes(Yy),GM=!lx&&yl.startsWith("mac");yl.startsWith("win");const $M=GM||lx,hf=typeof CSS<"u"&&!!CSS.supports?.("-webkit-backdrop-filter:none");!hf&&ou.includes("firefox");!hf&&ou.includes("chrom");const qM=$M,KM=/jsdom|happydom/.test(ou);function Hs(e){let t=e.activeElement;for(;t?.shadowRoot?.activeElement!=null;)t=t.shadowRoot.activeElement;return t}function pr(e,t){if(!e||!t)return!1;const a=t.getRootNode?.();if(e.contains(t))return!0;if(a&&Ld(a)){let o=t;for(;o;){if(e===o)return!0;o=o.parentNode||o.host}}return!1}function Io(e){return"composedPath"in e?e.composedPath()[0]??e.target:e.target}const Zy="data-base-ui-focusable",cx="input:not([type='hidden']):not([disabled]),[contenteditable]:not([contenteditable='false']),textarea:not([disabled])",Zj="ArrowLeft",Qj="ArrowRight",Jj="ArrowUp",Xj="ArrowDown",dx="data-starting-style",VM="data-ending-style",WM={[dx]:""},YM={[VM]:""},ZM={transitionStatus(e){return e==="starting"?WM:e==="ending"?YM:null}},Qy="data-trigger-disabled";function eU(e,t){if(!pf(e))return!1;const a=e;if(t.hasElement(a))return!a.hasAttribute(Qy);for(const[,o]of t.entries())if(pr(o,a))return!o.hasAttribute(Qy);return!1}function tU(e,t){if(t==null)return!1;if("composedPath"in e)return e.composedPath().includes(t);const a=e;return a.target!=null&&t.contains(a.target)}function nU(e){return e.matches("html,body")}function QM(e){return ur(e)&&e.matches(cx)}function aU(e){return e?.closest(`button,a[href],[role="button"],select,[tabindex]:not([tabindex="-1"]),${cx}`)!=null}function rU(e){return e?e.getAttribute("role")==="combobox"&&QM(e):!1}function oh(e){if(!e||KM)return!0;try{return e.matches(":focus-visible")}catch{return!0}}function oU(e){return e?e.hasAttribute(Zy)?e:e.querySelector(`[${Zy}]`)||e:null}function sU(e,t){return t<0||t>=e.length}function iU(e,t){return ux(e.current,{disabledIndices:t})}function lU(e,t){return ux(e.current,{decrement:!0,startingIndex:e.current.length,disabledIndices:t})}function ux(e,{startingIndex:t=-1,decrement:a=!1,disabledIndices:o,amount:s=1}={}){let i=t;do i+=a?-s:s;while(i>=0&&i<=e.length-1&&JM(e,i,o));return i}function JM(e,t,a){if(typeof a=="function"?a(t):a?.includes(t)??!1)return!0;const s=e[t];return s?!px(s)||s.matches(":disabled")?!0:!a&&(s.hasAttribute("disabled")||s.getAttribute("aria-disabled")==="true"):!1}function XM(e){return e.visibility==="hidden"||e.visibility==="collapse"}function px(e,t=e?ru(e):null){return!e||!e.isConnected||!t||XM(t)?!1:typeof e.checkVisibility=="function"?e.checkVisibility():t.display!=="none"&&t.display!=="contents"}const e2='a[href],button,input,select,textarea,summary,details,iframe,object,embed,[tabindex],[contenteditable]:not([contenteditable="false"]),audio[controls],video[controls]';function t2(e){const t=e.assignedSlot;if(t)return t;if(e.parentElement)return e.parentElement;const a=e.getRootNode();return Ld(a)?a.host:null}function sh(e){for(const t of Array.from(e.children))if(va(t)==="summary")return t;return null}function n2(e,t){const a=sh(t);return!!a&&(e===a||pr(a,e))}function mx(e){const t=e?va(e):"";return e!=null&&e.matches(e2)&&(t!=="summary"||e.parentElement!=null&&va(e.parentElement)==="details"&&sh(e.parentElement)===e)&&(t!=="details"||sh(e)==null)&&(t!=="input"||e.type!=="hidden")}function hx(e){if(!mx(e)||!e.isConnected||e.matches(":disabled"))return!1;for(let t=e;t;t=t2(t)){const a=t!==e,o=va(t)==="slot";if(t.hasAttribute("inert")||a&&va(t)==="details"&&!t.open&&!n2(e,t)||t.hasAttribute("hidden")||!o&&!a2(t,a))return!1}return!0}function a2(e,t){const a=ru(e);return t?a.display!=="none":px(e,a)}function fx(e){const t=e.tabIndex;if(t<0){const a=va(e);if(a==="details"||a==="audio"||a==="video"||ur(e)&&e.isContentEditable)return 0}return t}function bm(e){if(va(e)!=="input")return null;const t=e;return t.type==="radio"&&t.name!==""?t:null}function r2(e,t){const a=bm(e);if(!a)return!0;const o=t.find(s=>{const i=bm(s);return i?.name===a.name&&i.form===a.form&&i.checked});return o?o===a:t.find(s=>{const i=bm(s);return i?.name===a.name&&i.form===a.form})===a}function gx(e){if(ur(e)&&va(e)==="slot"){const t=e.assignedElements({flatten:!0});if(t.length>0)return t}return ur(e)&&e.shadowRoot?Array.from(e.shadowRoot.children):Array.from(e.children)}function _x(e,t){gx(e).forEach(a=>{mx(a)&&t.push(a),_x(a,t)})}function bx(e,t,a){gx(e).forEach(o=>{ur(o)&&o.matches(t)&&a.push(o),bx(o,t,a)})}function cU(e){return hx(e)&&fx(e)>=0}function o2(e){const t=[];return _x(e,t),t.filter(hx)}function ff(e){const t=o2(e);return t.filter(a=>fx(a)>=0&&r2(a,t))}function yx(e,t){const a=ff(e),o=a.length;if(o===0)return;const s=Hs(ja(e)),i=a.indexOf(s),c=i===-1?t===1?0:o-1:i+t;return a[c]}function s2(e){return yx(ja(e).body,1)||e}function i2(e){return yx(ja(e).body,-1)||e}function kx(e,t){if(!e)return null;const a=ff(ja(e).body),o=a.length;if(o===0)return null;const s=a.indexOf(e);if(s===-1)return null;const i=(s+t+o)%o;return a[i]}function dU(e){return kx(e,1)}function uU(e){return kx(e,-1)}function ym(e,t){const a=t||e.currentTarget,o=e.relatedTarget;return!o||!pr(a,o)}function l2(e){ff(e).forEach(a=>{a.dataset.tabindex=a.getAttribute("tabindex")||"",a.setAttribute("tabindex","-1")})}function Jy(e){const t=[];bx(e,"[data-tabindex]",t),t.forEach(a=>{const o=a.dataset.tabindex;delete a.dataset.tabindex,o?a.setAttribute("tabindex",o):a.removeAttribute("tabindex")})}function km(e){const t=new Map;let a=0,o=0;return e.forEach((s,i)=>{const c=s.transitionStatus==="ending";t.set(s.id,{value:s,domIndex:i,visibleIndex:c?-1:a,offsetY:o}),o+=s.height||0,c||(a+=1)}),t}function vm(e,t){let a=0;return e.map(o=>{if(o.transitionStatus==="ending")return o;const s=a>=t;return a+=1,o.limited===s?o:{...o,limited:s}})}const ya={toasts:e=>e.toasts,isEmpty:e=>e.toasts.length===0,toast:(e,t)=>e.toastMetadata.get(t)?.value,toastIndex:(e,t)=>e.toastMetadata.get(t)?.domIndex??-1,toastOffsetY:(e,t)=>e.toastMetadata.get(t)?.offsetY??0,toastVisibleIndex:(e,t)=>e.toastMetadata.get(t)?.visibleIndex??-1,focused:e=>e.focused,expanded:e=>e.hovering||e.focused,expandedOrOutOfFocus:e=>e.hovering||e.focused||!e.isWindowFocused,prevFocusElement:e=>e.prevFocusElement};class c2 extends AM{timers=new Map;areTimersPaused=!1;constructor(t){super({...t,toastMetadata:km(t.toasts)},{},ya)}setViewport=t=>{this.set("viewport",t)};syncProviderProps(t,a){const o=this.state.limit!==a;if(this.state.timeout===t&&!o)return;const s={timeout:t,limit:a};if(o){const i=vm(this.state.toasts,a);s.toasts=i,s.toastMetadata=km(i)}this.update(s)}disposeEffect=()=>()=>{this.timers.forEach(t=>{t.timeout?.clear()}),this.timers.clear()};removeToast(t,a=!1){const o=ya.toastIndex(this.state,t);if(o===-1)return;const s=this.state.toasts[o];a||s?.onRemove?.();const i=[...this.state.toasts];i.splice(o,1),this.setToasts(i)}addToast=t=>{const{timeout:a,limit:o}=this.state,s=t.id||ix("toast");if(t.id){const m=ya.toast(this.state,t.id);if(m)if(m.transitionStatus==="ending")this.removeToast(t.id,!0);else{const{id:f,transitionStatus:g,...b}=t;return this.updateToastInternal(t.id,b,!0,!0),t.id}}const i={...t,id:s,updateKey:0,transitionStatus:"starting"},c=[i,...this.state.toasts];this.setToasts(vm(c,o));const u=i.timeout??a;return i.type!=="loading"&&u>0&&this.scheduleTimer(s,u,()=>this.closeToast(s)),ya.expandedOrOutOfFocus(this.state)&&this.pauseTimers(),s};updateToast=(t,a)=>{const o=ya.toast(this.state,t);!o||o.transitionStatus==="ending"||this.updateToastInternal(t,typeof a=="function"?a(o):a,!1,!0)};updateToastInternal=(t,a,o=!1,s=!1)=>{const{timeout:i,toasts:c}=this.state,u=ya.toast(this.state,t);if(!u||u.transitionStatus==="ending")return;const m={...u,...a,...s&&{updateKey:u.updateKey+1}};this.setToasts(c.map(C=>C.id===t?m:C));const f=m.timeout??i,g=u.timeout??i,b=Object.hasOwn(a,"timeout"),w=m.transitionStatus!=="ending"&&m.type!=="loading"&&f>0,x=this.timers.has(t),S=g!==f,E=u.type==="loading";if(!w&&x){this.clearTimer(t);return}w&&(!x||S||b||E||o)&&(this.clearTimer(t),this.scheduleTimer(t,f,()=>this.closeToast(t)),ya.expandedOrOutOfFocus(this.state)&&this.pauseTimers())};closeToast=t=>{const a=t===void 0,{limit:o,toasts:s}=this.state;let i;if(a)i=s,this.clearTimers();else{const m=ya.toast(this.state,t);if(!m)return;i=[m],this.clearTimer(t)}const c=s.map(m=>a||m.id===t?{...m,transitionStatus:"ending",height:0}:m),u=vm(c,o);this.setToasts(u,!u.some(m=>m.transitionStatus!=="ending")),i.forEach(m=>{m.transitionStatus!=="ending"&&m.onClose?.()}),this.handleFocusManagement(t)};promiseToast=(t,a)=>{const o=_m(a.loading),s=this.addToast({...o,type:"loading"}),i=t.then(c=>{const u=_m(a.success,c);return this.updateToast(s,{...u,type:"success",timeout:u.timeout}),c}).catch(c=>{const u=_m(a.error,c);return this.updateToast(s,{...u,type:"error",timeout:u.timeout}),Promise.reject(c)});return{}.hasOwnProperty.call(a,"setPromise")&&a.setPromise(i),i};pauseTimers(){this.areTimersPaused||(this.areTimersPaused=!0,this.timers.forEach(t=>{t.timeout&&(t.timeout.clear(),t.remaining=Math.max(t.remaining-(Date.now()-t.start),0))}))}resumeTimers(){this.areTimersPaused&&(this.areTimersPaused=!1,this.timers.forEach((t,a)=>{t.remaining=t.remaining>0?t.remaining:t.delay,t.timeout??=bl.create(),t.timeout.start(t.remaining,()=>{this.handleTimerFired(a),t.callback()}),t.start=Date.now()}))}restoreFocusToPrevElement(){this.state.prevFocusElement?.focus({preventScroll:!0})}handleDocumentPointerDown=t=>{if(t.pointerType!=="touch")return;const a=Io(t);pr(this.state.viewport,a)||(this.resumeTimers(),this.update({hovering:!1,focused:!1}))};scheduleTimer(t,a,o){const s=Date.now(),c=!ya.expandedOrOutOfFocus(this.state)?bl.create():void 0;c?.start(a,()=>{this.handleTimerFired(t),o()}),this.timers.set(t,{timeout:c,start:s,delay:a,remaining:a,callback:o})}clearTimers(){this.timers.forEach(t=>{t.timeout?.clear()}),this.timers.clear(),this.areTimersPaused=!1}clearTimer(t){this.timers.get(t)?.timeout?.clear(),this.timers.delete(t),this.resetPausedStateIfNoTimersRemain()}handleTimerFired(t){this.timers.delete(t),this.resetPausedStateIfNoTimersRemain()}resetPausedStateIfNoTimersRemain(){this.timers.size===0&&(this.areTimersPaused=!1)}setToasts(t,a=t.length===0){const o={toasts:t,toastMetadata:km(t)};a&&(o.hovering=!1,o.focused=!1),this.update(o)}handleFocusManagement(t){const a=Hs(ja(this.state.viewport));if(!this.state.viewport||!pr(this.state.viewport,a)||!oh(a))return;if(t===void 0){this.restoreFocusToPrevElement();return}const o=ya.toasts(this.state),s=ya.toastIndex(this.state,t),i=(u,m)=>{for(let f=u;f>=0&&f<o.length;f+=m)if(o[f].transitionStatus!=="ending")return o[f];return null},c=i(s+1,1)??i(s-1,-1);c?c.ref?.current?.focus():this.restoreFocusToPrevElement()}}const d2=function(t){const{children:a,timeout:o=5e3,limit:s=3,toastManager:i}=t,c=Vo(()=>new c2({timeout:o,limit:s,viewport:null,toasts:[],hovering:!1,focused:!1,isWindowFocused:!0,prevFocusElement:null})).current;return lf(c.disposeEffect),k.useEffect(function(){return i?i[" subscribe"](({action:f,options:g})=>{const b=g.id;f==="promise"&&g.promise?c.promiseToast(g.promise,g):f==="update"&&b?c.updateToast(b,g.updates):f==="close"?c.closeToast(b):c.addToast(g)}):void 0},[c,i]),R.jsxs(X0.Provider,{value:c,children:[R.jsx(u2,{store:c,timeout:o,limit:s}),a]})};function u2(e){const{store:t,timeout:a,limit:o}=e;return ra(()=>{t.syncProviderProps(a,o)},[t,a,o]),null}const vx={clipPath:"inset(50%)",overflow:"hidden",whiteSpace:"nowrap",border:0,padding:0,width:1,height:1,margin:-1},wx={...vx,position:"fixed",top:0,left:0},pU={...vx,position:"absolute"},ih=k.forwardRef(function(t,a){const[o,s]=k.useState();ra(()=>{qM&&hf&&s("button")},[]);const i={tabIndex:0,role:o};return R.jsx("span",{...t,ref:a,style:wx,"aria-hidden":o?void 0:!0,...i,"data-base-ui-focus-guard":""})});function Xy(e,t,a,o){const s=Vo(xx).current;return m2(s,e,t,a,o)&&Sx(s,[e,t,a,o]),s.callback}function p2(e){const t=Vo(xx).current;return h2(t,e)&&Sx(t,e),t.callback}function xx(){return{callback:null,cleanup:null,refs:[]}}function m2(e,t,a,o,s){return e.refs[0]!==t||e.refs[1]!==a||e.refs[2]!==o||e.refs[3]!==s}function h2(e,t){return e.refs.length!==t.length||e.refs.some((a,o)=>a!==t[o])}function Sx(e,t){if(e.refs=t,t.every(a=>a==null)){e.callback=null;return}e.callback=a=>{if(e.cleanup&&(e.cleanup(),e.cleanup=null),a!=null){const o=Array(t.length).fill(null);for(let s=0;s<t.length;s+=1){const i=t[s];if(i!=null)switch(typeof i){case"function":{const c=i(a);typeof c=="function"&&(o[s]=c);break}case"object":{i.current=a;break}}}e.cleanup=()=>{for(let s=0;s<t.length;s+=1){const i=t[s];if(i!=null)switch(typeof i){case"function":{const c=o[s];typeof c=="function"?c():i(null);break}case"object":{i.current=null;break}}}}}}}function ek(e){if(!k.isValidElement(e))return null;const t=e,a=t.props;return(cf(19)?a?.ref:t.ref)??null}function lh(e,t){if(e&&!t)return e;if(!e&&t)return t;if(e||t)return{...e,...t}}function f2(e,t){const a={};for(const o in e){const s=e[o];if(t?.hasOwnProperty(o)){const i=t[o](s);i!=null&&Object.assign(a,i);continue}s===!0?a[`data-${o.toLowerCase()}`]="":s&&(a[`data-${o.toLowerCase()}`]=s.toString())}return a}function g2(e,t){return typeof e=="function"?e(t):e}function _2(e,t){return typeof e=="function"?e(t):e}const gf={};function _f(e,t,a,o,s){if(!a&&!o&&!s&&!e)return Md(t);let i=Md(e);return t&&(i=nl(i,t)),a&&(i=nl(i,a)),o&&(i=nl(i,o)),s&&(i=nl(i,s)),i}function b2(e){if(e.length===0)return gf;if(e.length===1)return Md(e[0]);let t=Md(e[0]);for(let a=1;a<e.length;a+=1)t=nl(t,e[a]);return t}function Md(e){return bf(e)?{...Tx(e,gf)}:y2(e)}function nl(e,t){return bf(t)?Tx(t,e):k2(e,t)}function y2(e){const t={...e};for(const a in t){const o=t[a];Cx(a,o)&&(t[a]=Ex(o))}return t}function k2(e,t){if(!t)return e;for(const a in t){const o=t[a];switch(a){case"style":{e[a]=lh(e.style,o);break}case"className":{e[a]=Ax(e.className,o);break}default:Cx(a,o)?e[a]=v2(e[a],o):e[a]=o}}return e}function Cx(e,t){const a=e.charCodeAt(0),o=e.charCodeAt(1),s=e.charCodeAt(2);return a===111&&o===110&&s>=65&&s<=90&&(typeof t=="function"||typeof t>"u")}function bf(e){return typeof e=="function"}function Tx(e,t){return bf(e)?e(t):e??gf}function v2(e,t){return t?e?(...a)=>{const o=a[0];if(Px(o)){const i=o;zd(i);const c=t(...a);return i.baseUIHandlerPrevented||e?.(...a),c}const s=t(...a);return e?.(...a),s}:Ex(t):e}function Ex(e){return e&&((...t)=>{const a=t[0];return Px(a)&&zd(a),e(...t)})}function zd(e){return e.preventBaseUIHandler=()=>{e.baseUIHandlerPrevented=!0},e}function Ax(e,t){return t?e?t+" "+e:t:e}function Px(e){return e!=null&&typeof e=="object"&&"nativeEvent"in e}function Dl(e,t,a={}){let o=t.render;a.enabled!==!1&&(o=C2(o));const s=w2(t,a,o);if(a.enabled===!1)return null;const i=a.state??Po;return T2(e,o,s,i)}function w2(e,t,a){const{className:o,style:s}=e,{state:i=Po,ref:c,props:u,stateAttributesMapping:m,enabled:f=!0}=t,g=f?g2(o,i):void 0,b=f?_2(s,i):void 0,w=f?f2(i,m):Po,x=f&&u?x2(u):void 0,S=f?lh(w,x)??{}:Po;return typeof document<"u"&&(f?Array.isArray(c)?S.ref=p2([S.ref,ek(a),...c]):S.ref=Xy(S.ref,ek(a),c):Xy(null,null)),f?(g!==void 0&&(S.className=Ax(S.className,g)),b!==void 0&&(S.style=lh(S.style,b)),S):Po}function x2(e){return Array.isArray(e)?b2(e):_f(void 0,e)}const S2=Symbol.for("react.lazy");function C2(e){if(e?.$$typeof!==S2)return e;const t=k.Children.toArray(e)[0];return k.isValidElement(t)?t:e}function T2(e,t,a,o){if(t){if(typeof t=="function")return t(a,o);const s=_f(a,t.props);return s.ref=a.ref,k.cloneElement(t,s)}if(e&&typeof e=="string")return E2(e,a);throw new Error(tu(8))}function E2(e,t){return e==="button"?k.createElement("button",{type:"button",...t,key:t.key}):e==="img"?k.createElement("img",{alt:"",...t,key:t.key}):k.createElement(e,t)}const A2="--toast-frontmost-height",P2=k.forwardRef(function(t,a){const{render:o,className:s,style:i,children:c,...u}=t,m=nu(),f=jM(),g=k.useRef(!1),b=k.useRef(!1),w=k.useRef(!1),x=m.useState("isEmpty"),S=m.useState("toasts"),E=m.useState("focused"),C=m.useState("expanded"),U=m.useState("prevFocusElement"),L=S[0]?.height,M=S.some(Z=>Z.transitionStatus==="ending"),D=S.filter(Z=>Z.priority==="high");k.useEffect(()=>{const Z=m.state.viewport;if(!Z||x)return;const H=hr(Z),N=ja(Z);function W(ce){ce.key==="F6"&&Io(ce)!==Z&&(ce.preventDefault(),m.set("prevFocusElement",Hs(N)),Z?.focus({preventScroll:!0}),m.pauseTimers(),m.set("focused",!0))}function ue(ce){Io(ce)===H&&(m.set("isWindowFocused",!1),m.pauseTimers())}function be(ce){if(ce.relatedTarget)return;const pe=Io(ce),Ge=Hs(ja(Z));(pe===H||!pr(Z,pe)||!oh(Ge))&&m.resumeTimers(),f.start(0,()=>m.set("isWindowFocused",!0))}return sx(Ro(H,"keydown",W),Ro(H,"blur",ue,!0),Ro(H,"focus",be,!0),Ro(N,"pointerdown",m.handleDocumentPointerDown,!0))},[m,f,x]);function Y(Z){g.current=!0;const H=Z.relatedTarget===m.state.viewport?S.find(N=>N.transitionStatus!=="ending"&&!N.limited):void 0;H?H.ref?.current?.focus():m.restoreFocusToPrevElement()}function J(Z){Z.key==="Tab"&&Z.shiftKey&&Io(Z.nativeEvent)===m.state.viewport&&(Z.preventDefault(),m.restoreFocusToPrevElement())}function Q(){m.state.toasts.some(H=>H.transitionStatus==="ending")||w.current||!b.current||(m.state.isWindowFocused&&m.resumeTimers(),m.set("hovering",!1),b.current=!1)}k.useEffect(Q,[M,m]);function T(){m.pauseTimers(),m.set("hovering",!0),b.current=!1}function $(){m.state.isWindowFocused&&m.resumeTimers()}function ae(){b.current=!0,Q()}function Ee(Z){Z.pointerType==="touch"&&(w.current=!0)}function ye(Z){Z.pointerType==="touch"&&(w.current=!1,Q())}function ze(){if(g.current){g.current=!1;return}E||oh(Hs(ja(m.state.viewport)))&&(m.set("focused",!0),m.pauseTimers())}function Se(Z){!E||pr(m.state.viewport,Z.relatedTarget)||(m.set("focused",!1),$())}const Me={tabIndex:-1,role:"region","aria-live":"polite","aria-atomic":!1,"aria-relevant":"additions text","aria-label":"Notifications",onMouseEnter:T,onMouseMove:T,onMouseLeave:ae,onFocus:ze,onBlur:Se,onKeyDown:J,onClick:ze,onPointerDown:Ee,onPointerUp:ye,onPointerCancel:ye,style:{[A2]:L?`${L}px`:void 0}},_e={expanded:C},de=!x&&U&&R.jsx(ih,{onFocus:Y}),ne=Dl("div",t,{ref:[a,m.setViewport],state:_e,props:[Me,u,{children:R.jsxs(k.Fragment,{children:[de,c,de]})}]});return R.jsxs(k.Fragment,{children:[de,ne,!E&&D.length>0&&R.jsx("div",{style:wx,children:D.map(Z=>R.jsxs("div",{role:"alert","aria-atomic":!0,children:[R.jsx("div",{children:Z.title}),R.jsx("div",{children:Z.description})]},Z.id))})]})});function R2(e){return cf(19)?e:e?"true":void 0}const Rx=k.createContext(void 0);function Ix(){const e=k.useContext(Rx);if(!e)throw new Error(tu(66));return e}function I2(e){return e==null?e:"current"in e?e.current:e}let Xc=null;function N2(e){if(!Xc){const t=[];Xc=t,queueMicrotask(()=>{Xc=null,$o.flushSync(()=>{for(const a of t)a()})})}Xc.push(e)}function D2(e,t=!1,a=!1){const o=zM();return Bo((s,i=null)=>{o.cancel();const c=I2(e);if(c==null)return;const u=c,m=()=>{if(!a){$o.flushSync(s);return}N2(()=>{i?.aborted||s()})};if(typeof u.getAnimations!="function"||globalThis.BASE_UI_ANIMATIONS_DISABLED){s();return}function f(){Promise.all(u.getAnimations().map(g=>g.finished)).then(()=>{i?.aborted||m()},()=>{if(i?.aborted)return;if(u.getAnimations().some(b=>b.pending||b.playState!=="finished")){f();return}m()})}if(t){const g=dx;if(!u.hasAttribute(g)){o.request(f);return}const b=new MutationObserver(()=>{u.hasAttribute(g)||(b.disconnect(),f())});b.observe(u,{attributes:!0,attributeFilter:[g]}),i?.addEventListener("abort",()=>b.disconnect(),{once:!0});return}o.request(f)})}function O2(e){const{enabled:t=!0,open:a,ref:o,batch:s=!1,onComplete:i}=e,c=Bo(i),u=D2(o,a,s);k.useEffect(()=>{if(!t)return;const m=new AbortController;return u(c,m.signal),()=>{m.abort()}},[t,a,c,u])}const mU=500,hU={style:{transition:"none"}},fU="data-base-ui-click-trigger",L2="data-base-ui-swipe-ignore",M2="data-swipe-ignore",z2=`[${L2}]`,j2=`[${M2}]`,gU={fallbackAxisSide:"none"},_U={fallbackAxisSide:"end"},U2={clipPath:"inset(50%)",position:"fixed",top:0,left:0};function H2(e,t){const a=hr(e).getComputedStyle(e).transform;let o=0,s=0,i=1;if(a&&a!=="none"){const c=a.match(/matrix(?:3d)?\(([^)]+)\)/);if(c){const u=c[1].split(", ").map(parseFloat);u.length===6?(o=u[4],s=u[5],i=Math.sqrt(u[0]*u[0]+u[1]*u[1])):u.length===16&&(o=u[12],s=u[13],i=u[0])}}return{x:o,y:s,scale:i}}function wm(e,t,a){switch(e){case"up":return-a;case"down":return a;case"left":return-t;case"right":return t;default:return 0}}const F2="--toast-index",B2="--toast-offset-y",G2="--toast-height",$2="--toast-swipe-movement-x",q2="--toast-swipe-movement-y",K2="data-swipe-direction",V2={...ZM,swipeDirection(e){return e?{[K2]:e}:null}},tk=40,W2=10,nk=.5,Y2=1,Z2=`${z2},${j2}`,Q2=k.forwardRef(function(t,a){const{toast:o,render:s,className:i,swipeDirection:c=["down","right"],style:u,...m}=t,f=o.positionerProps?.anchor!==void 0;let g=[];f||(g=Array.isArray(c)?c:[c]);const b=g.length>0,w=nu(),[x,S]=k.useState(void 0),[E,C]=k.useState(!1),[U,L]=k.useState(!1),[M,D]=k.useState({x:0,y:0}),[Y,J]=k.useState({x:0,y:0,scale:1}),[Q,T]=k.useState(),[$,ae]=k.useState(),[Ee,ye]=k.useState(null),ze=k.useRef(null),Se=k.useRef(void 0),Me=k.useRef({x:0,y:0}),_e=k.useRef({x:0,y:0,scale:1}),de=k.useRef(void 0),ne=k.useRef(0),Z=k.useRef(!1),H=k.useRef({x:0,y:0}),N=k.useRef(!1),W=k.useRef({x:0,y:0}),ue=k.useRef(null),be=k.useRef(null),ce=w.useState("toastIndex",o.id),pe=w.useState("toastVisibleIndex",o.id),Ge=w.useState("toastOffsetY",o.id),Ye=w.useState("focused"),De=w.useState("expanded");O2({open:o.transitionStatus!=="ending",ref:ze,onComplete(){o.transitionStatus==="ending"&&w.removeToast(o.id)}});const et=Bo((Ze=!1)=>{const st=ze.current;if(!st)return;const _t=st.style.height;st.style.height="auto";const zt=st.offsetHeight;st.style.height=_t;function jt(){w.updateToastInternal(o.id,{ref:ze,height:zt,transitionStatus:void 0})}Ze?$o.flushSync(jt):jt()});ra(()=>{const Ze=Se.current;o.transitionStatus!=="starting"&&Ze===o.id||(Ze!==void 0&&(S(void 0),J({x:0,y:0,scale:1}),Mt({x:0,y:0})),Se.current=o.id,et())},[et,o.id,o.transitionStatus]);function Mt(Ze){W.current=Ze,D(Ze)}ra(()=>()=>{be.current?.abort()},[]);function Wn(Ze,st){const _t=ht=>ht>0?ht**nk:-(Math.abs(ht)**nk),zt=Ze>0&&!g.includes("right")||Ze<0&&!g.includes("left"),jt=st>0&&!g.includes("down")||st<0&&!g.includes("up");return{x:zt?_t(Ze):Ze,y:jt?_t(st):st}}const Je=Bo(Ze=>{if(Ze.pointerId!==ue.current)return;ue.current=null,be.current?.abort(),be.current=null,C(!1),L(!1),ye(null);const st=_e.current;if(Ze.type==="pointercancel"||Z.current){Mt({x:st.x,y:st.y}),S(void 0);return}const _t=W.current,zt=_t.x-st.x,jt=_t.y-st.y;let ht;for(const bt of g)if(wm(bt,zt,jt)>tk){ht=bt;break}ht?(S(ht),w.closeToast(o.id)):(Mt({x:st.x,y:st.y}),S(void 0))});function Ht(Ze){if(Ze.button!==0||(Ze.pointerType==="touch"&&w.pauseTimers(),Io(Ze.nativeEvent)?.closest(`button,a,input,textarea,[role="button"],${Z2}`)))return;Z.current=!1,de.current=void 0,ne.current=0,ue.current=Ze.pointerId,Me.current={x:Ze.clientX,y:Ze.clientY},H.current=Me.current;const zt=Ze.currentTarget,jt=H2(zt);_e.current=jt,J(jt),Mt({x:jt.x,y:jt.y}),w.set("hovering",!0),C(!0),L(!1),ye(null),N.current=!0,be.current?.abort();const ht=new AbortController;be.current=ht;const bt=ja(zt);bt.addEventListener("pointerup",Je,{signal:ht.signal}),bt.addEventListener("pointercancel",Je,{signal:ht.signal}),zt.setPointerCapture?.(Ze.pointerId)}function St(Ze){if(Ze.pointerId!==ue.current)return;Ze.preventDefault(),N.current&&(Me.current={x:Ze.clientX,y:Ze.clientY},N.current=!1);const{clientY:st,clientX:_t,movementX:zt,movementY:jt}=Ze;(jt<0&&st>H.current.y||jt>0&&st<H.current.y)&&(H.current={x:H.current.x,y:st}),(zt<0&&_t>H.current.x||zt>0&&_t<H.current.x)&&(H.current={x:_t,y:H.current.y});const ht=_t-Me.current.x,bt=st-Me.current.y,nn=st-H.current.y,qa=_t-H.current.x;let Sa=Ee;if(!U&&Math.sqrt(ht*ht+bt*bt)>=Y2){L(!0);const ca=g.includes("left")||g.includes("right"),Un=g.includes("up")||g.includes("down");if(ca&&Un){const da=Math.abs(ht),_r=Math.abs(bt);Sa=da>_r?"horizontal":"vertical",ye(Sa)}}let Yt;if(!de.current)Sa==="vertical"?bt>0?Yt="down":bt<0&&(Yt="up"):Sa==="horizontal"?ht>0?Yt="right":ht<0&&(Yt="left"):Math.abs(ht)>=Math.abs(bt)?Yt=ht>0?"right":"left":Yt=bt>0?"down":"up",Yt&&g.includes(Yt)&&(de.current=Yt,ne.current=wm(Yt,ht,bt),S(Yt));else{const Va=de.current,ca=wm(Va,qa,nn);ca>tk?(Z.current=!1,S(Va)):!(g.includes("left")&&g.includes("right"))&&!(g.includes("up")&&g.includes("down"))&&ne.current-ca>=W2&&(Z.current=!0)}const oo=Wn(ht,bt);let Rn=_e.current.x,Ka=_e.current.y;const fr=g.includes("left")||g.includes("right"),gr=g.includes("up")||g.includes("down");Sa!=="vertical"&&fr&&(Rn+=oo.x),Sa!=="horizontal"&&gr&&(Ka+=oo.y),Mt({x:Rn,y:Ka})}function Yn(Ze){if(Ze.key==="Escape"){if(!ze.current||!pr(ze.current,Hs(ja(ze.current))))return;w.closeToast(o.id)}}k.useEffect(()=>{const Ze=ze.current;if(!b||!Ze)return;function st(_t){ue.current===null||!pr(Ze,Io(_t))||_t.preventDefault()}return Ro(Ze,"touchmove",st,{passive:!1})},[b]);function yn(){const Ze=M.x-Y.x,st=M.y-Y.y;return{transition:E?"none":void 0,transform:E?`translateX(${M.x}px) translateY(${M.y}px) scale(${Y.scale})`:void 0,[$2]:`${Ze}px`,[q2]:`${st}px`}}const $a=o.priority==="high",ao={role:$a?"alertdialog":"dialog",tabIndex:0,"aria-modal":!1,"aria-labelledby":Q,"aria-describedby":$,"aria-hidden":$a&&!Ye?!0:void 0,onPointerDown:b?Ht:void 0,onPointerMove:b?St:void 0,onPointerUp:b?Je:void 0,onPointerCancel:b?Je:void 0,onKeyDown:Yn,inert:R2(o.limited),style:{...yn(),[F2]:o.transitionStatus==="ending"?ce:pe,[B2]:`${Ge}px`,[G2]:o.height?`${o.height}px`:void 0}},wa=k.useMemo(()=>({toast:o,setTitleId:T,setDescriptionId:ae,recalculateHeight:et,visibleIndex:pe,expanded:De}),[o,T,ae,et,pe,De]),xa={transitionStatus:o.transitionStatus,expanded:De,limited:o.limited||!1,type:o.type,swiping:E,swipeDirection:x},ro=Dl("div",t,{ref:[a,ze],state:xa,stateAttributesMapping:V2,props:[ao,m]});return R.jsx(Rx.Provider,{value:wa,children:ro})});let ak=0;function J2(e,t="mui"){const[a,o]=k.useState(e),s=e||a;return k.useEffect(()=>{a==null&&(ak+=1,o(`${t}-${ak}`))},[a,t]),s}const rk=df.useId;function Nx(e,t){if(rk!==void 0){const a=rk();return e??(t?`${t}-${a}`:a)}return J2(e,t)}function Dx(e){return e==null||typeof e=="boolean"||e===""?!1:Array.isArray(e)?e.some(Dx):!0}function X2(e){return k.isValidElement(e)&&Dx(e.props.children)}function ez(e,t,a){const{toast:o,setTitleId:s,setDescriptionId:i}=Ix(),c=s,u=t??o.title;return{id:Nx(e),children:u,type:o.type,setId:c}}function tz(e,t,a){const o=X2(e);return ra(()=>{if(o)return a(t),()=>{a(s=>s===t?void 0:s)}},[o,t,a]),o?e:null}const nz=k.forwardRef(function(t,a){const{render:o,className:s,style:i,id:c,children:u,...m}=t,{id:f,children:g,type:b,setId:w}=ez(c,u),S=Dl("h2",t,{ref:a,state:{type:b},props:{...m,id:f,children:g}});return tz(S,f,w)}),az=k.createContext(void 0);function rz(e=!1){const t=k.useContext(az);if(t===void 0&&!e)throw new Error(tu(16));return t}function oz(e){const{focusableWhenDisabled:t,disabled:a,composite:o=!1,tabIndex:s=0,isNativeButton:i}=e,c=o&&t!==!1,u=o&&t===!1;return{props:k.useMemo(()=>{const f={onKeyDown(g){a&&t&&g.key!=="Tab"&&g.preventDefault()}};return o||(f.tabIndex=s,!i&&a&&(f.tabIndex=t?s:-1)),(i&&(t||c)||!i&&a)&&(f["aria-disabled"]=a),i&&(!t||u)&&(f.disabled=a),f},[o,a,t,c,u,i,s])}}function xm(e,t,{detail:a=0}={}){e.dispatchEvent(new(hr(e)).PointerEvent("click",{bubbles:!0,cancelable:!0,composed:!0,detail:a,shiftKey:t.shiftKey,ctrlKey:t.ctrlKey,altKey:t.altKey,metaKey:t.metaKey}))}function sz(e={}){const{disabled:t=!1,focusableWhenDisabled:a,tabIndex:o=0,native:s=!0,composite:i}=e,c=k.useRef(null),u=rz(!0),m=i??u!==void 0,{props:f}=oz({focusableWhenDisabled:a,disabled:t,composite:m,tabIndex:o,isNativeButton:s}),g=k.useCallback(()=>{const x=c.current;Sm(x)&&m&&t&&f.disabled===void 0&&x.disabled&&(x.disabled=!1)},[t,f.disabled,m]);ra(g,[g]);const b=k.useCallback((x={})=>{const{onClick:S,onMouseDown:E,onKeyUp:C,onKeyDown:U,onPointerDown:L,...M}=x;return _f({onClick(D){if(t){D.preventDefault();return}S?.(D)},onMouseDown(D){t||E?.(D)},onKeyDown(D){if(t||(zd(D),U?.(D),D.baseUIHandlerPrevented))return;const Y=D.target===D.currentTarget,J=D.currentTarget,Q=Sm(J),T=!s&&iz(J),$=Y&&(s?Q:!T),ae=D.key==="Enter",Ee=D.key===" ",ye=J.getAttribute("role"),ze=ye?.startsWith("menuitem")||ye==="option"||ye==="gridcell";if(Y&&m&&Ee){if(D.defaultPrevented&&ze)return;D.preventDefault(),(!s||Q)&&(D.preventBaseUIHandler(),xm(J,D));return}if(!$||s||!Ee&&!ae){Y&&T&&Ee&&D.preventDefault();return}D.defaultPrevented||(D.preventDefault(),ae&&(D.preventBaseUIHandler(),xm(J,D)))},onKeyUp(D){if(!t){if(zd(D),C?.(D),D.target===D.currentTarget&&s&&m&&Sm(D.currentTarget)&&D.key===" "){D.preventDefault();return}D.baseUIHandlerPrevented||D.target===D.currentTarget&&!s&&!m&&!D.defaultPrevented&&D.key===" "&&(D.preventBaseUIHandler(),xm(D.currentTarget,D))}},onPointerDown(D){if(t){D.preventDefault();return}L?.(D)}},s?{type:"button"}:{role:"button"},f,M)},[t,f,m,s]),w=Bo(x=>{c.current=x,g()});return{getButtonProps:b,buttonRef:w}}function Sm(e){return ur(e)&&e.tagName==="BUTTON"}function iz(e){return ur(e)&&e.tagName==="A"&&!!e.href}const lz=k.forwardRef(function(t,a){const{render:o,className:s,style:i,disabled:c,nativeButton:u=!0,...m}=t,f=nu(),{toast:g,expanded:b}=Ix(),[w,x]=k.useState(!1),{getButtonProps:S,buttonRef:E}=sz({disabled:c,native:u}),C={type:g.type};return Dl("button",t,{ref:[a,E],state:C,props:[{"aria-hidden":!b&&!w,onClick(){f.closeToast(g.id)},onFocus(){x(!0)},onBlur(){x(!1)}},m,S]})}),bU="none",yU="trigger-press",kU="trigger-hover",vU="trigger-focus",wU="outside-press",xU="item-press",SU="close-press",cz="focus-out",CU="escape-key",TU="list-navigation",EU="cancel-open",AU="disabled",PU="imperative-action",RU="window-resize";function dz(e,t,a,o){let s=!1,i=!1;const c=Po;return{reason:e,event:t??new Event("base-ui"),cancel(){s=!0},allowPropagation(){i=!0},get isCanceled(){return s},get isPropagationAllowed(){return i},trigger:a,...c}}function uz(e){return`data-base-ui-${e}`}const Ox=k.createContext(null),pz=()=>k.useContext(Ox),mz=uz("portal");function Lx(e={}){const{ref:t,container:a,componentProps:o=Po,elementProps:s}=e,i=Nx(),u=pz()?.portalNode,[m,f]=k.useState(null),[g,b]=k.useState(null),w=Bo(C=>{C!==null&&b(C)}),x=k.useRef(null);ra(()=>{if(a===null){x.current&&(x.current=null,b(null),f(null));return}const C=(a&&(uf(a)?a:a.current))??u??document.body;if(C==null){x.current&&(x.current=null,b(null),f(null));return}x.current!==C&&(x.current=C,b(null),f(C))},[a,u]);const S=Dl("div",o,{ref:[t,w],props:[{id:i,[mz]:""},s]}),E=m&&S?$o.createPortal(S,m):null;return{node:g,nodeId:k.isValidElement(S)?S.props.id:void 0,subtree:E}}const IU=k.forwardRef(function(t,a){const{render:o,className:s,style:i,children:c,container:u,portalOwnerRole:m,...f}=t,{node:g,nodeId:b,subtree:w}=Lx({container:u,ref:a,componentProps:t,elementProps:f}),x=k.useRef(null),S=k.useRef(null),E=k.useRef(null),C=k.useRef(null),[U,L]=k.useState(null),M=k.useRef(!1),D=U?.modal,Y=U?.open,J=!!U&&!U.modal&&U.open&&!!g;k.useEffect(()=>{if(!g||D)return;function T($){g&&$.relatedTarget&&ym($)&&($.type==="focusin"?M.current&&(Jy(g),M.current=!1):(l2(g),M.current=!0))}return sx(Ro(g,"focusin",T,!0),Ro(g,"focusout",T,!0))},[g,D]),ra(()=>{!g||Y!==!0||!M.current||(Jy(g),M.current=!1)},[Y,g]);const Q=k.useMemo(()=>({beforeOutsideRef:x,afterOutsideRef:S,beforeInsideRef:E,afterInsideRef:C,portalNode:g,setFocusManagerState:L}),[g]);return R.jsxs(k.Fragment,{children:[w,R.jsxs(Ox.Provider,{value:Q,children:[J&&g&&R.jsx(ih,{"data-type":"outside",ref:x,onFocus:T=>{if(ym(T,g))E.current?.focus();else{const $=U?U.domReference:null;i2($)?.focus()}}}),J&&g&&R.jsx("span",{role:m,"aria-owns":b,style:U2}),g&&$o.createPortal(c,g),J&&g&&R.jsx(ih,{"data-type":"outside",ref:S,onFocus:T=>{if(ym(T,g))C.current?.focus();else{const $=U?U.domReference:null;s2($)?.focus(),U?.closeOnFocusOut&&U?.onOpenChange(!1,dz(cz,T.nativeEvent))}}})]})]})}),hz=k.forwardRef(function(t,a){const{children:o,container:s,className:i,render:c,style:u,...m}=t,{node:f,subtree:g}=Lx({container:s,ref:a,componentProps:t,elementProps:m});return!g&&!f?null:R.jsxs(k.Fragment,{children:[g,f&&$o.createPortal(o,f)]})}),fz=k.forwardRef(function(t,a){return R.jsx(hz,{ref:a,...t})});function gz(){const e=nu(),t=e.useState("toasts");return k.useMemo(()=>({toasts:t,add:e.addToast,close:e.closeToast,update:e.updateToast,promise:e.promiseToast}),[t,e])}function _z(){const e=new Set;function t(a){e.forEach(o=>o(a))}return{" subscribe":function(o){return e.add(o),()=>{e.delete(o)}},add(a){const o=a.id||ix("toast"),s={...a,id:o,transitionStatus:"starting"};return t({action:"add",options:s}),o},close(a){t({action:"close",options:{id:a}})},update(a,o){t({action:"update",options:{id:a,updates:o}})},promise(a,o){let s=a;return t({action:"promise",options:{...o,promise:a,setPromise(i){s=i}}}),s}}}const yf=_z();function NU(e){return yf.add(e)}function bz({children:e}){return R.jsxs(d2,{toastManager:yf,children:[e,R.jsx(fz,{children:R.jsx(P2,{className:"fixed inset-x-0 top-6 z-[100] mx-auto flex w-full max-w-sm flex-col items-center gap-2 px-4 outline-none",children:R.jsx(yz,{})})})]})}function yz(){const{toasts:e}=gz();return e.map(t=>{const a=t.data?.onUndo;return R.jsxs(Q2,{toast:t,className:Nt("pointer-events-auto flex w-full items-center gap-3 rounded-xl border border-oai-gray-200 bg-oai-white px-4 py-3 shadow-xl transition-all duration-200 ease-out","data-[starting-style]:-translate-y-3 data-[starting-style]:opacity-0","data-[ending-style]:-translate-y-3 data-[ending-style]:opacity-0","dark:border-oai-gray-800 dark:bg-oai-gray-900"),children:[R.jsx(nz,{className:"min-w-0 flex-1 text-sm font-medium text-oai-black dark:text-white"}),a?R.jsx("button",{type:"button",onClick:()=>{a(),yf.close(t.id)},className:"shrink-0 rounded-md px-2 py-1 text-xs font-semibold text-oai-gray-600 transition-colors hover:bg-oai-gray-100 hover:text-oai-black focus:outline-none focus:ring-2 focus:ring-oai-gray-400/30 dark:text-oai-gray-300 dark:hover:bg-oai-gray-800 dark:hover:text-white",children:K("shared.action.undo")}):null,R.jsx(lz,{"aria-label":K("shared.action.dismiss"),className:"-mr-1 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-md text-oai-gray-400 transition-colors hover:bg-oai-gray-100 hover:text-oai-black focus:outline-none focus:ring-2 focus:ring-oai-gray-400/30 dark:hover:bg-oai-gray-800 dark:hover:text-white",children:R.jsx(af,{className:"h-3.5 w-3.5","aria-hidden":!0})})]},t.id)})}const kf=Object.freeze(["limits","leaderboard"]),kz=Object.freeze({limits:"/limits",leaderboard:"/leaderboard"}),vz=Object.freeze({limits:()=>mt(()=>import("./LimitsPage-DvM57ri3.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26])),leaderboard:()=>mt(()=>import("./LeaderboardPage-XgjAHwpy.js"),__vite__mapDeps([27,20,10,21,22,14,23,1,28,29,8,30,31,32,33,15,26,34,35,36,37,38,39,40,41]))}),Mx="total",zx=0,ok=20,wz=Object.freeze([10,20,50,100]),xz="tokentracker:leaderboard:pageSize",Sz=20,Cz=Object.freeze(["dashboard-existing","silent-preload","page-load","manual-refresh"]);let sk=0,sa;class Tz{constructor(t={}){this.limits=null,this.leaderboard=new Map,this.leaderboardMaxEntries=Pz(t.leaderboardMaxEntries)}read(t,a){return Ol(t),t==="limits"?!this.limits||this.limits.contextKey!==a?null:pd(this.limits):a?pd(this.leaderboard.get(a)):null}write(t,a={}){if(t.targetKey==="limits"){this.limits=t;return}this.leaderboard.has(t.contextKey)&&this.leaderboard.delete(t.contextKey),this.leaderboard.set(t.contextKey,t),this.evictLeaderboardEntries(a.activeContextKey||t.contextKey)}evictLeaderboardEntries(t=null){for(;this.leaderboard.size>this.leaderboardMaxEntries;){const a=Array.from(this.leaderboard.keys()).find(o=>o!==t)||this.leaderboard.keys().next().value;this.leaderboard.delete(a)}}snapshot(){return{limits:pd(this.limits),leaderboard:{maxEntries:this.leaderboardMaxEntries,size:this.leaderboard.size,keys:Array.from(this.leaderboard.keys())}}}}class Ez{constructor(t={}){sk+=1,this.sessionId=`dashboard-preload-${sk}`,this.createdAt=Date.now(),this.completedAt=null,this.startedAfterMainContentVisible=!1,this.cache=new Tz(t),this.targets={limits:ik("limits"),leaderboard:ik("leaderboard")}}}function ik(e){return{key:e,route:kz[e],resourceStatus:"idle",stateStatus:"idle",error:null,resourcePromise:null,resourceModule:null,resourceRequestId:0,statePromise:null,stateRequestId:0,pendingStateContextKey:null}}function Az(e={}){return new Ez(e)}function Pz(e){const t=Number(e);return!Number.isInteger(t)||t<1?Sz:t}sa=Az();function Ol(e){if(!kf.includes(e))throw new Error(`Unknown dashboard preload target: ${e}`)}function jx(e){return e?typeof e=="string"?e:e.message||String(e):null}function Rz(e,t){return Cz.includes(e)?e:t}function Iz(e){const t=Number(e);return Number.isFinite(t)?t:Date.now()}function pd(e){return e?{...e}:null}function lk(){const e=kf.every(t=>{const a=sa.targets[t];return a.resourceStatus==="fulfilled"||a.resourceStatus==="rejected"});sa.completedAt=e?Date.now():null}function Nz(){sa.startedAfterMainContentVisible=!0}function vf(e,t={}){Ol(e);const a=Object.entries(t).filter(([,o])=>o!==void 0).sort(([o],[s])=>o.localeCompare(s)).map(([o,s])=>`${o}=${s===null?"null":String(s)}`);return`${e}:${a.join("|")}`}function Dz(e,t={}){Ol(e);const a=sa.targets[e];if(a.resourceStatus==="fulfilled")return Promise.resolve(a.resourceModule);if(a.resourceStatus==="pending"&&a.resourcePromise)return a.resourcePromise;const o=t.loader||vz[e],s=a.resourceRequestId+1;a.resourceRequestId=s,a.resourceStatus="pending",a.error=null;const i=Promise.resolve().then(()=>o()).then(c=>a.resourceRequestId!==s||a.resourcePromise!==i?null:(a.resourceStatus="fulfilled",a.resourceModule=c,a.error=null,lk(),c)).catch(c=>(a.resourceRequestId!==s||a.resourcePromise!==i||(a.resourceStatus="rejected",a.error=jx(c),lk()),null));return a.resourcePromise=i,i}function Oz(e={}){const t=e.loaders||{};return Promise.all(kf.map(a=>Dz(a,{loader:t[a]})))}function Ux(e,t){Ol(e);const a=sa.targets[e],o=t?.status||"fulfilled",s={targetKey:e,status:o,data:t?.data??null,error:jx(t?.error),source:Rz(t?.source,"silent-preload"),generatedAt:Iz(t?.generatedAt),updatedAt:Date.now(),contextKey:t?.contextKey||vf(e,t?.context||{})};return a.stateStatus=o,o==="rejected"||o==="skipped"?a.error=s.error:o==="fulfilled"&&(a.error=null,sa.cache.write(s,{activeContextKey:t?.activeContextKey})),pd(s)}function Hx(e,t){return Ol(e),sa.cache.read(e,t)}function DU(e,t={}){return Ux("limits",{data:e,source:t.source||"dashboard-existing",contextKey:t.contextKey||Fx(t.context||{}),generatedAt:t.generatedAt,status:t.status||"fulfilled",error:t.error})}function Fx(e={}){return vf("limits",{state:"current",...e})}function OU(e=Fx()){return Hx("limits",e)}function ch(e,t={}){return Ux("leaderboard",{activeContextKey:t.activeContextKey,data:e,source:t.source||"silent-preload",contextKey:t.contextKey||wf(t.context||{}),generatedAt:t.generatedAt,status:t.status||"fulfilled",error:t.error})}function Lz(e){return Hx("leaderboard",e)}function Bx(){if(typeof window>"u")return ok;try{const e=window.localStorage.getItem(xz),t=Number(e);if(wz.includes(t))return t}catch{}return ok}function Gx(e={}){const t=e.userId;return t!==void 0?t||null:e.cloudUser?.id||null}function $x(e={}){return typeof e.accessMode=="string"&&e.accessMode.trim()?e.accessMode.trim():e.mockEnabled?"mock":e.baseUrl?"cloud":"unavailable"}function wf(e={}){const t=!!e.mockEnabled,a=e.baseUrl??"";return vf("leaderboard",{accessMode:$x({...e,baseUrl:a,mockEnabled:t}),baseUrl:a,mockEnabled:t,offset:e.offset??zx,pageSize:e.pageSize??Bx(),period:e.period||Mx,userId:Gx(e)})}function ed(e,t){const a=sa.targets.leaderboard;return a.stateRequestId+=1,a.statePromise=null,a.pendingStateContextKey=null,ch(null,{contextKey:t,status:"skipped",error:e})}function Mz(e={}){const t=sa,a=!!e.mockEnabled,o=e.baseUrl??"",s=$x({...e,baseUrl:o,mockEnabled:a}),i=e.period||Mx,c=e.pageSize??Bx(),u=e.offset??zx,m=Gx(e),f=wf({accessMode:s,baseUrl:o,mockEnabled:a,offset:u,pageSize:c,period:i,userId:m});if(!a&&e.authLoading)return Promise.resolve(ed("auth-loading",f));if(!a&&!e.signedIn&&s!=="public")return Promise.resolve(ed("not-signed-in",f));if(!a&&!o)return Promise.resolve(ed("missing-base-url",f));if(!a&&s==="unavailable")return Promise.resolve(ed("access-unavailable",f));const g=t.targets.leaderboard,b=Lz(f);if(b)return Promise.resolve(b);if(g.stateStatus==="pending"&&g.statePromise&&g.pendingStateContextKey===f)return g.statePromise;const w=g.stateRequestId+1;g.stateRequestId=w,g.stateStatus="pending",g.pendingStateContextKey=f,g.error=null;const x=Promise.resolve().then(()=>YN({userId:m,period:i,limit:c,offset:u})).then(S=>sa!==t||g.stateRequestId!==w||g.statePromise!==x?null:(g.pendingStateContextKey=null,ch(S,{contextKey:f}))).catch(S=>(sa!==t||g.stateRequestId!==w||g.statePromise!==x||(g.pendingStateContextKey=null,ch(null,{contextKey:f,status:"rejected",error:S})),null));return g.statePromise=x,x}const zz=typeof window<"u"?window.location.search:"",ck=new URLSearchParams(zz),td=ck.get("insforge_code")||ck.get("code")||null,dk=!!Kw();function jz(){Il();const{loading:e,signedIn:t}=ii(),a=Xr(),[o,s]=k.useState("processing"),[i,c]=k.useState(null),u=k.useRef(!1);k.useEffect(()=>{if(!(!td||u.current)){if(u.current=!0,dk){c(!1);return}(async()=>{try{const g=await(await fetch("/api/auth-bridge/verifier")).json();c(!!g?.native)}catch{c(!1)}})()}},[]),k.useEffect(()=>{if(i!==!0||!td)return;s("redirecting");const f=setTimeout(()=>{window.location.href=`tokentracker://auth/callback?insforge_code=${encodeURIComponent(td)}`},200);return()=>clearTimeout(f)},[i]),k.useEffect(()=>{if(i!==!1||e)return;if(t){dk&&Ww({type:"authCompleted"}),a("/dashboard",{replace:!0});return}const f=setTimeout(()=>{t||s("failed")},12e3);return()=>clearTimeout(f)},[i,e,t,a]),k.useEffect(()=>{if(!td&&i===null){const f=setTimeout(()=>s("failed"),3e3);return()=>clearTimeout(f)}},[i]);const m=()=>{a("/dashboard",{replace:!0})};return o==="processing"&&i!==!0&&(i===null||i===!1&&e)?R.jsx("div",{className:"min-h-screen bg-oai-gray-950"}):R.jsx("div",{className:"min-h-screen bg-oai-gray-950 text-white font-oai antialiased dark flex items-center justify-center",children:R.jsxs("div",{className:"text-center space-y-4 max-w-sm px-4",children:[o==="processing"&&R.jsxs(R.Fragment,{children:[R.jsx("div",{className:"w-8 h-8 border-2 border-oai-gray-600 border-t-white rounded-full animate-spin mx-auto"}),R.jsx("p",{className:"text-oai-gray-400 text-sm",children:K("auth.callback.processing")})]}),o==="redirecting"&&R.jsxs(R.Fragment,{children:[R.jsx("div",{className:"w-12 h-12 mx-auto rounded-full bg-green-500/15 flex items-center justify-center",children:R.jsx("svg",{className:"w-6 h-6 text-green-400",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round",children:R.jsx("path",{d:"M20 6 9 17l-5-5"})})}),R.jsx("p",{className:"text-white text-sm font-medium",children:K("auth.callback.success")}),R.jsx("p",{className:"text-oai-gray-500 text-xs",children:K("auth.callback.redirecting")})]}),o==="failed"&&R.jsxs("div",{className:"space-y-3",children:[R.jsx("p",{className:"text-oai-gray-300 text-sm",children:K("auth.callback.failed")}),R.jsx("button",{type:"button",onClick:m,className:"px-4 py-2 rounded-lg bg-oai-gray-800 text-sm text-white hover:bg-oai-gray-700 transition-colors",children:K("auth.callback.close")})]})]})})}const su=()=>null,Uz=k.lazy(()=>mt(()=>import("./index-DsXIWrJx.js"),[]).then(e=>({default:e.Analytics})).catch(()=>({default:su}))),Hz=k.lazy(()=>mt(()=>import("./index-D356L-jw.js"),[]).then(e=>({default:e.SpeedInsights})).catch(()=>({default:su}))),Fz=k.lazy(()=>mt(()=>import("./LoginModal-Bmw7-b3f.js"),__vite__mapDeps([42,43,44,13,14,15,16])).then(e=>({default:e.LoginModal})).catch(()=>({default:su}))),Bz=k.lazy(()=>mt(()=>import("./CommandPalette-BmDZmpMi.js"),__vite__mapDeps([45,1,8,46,47,48,7])).then(e=>({default:e.CommandPalette})).catch(()=>({default:su}))),Gz=k.lazy(()=>mt(()=>import("./DashboardPage-3dlQBOjz.js"),__vite__mapDeps([49,4,39,50,1,30,31,51,52,25,15,14,22,23,26,7,2,3,53,54,55,28,13,56,5,20,10,21,8,57,47,58,6,59,43,44,60,61])).then(e=>({default:e.DashboardPage}))),$z=k.lazy(()=>mt(()=>import("./IpCheckPage-C7kpZ9JX.js"),[])),qz=k.lazy(()=>mt(()=>import("./ServiceStatusPage-BYmKzI_v.js"),__vite__mapDeps([62,8,63]))),Kz=k.lazy(()=>mt(()=>import("./AchievementsPage-Cle78oKH.js"),__vite__mapDeps([64,65,1,34,35,36,37,38,66,7]))),Vz=k.lazy(()=>mt(()=>import("./LandingPage-CfYk0Jzy.js").then(e=>e.a),__vite__mapDeps([67,68,69,41,1,21,70,71,19,60,8,47,66])).then(e=>({default:e.LandingPage}))),Wz=k.lazy(()=>mt(()=>import("./LeaderboardPage-XgjAHwpy.js"),__vite__mapDeps([27,20,10,21,22,14,23,1,28,29,8,30,31,32,33,15,26,34,35,36,37,38,39,40,41])).then(e=>({default:e.LeaderboardPage}))),Yz=k.lazy(()=>mt(()=>import("./LeaderboardProfilePage-3SWjG8FQ.js"),__vite__mapDeps([72,30,69,73,53,31,52,54,55,32,33,14,15,26,23,8,34,35,36,37,38,65,1,66,7,18,74,21,13,19])).then(e=>({default:e.LeaderboardProfilePage}))),Zz=k.lazy(()=>mt(()=>import("./LimitsPage-DvM57ri3.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26])).then(e=>({default:e.LimitsPage}))),Qz=k.lazy(()=>mt(()=>import("./LoginPage-CEI4nnlT.js"),__vite__mapDeps([75,43,44])).then(e=>({default:e.LoginPage}))),Jz=k.lazy(()=>mt(()=>import("./ResetPasswordPage-QKUaLtO3.js"),__vite__mapDeps([76,43,44])).then(e=>({default:e.ResetPasswordPage}))),Xz=k.lazy(()=>mt(()=>import("./DevicePage-K3CdWKaf.js"),[])),e3=k.lazy(()=>mt(()=>import("./WrappedPage-sm7UVFon.js"),[])),t3=k.lazy(()=>mt(()=>import("./SettingsPage-CIZ6WmNR.js"),__vite__mapDeps([77,28,29,3,8,78,5,1,59,21,68,47,79,13,14,15,22,23,26,56,11,10,51,37,19,25,63,54,55,33,58,30,31,20,80,12,16,18])).then(e=>({default:e.SettingsPage}))),n3=k.lazy(()=>mt(()=>import("./CloudPage-OYiiZ4c4.js"),__vite__mapDeps([81,78,5,40,10,82,38,21])).then(e=>({default:e.CloudPage}))),a3=k.lazy(()=>mt(()=>import("./CloudCheckoutPage-ohIQnIhe.js"),__vite__mapDeps([83,79,70,5,78,81,40,10,82,38,21,58,63,44])).then(e=>({default:e.CloudCheckoutPage}))),r3=k.lazy(()=>mt(()=>import("./SelfHostPage-DF8EzBEV.js"),__vite__mapDeps([84,44,82,63])).then(e=>({default:e.SelfHostPage}))),o3=k.lazy(()=>mt(()=>import("./SkillsPage-cwHyK0Hp.js"),__vite__mapDeps([85,17,18,19,5,12,13,14,15,16,55,8,1,30,63,58,61,21,86,47,7,22,23,46,36,10,48,24,25,26])).then(e=>({default:e.SkillsPage}))),s3=k.lazy(()=>mt(()=>import("./SessionsPage-BsCVe75l.js"),__vite__mapDeps([87,17,18,19,20,10,21,22,14,23,48,25,15,26,8,9,30,68,58,55,33,88])).then(e=>({default:e.SessionsPage}))),i3=k.lazy(()=>mt(()=>import("./WidgetsPage-HrhnI3C-.js"),__vite__mapDeps([89,20,10,21,22,14,23,80,78,5,6,1,7,18,19])).then(e=>({default:e.WidgetsPage}))),l3=k.lazy(()=>mt(()=>import("./PetPage-7Udtc9GY.js").then(e=>e.P),__vite__mapDeps([90,78,5,8,80,6,1,7,74,58,35,86,13,14,15,16,56])).then(e=>({default:e.PetPage})));function c3(){const{resolvedLocale:e}=Il(),t=An(),a=Xr(),o=ii();HO();const s=k.useRef(null);k.useEffect(()=>{const St=o.enabled&&o.signedIn?o.user?.id:null;s.current!==St&&(s.current&&sm(s.current),St&&sm(St),s.current=St)},[o.enabled,o.signedIn,o.user?.id]);const i=k.useRef(!1),c=k.useRef(!1),u=k.useRef(new Set),m=Ot(),f=k.useMemo(()=>typeof window>"u"?!1:DO(window.location.search),[]),g=t?.pathname||"/",b=new URL(window.location.href),w=b.pathname.replace(/\/+$/,"")||"/",S=w.match(/^\/share\/([^/?#]+)$/i)?.[1]||null,E=b.searchParams.get("token")||null,C=S||E,U=w==="/share"||w==="/share.html"||w.startsWith("/share/"),L=typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1"),M=g.replace(/\/+$/,"")||"/";k.useEffect(()=>{if(!(!o.signedIn||o.loading||!["/","/dashboard"].includes(M)))try{const St=window.sessionStorage.getItem("tt.cloud.return");if(!/^\/(cloud|billing\/checkout)(\?|$)/.test(St||""))return;window.sessionStorage.removeItem("tt.cloud.return"),a(St,{replace:!0})}catch{}},[o.signedIn,o.loading,M,a]);const D=M==="/"||M==="/dashboard",Y=M==="/leaderboard",J=M.match(/^\/u\/([^/]+)$/i),Q=J?J[1]:null,T=!!(o.enabled&&o.signedIn),$=L||T,ae=!1,Ee=IO(),ye=!$&&!m&&!L,ze=m?"mock":o.loading?"unavailable":T?"cloud":$?"local":"unavailable",Se=k.useCallback(()=>{if(!i.current||!m&&o.loading||!m&&!$)return;const St={accessMode:ze,baseUrl:NO(),mockEnabled:m,signedIn:$,authLoading:!!o.loading,userId:T&&o.user?.id||null},Yn=wf(St);u.current.has(Yn)||(u.current.add(Yn),Mz(St))},[T,o.loading,o.user?.id,ze,m,$]),Me=k.useCallback(()=>{D&&(i.current||(i.current=!0,Nz()),c.current||(c.current=!0,Oz()),Se())},[D,Se]);k.useEffect(()=>{Se()},[Se]);const _e=k.useMemo(()=>!o.enabled||!T?null:{getAccessToken:()=>o.getAccessToken(),name:o.displayName||"",userId:o.user?.id||null},[T,o]);let de=L||m||f?"dashboard":"landing";M==="/landing"&&(de="landing"),M==="/dashboard"&&(de="dashboard"),Y&&(de="dashboard"),Q&&(de="dashboard");const ne=M==="/limits",Z=M==="/settings",H=M==="/cloud",N=M==="/billing/checkout",W=M==="/self-host",ue=M==="/skills",be=M==="/sessions",ce=M==="/widgets",pe=M==="/pet-settings",Ge=M==="/ip-check",Ye=M==="/service-status",De=M==="/achievements";(ne||Z||H||N||W||ue||be||ce||pe||Ge||Ye||De)&&(de="dashboard");let et=Gz;Q?et=Yz:M==="/leaderboard"?et=Wz:ne?et=Zz:Z?et=t3:H?et=n3:N?et=a3:W?et=r3:ue?et=o3:be?et=s3:ce?et=i3:pe?et=l3:Ge?et=$z:Ye?et=qz:De&&(et=Kz);const Mt=!U&&(!ye||H||N||W)&&(M==="/dashboard"||M==="/"||Y||ne||Z||H||N||W||ue||be||ce||pe||Ge||Ye||De);if(!L&&!T&&!U&&!o.loading&&de==="dashboard"&&!Y&&!H&&!N&&!W&&!Q&&M!=="/login"&&M!=="/reset-password"&&M!=="/landing"&&M!=="/auth/callback"&&M!=="/auth/native-callback"){const St=new URLSearchParams(t.search);for(const $a of["insforge_code","code","state","access_token","refresh_token"])St.delete($a);const Yn=St.toString(),yn=encodeURIComponent(t.pathname+(Yn?`?${Yn}`:""));return R.jsx(kE,{to:`/login?next=${yn}`,replace:!0})}let Je=null,Ht=!1;if(M==="/auth/callback"||M==="/auth/native-callback")Je=R.jsx(jz,{});else if(M==="/login")Je=R.jsx(Qz,{});else if(M==="/reset-password")Je=R.jsx(Jz,{});else if(M==="/device")Je=R.jsx(Xz,{});else if(M==="/wrapped")Je=R.jsx(e3,{});else if(de==="landing")Je=R.jsx(Vz,{signInUrl:"/login",signUpUrl:"/login"}),Ht=!0;else{const St=R.jsxs(R.Fragment,{children:[o.configurationError?R.jsx("p",{role:"alert",className:"mx-auto w-full max-w-7xl px-4 py-4 text-sm leading-6 text-oai-gray-700 dark:text-oai-gray-300 sm:px-6",children:K("instance.configuration.invalid")}):null,D&&!U&&T?R.jsx($O,{userId:o.user?.id,localHost:L,className:"mx-auto w-full max-w-7xl px-4 pt-4 sm:px-6",onContinueLocal:()=>{sm(o.user?.id),jI(!1)}}):null,R.jsx(et,{baseUrl:Ee,auth:_e,signedIn:$,sessionSoftExpired:ae,signOut:()=>o.enabled?o.signOut():Promise.resolve(),publicMode:U,publicToken:C,userId:Q,signInUrl:"/login",signUpUrl:"/login",onMainContentVisible:Me},e)]});Mt?Je=R.jsxs(oM,{children:[St,!L&&R.jsx("footer",{className:"px-4 py-6",children:R.jsx(Fy,{})})]}):Je=St}return R.jsx(kO,{children:R.jsx(xO,{children:R.jsx(bz,{children:R.jsxs(AO,{children:[R.jsx(k.Suspense,{fallback:null,children:Je}),!L&&!Mt&&!Ht&&R.jsx("footer",{className:"px-4 py-6",children:R.jsx(Fy,{})}),R.jsxs(k.Suspense,{fallback:null,children:[Mt?R.jsx(Bz,{}):null,R.jsx(Fz,{}),R.jsx(Uz,{}),R.jsx(Hz,{})]})]})})})})}const d3="phc_nXhUfFbyrW9gNvp8iBL83eWPUhAuAYJgcgqUJxwUbBgj",u3="https://us.i.posthog.com";function p3(){if(typeof window>"u")return"web";if(xn())return"mac-app";if(oi())return"win-app";const e=window.location.hostname;return e==="localhost"||e==="127.0.0.1"?"cli-localhost":"web"}async function uk(e){const{default:t}=await mt(async()=>{const{default:a}=await import("./module-BNnaKM__.js");return{default:a}},[]);t.init(d3,{api_host:u3,capture_pageview:"history_change",autocapture:!1,disable_session_recording:!0,respect_dnt:!0,persistence:"localStorage"}),t.register({shell:e})}function m3(){if(!(typeof window>"u"))try{const e=p3();if(e==="web"){uk(e).catch(()=>{});return}fetch("/functions/tokentracker-telemetry-pref").then(t=>t.ok?t.json():null).then(t=>{if(t&&t.disabled===!1)return uk(e)}).catch(()=>{})}catch{}}m3();const h3=KE([{path:"*",element:R.jsx(c3,{})}]);DC.createRoot(document.getElementById("root")).render(R.jsx(No.StrictMode,{children:R.jsx(OD,{children:R.jsx(VD,{children:R.jsx(FD,{children:R.jsx(RD,{children:R.jsx(ID,{children:R.jsx(r1,{router:h3})})})})})})}));const f3=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"}));export{EO as $,ri as A,Fo as B,HD as C,$h as D,fj as E,kj as F,bj as G,zs as H,yj as I,Po as J,Dl as K,Qr as L,sz as M,dz as N,SU as O,VL as P,T3 as Q,gO as R,B3 as S,Ym as T,E3 as U,No as V,Ot as W,af as X,K3 as Y,Il as Z,mt as _,ii as a,jM as a$,$j as a0,BL as a1,ml as a2,Fj as a3,TO as a4,Z0 as a5,Pj as a6,za as a7,GO as a8,BO as a9,C3 as aA,Bh as aB,cj as aC,aj as aD,dj as aE,rj as aF,lj as aG,nj as aH,I3 as aI,xt as aJ,R3 as aK,sO as aL,iO as aM,V3 as aN,W3 as aO,S3 as aP,q3 as aQ,N3 as aR,_j as aS,DU as aT,oj as aU,Vm as aV,sM as aW,tx as aX,Vo as aY,lf as aZ,bl as a_,Bj as aa,jj as ab,Lj as ac,zj as ad,Py as ae,Oj as af,hl as ag,Al as ah,Uo as ai,Yd as aj,El as ak,Pl as al,mO as am,Ej as an,zL as ao,yO as ap,KL as aq,$o as ar,An as as,Gj as at,nf as au,Mj as av,Uj as aw,CO as ax,iN as ay,L3 as az,G3 as b,Hs as b$,Bo as b0,ra as b1,pf as b2,ja as b3,sx as b4,Ro as b5,kU as b6,Io as b7,aU as b8,eU as b9,ih as bA,IU as bB,_U as bC,D2 as bD,R2 as bE,O2 as bF,ur as bG,PM as bH,ru as bI,hr as bJ,RM as bK,rh as bL,rx as bM,Kj as bN,DM as bO,Vj as bP,va as bQ,ax as bR,Wj as bS,Vy as bT,LM as bU,OM as bV,hU as bW,bU as bX,GM as bY,hf as bZ,uz as b_,pr as ba,NO as bb,w3 as bc,wf as bd,Lz as be,ch as bf,id as bg,jI as bh,Dj as bi,NU as bj,OU as bk,_O as bl,tu as bm,AM as bn,yU as bo,CU as bp,mU as bq,cz as br,_M as bs,PU as bt,ym as bu,dU as bv,s2 as bw,uU as bx,qj as by,fU as bz,K as c,sm as c$,vU as c0,QM as c1,oh as c2,_f as c3,AU as c4,Qy as c5,hz as c6,ZM as c7,Xy as c8,xm as c9,i2 as cA,ff as cB,cU as cC,o2 as cD,px as cE,tU as cF,nU as cG,mf as cH,Zy as cI,lx as cJ,LN as cK,MN as cL,Iw as cM,rw as cN,Fm as cO,jN as cP,UN as cQ,by as cR,$3 as cS,FO as cT,Wi as cU,gj as cV,pl as cW,hn as cX,Hj as cY,Aj as cZ,fl as c_,pU as ca,wx as cb,tN as cc,x3 as cd,vj as ce,Cj as cf,wj as cg,xj as ch,Sj as ci,RO as cj,Ij as ck,Nj as cl,R0 as cm,Rj as cn,Fy as co,DO as cp,Yj as cq,KM as cr,Ld as cs,Nx as ct,rU as cu,pz as cv,zM as cw,oU as cx,I2 as cy,wU as cz,Xr as d,z3 as d0,$O as d1,Sn as d2,Ay as d3,Ey as d4,O3 as d5,Vs as d6,Pd as d7,zw as d8,jw as d9,H3 as dA,ij as dB,U3 as dC,pj as dD,Q3 as dE,kw as dF,F3 as dG,tj as dH,J3 as dI,X3 as dJ,ej as dK,mj as dL,D3 as dM,Vr as dN,Tj as dO,Y3 as dP,M3 as dQ,VI as dR,A3 as dS,P3 as dT,Z3 as dU,Zr as dV,j3 as dW,hj as dX,Tw as dY,Uw as da,Hw as db,Fw as dc,rO as dd,dO as de,cO as df,sU as dg,iU as dh,lU as di,TU as dj,ux as dk,Zj as dl,Qj as dm,Jj as dn,Xj as dp,JM as dq,iM as dr,EU as ds,gU as dt,RU as du,xU as dv,vw as dw,uj as dx,sj as dy,lN as dz,g3 as e,MI as f,YN as g,$w as h,aN as i,R as j,js as k,La as l,e0 as m,Id as n,Lt as o,Rl as p,Kw as q,k as r,jL as s,xn as t,PO as u,oi as v,Ww as w,Wt as x,Nt as y,gl as z};