{e.copy_||(e.assigned_=new Map,e.copy_=Ig(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var jU=class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(r,n,i)=>{if(Wo(r)&&!Wo(n)){const s=n;n=r;const u=this;return function(d=s,...h){return u.produce(d,p=>n.call(this,p,...h))}}Wo(n)||on(6),i!==void 0&&!Wo(i)&&on(7);let a;if(dn(r)){const s=pS(this),u=Lg(s,r,void 0);let c=!0;try{a=n(u),c=!1}finally{c?Dg(s):Mg(s)}return hS(s,i),vS(a,s)}else if(!r||!Fy(r)){if(a=n(r),a===void 0&&(a=r),a===HA&&(a=void 0),this.autoFreeze_&&qy(a,!0),i){const s=[],u=[];Ma(Rg).generateReplacementPatches_(r,a,{patches_:s,inversePatches_:u}),i(s,u)}return a}else on(1,r)},this.produceWithPatches=(r,n)=>{if(Wo(r))return(u,...c)=>this.produceWithPatches(u,d=>r(d,...c));let i,a;return[this.produce(r,n,(u,c)=>{i=u,a=c}),i,a]},ym(t==null?void 0:t.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),ym(t==null?void 0:t.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),ym(t==null?void 0:t.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(t){dn(t)||on(8),ti(t)&&(t=Ur(t));const r=pS(this),n=Lg(r,t,void 0);return n[ir].isManual_=!0,Mg(r),n}finishDraft(t,r){const n=t&&t[ir];(!n||!n.isManual_)&&on(9);const{scope_:i}=n;return hS(i,r),vS(void 0,i)}setAutoFreeze(t){this.autoFreeze_=t}setUseStrictShallowCopy(t){this.useStrictShallowCopy_=t}setUseStrictIteration(t){this.useStrictIteration_=t}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(t,r){let n;for(n=r.length-1;n>=0;n--){const a=r[n];if(a.path.length===0&&a.op==="replace"){t=a.value;break}}n>-1&&(r=r.slice(n+1));const i=Ma(Rg).applyPatches_;return ti(t)?i(t,r):this.produce(t,a=>i(a,r))}};function Lg(e,t,r,n){const[i,a]=Df(t)?Ma(Nd).proxyMap_(t,r):Mf(t)?Ma(Nd).proxySet_(t,r):AU(t,r);return((r==null?void 0:r.scope_)??GA()).drafts_.push(i),a.callbacks_=(r==null?void 0:r.callbacks_)??[],a.key_=n,r&&n!==void 0?EU(r,a,n):a.callbacks_.push(function(c){var h;(h=c.mapSetPlugin_)==null||h.fixSetContents(a);const{patchPlugin_:d}=c;a.modified_&&d&&d.generatePatches_(a,[],c)}),i}function Ur(e){return ti(e)||on(10,e),ZA(e)}function ZA(e){if(!dn(e)||$f(e))return e;const t=e[ir];let r,n=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=Ig(e,t.scope_.immer_.useStrictShallowCopy_),n=t.scope_.immer_.shouldUseStrictIteration()}else r=Ig(e,!0);return If(r,(i,a)=>{Td(r,i,ZA(a))},n),t&&(t.finalized_=!1),r}var TU=new jU,eC=TU.produce;function tC(e){return({dispatch:r,getState:n})=>i=>a=>typeof a=="function"?a(r,n,e):i(a)}var NU=tC(),IU=tC,RU=typeof window<"u"&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]=="object"?Ad:Ad.apply(null,arguments)};function Ar(e,t){function r(...n){if(t){let i=t(...n);if(!i)throw new Error(Er(0));return{type:e,payload:i.payload,..."meta"in i&&{meta:i.meta},..."error"in i&&{error:i.error}}}return{type:e,payload:n[0]}}return r.toString=()=>`${e}`,r.type=e,r.match=n=>qA(n)&&n.type===e,r}var rC=class Pl extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,Pl.prototype)}static get[Symbol.species](){return Pl}concat(...t){return super.concat.apply(this,t)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new Pl(...t[0].concat(this)):new Pl(...t.concat(this))}};function gS(e){return dn(e)?eC(e,()=>{}):e}function Vc(e,t,r){return e.has(t)?e.get(t):e.set(t,r(t)).get(t)}function DU(e){return typeof e=="boolean"}var MU=()=>function(t){const{thunk:r=!0,immutableCheck:n=!0,serializableCheck:i=!0,actionCreatorCheck:a=!0}=t??{};let s=new rC;return r&&(DU(r)?s.push(NU):s.push(IU(r.extraArgument))),s},nC="RTK_autoBatch",Je=()=>e=>({payload:e,meta:{[nC]:!0}}),yS=e=>t=>{setTimeout(t,e)},$U=(e,t)=>r=>{let n=!1;const i=()=>{n||(n=!0,cancelAnimationFrame(a),clearTimeout(s),r())},a=e(i),s=setTimeout(i,t)},iC=(e={type:"raf"})=>t=>(...r)=>{const n=t(...r);let i=!0,a=!1,s=!1;const u=new Set,c=e.type==="tick"?queueMicrotask:e.type==="raf"?typeof window<"u"&&window.requestAnimationFrame?$U(window.requestAnimationFrame,100):yS(10):e.type==="callback"?e.queueNotification:yS(e.timeout),d=()=>{s=!1,a&&(a=!1,u.forEach(h=>h()))};return Object.assign({},n,{subscribe(h){const p=()=>i&&h(),m=n.subscribe(p);return u.add(h),()=>{m(),u.delete(h)}},dispatch(h){var p;try{return i=!((p=h==null?void 0:h.meta)!=null&&p[nC]),a=!i,a&&(s||(s=!0,c(d))),n.dispatch(h)}finally{i=!0}}})},LU=e=>function(r){const{autoBatch:n=!0}=r??{};let i=new rC(e);return n&&i.push(iC(typeof n=="object"?n:void 0)),i};function zU(e){const t=MU(),{reducer:r=void 0,middleware:n,devTools:i=!0,preloadedState:a=void 0,enhancers:s=void 0}=e||{};let u;if(typeof r=="function")u=r;else if(By(r))u=WA(r);else throw new Error(Er(1));let c;typeof n=="function"?c=n(t):c=t();let d=Ad;i&&(d=RU({trace:!1,...typeof i=="object"&&i}));const h=gU(...c),p=LU(h);let m=typeof s=="function"?s(p):p();const g=d(...m);return FA(u,a,g)}function aC(e){const t={},r=[];let n;const i={addCase(a,s){const u=typeof a=="string"?a:a.type;if(!u)throw new Error(Er(28));if(u in t)throw new Error(Er(29));return t[u]=s,i},addAsyncThunk(a,s){return s.pending&&(t[a.pending.type]=s.pending),s.rejected&&(t[a.rejected.type]=s.rejected),s.fulfilled&&(t[a.fulfilled.type]=s.fulfilled),s.settled&&r.push({matcher:a.settled,reducer:s.settled}),i},addMatcher(a,s){return r.push({matcher:a,reducer:s}),i},addDefaultCase(a){return n=a,i}};return e(i),[t,r,n]}function UU(e){return typeof e=="function"}function BU(e,t){let[r,n,i]=aC(t),a;if(UU(e))a=()=>gS(e());else{const u=gS(e);a=()=>u}function s(u=a(),c){let d=[r[c.type],...n.filter(({matcher:h})=>h(c)).map(({reducer:h})=>h)];return d.filter(h=>!!h).length===0&&(d=[i]),d.reduce((h,p)=>{if(p)if(ti(h)){const g=p(h,c);return g===void 0?h:g}else{if(dn(h))return eC(h,m=>p(m,c));{const m=p(h,c);if(m===void 0){if(h===null)return h;throw Error("A case reducer on a non-draftable value must not return undefined")}return m}}return h},u)}return s.getInitialState=a,s}var FU="ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW",WU=(e=21)=>{let t="",r=e;for(;r--;)t+=FU[Math.random()*64|0];return t},qU=Symbol.for("rtk-slice-createasyncthunk");function HU(e,t){return`${e}/${t}`}function KU({creators:e}={}){var r;const t=(r=e==null?void 0:e.asyncThunk)==null?void 0:r[qU];return function(i){const{name:a,reducerPath:s=a}=i;if(!a)throw new Error(Er(11));const u=(typeof i.reducers=="function"?i.reducers(GU()):i.reducers)||{},c=Object.keys(u),d={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},h={addCase(C,N){const j=typeof C=="string"?C:C.type;if(!j)throw new Error(Er(12));if(j in d.sliceCaseReducersByType)throw new Error(Er(13));return d.sliceCaseReducersByType[j]=N,h},addMatcher(C,N){return d.sliceMatchers.push({matcher:C,reducer:N}),h},exposeAction(C,N){return d.actionCreators[C]=N,h},exposeCaseReducer(C,N){return d.sliceCaseReducersByName[C]=N,h}};c.forEach(C=>{const N=u[C],j={reducerName:C,type:HU(a,C),createNotation:typeof i.reducers=="function"};XU(N)?QU(j,N,h,t):YU(j,N,h)});function p(){const[C={},N=[],j=void 0]=typeof i.extraReducers=="function"?aC(i.extraReducers):[i.extraReducers],M={...C,...d.sliceCaseReducersByType};return BU(i.initialState,F=>{for(let W in M)F.addCase(W,M[W]);for(let W of d.sliceMatchers)F.addMatcher(W.matcher,W.reducer);for(let W of N)F.addMatcher(W.matcher,W.reducer);j&&F.addDefaultCase(j)})}const m=C=>C,g=new Map,b=new WeakMap;let w;function S(C,N){return w||(w=p()),w(C,N)}function k(){return w||(w=p()),w.getInitialState()}function A(C,N=!1){function j(F){let W=F[C];return typeof W>"u"&&N&&(W=Vc(b,j,k)),W}function M(F=m){const W=Vc(g,N,()=>new WeakMap);return Vc(W,F,()=>{const H={};for(const[Y,B]of Object.entries(i.selectors??{}))H[Y]=VU(B,F,()=>Vc(b,F,k),N);return H})}return{reducerPath:C,getSelectors:M,get selectors(){return M(j)},selectSlice:j}}const P={name:a,reducer:S,actions:d.actionCreators,caseReducers:d.sliceCaseReducersByName,getInitialState:k,...A(s),injectInto(C,{reducerPath:N,...j}={}){const M=N??s;return C.inject({reducerPath:M,reducer:S},j),{...P,...A(M,!0)}}};return P}}function VU(e,t,r,n){function i(a,...s){let u=t(a);return typeof u>"u"&&n&&(u=r()),e(u,...s)}return i.unwrapped=e,i}var Xt=KU();function GU(){function e(t,r){return{_reducerDefinitionType:"asyncThunk",payloadCreator:t,...r}}return e.withTypes=()=>e,{reducer(t){return Object.assign({[t.name](...r){return t(...r)}}[t.name],{_reducerDefinitionType:"reducer"})},preparedReducer(t,r){return{_reducerDefinitionType:"reducerWithPrepare",prepare:t,reducer:r}},asyncThunk:e}}function YU({type:e,reducerName:t,createNotation:r},n,i){let a,s;if("reducer"in n){if(r&&!JU(n))throw new Error(Er(17));a=n.reducer,s=n.prepare}else a=n;i.addCase(e,a).exposeCaseReducer(t,a).exposeAction(t,s?Ar(e,s):Ar(e))}function XU(e){return e._reducerDefinitionType==="asyncThunk"}function JU(e){return e._reducerDefinitionType==="reducerWithPrepare"}function QU({type:e,reducerName:t},r,n,i){if(!i)throw new Error(Er(18));const{payloadCreator:a,fulfilled:s,pending:u,rejected:c,settled:d,options:h}=r,p=i(e,a,h);n.exposeAction(t,p),s&&n.addCase(p.fulfilled,s),u&&n.addCase(p.pending,u),c&&n.addCase(p.rejected,c),d&&n.addMatcher(p.settled,d),n.exposeCaseReducer(t,{fulfilled:s||Gc,pending:u||Gc,rejected:c||Gc,settled:d||Gc})}function Gc(){}var ZU="task",oC="listener",sC="completed",Hy="cancelled",eB=`task-${Hy}`,tB=`task-${sC}`,zg=`${oC}-${Hy}`,rB=`${oC}-${sC}`,zf=class{constructor(e){sl(this,"code");sl(this,"name","TaskAbortError");sl(this,"message");this.code=e,this.message=`${ZU} ${Hy} (reason: ${e})`}},Ky=(e,t)=>{if(typeof e!="function")throw new TypeError(Er(32))},Dd=()=>{},lC=(e,t=Dd)=>(e.catch(t),e),uC=(e,t)=>(e.addEventListener("abort",t,{once:!0}),()=>e.removeEventListener("abort",t)),Ta=e=>{if(e.aborted)throw new zf(e.reason)};function cC(e,t){let r=Dd;return new Promise((n,i)=>{const a=()=>i(new zf(e.reason));if(e.aborted){a();return}r=uC(e,a),t.finally(()=>r()).then(n,i)}).finally(()=>{r=Dd})}var nB=async(e,t)=>{try{return await Promise.resolve(),{status:"ok",value:await e()}}catch(r){return{status:r instanceof zf?"cancelled":"rejected",error:r}}finally{t==null||t()}},Md=e=>t=>lC(cC(e,t).then(r=>(Ta(e),r))),dC=e=>{const t=Md(e);return r=>t(new Promise(n=>setTimeout(n,r)))},{assign:Yo}=Object,wS={},Uf="listenerMiddleware",iB=(e,t)=>{const r=n=>uC(e,()=>n.abort(e.reason));return(n,i)=>{Ky(n);const a=new AbortController;r(a);const s=nB(async()=>{Ta(e),Ta(a.signal);const u=await n({pause:Md(a.signal),delay:dC(a.signal),signal:a.signal});return Ta(a.signal),u},()=>a.abort(tB));return i!=null&&i.autoJoin&&t.push(s.catch(Dd)),{result:Md(e)(s),cancel(){a.abort(eB)}}}},aB=(e,t)=>{const r=async(n,i)=>{Ta(t);let a=()=>{};const u=[new Promise((c,d)=>{let h=e({predicate:n,effect:(p,m)=>{m.unsubscribe(),c([p,m.getState(),m.getOriginalState()])}});a=()=>{h(),d()}})];i!=null&&u.push(new Promise(c=>setTimeout(c,i,null)));try{const c=await cC(t,Promise.race(u));return Ta(t),c}finally{a()}};return(n,i)=>lC(r(n,i))},fC=e=>{let{type:t,actionCreator:r,matcher:n,predicate:i,effect:a}=e;if(t)i=Ar(t).match;else if(r)t=r.type,i=r.match;else if(n)i=n;else if(!i)throw new Error(Er(21));return Ky(a),{predicate:i,type:t,effect:a}},hC=Yo(e=>{const{type:t,predicate:r,effect:n}=fC(e);return{id:WU(),effect:n,type:t,predicate:r,pending:new Set,unsubscribe:()=>{throw new Error(Er(22))}}},{withTypes:()=>hC}),bS=(e,t)=>{const{type:r,effect:n,predicate:i}=fC(t);return Array.from(e.values()).find(a=>(typeof r=="string"?a.type===r:a.predicate===i)&&a.effect===n)},Ug=e=>{e.pending.forEach(t=>{t.abort(zg)})},oB=(e,t)=>()=>{for(const r of t.keys())Ug(r);e.clear()},xS=(e,t,r)=>{try{e(t,r)}catch(n){setTimeout(()=>{throw n},0)}},pC=Yo(Ar(`${Uf}/add`),{withTypes:()=>pC}),sB=Ar(`${Uf}/removeAll`),vC=Yo(Ar(`${Uf}/remove`),{withTypes:()=>vC}),lB=(...e)=>{console.error(`${Uf}/error`,...e)},uu=(e={})=>{const t=new Map,r=new Map,n=g=>{const b=r.get(g)??0;r.set(g,b+1)},i=g=>{const b=r.get(g)??1;b===1?r.delete(g):r.set(g,b-1)},{extra:a,onError:s=lB}=e;Ky(s);const u=g=>(g.unsubscribe=()=>t.delete(g.id),t.set(g.id,g),b=>{g.unsubscribe(),b!=null&&b.cancelActive&&Ug(g)}),c=g=>{const b=bS(t,g)??hC(g);return u(b)};Yo(c,{withTypes:()=>c});const d=g=>{const b=bS(t,g);return b&&(b.unsubscribe(),g.cancelActive&&Ug(b)),!!b};Yo(d,{withTypes:()=>d});const h=async(g,b,w,S)=>{const k=new AbortController,A=aB(c,k.signal),P=[];try{g.pending.add(k),n(g),await Promise.resolve(g.effect(b,Yo({},w,{getOriginalState:S,condition:(C,N)=>A(C,N).then(Boolean),take:A,delay:dC(k.signal),pause:Md(k.signal),extra:a,signal:k.signal,fork:iB(k.signal,P),unsubscribe:g.unsubscribe,subscribe:()=>{t.set(g.id,g)},cancelActiveListeners:()=>{g.pending.forEach((C,N,j)=>{C!==k&&(C.abort(zg),j.delete(C))})},cancel:()=>{k.abort(zg),g.pending.delete(k)},throwIfCancelled:()=>{Ta(k.signal)}})))}catch(C){C instanceof zf||xS(s,C,{raisedBy:"effect"})}finally{await Promise.all(P),k.abort(rB),i(g),g.pending.delete(k)}},p=oB(t,r);return{middleware:g=>b=>w=>{if(!qA(w))return b(w);if(pC.match(w))return c(w.payload);if(sB.match(w)){p();return}if(vC.match(w))return d(w.payload);let S=g.getState();const k=()=>{if(S===wS)throw new Error(Er(23));return S};let A;try{if(A=b(w),t.size>0){const P=g.getState(),C=Array.from(t.values());for(const N of C){let j=!1;try{j=N.predicate(w,P,S)}catch(M){j=!1,xS(s,M,{raisedBy:"predicate"})}j&&h(N,w,g,k)}}}finally{S=wS}return A},startListening:c,stopListening:d,clearListeners:p}};function Er(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var uB={layoutType:"horizontal",width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},mC=Xt({name:"chartLayout",initialState:uB,reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){var r,n,i,a;e.margin.top=(r=t.payload.top)!==null&&r!==void 0?r:0,e.margin.right=(n=t.payload.right)!==null&&n!==void 0?n:0,e.margin.bottom=(i=t.payload.bottom)!==null&&i!==void 0?i:0,e.margin.left=(a=t.payload.left)!==null&&a!==void 0?a:0},setScale(e,t){e.scale=t.payload}}}),{setMargin:cB,setLayout:dB,setChartSize:fB,setScale:hB}=mC.actions,pB=mC.reducer;function gC(e,t,r){return Array.isArray(e)&&e&&t+r!==0?e.slice(t,r+1):e}function je(e){return Number.isFinite(e)}function Rn(e){return typeof e=="number"&&e>0&&Number.isFinite(e)}function _S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Ko(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?_S(Object(r),!0).forEach(function(n){vB(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):_S(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function vB(e,t,r){return(t=mB(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function mB(e){var t=gB(e,"string");return typeof t=="symbol"?t:t+""}function gB(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function ht(e,t,r){return tt(e)||tt(t)?r:In(t)?ts(e,t,r):typeof t=="function"?t(e):r}var yB=(e,t,r)=>{if(t&&r){var{width:n,height:i}=r,{align:a,verticalAlign:s,layout:u}=t;if((u==="vertical"||u==="horizontal"&&s==="middle")&&a!=="center"&&ce(e[a]))return Ko(Ko({},e),{},{[a]:e[a]+(n||0)});if((u==="horizontal"||u==="vertical"&&a==="center")&&s!=="middle"&&ce(e[s]))return Ko(Ko({},e),{},{[s]:e[s]+(i||0)})}return e},ui=(e,t)=>e==="horizontal"&&t==="xAxis"||e==="vertical"&&t==="yAxis"||e==="centric"&&t==="angleAxis"||e==="radial"&&t==="radiusAxis",yC=(e,t,r,n)=>{if(n)return e.map(u=>u.coordinate);var i,a,s=e.map(u=>(u.coordinate===t&&(i=!0),u.coordinate===r&&(a=!0),u.coordinate));return i||s.push(t),a||s.push(r),s},wC=(e,t,r)=>{if(!e)return null;var{duplicateDomain:n,type:i,range:a,scale:s,realScaleType:u,isCategorical:c,categoricalDomain:d,tickCount:h,ticks:p,niceTicks:m,axisType:g}=e;if(!s)return null;var b=u==="scaleBand"&&s.bandwidth?s.bandwidth()/2:2,w=i==="category"&&s.bandwidth?s.bandwidth()/b:0;if(w=g==="angleAxis"&&a&&a.length>=2?vr(a[0]-a[1])*2*w:w,p||m){var S=(p||m||[]).map((k,A)=>{var P=n?n.indexOf(k):k,C=s.map(P);return je(C)?{coordinate:C+w,value:k,offset:w,index:A}:null}).filter(mr);return S}return c&&d?d.map((k,A)=>{var P=s.map(k);return je(P)?{coordinate:P+w,value:k,index:A,offset:w}:null}).filter(mr):s.ticks&&h!=null?s.ticks(h).map((k,A)=>{var P=s.map(k);return je(P)?{coordinate:P+w,value:k,index:A,offset:w}:null}).filter(mr):s.domain().map((k,A)=>{var P=s.map(k);return je(P)?{coordinate:P+w,value:n?n[k]:k,index:A,offset:w}:null}).filter(mr)},wB=(e,t)=>{if(!t||t.length!==2||!ce(t[0])||!ce(t[1]))return e;var r=Math.min(t[0],t[1]),n=Math.max(t[0],t[1]),i=[e[0],e[1]];return(!ce(e[0])||e[0]<r)&&(i[0]=r),(!ce(e[1])||e[1]>n)&&(i[1]=n),i[0]>n&&(i[0]=n),i[1]<r&&(i[1]=r),i},bB=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var i=0;i<n;++i)for(var a=0,s=0,u=0;u<r;++u){var c=e[u],d=c==null?void 0:c[i];if(d!=null){var h=d[1],p=d[0],m=Nn(h)?p:h;m>=0?(d[0]=a,a+=m,d[1]=a):(d[0]=s,s+=m,d[1]=s)}}}},xB=e=>{var t,r=e.length;if(!(r<=0)){var n=(t=e[0])===null||t===void 0?void 0:t.length;if(!(n==null||n<=0))for(var i=0;i<n;++i)for(var a=0,s=0;s<r;++s){var u=e[s],c=u==null?void 0:u[i];if(c!=null){var d=Nn(c[1])?c[0]:c[1];d>=0?(c[0]=a,a+=d,c[1]=a):(c[0]=0,c[1]=0)}}}},_B={sign:bB,expand:V3,none:Ra,silhouette:G3,wiggle:Y3,positive:xB},SB=(e,t,r)=>{var n,i=(n=_B[r])!==null&&n!==void 0?n:Ra,a=K3().keys(t).value((u,c)=>Number(ht(u,c,0))).order(Cg).offset(i),s=a(e);return s.forEach((u,c)=>{u.forEach((d,h)=>{var p=ht(e[h],t[c],0);Array.isArray(p)&&p.length===2&&ce(p[0])&&ce(p[1])&&(d[0]=p[0],d[1]=p[1])})}),s};function kB(e){return e==null?void 0:String(e)}function SS(e){var{axis:t,ticks:r,bandSize:n,entry:i,index:a,dataKey:s}=e;if(t.type==="category"){if(!t.allowDuplicatedCategory&&t.dataKey&&!tt(i[t.dataKey])){var u=PA(r,"value",i[t.dataKey]);if(u)return u.coordinate+n/2}return r!=null&&r[a]?r[a].coordinate+n/2:null}var c=ht(i,tt(s)?t.dataKey:s),d=t.scale.map(c);return ce(d)?d:null}var kS=e=>{var{axis:t,ticks:r,offset:n,bandSize:i,entry:a,index:s}=e;if(t.type==="category")return r[s]?r[s].coordinate+n:null;var u=ht(a,t.dataKey,t.scale.domain()[s]);if(tt(u))return null;var c=t.scale.map(u);return ce(c)?c-i/2+n:null},PB=e=>{var{numericAxis:t}=e,r=t.scale.domain();if(t.type==="number"){var n=Math.min(r[0],r[1]),i=Math.max(r[0],r[1]);return n<=0&&i>=0?0:i<0?i:n}return r[0]},EB=e=>{var t=e.flat(2).filter(ce);return[Math.min(...t),Math.max(...t)]},OB=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],AB=(e,t,r)=>{if(e!=null)return OB(Object.keys(e).reduce((n,i)=>{var a=e[i];if(!a)return n;var{stackedData:s}=a,u=s.reduce((c,d)=>{var h=gC(d,t,r),p=EB(h);return!je(p[0])||!je(p[1])?c:[Math.min(c[0],p[0]),Math.max(c[1],p[1])]},[1/0,-1/0]);return[Math.min(u[0],n[0]),Math.max(u[1],n[1])]},[1/0,-1/0]))},PS=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,ES=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,ns=(e,t,r)=>{if(e&&e.scale&&e.scale.bandwidth){var n=e.scale.bandwidth();if(!r||n>0)return n}if(e&&t&&t.length>=2){for(var i=Tf(t,h=>h.coordinate),a=1/0,s=1,u=i.length;s<u;s++){var c=i[s],d=i[s-1];a=Math.min(((c==null?void 0:c.coordinate)||0)-((d==null?void 0:d.coordinate)||0),a)}return a===1/0?0:a}return r?void 0:0};function OS(e){var{tooltipEntrySettings:t,dataKey:r,payload:n,value:i,name:a}=e;return Ko(Ko({},t),{},{dataKey:r,payload:n,value:i,name:a})}function Bf(e,t){if(e)return String(e);if(typeof t=="string")return t}var CB=(e,t)=>{if(t==="horizontal")return e.relativeX;if(t==="vertical")return e.relativeY},jB=(e,t)=>t==="centric"?e.angle:e.radius,ci=e=>e.layout.width,di=e=>e.layout.height,TB=e=>e.layout.scale,bC=e=>e.layout.margin,Ff=L(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),Wf=L(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),NB="data-recharts-item-index",IB="data-recharts-item-id",cu=60;function AS(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Yc(e){for(var t=1;t<arguments.length;t++){var r=arguments[t]!=null?arguments[t]:{};t%2?AS(Object(r),!0).forEach(function(n){RB(e,n,r[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):AS(Object(r)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(r,n))})}return e}function RB(e,t,r){return(t=DB(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function DB(e){var t=MB(e,"string");return typeof t=="symbol"?t:t+""}function MB(e,t){if(typeof e!="object"||!e)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}var $B=e=>e.brush.height;function LB(e){var t=Wf(e);return t.reduce((r,n)=>{if(n.orientation==="left"&&!n.mirror&&!n.hide){var i=typeof n.width=="number"?n.width:cu;return r+i}return r},0)}function zB(e){var t=Wf(e);return t.reduce((r,n)=>{if(n.orientation==="right"&&!n.mirror&&!n.hide){var i=typeof n.width=="number"?n.width:cu;return r+i}return r},0)}function UB(e){var t=Ff(e);return t.reduce((r,n)=>n.orientation==="top"&&!n.mirror&&!n.hide?r+n.height:r,0)}function BB(e){var t=Ff(e);return t.reduce((r,n)=>n.orientation==="bottom"&&!n.mirror&&!n.hide?r+n.height:r,0)}var Tt=L([ci,di,bC,$B,LB,zB,UB,BB,BA,dU],(e,t,r,n,i,a,s,u,c,d)=>{var h={left:(r.left||0)+i,right:(r.right||0)+a},p={top:(r.top||0)+s,bottom:(r.bottom||0)+u},m=Yc(Yc({},p),h),g=m.bottom;m.bottom+=n,m=yB(m,c,d);var b=e-m.left-m.right,w=t-m.top-m.bottom;return Yc(Yc({brushBottom:g},m),{},{width:Math.max(b,0),height:Math.max(w,0)})}),FB=L(Tt,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),Vy=L(ci,