From 6b4d2678c626d1dc432afbbb44c5c932dd96dc88 Mon Sep 17 00:00:00 2001 From: EBB2675 Date: Fri, 4 Sep 2026 11:45:11 +0200 Subject: [PATCH 1/3] Stop re-measuring every node on pan and zoom in the graph overlay --- .../{index-DZx-Y8jh.js => index-C4GIeJ4g.js} | 256 +++++++++--------- ...ex.es-GC6TJ9k9.js => index.es-CCxox2Or.js} | 2 +- .../static/assets/purify.es-Bzr520pe.js | 2 - .../static/assets/purify.es-CovBOfck.js | 2 + api/light_mode/static/index.html | 2 +- web/src/GraphView.tsx | 70 +++-- web/tests/graph-view-overlay-sync.test.tsx | 184 +++++++++++++ 7 files changed, 359 insertions(+), 159 deletions(-) rename api/light_mode/static/assets/{index-DZx-Y8jh.js => index-C4GIeJ4g.js} (50%) rename api/light_mode/static/assets/{index.es-GC6TJ9k9.js => index.es-CCxox2Or.js} (99%) delete mode 100644 api/light_mode/static/assets/purify.es-Bzr520pe.js create mode 100644 api/light_mode/static/assets/purify.es-CovBOfck.js create mode 100644 web/tests/graph-view-overlay-sync.test.tsx diff --git a/api/light_mode/static/assets/index-DZx-Y8jh.js b/api/light_mode/static/assets/index-C4GIeJ4g.js similarity index 50% rename from api/light_mode/static/assets/index-DZx-Y8jh.js rename to api/light_mode/static/assets/index-C4GIeJ4g.js index df22882..764feb9 100644 --- a/api/light_mode/static/assets/index-DZx-Y8jh.js +++ b/api/light_mode/static/assets/index-C4GIeJ4g.js @@ -1,39 +1,39 @@ -(function(){const h=document.createElement("link").relList;if(h&&h.supports&&h.supports("modulepreload"))return;for(const C of document.querySelectorAll('link[rel="modulepreload"]'))A(C);new MutationObserver(C=>{for(const M of C)if(M.type==="childList")for(const S of M.addedNodes)S.tagName==="LINK"&&S.rel==="modulepreload"&&A(S)}).observe(document,{childList:!0,subtree:!0});function m(C){const M={};return C.integrity&&(M.integrity=C.integrity),C.referrerPolicy&&(M.referrerPolicy=C.referrerPolicy),C.crossOrigin==="use-credentials"?M.credentials="include":C.crossOrigin==="anonymous"?M.credentials="omit":M.credentials="same-origin",M}function A(C){if(C.ep)return;C.ep=!0;const M=m(C);fetch(C.href,M)}})();var _jn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function cxn(b){return b&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default")?b.default:b}var tzn={exports:{}},t2n={};var DGn;function gZn(){if(DGn)return t2n;DGn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.fragment");function m(A,C,M){var S=null;if(M!==void 0&&(S=""+M),C.key!==void 0&&(S=""+C.key),"key"in C){M={};for(var P in C)P!=="key"&&(M[P]=C[P])}else M=C;return C=M.ref,{$$typeof:b,type:A,key:S,ref:C!==void 0?C:null,props:M}}return t2n.Fragment=h,t2n.jsx=m,t2n.jsxs=m,t2n}var IGn;function bZn(){return IGn||(IGn=1,tzn.exports=gZn()),tzn.exports}var Mn=bZn(),rzn={exports:{}},E1={};var BGn;function wZn(){if(BGn)return E1;BGn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),A=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),M=Symbol.for("react.consumer"),S=Symbol.for("react.context"),P=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),B=Symbol.for("react.memo"),$=Symbol.for("react.lazy"),V=Symbol.for("react.activity"),ee=Symbol.iterator;function W(rn){return rn===null||typeof rn!="object"?null:(rn=ee&&rn[ee]||rn["@@iterator"],typeof rn=="function"?rn:null)}var Y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ie=Object.assign,oe={};function se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}se.prototype.isReactComponent={},se.prototype.setState=function(rn,Be){if(typeof rn!="object"&&typeof rn!="function"&&rn!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,rn,Be,"setState")},se.prototype.forceUpdate=function(rn){this.updater.enqueueForceUpdate(this,rn,"forceUpdate")};function be(){}be.prototype=se.prototype;function Se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}var we=Se.prototype=new be;we.constructor=Se,ie(we,se.prototype),we.isPureReactComponent=!0;var $e=Array.isArray;function Ze(){}var qe={H:null,A:null,T:null,S:null},He=Object.prototype.hasOwnProperty;function Fe(rn,Be,sn){var gn=sn.ref;return{$$typeof:b,type:rn,key:Be,ref:gn!==void 0?gn:null,props:sn}}function Ge(rn,Be){return Fe(rn.type,Be,rn.props)}function De(rn){return typeof rn=="object"&&rn!==null&&rn.$$typeof===b}function Ie(rn){var Be={"=":"=0",":":"=2"};return"$"+rn.replace(/[=:]/g,function(sn){return Be[sn]})}var Z=/\/+/g;function en(rn,Be){return typeof rn=="object"&&rn!==null&&rn.key!=null?Ie(""+rn.key):Be.toString(36)}function vn(rn){switch(rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason;default:switch(typeof rn.status=="string"?rn.then(Ze,Ze):(rn.status="pending",rn.then(function(Be){rn.status==="pending"&&(rn.status="fulfilled",rn.value=Be)},function(Be){rn.status==="pending"&&(rn.status="rejected",rn.reason=Be)})),rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason}}throw rn}function tn(rn,Be,sn,gn,An){var Bn=typeof rn;(Bn==="undefined"||Bn==="boolean")&&(rn=null);var ht=!1;if(rn===null)ht=!0;else switch(Bn){case"bigint":case"string":case"number":ht=!0;break;case"object":switch(rn.$$typeof){case b:case h:ht=!0;break;case $:return ht=rn._init,tn(ht(rn._payload),Be,sn,gn,An)}}if(ht)return An=An(rn),ht=gn===""?"."+en(rn,0):gn,$e(An)?(sn="",ht!=null&&(sn=ht.replace(Z,"$&/")+"/"),tn(An,Be,sn,"",function(Jn){return Jn})):An!=null&&(De(An)&&(An=Ge(An,sn+(An.key==null||rn&&rn.key===An.key?"":(""+An.key).replace(Z,"$&/")+"/")+ht)),Be.push(An)),1;ht=0;var _t=gn===""?".":gn+":";if($e(rn))for(var Et=0;Et>>1,vt=tn[Zn];if(0>>1;ZnC(sn,hn))gnC(An,sn)?(tn[Zn]=An,tn[gn]=hn,Zn=gn):(tn[Zn]=sn,tn[Be]=hn,Zn=Be);else if(gnC(An,hn))tn[Zn]=An,tn[gn]=hn,Zn=gn;else break e}}return un}function C(tn,un){var hn=tn.sortIndex-un.sortIndex;return hn!==0?hn:tn.id-un.id}if(b.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;b.unstable_now=function(){return M.now()}}else{var S=Date,P=S.now();b.unstable_now=function(){return S.now()-P}}var R=[],B=[],$=1,V=null,ee=3,W=!1,Y=!1,ie=!1,oe=!1,se=typeof setTimeout=="function"?setTimeout:null,be=typeof clearTimeout=="function"?clearTimeout:null,Se=typeof setImmediate<"u"?setImmediate:null;function we(tn){for(var un=m(B);un!==null;){if(un.callback===null)A(B);else if(un.startTime<=tn)A(B),un.sortIndex=un.expirationTime,h(R,un);else break;un=m(B)}}function $e(tn){if(ie=!1,we(tn),!Y)if(m(R)!==null)Y=!0,Ze||(Ze=!0,Ie());else{var un=m(B);un!==null&&vn($e,un.startTime-tn)}}var Ze=!1,qe=-1,He=5,Fe=-1;function Ge(){return oe?!0:!(b.unstable_now()-Fetn&&Ge());){var Zn=V.callback;if(typeof Zn=="function"){V.callback=null,ee=V.priorityLevel;var vt=Zn(V.expirationTime<=tn);if(tn=b.unstable_now(),typeof vt=="function"){V.callback=vt,we(tn),un=!0;break n}V===m(R)&&A(R),we(tn)}else A(R);V=m(R)}if(V!==null)un=!0;else{var rn=m(B);rn!==null&&vn($e,rn.startTime-tn),un=!1}}break e}finally{V=null,ee=hn,W=!1}un=void 0}}finally{un?Ie():Ze=!1}}}var Ie;if(typeof Se=="function")Ie=function(){Se(De)};else if(typeof MessageChannel<"u"){var Z=new MessageChannel,en=Z.port2;Z.port1.onmessage=De,Ie=function(){en.postMessage(null)}}else Ie=function(){se(De,0)};function vn(tn,un){qe=se(function(){tn(b.unstable_now())},un)}b.unstable_IdlePriority=5,b.unstable_ImmediatePriority=1,b.unstable_LowPriority=4,b.unstable_NormalPriority=3,b.unstable_Profiling=null,b.unstable_UserBlockingPriority=2,b.unstable_cancelCallback=function(tn){tn.callback=null},b.unstable_forceFrameRate=function(tn){0>tn||125Zn?(tn.sortIndex=hn,h(B,tn),m(R)===null&&tn===m(B)&&(ie?(be(qe),qe=-1):ie=!0,vn($e,hn-Zn))):(tn.sortIndex=vt,h(R,tn),Y||W||(Y=!0,Ze||(Ze=!0,Ie()))),tn},b.unstable_shouldYield=Ge,b.unstable_wrapCallback=function(tn){var un=ee;return function(){var hn=ee;ee=un;try{return tn.apply(this,arguments)}finally{ee=hn}}}})(uzn)),uzn}var FGn;function vZn(){return FGn||(FGn=1,czn.exports=pZn()),czn.exports}var szn={exports:{}},lL={};var $Gn;function mZn(){if($Gn)return lL;$Gn=1;var b=VHn();function h(R){var B="https://react.dev/errors/"+R;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(b)}catch(h){console.error(h)}}return b(),szn.exports=mZn(),szn.exports}var zGn;function kZn(){if(zGn)return r2n;zGn=1;var b=vZn(),h=VHn(),m=yZn();function A(x){var N="https://react.dev/errors/"+x;if(1vt||(x.current=Zn[vt],Zn[vt]=null,vt--)}function sn(x,N){vt++,Zn[vt]=x.current,x.current=N}var gn=rn(null),An=rn(null),Bn=rn(null),ht=rn(null);function _t(x,N){switch(sn(Bn,N),sn(An,x),sn(gn,null),N.nodeType){case 9:case 11:x=(x=N.documentElement)&&(x=x.namespaceURI)?Gde(x):0;break;default:if(x=N.tagName,N=N.namespaceURI)N=Gde(N),x=Kde(N,x);else switch(x){case"svg":x=1;break;case"math":x=2;break;default:x=0}}Be(gn),sn(gn,x)}function Et(){Be(gn),Be(An),Be(Bn)}function Jn(x){x.memoizedState!==null&&sn(ht,x);var N=gn.current,_=Kde(N,x.type);N!==_&&(sn(An,x),sn(gn,_))}function At(x){An.current===x&&(Be(gn),Be(An)),ht.current===x&&(Be(ht),fG._currentValue=hn)}var qt,yr;function ri(x){if(qt===void 0)try{throw Error()}catch(_){var N=_.stack.trim().match(/\n( *(at )?)/);qt=N&&N[1]||"",yr=-1<_.stack.indexOf(` +(function(){const h=document.createElement("link").relList;if(h&&h.supports&&h.supports("modulepreload"))return;for(const C of document.querySelectorAll('link[rel="modulepreload"]'))A(C);new MutationObserver(C=>{for(const M of C)if(M.type==="childList")for(const S of M.addedNodes)S.tagName==="LINK"&&S.rel==="modulepreload"&&A(S)}).observe(document,{childList:!0,subtree:!0});function m(C){const M={};return C.integrity&&(M.integrity=C.integrity),C.referrerPolicy&&(M.referrerPolicy=C.referrerPolicy),C.crossOrigin==="use-credentials"?M.credentials="include":C.crossOrigin==="anonymous"?M.credentials="omit":M.credentials="same-origin",M}function A(C){if(C.ep)return;C.ep=!0;const M=m(C);fetch(C.href,M)}})();var Fjn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function cxn(b){return b&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default")?b.default:b}var tzn={exports:{}},t2n={};var BGn;function wZn(){if(BGn)return t2n;BGn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.fragment");function m(A,C,M){var S=null;if(M!==void 0&&(S=""+M),C.key!==void 0&&(S=""+C.key),"key"in C){M={};for(var P in C)P!=="key"&&(M[P]=C[P])}else M=C;return C=M.ref,{$$typeof:b,type:A,key:S,ref:C!==void 0?C:null,props:M}}return t2n.Fragment=h,t2n.jsx=m,t2n.jsxs=m,t2n}var RGn;function pZn(){return RGn||(RGn=1,tzn.exports=wZn()),tzn.exports}var Mn=pZn(),rzn={exports:{}},A1={};var _Gn;function vZn(){if(_Gn)return A1;_Gn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),A=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),M=Symbol.for("react.consumer"),S=Symbol.for("react.context"),P=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),B=Symbol.for("react.memo"),$=Symbol.for("react.lazy"),V=Symbol.for("react.activity"),ee=Symbol.iterator;function W(rn){return rn===null||typeof rn!="object"?null:(rn=ee&&rn[ee]||rn["@@iterator"],typeof rn=="function"?rn:null)}var Y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},re=Object.assign,oe={};function se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}se.prototype.isReactComponent={},se.prototype.setState=function(rn,Be){if(typeof rn!="object"&&typeof rn!="function"&&rn!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,rn,Be,"setState")},se.prototype.forceUpdate=function(rn){this.updater.enqueueForceUpdate(this,rn,"forceUpdate")};function be(){}be.prototype=se.prototype;function Se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}var we=Se.prototype=new be;we.constructor=Se,re(we,se.prototype),we.isPureReactComponent=!0;var $e=Array.isArray;function Ze(){}var qe={H:null,A:null,T:null,S:null},He=Object.prototype.hasOwnProperty;function Fe(rn,Be,sn){var dn=sn.ref;return{$$typeof:b,type:rn,key:Be,ref:dn!==void 0?dn:null,props:sn}}function Ge(rn,Be){return Fe(rn.type,Be,rn.props)}function De(rn){return typeof rn=="object"&&rn!==null&&rn.$$typeof===b}function Ie(rn){var Be={"=":"=0",":":"=2"};return"$"+rn.replace(/[=:]/g,function(sn){return Be[sn]})}var Z=/\/+/g;function en(rn,Be){return typeof rn=="object"&&rn!==null&&rn.key!=null?Ie(""+rn.key):Be.toString(36)}function vn(rn){switch(rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason;default:switch(typeof rn.status=="string"?rn.then(Ze,Ze):(rn.status="pending",rn.then(function(Be){rn.status==="pending"&&(rn.status="fulfilled",rn.value=Be)},function(Be){rn.status==="pending"&&(rn.status="rejected",rn.reason=Be)})),rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason}}throw rn}function nn(rn,Be,sn,dn,An){var Bn=typeof rn;(Bn==="undefined"||Bn==="boolean")&&(rn=null);var ht=!1;if(rn===null)ht=!0;else switch(Bn){case"bigint":case"string":case"number":ht=!0;break;case"object":switch(rn.$$typeof){case b:case h:ht=!0;break;case $:return ht=rn._init,nn(ht(rn._payload),Be,sn,dn,An)}}if(ht)return An=An(rn),ht=dn===""?"."+en(rn,0):dn,$e(An)?(sn="",ht!=null&&(sn=ht.replace(Z,"$&/")+"/"),nn(An,Be,sn,"",function(Jn){return Jn})):An!=null&&(De(An)&&(An=Ge(An,sn+(An.key==null||rn&&rn.key===An.key?"":(""+An.key).replace(Z,"$&/")+"/")+ht)),Be.push(An)),1;ht=0;var _t=dn===""?".":dn+":";if($e(rn))for(var St=0;St>>1,vt=nn[Zn];if(0>>1;ZnC(sn,hn))dnC(An,sn)?(nn[Zn]=An,nn[dn]=hn,Zn=dn):(nn[Zn]=sn,nn[Be]=hn,Zn=Be);else if(dnC(An,hn))nn[Zn]=An,nn[dn]=hn,Zn=dn;else break e}}return un}function C(nn,un){var hn=nn.sortIndex-un.sortIndex;return hn!==0?hn:nn.id-un.id}if(b.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;b.unstable_now=function(){return M.now()}}else{var S=Date,P=S.now();b.unstable_now=function(){return S.now()-P}}var R=[],B=[],$=1,V=null,ee=3,W=!1,Y=!1,re=!1,oe=!1,se=typeof setTimeout=="function"?setTimeout:null,be=typeof clearTimeout=="function"?clearTimeout:null,Se=typeof setImmediate<"u"?setImmediate:null;function we(nn){for(var un=m(B);un!==null;){if(un.callback===null)A(B);else if(un.startTime<=nn)A(B),un.sortIndex=un.expirationTime,h(R,un);else break;un=m(B)}}function $e(nn){if(re=!1,we(nn),!Y)if(m(R)!==null)Y=!0,Ze||(Ze=!0,Ie());else{var un=m(B);un!==null&&vn($e,un.startTime-nn)}}var Ze=!1,qe=-1,He=5,Fe=-1;function Ge(){return oe?!0:!(b.unstable_now()-Fenn&&Ge());){var Zn=V.callback;if(typeof Zn=="function"){V.callback=null,ee=V.priorityLevel;var vt=Zn(V.expirationTime<=nn);if(nn=b.unstable_now(),typeof vt=="function"){V.callback=vt,we(nn),un=!0;break n}V===m(R)&&A(R),we(nn)}else A(R);V=m(R)}if(V!==null)un=!0;else{var rn=m(B);rn!==null&&vn($e,rn.startTime-nn),un=!1}}break e}finally{V=null,ee=hn,W=!1}un=void 0}}finally{un?Ie():Ze=!1}}}var Ie;if(typeof Se=="function")Ie=function(){Se(De)};else if(typeof MessageChannel<"u"){var Z=new MessageChannel,en=Z.port2;Z.port1.onmessage=De,Ie=function(){en.postMessage(null)}}else Ie=function(){se(De,0)};function vn(nn,un){qe=se(function(){nn(b.unstable_now())},un)}b.unstable_IdlePriority=5,b.unstable_ImmediatePriority=1,b.unstable_LowPriority=4,b.unstable_NormalPriority=3,b.unstable_Profiling=null,b.unstable_UserBlockingPriority=2,b.unstable_cancelCallback=function(nn){nn.callback=null},b.unstable_forceFrameRate=function(nn){0>nn||125Zn?(nn.sortIndex=hn,h(B,nn),m(R)===null&&nn===m(B)&&(re?(be(qe),qe=-1):re=!0,vn($e,hn-Zn))):(nn.sortIndex=vt,h(R,nn),Y||W||(Y=!0,Ze||(Ze=!0,Ie()))),nn},b.unstable_shouldYield=Ge,b.unstable_wrapCallback=function(nn){var un=ee;return function(){var hn=ee;ee=un;try{return nn.apply(this,arguments)}finally{ee=hn}}}})(uzn)),uzn}var qGn;function yZn(){return qGn||(qGn=1,czn.exports=mZn()),czn.exports}var szn={exports:{}},gL={};var zGn;function kZn(){if(zGn)return gL;zGn=1;var b=XHn();function h(R){var B="https://react.dev/errors/"+R;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(b)}catch(h){console.error(h)}}return b(),szn.exports=kZn(),szn.exports}var HGn;function SZn(){if(HGn)return r2n;HGn=1;var b=yZn(),h=XHn(),m=EZn();function A(x){var N="https://react.dev/errors/"+x;if(1vt||(x.current=Zn[vt],Zn[vt]=null,vt--)}function sn(x,N){vt++,Zn[vt]=x.current,x.current=N}var dn=rn(null),An=rn(null),Bn=rn(null),ht=rn(null);function _t(x,N){switch(sn(Bn,N),sn(An,x),sn(dn,null),N.nodeType){case 9:case 11:x=(x=N.documentElement)&&(x=x.namespaceURI)?Gde(x):0;break;default:if(x=N.tagName,N=N.namespaceURI)N=Gde(N),x=Kde(N,x);else switch(x){case"svg":x=1;break;case"math":x=2;break;default:x=0}}Be(dn),sn(dn,x)}function St(){Be(dn),Be(An),Be(Bn)}function Jn(x){x.memoizedState!==null&&sn(ht,x);var N=dn.current,_=Kde(N,x.type);N!==_&&(sn(An,x),sn(dn,_))}function Ct(x){An.current===x&&(Be(dn),Be(An)),ht.current===x&&(Be(ht),hG._currentValue=hn)}var zt,yr;function ni(x){if(zt===void 0)try{throw Error()}catch(_){var N=_.stack.trim().match(/\n( *(at )?)/);zt=N&&N[1]||"",yr=-1<_.stack.indexOf(` at`)?" ()":-1<_.stack.indexOf("@")?"@unknown:0:0":""}return` -`+qt+x+yr}var En=!1;function Ti(x,N){if(!x||En)return"";En=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var X={DetermineComponentFrameRoot:function(){try{if(N){var Gc=function(){throw Error()};if(Object.defineProperty(Gc.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Gc,[])}catch(uc){var Ui=uc}Reflect.construct(x,[],Gc)}else{try{Gc.call()}catch(uc){Ui=uc}x.call(Gc.prototype)}}else{try{throw Error()}catch(uc){Ui=uc}(Gc=x())&&typeof Gc.catch=="function"&&Gc.catch(function(){})}}catch(uc){if(uc&&Ui&&typeof uc.stack=="string")return[uc.stack,Ui.stack]}return[null,null]}};X.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var ae=Object.getOwnPropertyDescriptor(X.DetermineComponentFrameRoot,"name");ae&&ae.configurable&&Object.defineProperty(X.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var ge=X.DetermineComponentFrameRoot(),nn=ge[0],_n=ge[1];if(nn&&_n){var tr=nn.split(` +`+zt+x+yr}var En=!1;function Ti(x,N){if(!x||En)return"";En=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var X={DetermineComponentFrameRoot:function(){try{if(N){var Gc=function(){throw Error()};if(Object.defineProperty(Gc.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Gc,[])}catch(uc){var zi=uc}Reflect.construct(x,[],Gc)}else{try{Gc.call()}catch(uc){zi=uc}x.call(Gc.prototype)}}else{try{throw Error()}catch(uc){zi=uc}(Gc=x())&&typeof Gc.catch=="function"&&Gc.catch(function(){})}}catch(uc){if(uc&&zi&&typeof uc.stack=="string")return[uc.stack,zi.stack]}return[null,null]}};X.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var ae=Object.getOwnPropertyDescriptor(X.DetermineComponentFrameRoot,"name");ae&&ae.configurable&&Object.defineProperty(X.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var ge=X.DetermineComponentFrameRoot(),tn=ge[0],_n=ge[1];if(tn&&_n){var rr=tn.split(` `),ji=_n.split(` -`);for(ae=X=0;Xae||tr[X]!==ji[ae]){var Nc=` -`+tr[X].replace(" at new "," at ");return x.displayName&&Nc.includes("")&&(Nc=Nc.replace("",x.displayName)),Nc}while(1<=X&&0<=ae);break}}}finally{En=!1,Error.prepareStackTrace=_}return(_=x?x.displayName||x.name:"")?ri(_):""}function Xc(x,N){switch(x.tag){case 26:case 27:case 5:return ri(x.type);case 16:return ri("Lazy");case 13:return x.child!==N&&N!==null?ri("Suspense Fallback"):ri("Suspense");case 19:return ri("SuspenseList");case 0:case 15:return Ti(x.type,!1);case 11:return Ti(x.type.render,!1);case 1:return Ti(x.type,!0);case 31:return ri("Activity");default:return""}}function Rc(x){try{var N="",_=null;do N+=Xc(x,_),_=x,x=x.return;while(x);return N}catch(X){return` +`);for(ae=X=0;Xae||rr[X]!==ji[ae]){var Oc=` +`+rr[X].replace(" at new "," at ");return x.displayName&&Oc.includes("")&&(Oc=Oc.replace("",x.displayName)),Oc}while(1<=X&&0<=ae);break}}}finally{En=!1,Error.prepareStackTrace=_}return(_=x?x.displayName||x.name:"")?ni(_):""}function Wc(x,N){switch(x.tag){case 26:case 27:case 5:return ni(x.type);case 16:return ni("Lazy");case 13:return x.child!==N&&N!==null?ni("Suspense Fallback"):ni("Suspense");case 19:return ni("SuspenseList");case 0:case 15:return Ti(x.type,!1);case 11:return Ti(x.type.render,!1);case 1:return Ti(x.type,!0);case 31:return ni("Activity");default:return""}}function _c(x){try{var N="",_=null;do N+=Wc(x,_),_=x,x=x.return;while(x);return N}catch(X){return` Error generating stack: `+X.message+` -`+X.stack}}var Jr=Object.prototype.hasOwnProperty,yi=b.unstable_scheduleCallback,ki=b.unstable_cancelCallback,qc=b.unstable_shouldYield,Gi=b.unstable_requestPaint,ac=b.unstable_now,fs=b.unstable_getCurrentPriorityLevel,_u=b.unstable_ImmediatePriority,Zs=b.unstable_UserBlockingPriority,Is=b.unstable_NormalPriority,Fu=b.unstable_LowPriority,vu=b.unstable_IdlePriority,yc=b.log,Fi=b.unstable_setDisableYieldValue,Ln=null,Cn=null;function at(x){if(typeof yc=="function"&&Fi(x),Cn&&typeof Cn.setStrictMode=="function")try{Cn.setStrictMode(Ln,x)}catch{}}var nr=Math.clz32?Math.clz32:$r,Vt=Math.log,xc=Math.LN2;function $r(x){return x>>>=0,x===0?32:31-(Vt(x)/xc|0)|0}var dc=256,Zr=262144,Ec=4194304;function zi(x){var N=x&42;if(N!==0)return N;switch(x&-x){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:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return x&261888;case 262144:case 524288:case 1048576:case 2097152:return x&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return x&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return x}}function hu(x,N,_){var X=x.pendingLanes;if(X===0)return 0;var ae=0,ge=x.suspendedLanes,nn=x.pingedLanes;x=x.warmLanes;var _n=X&134217727;return _n!==0?(X=_n&~ge,X!==0?ae=zi(X):(nn&=_n,nn!==0?ae=zi(nn):_||(_=_n&~x,_!==0&&(ae=zi(_))))):(_n=X&~ge,_n!==0?ae=zi(_n):nn!==0?ae=zi(nn):_||(_=X&~x,_!==0&&(ae=zi(_)))),ae===0?0:N!==0&&N!==ae&&(N&ge)===0&&(ge=ae&-ae,_=N&-N,ge>=_||ge===32&&(_&4194048)!==0)?N:ae}function is(x,N){return(x.pendingLanes&~(x.suspendedLanes&~x.pingedLanes)&N)===0}function mo(x,N){switch(x){case 1:case 2:case 4:case 8:case 64:return N+250;case 16:case 32: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+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Ho(){var x=Ec;return Ec<<=1,(Ec&62914560)===0&&(Ec=4194304),x}function vh(x){for(var N=[],_=0;31>_;_++)N.push(x);return N}function mu(x,N){x.pendingLanes|=N,N!==268435456&&(x.suspendedLanes=0,x.pingedLanes=0,x.warmLanes=0)}function Ga(x,N,_,X,ae,ge){var nn=x.pendingLanes;x.pendingLanes=_,x.suspendedLanes=0,x.pingedLanes=0,x.warmLanes=0,x.expiredLanes&=_,x.entangledLanes&=_,x.errorRecoveryDisabledLanes&=_,x.shellSuspendCounter=0;var _n=x.entanglements,tr=x.expirationTimes,ji=x.hiddenUpdates;for(_=nn&~_;0<_;){var Nc=31-nr(_),Gc=1<"u")return null;try{return x.activeElement||x.body}catch{return x.body}}var Nl=/[\n"\\]/g;function Gw(x){return x.replace(Nl,function(N){return"\\"+N.charCodeAt(0).toString(16)+" "})}function _7(x,N,_,X,ae,ge,nn,_n){x.name="",nn!=null&&typeof nn!="function"&&typeof nn!="symbol"&&typeof nn!="boolean"?x.type=nn:x.removeAttribute("type"),N!=null?nn==="number"?(N===0&&x.value===""||x.value!=N)&&(x.value=""+Ql(N)):x.value!==""+Ql(N)&&(x.value=""+Ql(N)):nn!=="submit"&&nn!=="reset"||x.removeAttribute("value"),N!=null?VA(x,nn,Ql(N)):_!=null?VA(x,nn,Ql(_)):X!=null&&x.removeAttribute("value"),ae==null&&ge!=null&&(x.defaultChecked=!!ge),ae!=null&&(x.checked=ae&&typeof ae!="function"&&typeof ae!="symbol"),_n!=null&&typeof _n!="function"&&typeof _n!="symbol"&&typeof _n!="boolean"?x.name=""+Ql(_n):x.removeAttribute("name")}function F7(x,N,_,X,ae,ge,nn,_n){if(ge!=null&&typeof ge!="function"&&typeof ge!="symbol"&&typeof ge!="boolean"&&(x.type=ge),N!=null||_!=null){if(!(ge!=="submit"&&ge!=="reset"||N!=null)){Hw(x);return}_=_!=null?""+Ql(_):"",N=N!=null?""+Ql(N):_,_n||N===x.value||(x.value=N),x.defaultValue=N}X=X??ae,X=typeof X!="function"&&typeof X!="symbol"&&!!X,x.checked=_n?x.checked:!!X,x.defaultChecked=!!X,nn!=null&&typeof nn!="function"&&typeof nn!="symbol"&&typeof nn!="boolean"&&(x.name=nn),Hw(x)}function VA(x,N,_){N==="number"&&Kh(x.ownerDocument)===x||x.defaultValue===""+_||(x.defaultValue=""+_)}function tm(x,N,_,X){if(x=x.options,N){N={};for(var ae=0;ae<_.length;ae++)N["$"+_[ae]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Mb=!1;if(Kw)try{var U4={};Object.defineProperty(U4,"passive",{get:function(){Mb=!0}}),window.addEventListener("test",U4,U4),window.removeEventListener("test",U4,U4)}catch{Mb=!1}var uv=null,AE=null,v5=null;function CE(){if(v5)return v5;var x,N=AE,_=N.length,X,ae="value"in uv?uv.value:uv.textContent,ge=ae.length;for(x=0;x<_&&N[x]===ae[x];x++);var nn=_-x;for(X=1;X<=nn&&N[_-X]===ae[ge-X];X++);return v5=ae.slice(x,1=Z6),fp=" ",xE=!1;function ME(x,N){switch(x){case"keyup":return YA.indexOf(N.keyCode)!==-1;case"keydown":return N.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ZA(x){return x=x.detail,typeof x=="object"&&"data"in x?x.data:null}var e8=!1;function d3(x,N){switch(x){case"compositionend":return ZA(N);case"keypress":return N.which!==32?null:(xE=!0,fp);case"textInput":return x=N.data,x===fp&&xE?null:x;default:return null}}function Oy(x,N){if(e8)return x==="compositionend"||!K4&&ME(x,N)?(x=CE(),v5=AE=uv=null,e8=!1,x):null;switch(x){case"paste":return null;case"keypress":if(!(N.ctrlKey||N.altKey||N.metaKey)||N.ctrlKey&&N.altKey){if(N.char&&1=N)return{node:_,offset:N-x};x=X}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=wo(_)}}function sw(x,N){return x&&N?x===N?!0:x&&x.nodeType===3?!1:N&&N.nodeType===3?sw(x,N.parentNode):"contains"in x?x.contains(N):x.compareDocumentPosition?!!(x.compareDocumentPosition(N)&16):!1:!1}function lp(x){x=x!=null&&x.ownerDocument!=null&&x.ownerDocument.defaultView!=null?x.ownerDocument.defaultView:window;for(var N=Kh(x.document);N instanceof x.HTMLIFrameElement;){try{var _=typeof N.contentWindow.location.href=="string"}catch{_=!1}if(_)x=N.contentWindow;else break;N=Kh(x.document)}return N}function sm(x){var N=x&&x.nodeName&&x.nodeName.toLowerCase();return N&&(N==="input"&&(x.type==="text"||x.type==="search"||x.type==="tel"||x.type==="url"||x.type==="password")||N==="textarea"||x.contentEditable==="true")}var om=Kw&&"documentMode"in document&&11>=document.documentMode,Xw=null,Zl=null,hp=null,Ww=!1;function C1(x,N,_){var X=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;Ww||Xw==null||Xw!==Kh(X)||(X=Xw,"selectionStart"in X&&sm(X)?X={start:X.selectionStart,end:X.selectionEnd}:(X=(X.ownerDocument&&X.ownerDocument.defaultView||window).getSelection(),X={anchorNode:X.anchorNode,anchorOffset:X.anchorOffset,focusNode:X.focusNode,focusOffset:X.focusOffset}),hp&&Df(hp,X)||(hp=X,X=HW(Zl,"onSelect"),0>=nn,ae-=nn,p9=1<<32-nr(N)+ae|_<Gl?(Jh=ya,ya=null):Jh=ya.sibling;var a0=Ui(Wr,ya,Ei[Gl],kc);if(a0===null){ya===null&&(ya=Jh);break}x&&ya&&a0.alternate===null&&N(Wr,ya),Er=ge(a0,Er,Gl),o0===null?Ja=a0:o0.sibling=a0,o0=a0,ya=Jh}if(Gl===Ei.length)return _(Wr,ya),T1&&c8(Wr,Gl),Ja;if(ya===null){for(;GlGl?(Jh=ya,ya=null):Jh=ya.sibling;var AP=Ui(Wr,ya,a0.value,kc);if(AP===null){ya===null&&(ya=Jh);break}x&&ya&&AP.alternate===null&&N(Wr,ya),Er=ge(AP,Er,Gl),o0===null?Ja=AP:o0.sibling=AP,o0=AP,ya=Jh}if(a0.done)return _(Wr,ya),T1&&c8(Wr,Gl),Ja;if(ya===null){for(;!a0.done;Gl++,a0=Ei.next())a0=Gc(Wr,a0.value,kc),a0!==null&&(Er=ge(a0,Er,Gl),o0===null?Ja=a0:o0.sibling=a0,o0=a0);return T1&&c8(Wr,Gl),Ja}for(ya=X(ya);!a0.done;Gl++,a0=Ei.next())a0=uc(ya,Wr,Gl,a0.value,kc),a0!==null&&(x&&a0.alternate!==null&&ya.delete(a0.key===null?Gl:a0.key),Er=ge(a0,Er,Gl),o0===null?Ja=a0:o0.sibling=a0,o0=a0);return x&&ya.forEach(function(qL){return N(Wr,qL)}),T1&&c8(Wr,Gl),Ja}function yg(Wr,Er,Ei,kc){if(typeof Ei=="object"&&Ei!==null&&Ei.type===ie&&Ei.key===null&&(Ei=Ei.props.children),typeof Ei=="object"&&Ei!==null){switch(Ei.$$typeof){case W:e:{for(var Ja=Ei.key;Er!==null;){if(Er.key===Ja){if(Ja=Ei.type,Ja===ie){if(Er.tag===7){_(Wr,Er.sibling),kc=ae(Er,Ei.props.children),kc.return=Wr,Wr=kc;break e}}else if(Er.elementType===Ja||typeof Ja=="object"&&Ja!==null&&Ja.$$typeof===He&&ii(Ja)===Er.type){_(Wr,Er.sibling),kc=ae(Er,Ei.props),ol(kc,Ei),kc.return=Wr,Wr=kc;break e}_(Wr,Er);break}else N(Wr,Er);Er=Er.sibling}Ei.type===ie?(kc=Sj(Ei.props.children,Wr.mode,kc,Ei.key),kc.return=Wr,Wr=kc):(kc=iP(Ei.type,Ei.key,Ei.props,null,Wr.mode,kc),ol(kc,Ei),kc.return=Wr,Wr=kc)}return nn(Wr);case Y:e:{for(Ja=Ei.key;Er!==null;){if(Er.key===Ja)if(Er.tag===4&&Er.stateNode.containerInfo===Ei.containerInfo&&Er.stateNode.implementation===Ei.implementation){_(Wr,Er.sibling),kc=ae(Er,Ei.children||[]),kc.return=Wr,Wr=kc;break e}else{_(Wr,Er);break}else N(Wr,Er);Er=Er.sibling}kc=cP(Ei,Wr.mode,kc),kc.return=Wr,Wr=kc}return nn(Wr);case He:return Ei=ii(Ei),yg(Wr,Er,Ei,kc)}if(vn(Ei))return ia(Wr,Er,Ei,kc);if(Ie(Ei)){if(Ja=Ie(Ei),typeof Ja!="function")throw Error(A(150));return Ei=Ja.call(Ei),Ef(Wr,Er,Ei,kc)}if(typeof Ei.then=="function")return yg(Wr,Er,yo(Ei),kc);if(Ei.$$typeof===Se)return yg(Wr,Er,vB(Wr,Ei),kc);Go(Wr,Ei)}return typeof Ei=="string"&&Ei!==""||typeof Ei=="number"||typeof Ei=="bigint"?(Ei=""+Ei,Er!==null&&Er.tag===6?(_(Wr,Er.sibling),kc=ae(Er,Ei),kc.return=Wr,Wr=kc):(_(Wr,Er),kc=bB(Ei,Wr.mode,kc),kc.return=Wr,Wr=kc),nn(Wr)):_(Wr,Er)}return function(Wr,Er,Ei,kc){try{Yo=0;var Ja=yg(Wr,Er,Ei,kc);return Kc=null,Ja}catch(ya){if(ya===vr||ya===kt)throw ya;var o0=k5(29,ya,null,Wr.mode);return o0.lanes=kc,o0.return=Wr,o0}finally{}}}var sb=f1(!0),Ul=f1(!1),ko=!1;function Bs(x){x.updateQueue={baseState:x.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function ow(x,N){x=x.updateQueue,N.updateQueue===x&&(N.updateQueue={baseState:x.baseState,firstBaseUpdate:x.firstBaseUpdate,lastBaseUpdate:x.lastBaseUpdate,shared:x.shared,callbacks:null})}function kf(x){return{lane:x,tag:0,payload:null,callback:null,next:null}}function Hl(x,N,_){var X=x.updateQueue;if(X===null)return null;if(X=X.shared,(L0&2)!==0){var ae=X.pending;return ae===null?N.next=N:(N.next=ae.next,ae.next=N),X.pending=N,N=y5(x),dB(x,null,_),N}return hB(x,X,N,_),y5(x)}function x0(x,N,_){if(N=N.updateQueue,N!==null&&(N=N.shared,(_&4194048)!==0)){var X=N.lanes;X&=x.pendingLanes,_|=X,N.lanes=_,Oh(x,_)}}function sv(x,N){var _=x.updateQueue,X=x.alternate;if(X!==null&&(X=X.updateQueue,_===X)){var ae=null,ge=null;if(_=_.firstBaseUpdate,_!==null){do{var nn={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};ge===null?ae=ge=nn:ge=ge.next=nn,_=_.next}while(_!==null);ge===null?ae=ge=N:ge=ge.next=N}else ae=ge=N;_={baseState:X.baseState,firstBaseUpdate:ae,lastBaseUpdate:ge,shared:X.shared,callbacks:X.callbacks},x.updateQueue=_;return}x=_.lastBaseUpdate,x===null?_.firstBaseUpdate=N:x.next=N,_.lastBaseUpdate=N}var m3=!1;function _g(){if(m3){var x=de;if(x!==null)throw x}}function dp(x,N,_,X){m3=!1;var ae=x.updateQueue;ko=!1;var ge=ae.firstBaseUpdate,nn=ae.lastBaseUpdate,_n=ae.shared.pending;if(_n!==null){ae.shared.pending=null;var tr=_n,ji=tr.next;tr.next=null,nn===null?ge=ji:nn.next=ji,nn=tr;var Nc=x.alternate;Nc!==null&&(Nc=Nc.updateQueue,_n=Nc.lastBaseUpdate,_n!==nn&&(_n===null?Nc.firstBaseUpdate=ji:_n.next=ji,Nc.lastBaseUpdate=tr))}if(ge!==null){var Gc=ae.baseState;nn=0,Nc=ji=tr=null,_n=ge;do{var Ui=_n.lane&-536870913,uc=Ui!==_n.lane;if(uc?(z1&Ui)===Ui:(X&Ui)===Ui){Ui!==0&&Ui===re&&(m3=!0),Nc!==null&&(Nc=Nc.next={lane:0,tag:_n.tag,payload:_n.payload,callback:null,next:null});e:{var ia=x,Ef=_n;Ui=N;var yg=_;switch(Ef.tag){case 1:if(ia=Ef.payload,typeof ia=="function"){Gc=ia.call(yg,Gc,Ui);break e}Gc=ia;break e;case 3:ia.flags=ia.flags&-65537|128;case 0:if(ia=Ef.payload,Ui=typeof ia=="function"?ia.call(yg,Gc,Ui):ia,Ui==null)break e;Gc=V({},Gc,Ui);break e;case 2:ko=!0}}Ui=_n.callback,Ui!==null&&(x.flags|=64,uc&&(x.flags|=8192),uc=ae.callbacks,uc===null?ae.callbacks=[Ui]:uc.push(Ui))}else uc={lane:Ui,tag:_n.tag,payload:_n.payload,callback:_n.callback,next:null},Nc===null?(ji=Nc=uc,tr=Gc):Nc=Nc.next=uc,nn|=Ui;if(_n=_n.next,_n===null){if(_n=ae.shared.pending,_n===null)break;uc=_n,_n=uc.next,uc.next=null,ae.lastBaseUpdate=uc,ae.shared.pending=null}}while(!0);Nc===null&&(tr=Gc),ae.baseState=tr,ae.firstBaseUpdate=ji,ae.lastBaseUpdate=Nc,ge===null&&(ae.shared.lanes=0),pP|=nn,x.lanes=nn,x.memoizedState=Gc}}function E5(x,N){if(typeof x!="function")throw Error(A(191,x));x.call(N)}function gp(x,N){var _=x.callbacks;if(_!==null)for(x.callbacks=null,x=0;x<_.length;x++)E5(_[x],N)}var Dh=rn(null),Ed=rn(0);function aw(x,N){x=RL,sn(Ed,x),sn(Dh,N),RL=x|N.baseLanes}function _d(){sn(Ed,RL),sn(Dh,Dh.current)}function ov(){RL=Ed.current,Be(Dh),Be(Ed)}var fw=rn(null),Sd=null;function P2(x){var N=x.alternate;sn(td,td.current&1),sn(fw,x),Sd===null&&(N===null||Dh.current!==null||N.memoizedState!==null)&&(Sd=x)}function M0(x){sn(td,td.current),sn(fw,x),Sd===null&&(Sd=x)}function bp(x){x.tag===22?(sn(td,td.current),sn(fw,x),Sd===null&&(Sd=x)):wp()}function wp(){sn(td,td.current),sn(fw,fw.current)}function vg(x){Be(fw),Sd===x&&(Sd=null),Be(td)}var td=rn(0);function S5(x){for(var N=x;N!==null;){if(N.tag===13){var _=N.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||Zie(_)||ece(_)))return N}else if(N.tag===19&&(N.memoizedProps.revealOrder==="forwards"||N.memoizedProps.revealOrder==="backwards"||N.memoizedProps.revealOrder==="unstable_legacy-backwards"||N.memoizedProps.revealOrder==="together")){if((N.flags&128)!==0)return N}else if(N.child!==null){N.child.return=N,N=N.child;continue}if(N===x)break;for(;N.sibling===null;){if(N.return===null||N.return===x)return null;N=N.return}N.sibling.return=N.return,N=N.sibling}return null}var Qw=0,Qa=null,uf=null,Ad=null,J4=!1,y9=!1,Iy=!1,pp=0,Mj=0,Lj=null,b$=0;function Fg(){throw Error(A(321))}function IH(x,N){if(N===null)return!1;for(var _=0;_ge?ge:8;var nn=tn.T,_n={};tn.T=_n,aie(x,!1,N,_);try{var tr=ae(),ji=tn.S;if(ji!==null&&ji(_n,tr),tr!==null&&typeof tr=="object"&&typeof tr.then=="function"){var Nc=wn(tr,X);GH(x,N,Nc,W7(x))}else GH(x,N,X,W7(x))}catch(Gc){GH(x,N,{then:function(){},status:"rejected",reason:Gc},W7())}finally{un.p=ge,nn!==null&&_n.types!==null&&(nn.types=_n.types),tn.T=nn}}function sie(){}function HH(x,N,_,X){if(x.tag!==5)throw Error(A(476));var ae=D1e(x).queue;P1e(x,ae,N,hn,_===null?sie:function(){return mW(x),_(X)})}function D1e(x){var N=x.memoizedState;if(N!==null)return N;N={memoizedState:hn,baseState:hn,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:OE,lastRenderedState:hn},next:null};var _={};return N.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:OE,lastRenderedState:_},next:null},x.memoizedState=N,x=x.alternate,x!==null&&(x.memoizedState=N),N}function mW(x){var N=D1e(x);N.next===null&&(N=x.alternate.memoizedState),GH(x,N.next.queue,{},W7())}function oie(){return v3(fG)}function I1e(){return Zw().memoizedState}function B1e(){return Zw().memoizedState}function v4e(x){for(var N=x.return;N!==null;){switch(N.tag){case 24:case 3:var _=W7();x=kf(_);var X=Hl(N,x,_);X!==null&&(C9(X,N,_),x0(X,N,_)),N={cache:aP()},x.payload=N;return}N=N.return}}function m4e(x,N,_){var X=W7();_={lane:X,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},yW(x)?_1e(N,_):(_=u$(x,N,_,X),_!==null&&(C9(_,x,X),F1e(_,N,X)))}function R1e(x,N,_){var X=W7();GH(x,N,_,X)}function GH(x,N,_,X){var ae={lane:X,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(yW(x))_1e(N,ae);else{var ge=x.alternate;if(x.lanes===0&&(ge===null||ge.lanes===0)&&(ge=N.lastRenderedReducer,ge!==null))try{var nn=N.lastRenderedState,_n=ge(nn,_);if(ae.hasEagerState=!0,ae.eagerState=_n,Gu(_n,nn))return hB(x,N,ae,0),ob===null&&lB(),!1}catch{}finally{}if(_=u$(x,N,ae,X),_!==null)return C9(_,x,X),F1e(_,N,X),!0}return!1}function aie(x,N,_,X){if(X={lane:2,revertLane:$ie(),gesture:null,action:X,hasEagerState:!1,eagerState:null,next:null},yW(x)){if(N)throw Error(A(479))}else N=u$(x,_,X,2),N!==null&&C9(N,x,2)}function yW(x){var N=x.alternate;return x===Qa||N!==null&&N===Qa}function _1e(x,N){y9=J4=!0;var _=x.pending;_===null?N.next=N:(N.next=_.next,_.next=N),x.pending=N}function F1e(x,N,_){if((_&4194048)!==0){var X=N.lanes;X&=x.pendingLanes,_|=X,N.lanes=_,Oh(x,_)}}var KH={readContext:v3,use:lP,useCallback:Fg,useContext:Fg,useEffect:Fg,useImperativeHandle:Fg,useLayoutEffect:Fg,useInsertionEffect:Fg,useMemo:Fg,useReducer:Fg,useRef:Fg,useState:Fg,useDebugValue:Fg,useDeferredValue:Fg,useTransition:Fg,useSyncExternalStore:Fg,useId:Fg,useHostTransitionStatus:Fg,useFormState:Fg,useActionState:Fg,useOptimistic:Fg,useMemoCache:Fg,useCacheRefresh:Fg};KH.useEffectEvent=Fg;var $1e={readContext:v3,use:lP,useCallback:function(x,N){return fm().memoizedState=[x,N===void 0?null:N],x},useContext:v3,useEffect:S1e,useImperativeHandle:function(x,N,_){_=_!=null?_.concat([x]):null,dP(4194308,4,j1e.bind(null,N,x),_)},useLayoutEffect:function(x,N){return dP(4194308,4,x,N)},useInsertionEffect:function(x,N){dP(4,2,x,N)},useMemo:function(x,N){var _=fm();N=N===void 0?null:N;var X=x();if(Iy){at(!0);try{x()}finally{at(!1)}}return _.memoizedState=[X,N],X},useReducer:function(x,N,_){var X=fm();if(_!==void 0){var ae=_(N);if(Iy){at(!0);try{_(N)}finally{at(!1)}}}else ae=N;return X.memoizedState=X.baseState=ae,x={pending:null,lanes:0,dispatch:null,lastRenderedReducer:x,lastRenderedState:ae},X.queue=x,x=x.dispatch=m4e.bind(null,Qa,x),[X.memoizedState,x]},useRef:function(x){var N=fm();return x={current:x},N.memoizedState=x},useState:function(x){x=Oj(x);var N=x.queue,_=R1e.bind(null,Qa,N);return N.dispatch=_,[x.memoizedState,_]},useDebugValue:uie,useDeferredValue:function(x,N){var _=fm();return N1e(_,x,N)},useTransition:function(){var x=Oj(!1);return x=P1e.bind(null,Qa,x.queue,!0,!1),fm().memoizedState=x,[!1,x]},useSyncExternalStore:function(x,N,_){var X=Qa,ae=fm();if(T1){if(_===void 0)throw Error(A(407));_=_()}else{if(_=N(),ob===null)throw Error(A(349));(z1&127)!==0||uC(X,N,_)}ae.memoizedState=_;var ge={value:_,getSnapshot:N};return ae.queue=ge,S1e(qH.bind(null,X,ge,x),[x]),X.flags|=2048,PL(9,{destroy:void 0},$H.bind(null,X,ge,_,N),null),_},useId:function(){var x=fm(),N=ob.identifierPrefix;if(T1){var _=v9,X=p9;_=(X&~(1<<32-nr(X)-1)).toString(32)+_,N="_"+N+"R_"+_,_=pp++,0<_&&(N+="H"+_.toString(32)),N+="_"}else _=b$++,N="_"+N+"r_"+_.toString(32)+"_";return x.memoizedState=N},useHostTransitionStatus:oie,useFormState:PE,useActionState:PE,useOptimistic:function(x){var N=fm();N.memoizedState=N.baseState=x;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return N.queue=_,N=aie.bind(null,Qa,!0,_),_.dispatch=N,[x,N]},useMemoCache:NL,useCacheRefresh:function(){return fm().memoizedState=v4e.bind(null,Qa)},useEffectEvent:function(x){var N=fm(),_={impl:x};return N.memoizedState=_,function(){if((L0&2)!==0)throw Error(A(440));return _.impl.apply(void 0,arguments)}}},fie={readContext:v3,use:lP,useCallback:M1e,useContext:v3,useEffect:cie,useImperativeHandle:x1e,useInsertionEffect:C1e,useLayoutEffect:T1e,useMemo:L1e,useReducer:v$,useRef:vW,useState:function(){return v$(OE)},useDebugValue:uie,useDeferredValue:function(x,N){var _=Zw();return O1e(_,uf.memoizedState,x,N)},useTransition:function(){var x=v$(OE)[0],N=Zw().memoizedState;return[typeof x=="boolean"?x:Nj(x),N]},useSyncExternalStore:m$,useId:I1e,useHostTransitionStatus:oie,useFormState:sC,useActionState:sC,useOptimistic:function(x,N){var _=Zw();return gW(_,uf,x,N)},useMemoCache:NL,useCacheRefresh:B1e};fie.useEffectEvent=A1e;var y4e={readContext:v3,use:lP,useCallback:M1e,useContext:v3,useEffect:cie,useImperativeHandle:x1e,useInsertionEffect:C1e,useLayoutEffect:T1e,useMemo:L1e,useReducer:FH,useRef:vW,useState:function(){return FH(OE)},useDebugValue:uie,useDeferredValue:function(x,N){var _=Zw();return uf===null?N1e(_,x,N):O1e(_,uf.memoizedState,x,N)},useTransition:function(){var x=FH(OE)[0],N=Zw().memoizedState;return[typeof x=="boolean"?x:Nj(x),N]},useSyncExternalStore:m$,useId:I1e,useHostTransitionStatus:oie,useFormState:E$,useActionState:E$,useOptimistic:function(x,N){var _=Zw();return uf!==null?gW(_,uf,x,N):(_.baseState=x,[x,_.queue.dispatch])},useMemoCache:NL,useCacheRefresh:B1e};y4e.useEffectEvent=A1e;function lie(x,N,_,X){N=x.memoizedState,_=_(X,N),_=_==null?N:V({},N,_),x.memoizedState=_,x.lanes===0&&(x.updateQueue.baseState=_)}var kW={enqueueSetState:function(x,N,_){x=x._reactInternals;var X=W7(),ae=kf(X);ae.payload=N,_!=null&&(ae.callback=_),N=Hl(x,ae,X),N!==null&&(C9(N,x,X),x0(N,x,X))},enqueueReplaceState:function(x,N,_){x=x._reactInternals;var X=W7(),ae=kf(X);ae.tag=1,ae.payload=N,_!=null&&(ae.callback=_),N=Hl(x,ae,X),N!==null&&(C9(N,x,X),x0(N,x,X))},enqueueForceUpdate:function(x,N){x=x._reactInternals;var _=W7(),X=kf(_);X.tag=2,N!=null&&(X.callback=N),N=Hl(x,X,_),N!==null&&(C9(N,x,_),x0(N,x,_))}};function q1e(x,N,_,X,ae,ge,nn){return x=x.stateNode,typeof x.shouldComponentUpdate=="function"?x.shouldComponentUpdate(X,ge,nn):N.prototype&&N.prototype.isPureReactComponent?!Df(_,X)||!Df(ae,ge):!0}function z1e(x,N,_,X){x=N.state,typeof N.componentWillReceiveProps=="function"&&N.componentWillReceiveProps(_,X),typeof N.UNSAFE_componentWillReceiveProps=="function"&&N.UNSAFE_componentWillReceiveProps(_,X),N.state!==x&&kW.enqueueReplaceState(N,N.state,null)}function SB(x,N){var _=N;if("ref"in N){_={};for(var X in N)X!=="ref"&&(_[X]=N[X])}if(x=x.defaultProps){_===N&&(_=V({},_));for(var ae in x)_[ae]===void 0&&(_[ae]=x[ae])}return _}function U1e(x){fB(x)}function EW(x){console.error(x)}function SW(x){fB(x)}function AW(x,N){try{var _=x.onUncaughtError;_(N.value,{componentStack:N.stack})}catch(X){setTimeout(function(){throw X})}}function CW(x,N,_){try{var X=x.onCaughtError;X(_.value,{componentStack:_.stack,errorBoundary:N.tag===1?N.stateNode:null})}catch(ae){setTimeout(function(){throw ae})}}function hie(x,N,_){return _=kf(_),_.tag=3,_.payload={element:null},_.callback=function(){AW(x,N)},_}function H1e(x){return x=kf(x),x.tag=3,x}function V7(x,N,_,X){var ae=_.type.getDerivedStateFromError;if(typeof ae=="function"){var ge=X.value;x.payload=function(){return ae(ge)},x.callback=function(){CW(N,_,X)}}var nn=_.stateNode;nn!==null&&typeof nn.componentDidCatch=="function"&&(x.callback=function(){CW(N,_,X),typeof ae!="function"&&(vP===null?vP=new Set([this]):vP.add(this));var _n=X.stack;this.componentDidCatch(X.value,{componentStack:_n!==null?_n:""})})}function k4e(x,N,_,X,ae){if(_.flags|=32768,X!==null&&typeof X=="object"&&typeof X.then=="function"){if(N=_.alternate,N!==null&&xj(N,_,ae,!0),_=fw.current,_!==null){switch(_.tag){case 31:case 13:return Sd===null?_W():_.alternate===null&&vp===0&&(vp=3),_.flags&=-257,_.flags|=65536,_.lanes=ae,X===xr?_.flags|=16384:(N=_.updateQueue,N===null?_.updateQueue=new Set([X]):N.add(X),Rie(x,X,ae)),!1;case 22:return _.flags|=65536,X===xr?_.flags|=16384:(N=_.updateQueue,N===null?(N={transitions:null,markerInstances:null,retryQueue:new Set([X])},_.updateQueue=N):(_=N.retryQueue,_===null?N.retryQueue=new Set([X]):_.add(X)),Rie(x,X,ae)),!1}throw Error(A(435,_.tag))}return Rie(x,X,ae),_W(),!1}if(T1)return N=fw.current,N!==null?((N.flags&65536)===0&&(N.flags|=256),N.flags|=65536,N.lanes=ae,X!==K7&&(x=Error(A(422),{cause:X}),rC(g9(x,_)))):(X!==K7&&(N=Error(A(423),{cause:X}),rC(g9(N,_))),x=x.current.alternate,x.flags|=65536,ae&=-ae,x.lanes|=ae,X=g9(X,_),ae=hie(x.stateNode,X,ae),sv(x,ae),vp!==4&&(vp=2)),!1;var ge=Error(A(520),{cause:X});if(ge=g9(ge,_),rG===null?rG=[ge]:rG.push(ge),vp!==4&&(vp=2),N===null)return!0;X=g9(X,_),_=N;do{switch(_.tag){case 3:return _.flags|=65536,x=ae&-ae,_.lanes|=x,x=hie(_.stateNode,X,x),sv(_,x),!1;case 1:if(N=_.type,ge=_.stateNode,(_.flags&128)===0&&(typeof N.getDerivedStateFromError=="function"||ge!==null&&typeof ge.componentDidCatch=="function"&&(vP===null||!vP.has(ge))))return _.flags|=65536,ae&=-ae,_.lanes|=ae,ae=H1e(ae),V7(ae,x,_,X),sv(_,ae),!1}_=_.return}while(_!==null);return!1}var Pj=Error(A(461)),av=!1;function By(x,N,_,X){N.child=x===null?Ul(N,null,_,X):sb(N,x.child,_,X)}function G1e(x,N,_,X,ae){_=_.render;var ge=N.ref;if("ref"in X){var nn={};for(var _n in X)_n!=="ref"&&(nn[_n]=X[_n])}else nn=X;return iC(N),X=BH(x,N,_,nn,ge,ae),_n=RH(),x!==null&&!av?(_H(x,N,ae),IL(x,N,ae)):(T1&&_n&&OH(N),N.flags|=1,By(x,N,X,ae),N.child)}function K1e(x,N,_,X,ae){if(x===null){var ge=_.type;return typeof ge=="function"&&!o$(ge)&&ge.defaultProps===void 0&&_.compare===null?(N.tag=15,N.type=ge,J1e(x,N,ge,X,ae)):(x=iP(_.type,null,X,N,N.mode,ae),x.ref=N.ref,x.return=N,N.child=x)}if(ge=x.child,!mie(x,ae)){var nn=ge.memoizedProps;if(_=_.compare,_=_!==null?_:Df,_(nn,X)&&x.ref===N.ref)return IL(x,N,ae)}return N.flags|=1,x=d9(ge,X),x.ref=N.ref,x.return=N,N.child=x}function J1e(x,N,_,X,ae){if(x!==null){var ge=x.memoizedProps;if(Df(ge,X)&&x.ref===N.ref)if(av=!1,N.pendingProps=X=ge,mie(x,ae))(x.flags&131072)!==0&&(av=!0);else return N.lanes=x.lanes,IL(x,N,ae)}return gie(x,N,_,X,ae)}function die(x,N,_,X){var ae=X.children,ge=x!==null?x.memoizedState:null;if(x===null&&N.stateNode===null&&(N.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),X.mode==="hidden"){if((N.flags&128)!==0){if(ge=ge!==null?ge.baseLanes|_:_,x!==null){for(X=N.child=x.child,ae=0;X!==null;)ae=ae|X.lanes|X.childLanes,X=X.sibling;X=ae&~ge}else X=0,N.child=null;return V1e(x,N,ge,_,X)}if((_&536870912)!==0)N.memoizedState={baseLanes:0,cachePool:null},x!==null&&rt(N,ge!==null?ge.cachePool:null),ge!==null?aw(N,ge):_d(),bp(N);else return X=N.lanes=536870912,V1e(x,N,ge!==null?ge.baseLanes|_:_,_,X)}else ge!==null?(rt(N,ge.cachePool),aw(N,ge),wp(),N.memoizedState=null):(x!==null&&rt(N,null),_d(),wp());return By(x,N,ae,_),N.child}function JH(x,N){return x!==null&&x.tag===22||N.stateNode!==null||(N.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),N.sibling}function V1e(x,N,_,X,ae){var ge=Gn();return ge=ge===null?null:{parent:O2._currentValue,pool:ge},N.memoizedState={baseLanes:_,cachePool:ge},x!==null&&rt(N,null),_d(),bp(N),x!==null&&xj(x,N,X,!0),N.childLanes=ae,null}function TW(x,N){return N=$t({mode:N.mode,children:N.children},x.mode),N.ref=x.ref,x.child=N,N.return=x,N}function E4e(x,N,_){return sb(N,x.child,null,_),x=TW(N,N.pendingProps),x.flags|=2,vg(N),N.memoizedState=null,x}function S4e(x,N,_){var X=N.pendingProps,ae=(N.flags&128)!==0;if(N.flags&=-129,x===null){if(T1){if(X.mode==="hidden")return x=TW(N,X),N.lanes=536870912,JH(null,x);if(M0(N),(x=ub)?(x=Yde(x,Yw),x=x!==null&&x.data==="&"?x:null,x!==null&&(N.memoizedState={dehydrated:x,treeContext:Aj!==null?{id:p9,overflow:v9}:null,retryLane:536870912,hydrationErrors:null},_=a$(x),_.return=N,N.child=_,am=N,ub=null)):x=null,x===null)throw Cj(N);return N.lanes=536870912,null}return TW(N,X)}var ge=x.memoizedState;if(ge!==null){var nn=ge.dehydrated;if(M0(N),ae)if(N.flags&256)N.flags&=-257,N=E4e(x,N,_);else if(N.memoizedState!==null)N.child=x.child,N.flags|=128,N=null;else throw Error(A(558));else if(av||xj(x,N,_,!1),ae=(_&x.childLanes)!==0,av||ae){if(X=ob,X!==null&&(nn=Ph(X,_),nn!==0&&nn!==ge.retryLane))throw ge.retryLane=nn,nC(x,nn),C9(X,x,nn),Pj;_W(),N=E4e(x,N,_)}else x=ge.treeContext,ub=RE(nn.nextSibling),am=N,T1=!0,Dy=null,Yw=!1,x!==null&&hW(N,x),N=TW(N,X),N.flags|=4096;return N}return x=d9(x.child,{mode:X.mode,children:X.children}),x.ref=N.ref,N.child=x,x.return=N,x}function jW(x,N){var _=N.ref;if(_===null)x!==null&&x.ref!==null&&(N.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(A(284));(x===null||x.ref!==_)&&(N.flags|=4194816)}}function gie(x,N,_,X,ae){return iC(N),_=BH(x,N,_,X,void 0,ae),X=RH(),x!==null&&!av?(_H(x,N,ae),IL(x,N,ae)):(T1&&X&&OH(N),N.flags|=1,By(x,N,_,ae),N.child)}function X1e(x,N,_,X,ae,ge){return iC(N),N.updateQueue=null,_=cC(N,X,_,ae),w$(x),X=RH(),x!==null&&!av?(_H(x,N,ge),IL(x,N,ge)):(T1&&X&&OH(N),N.flags|=1,By(x,N,_,ge),N.child)}function W1e(x,N,_,X,ae){if(iC(N),N.stateNode===null){var ge=w3,nn=_.contextType;typeof nn=="object"&&nn!==null&&(ge=v3(nn)),ge=new _(X,ge),N.memoizedState=ge.state!==null&&ge.state!==void 0?ge.state:null,ge.updater=kW,N.stateNode=ge,ge._reactInternals=N,ge=N.stateNode,ge.props=X,ge.state=N.memoizedState,ge.refs={},Bs(N),nn=_.contextType,ge.context=typeof nn=="object"&&nn!==null?v3(nn):w3,ge.state=N.memoizedState,nn=_.getDerivedStateFromProps,typeof nn=="function"&&(lie(N,_,nn,X),ge.state=N.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof ge.getSnapshotBeforeUpdate=="function"||typeof ge.UNSAFE_componentWillMount!="function"&&typeof ge.componentWillMount!="function"||(nn=ge.state,typeof ge.componentWillMount=="function"&&ge.componentWillMount(),typeof ge.UNSAFE_componentWillMount=="function"&&ge.UNSAFE_componentWillMount(),nn!==ge.state&&kW.enqueueReplaceState(ge,ge.state,null),dp(N,X,ge,ae),_g(),ge.state=N.memoizedState),typeof ge.componentDidMount=="function"&&(N.flags|=4194308),X=!0}else if(x===null){ge=N.stateNode;var _n=N.memoizedProps,tr=SB(_,_n);ge.props=tr;var ji=ge.context,Nc=_.contextType;nn=w3,typeof Nc=="object"&&Nc!==null&&(nn=v3(Nc));var Gc=_.getDerivedStateFromProps;Nc=typeof Gc=="function"||typeof ge.getSnapshotBeforeUpdate=="function",_n=N.pendingProps!==_n,Nc||typeof ge.UNSAFE_componentWillReceiveProps!="function"&&typeof ge.componentWillReceiveProps!="function"||(_n||ji!==nn)&&z1e(N,ge,X,nn),ko=!1;var Ui=N.memoizedState;ge.state=Ui,dp(N,X,ge,ae),_g(),ji=N.memoizedState,_n||Ui!==ji||ko?(typeof Gc=="function"&&(lie(N,_,Gc,X),ji=N.memoizedState),(tr=ko||q1e(N,_,tr,X,Ui,ji,nn))?(Nc||typeof ge.UNSAFE_componentWillMount!="function"&&typeof ge.componentWillMount!="function"||(typeof ge.componentWillMount=="function"&&ge.componentWillMount(),typeof ge.UNSAFE_componentWillMount=="function"&&ge.UNSAFE_componentWillMount()),typeof ge.componentDidMount=="function"&&(N.flags|=4194308)):(typeof ge.componentDidMount=="function"&&(N.flags|=4194308),N.memoizedProps=X,N.memoizedState=ji),ge.props=X,ge.state=ji,ge.context=nn,X=tr):(typeof ge.componentDidMount=="function"&&(N.flags|=4194308),X=!1)}else{ge=N.stateNode,ow(x,N),nn=N.memoizedProps,Nc=SB(_,nn),ge.props=Nc,Gc=N.pendingProps,Ui=ge.context,ji=_.contextType,tr=w3,typeof ji=="object"&&ji!==null&&(tr=v3(ji)),_n=_.getDerivedStateFromProps,(ji=typeof _n=="function"||typeof ge.getSnapshotBeforeUpdate=="function")||typeof ge.UNSAFE_componentWillReceiveProps!="function"&&typeof ge.componentWillReceiveProps!="function"||(nn!==Gc||Ui!==tr)&&z1e(N,ge,X,tr),ko=!1,Ui=N.memoizedState,ge.state=Ui,dp(N,X,ge,ae),_g();var uc=N.memoizedState;nn!==Gc||Ui!==uc||ko||x!==null&&x.dependencies!==null&&pB(x.dependencies)?(typeof _n=="function"&&(lie(N,_,_n,X),uc=N.memoizedState),(Nc=ko||q1e(N,_,Nc,X,Ui,uc,tr)||x!==null&&x.dependencies!==null&&pB(x.dependencies))?(ji||typeof ge.UNSAFE_componentWillUpdate!="function"&&typeof ge.componentWillUpdate!="function"||(typeof ge.componentWillUpdate=="function"&&ge.componentWillUpdate(X,uc,tr),typeof ge.UNSAFE_componentWillUpdate=="function"&&ge.UNSAFE_componentWillUpdate(X,uc,tr)),typeof ge.componentDidUpdate=="function"&&(N.flags|=4),typeof ge.getSnapshotBeforeUpdate=="function"&&(N.flags|=1024)):(typeof ge.componentDidUpdate!="function"||nn===x.memoizedProps&&Ui===x.memoizedState||(N.flags|=4),typeof ge.getSnapshotBeforeUpdate!="function"||nn===x.memoizedProps&&Ui===x.memoizedState||(N.flags|=1024),N.memoizedProps=X,N.memoizedState=uc),ge.props=X,ge.state=uc,ge.context=tr,X=Nc):(typeof ge.componentDidUpdate!="function"||nn===x.memoizedProps&&Ui===x.memoizedState||(N.flags|=4),typeof ge.getSnapshotBeforeUpdate!="function"||nn===x.memoizedProps&&Ui===x.memoizedState||(N.flags|=1024),X=!1)}return ge=X,jW(x,N),X=(N.flags&128)!==0,ge||X?(ge=N.stateNode,_=X&&typeof _.getDerivedStateFromError!="function"?null:ge.render(),N.flags|=1,x!==null&&X?(N.child=sb(N,x.child,null,ae),N.child=sb(N,null,_,ae)):By(x,N,_,ae),N.memoizedState=ge.state,x=N.child):x=IL(x,N,ae),x}function Y1e(x,N,_,X){return ML(),N.flags|=256,By(x,N,_,X),N.child}var bie={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function k9(x){return{baseLanes:x,cachePool:St()}}function wie(x,N,_){return x=x!==null?x.childLanes&~_:0,N&&(x|=X7),x}function DL(x,N,_){var X=N.pendingProps,ae=!1,ge=(N.flags&128)!==0,nn;if((nn=ge)||(nn=x!==null&&x.memoizedState===null?!1:(td.current&2)!==0),nn&&(ae=!0,N.flags&=-129),nn=(N.flags&32)!==0,N.flags&=-33,x===null){if(T1){if(ae?P2(N):wp(),(x=ub)?(x=Yde(x,Yw),x=x!==null&&x.data!=="&"?x:null,x!==null&&(N.memoizedState={dehydrated:x,treeContext:Aj!==null?{id:p9,overflow:v9}:null,retryLane:536870912,hydrationErrors:null},_=a$(x),_.return=N,N.child=_,am=N,ub=null)):x=null,x===null)throw Cj(N);return ece(x)?N.lanes=32:N.lanes=536870912,null}var _n=X.children;return X=X.fallback,ae?(wp(),ae=N.mode,_n=$t({mode:"hidden",children:_n},ae),X=Sj(X,ae,_,null),_n.return=N,X.return=N,_n.sibling=X,N.child=_n,X=N.child,X.memoizedState=k9(_),X.childLanes=wie(x,nn,_),N.memoizedState=bie,JH(null,X)):(P2(N),xW(N,_n))}var tr=x.memoizedState;if(tr!==null&&(_n=tr.dehydrated,_n!==null)){if(ge)N.flags&256?(P2(N),N.flags&=-257,N=pie(x,N,_)):N.memoizedState!==null?(wp(),N.child=x.child,N.flags|=128,N=null):(wp(),_n=X.fallback,ae=N.mode,X=$t({mode:"visible",children:X.children},ae),_n=Sj(_n,ae,_,null),_n.flags|=2,X.return=N,_n.return=N,X.sibling=_n,N.child=X,sb(N,x.child,null,_),X=N.child,X.memoizedState=k9(_),X.childLanes=wie(x,nn,_),N.memoizedState=bie,N=JH(null,X));else if(P2(N),ece(_n)){if(nn=_n.nextSibling&&_n.nextSibling.dataset,nn)var ji=nn.dgst;nn=ji,X=Error(A(419)),X.stack="",X.digest=nn,rC({value:X,source:null,stack:null}),N=pie(x,N,_)}else if(av||xj(x,N,_,!1),nn=(_&x.childLanes)!==0,av||nn){if(nn=ob,nn!==null&&(X=Ph(nn,_),X!==0&&X!==tr.retryLane))throw tr.retryLane=X,nC(x,X),C9(nn,x,X),Pj;Zie(_n)||_W(),N=pie(x,N,_)}else Zie(_n)?(N.flags|=192,N.child=x.child,N=null):(x=tr.treeContext,ub=RE(_n.nextSibling),am=N,T1=!0,Dy=null,Yw=!1,x!==null&&hW(N,x),N=xW(N,X.children),N.flags|=4096);return N}return ae?(wp(),_n=X.fallback,ae=N.mode,tr=x.child,ji=tr.sibling,X=d9(tr,{mode:"hidden",children:X.children}),X.subtreeFlags=tr.subtreeFlags&65011712,ji!==null?_n=d9(ji,_n):(_n=Sj(_n,ae,_,null),_n.flags|=2),_n.return=N,X.return=N,X.sibling=_n,N.child=X,JH(null,X),X=N.child,_n=x.child.memoizedState,_n===null?_n=k9(_):(ae=_n.cachePool,ae!==null?(tr=O2._currentValue,ae=ae.parent!==tr?{parent:tr,pool:tr}:ae):ae=St(),_n={baseLanes:_n.baseLanes|_,cachePool:ae}),X.memoizedState=_n,X.childLanes=wie(x,nn,_),N.memoizedState=bie,JH(x.child,X)):(P2(N),_=x.child,x=_.sibling,_=d9(_,{mode:"visible",children:X.children}),_.return=N,_.sibling=null,x!==null&&(nn=N.deletions,nn===null?(N.deletions=[x],N.flags|=16):nn.push(x)),N.child=_,N.memoizedState=null,_)}function xW(x,N){return N=$t({mode:"visible",children:N},x.mode),N.return=x,x.child=N}function $t(x,N){return x=k5(22,x,null,N),x.lanes=0,x}function pie(x,N,_){return sb(N,x.child,null,_),x=xW(N,N.pendingProps.children),x.flags|=2,N.memoizedState=null,x}function Q1e(x,N,_){x.lanes|=N;var X=x.alternate;X!==null&&(X.lanes|=N),oP(x.return,N,_)}function vie(x,N,_,X,ae,ge){var nn=x.memoizedState;nn===null?x.memoizedState={isBackwards:N,rendering:null,renderingStartTime:0,last:X,tail:_,tailMode:ae,treeForkCount:ge}:(nn.isBackwards=N,nn.rendering=null,nn.renderingStartTime=0,nn.last=X,nn.tail=_,nn.tailMode=ae,nn.treeForkCount=ge)}function Z1e(x,N,_){var X=N.pendingProps,ae=X.revealOrder,ge=X.tail;X=X.children;var nn=td.current,_n=(nn&2)!==0;if(_n?(nn=nn&1|2,N.flags|=128):nn&=1,sn(td,nn),By(x,N,X,_),X=T1?wB:0,!_n&&x!==null&&(x.flags&128)!==0)e:for(x=N.child;x!==null;){if(x.tag===13)x.memoizedState!==null&&Q1e(x,_,N);else if(x.tag===19)Q1e(x,_,N);else if(x.child!==null){x.child.return=x,x=x.child;continue}if(x===N)break e;for(;x.sibling===null;){if(x.return===null||x.return===N)break e;x=x.return}x.sibling.return=x.return,x=x.sibling}switch(ae){case"forwards":for(_=N.child,ae=null;_!==null;)x=_.alternate,x!==null&&S5(x)===null&&(ae=_),_=_.sibling;_=ae,_===null?(ae=N.child,N.child=null):(ae=_.sibling,_.sibling=null),vie(N,!1,ae,_,ge,X);break;case"backwards":case"unstable_legacy-backwards":for(_=null,ae=N.child,N.child=null;ae!==null;){if(x=ae.alternate,x!==null&&S5(x)===null){N.child=ae;break}x=ae.sibling,ae.sibling=_,_=ae,ae=x}vie(N,!0,_,null,ge,X);break;case"together":vie(N,!1,null,null,void 0,X);break;default:N.memoizedState=null}return N.child}function IL(x,N,_){if(x!==null&&(N.dependencies=x.dependencies),pP|=N.lanes,(_&N.childLanes)===0)if(x!==null){if(xj(x,N,_,!1),(_&N.childLanes)===0)return null}else return null;if(x!==null&&N.child!==x.child)throw Error(A(153));if(N.child!==null){for(x=N.child,_=d9(x,x.pendingProps),N.child=_,_.return=N;x.sibling!==null;)x=x.sibling,_=_.sibling=d9(x,x.pendingProps),_.return=N;_.sibling=null}return N.child}function mie(x,N){return(x.lanes&N)!==0?!0:(x=x.dependencies,!!(x!==null&&pB(x)))}function A4e(x,N,_){switch(N.tag){case 3:_t(N,N.stateNode.containerInfo),jj(N,O2,x.memoizedState.cache),ML();break;case 27:case 5:Jn(N);break;case 4:_t(N,N.stateNode.containerInfo);break;case 10:jj(N,N.type,N.memoizedProps.value);break;case 31:if(N.memoizedState!==null)return N.flags|=128,M0(N),null;break;case 13:var X=N.memoizedState;if(X!==null)return X.dehydrated!==null?(P2(N),N.flags|=128,null):(_&N.child.childLanes)!==0?DL(x,N,_):(P2(N),x=IL(x,N,_),x!==null?x.sibling:null);P2(N);break;case 19:var ae=(x.flags&128)!==0;if(X=(_&N.childLanes)!==0,X||(xj(x,N,_,!1),X=(_&N.childLanes)!==0),ae){if(X)return Z1e(x,N,_);N.flags|=128}if(ae=N.memoizedState,ae!==null&&(ae.rendering=null,ae.tail=null,ae.lastEffect=null),sn(td,td.current),X)break;return null;case 22:return N.lanes=0,die(x,N,_,N.pendingProps);case 24:jj(N,O2,x.memoizedState.cache)}return IL(x,N,_)}function ede(x,N,_){if(x!==null)if(x.memoizedProps!==N.pendingProps)av=!0;else{if(!mie(x,_)&&(N.flags&128)===0)return av=!1,A4e(x,N,_);av=(x.flags&131072)!==0}else av=!1,T1&&(N.flags&1048576)!==0&&lW(N,wB,N.index);switch(N.lanes=0,N.tag){case 16:e:{var X=N.pendingProps;if(x=ii(N.elementType),N.type=x,typeof x=="function")o$(x)?(X=SB(x,X),N.tag=1,N=W1e(null,N,x,X,_)):(N.tag=0,N=gie(null,N,x,X,_));else{if(x!=null){var ae=x.$$typeof;if(ae===we){N.tag=11,N=G1e(null,N,x,X,_);break e}else if(ae===qe){N.tag=14,N=K1e(null,N,x,X,_);break e}}throw N=en(x)||x,Error(A(306,N,""))}}return N;case 0:return gie(x,N,N.type,N.pendingProps,_);case 1:return X=N.type,ae=SB(X,N.pendingProps),W1e(x,N,X,ae,_);case 3:e:{if(_t(N,N.stateNode.containerInfo),x===null)throw Error(A(387));X=N.pendingProps;var ge=N.memoizedState;ae=ge.element,ow(x,N),dp(N,X,null,_);var nn=N.memoizedState;if(X=nn.cache,jj(N,O2,X),X!==ge.cache&&LL(N,[O2],_,!0),_g(),X=nn.element,ge.isDehydrated)if(ge={element:X,isDehydrated:!1,cache:nn.cache},N.updateQueue.baseState=ge,N.memoizedState=ge,N.flags&256){N=Y1e(x,N,X,_);break e}else if(X!==ae){ae=g9(Error(A(424)),N),rC(ae),N=Y1e(x,N,X,_);break e}else{switch(x=N.stateNode.containerInfo,x.nodeType){case 9:x=x.body;break;default:x=x.nodeName==="HTML"?x.ownerDocument.body:x}for(ub=RE(x.firstChild),am=N,T1=!0,Dy=null,Yw=!0,_=Ul(N,null,X,_),N.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling}else{if(ML(),X===ae){N=IL(x,N,_);break e}By(x,N,X,_)}N=N.child}return N;case 26:return jW(x,N),x===null?(_=i0e(N.type,null,N.pendingProps,null))?N.memoizedState=_:T1||(_=N.type,x=N.pendingProps,X=KW(Bn.current).createElement(_),X[ah]=N,X[ed]=x,_y(X,_,x),Rg(X),N.stateNode=X):N.memoizedState=i0e(N.type,x.memoizedProps,N.pendingProps,x.memoizedState),null;case 27:return Jn(N),x===null&&T1&&(X=N.stateNode=Zde(N.type,N.pendingProps,Bn.current),am=N,Yw=!0,ae=ub,EP(N.type)?(nce=ae,ub=RE(X.firstChild)):ub=ae),By(x,N,N.pendingProps.children,_),jW(x,N),x===null&&(N.flags|=4194304),N.child;case 5:return x===null&&T1&&((ae=X=ub)&&(X=W4e(X,N.type,N.pendingProps,Yw),X!==null?(N.stateNode=X,am=N,ub=RE(X.firstChild),Yw=!1,ae=!0):ae=!1),ae||Cj(N)),Jn(N),ae=N.type,ge=N.pendingProps,nn=x!==null?x.memoizedProps:null,X=ge.children,Wie(ae,ge)?X=null:nn!==null&&Wie(ae,nn)&&(N.flags|=32),N.memoizedState!==null&&(ae=BH(x,N,iie,null,null,_),fG._currentValue=ae),jW(x,N),By(x,N,X,_),N.child;case 6:return x===null&&T1&&((x=_=ub)&&(_=Y4e(_,N.pendingProps,Yw),_!==null?(N.stateNode=_,am=N,ub=null,x=!0):x=!1),x||Cj(N)),null;case 13:return DL(x,N,_);case 4:return _t(N,N.stateNode.containerInfo),X=N.pendingProps,x===null?N.child=sb(N,null,X,_):By(x,N,X,_),N.child;case 11:return G1e(x,N,N.type,N.pendingProps,_);case 7:return By(x,N,N.pendingProps,_),N.child;case 8:return By(x,N,N.pendingProps.children,_),N.child;case 12:return By(x,N,N.pendingProps.children,_),N.child;case 10:return X=N.pendingProps,jj(N,N.type,X.value),By(x,N,X.children,_),N.child;case 9:return ae=N.type._context,X=N.pendingProps.children,iC(N),ae=v3(ae),X=X(ae),N.flags|=1,By(x,N,X,_),N.child;case 14:return K1e(x,N,N.type,N.pendingProps,_);case 15:return J1e(x,N,N.type,N.pendingProps,_);case 19:return Z1e(x,N,_);case 31:return S4e(x,N,_);case 22:return die(x,N,_,N.pendingProps);case 24:return iC(N),X=v3(O2),x===null?(ae=Gn(),ae===null&&(ae=ob,ge=aP(),ae.pooledCache=ge,ge.refCount++,ge!==null&&(ae.pooledCacheLanes|=_),ae=ge),N.memoizedState={parent:X,cache:ae},Bs(N),jj(N,O2,ae)):((x.lanes&_)!==0&&(ow(x,N),dp(N,null,null,_),_g()),ae=x.memoizedState,ge=N.memoizedState,ae.parent!==X?(ae={parent:X,cache:X},N.memoizedState=ae,N.lanes===0&&(N.memoizedState=N.updateQueue.baseState=ae),jj(N,O2,X)):(X=ge.cache,jj(N,O2,X),X!==ae.cache&&LL(N,[O2],_,!0))),By(x,N,N.pendingProps.children,_),N.child;case 29:throw N.pendingProps}throw Error(A(156,N.tag))}function BL(x){x.flags|=4}function yie(x,N,_,X,ae){if((N=(x.mode&32)!==0)&&(N=!1),N){if(x.flags|=16777216,(ae&335544128)===ae)if(x.stateNode.complete)x.flags|=8192;else if(vde())x.flags|=8192;else throw wc=xr,bi}else x.flags&=-16777217}function nde(x,N){if(N.type!=="stylesheet"||(N.state.loading&4)!==0)x.flags&=-16777217;else if(x.flags|=16777216,!oce(N))if(vde())x.flags|=8192;else throw wc=xr,bi}function S$(x,N){N!==null&&(x.flags|=4),x.flags&16384&&(N=x.tag!==22?Ho():536870912,x.lanes|=N,x$|=N)}function VH(x,N){if(!T1)switch(x.tailMode){case"hidden":N=x.tail;for(var _=null;N!==null;)N.alternate!==null&&(_=N),N=N.sibling;_===null?x.tail=null:_.sibling=null;break;case"collapsed":_=x.tail;for(var X=null;_!==null;)_.alternate!==null&&(X=_),_=_.sibling;X===null?N||x.tail===null?x.tail=null:x.tail.sibling=null:X.sibling=null}}function lw(x){var N=x.alternate!==null&&x.alternate.child===x.child,_=0,X=0;if(N)for(var ae=x.child;ae!==null;)_|=ae.lanes|ae.childLanes,X|=ae.subtreeFlags&65011712,X|=ae.flags&65011712,ae.return=x,ae=ae.sibling;else for(ae=x.child;ae!==null;)_|=ae.lanes|ae.childLanes,X|=ae.subtreeFlags,X|=ae.flags,ae.return=x,ae=ae.sibling;return x.subtreeFlags|=X,x.childLanes=_,N}function kie(x,N,_){var X=N.pendingProps;switch(h$(N),N.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return lw(N),null;case 1:return lw(N),null;case 3:return _=N.stateNode,X=null,x!==null&&(X=x.memoizedState.cache),N.memoizedState.cache!==X&&(N.flags|=2048),m9(O2),Et(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(x===null||x.child===null)&&(p3(N)?BL(N):x===null||x.memoizedState.isDehydrated&&(N.flags&256)===0||(N.flags|=1024,sP())),lw(N),null;case 26:var ae=N.type,ge=N.memoizedState;return x===null?(BL(N),ge!==null?(lw(N),nde(N,ge)):(lw(N),yie(N,ae,null,X,_))):ge?ge!==x.memoizedState?(BL(N),lw(N),nde(N,ge)):(lw(N),N.flags&=-16777217):(x=x.memoizedProps,x!==X&&BL(N),lw(N),yie(N,ae,x,X,_)),null;case 27:if(At(N),_=Bn.current,ae=N.type,x!==null&&N.stateNode!=null)x.memoizedProps!==X&&BL(N);else{if(!X){if(N.stateNode===null)throw Error(A(166));return lw(N),null}x=gn.current,p3(N)?PH(N):(x=Zde(ae,X,_),N.stateNode=x,BL(N))}return lw(N),null;case 5:if(At(N),ae=N.type,x!==null&&N.stateNode!=null)x.memoizedProps!==X&&BL(N);else{if(!X){if(N.stateNode===null)throw Error(A(166));return lw(N),null}if(ge=gn.current,p3(N))PH(N);else{var nn=KW(Bn.current);switch(ge){case 1:ge=nn.createElementNS("http://www.w3.org/2000/svg",ae);break;case 2:ge=nn.createElementNS("http://www.w3.org/1998/Math/MathML",ae);break;default:switch(ae){case"svg":ge=nn.createElementNS("http://www.w3.org/2000/svg",ae);break;case"math":ge=nn.createElementNS("http://www.w3.org/1998/Math/MathML",ae);break;case"script":ge=nn.createElement("div"),ge.innerHTML=" + diff --git a/web/src/GraphView.tsx b/web/src/GraphView.tsx index 38c0143..d3f1d39 100644 --- a/web/src/GraphView.tsx +++ b/web/src/GraphView.tsx @@ -64,6 +64,15 @@ const cleanType = (t?: string | null) => { const editableCardWidth = (box: CardBox) => Math.max(box.w + 24, 200); +const sameCardBox = (a: CardBox | undefined, b: CardBox) => + a !== undefined && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h; + +const sameCardBoxMap = (a: Record, b: Record) => { + const ids = Object.keys(a); + if (ids.length !== Object.keys(b).length) return false; + return ids.every((id) => sameCardBox(a[id], b[id])); +}; + const connectionPoints = (source: CardBox, target: CardBox) => { const sx = source.x + source.w / 2; const sy = source.y + source.h / 2; @@ -143,7 +152,7 @@ export default function GraphView({ const containerRef = useRef(null); const cyRef = useRef(null); const overlayRef = useRef(null); - const [cardBoxes, setCardBoxes] = useState>({}); + const [cardBoxes, setCardBoxes] = useState>({}); const [viewport, setViewport] = useState<{ pan: { x: number; y: number }; zoom: number }>({ pan: { x: 0, y: 0 }, zoom: 1, @@ -816,43 +825,43 @@ export default function GraphView({ const cy = cyRef.current; if (!cy) return; - let rafId: number | null = null; - - const updateBoxes = () => { - const boxes: Record = {}; + // Viewport synchronization: the overlay wrapper is translated/scaled to + // follow Cytoscape pan/zoom. Node model positions and model-space bounding + // boxes do not change when the user pans or zooms, so this path stays cheap + // and must never re-measure node geometry. + const syncViewport = () => { const pan = cy.pan(); const zoom = cy.zoom(); + setViewport((prev) => + prev.pan.x === pan.x && prev.pan.y === pan.y && prev.zoom === zoom + ? prev + : { pan: { x: pan.x, y: pan.y }, zoom } + ); + }; + // Full geometry synchronization: measure every node's model-space bounding + // box and rebuild the card-box map. Only needed when the graph geometry + // actually changes (initial overlay geometry, and when layout finishes). + const syncAllCardBoxes = () => { + const boxes: Record = {}; cy.nodes().forEach((n) => { const box = n.boundingBox({ includeLabels: true }); boxes[n.id()] = { x: box.x1, y: box.y1, w: box.w, h: box.h }; }); - - setViewport((prev) => { - const samePan = prev.pan.x === pan.x && prev.pan.y === pan.y; - const sameZoom = prev.zoom === zoom; - if (samePan && sameZoom) return prev; - return { pan, zoom }; - }); - setCardBoxes(boxes); + setCardBoxes((prev) => (sameCardBoxMap(prev, boxes) ? prev : boxes)); }; - const scheduleUpdate = () => { - if (rafId !== null) return; - rafId = requestAnimationFrame(() => { - rafId = null; - updateBoxes(); - }); - }; + // Establish initial geometry now, in case layout already completed before + // this effect registered its listener. + syncViewport(); + syncAllCardBoxes(); - updateBoxes(); - cy.on("render", scheduleUpdate); - cy.on("pan zoom", scheduleUpdate); + cy.on("pan zoom", syncViewport); + cy.on("layoutstop", syncAllCardBoxes); return () => { - if (rafId !== null) cancelAnimationFrame(rafId); - cy.off("render", scheduleUpdate); - cy.off("pan zoom", scheduleUpdate); + cy.off("pan zoom", syncViewport); + cy.off("layoutstop", syncAllCardBoxes); }; }, [umlState, theme, umlEdges, graphNodes, showQuantityMetadata, diff]); @@ -901,7 +910,14 @@ export default function GraphView({ const dx = (e.clientX - state.startX) / viewport.zoom; const dy = (e.clientY - state.startY) / viewport.zoom; node.position({ x: state.nodeX + dx, y: state.nodeY + dy }); - cy.emit("render"); + + // Only the dragged node's model position changed: update just its card + // box instead of re-measuring every node in the graph. + const box = node.boundingBox({ includeLabels: true }); + const next: CardBox = { x: box.x1, y: box.y1, w: box.w, h: box.h }; + setCardBoxes((prev) => + sameCardBox(prev[state.id], next) ? prev : { ...prev, [state.id]: next } + ); }, [viewport.zoom] ); diff --git a/web/tests/graph-view-overlay-sync.test.tsx b/web/tests/graph-view-overlay-sync.test.tsx new file mode 100644 index 0000000..e7ab233 --- /dev/null +++ b/web/tests/graph-view-overlay-sync.test.tsx @@ -0,0 +1,184 @@ +import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import GraphView from '../src/GraphView'; +import type { UmlGraphState } from '../src/types/uml'; + +// Records every node id that gets measured via boundingBox({ includeLabels }). +let boundingBoxCalls: string[] = []; + +// Minimal fake Cytoscape core: a real event bus plus the handful of methods +// GraphView touches. Layout never runs, so the test drives `layoutstop` +// explicitly. `boundingBox` pushes the node id so the regression assertions can +// see exactly which nodes were re-measured and when. +function makeFakeCy(nodeIds: string[]) { + const listeners: Record void>> = {}; + + const makeNode = (id: string) => ({ + id: () => id, + data: (key?: string) => { + const d: Record = { id, label: id, rawName: id, module: '' }; + return key ? d[key] : d; + }, + position: (pos?: { x: number; y: number }) => (pos ? undefined : { x: 0, y: 0 }), + empty: () => false, + select: () => {}, + addClass: () => {}, + boundingBox: () => { + boundingBoxCalls.push(id); + return { x1: 0, y1: 0, x2: 120, y2: 60, w: 120, h: 60 }; + }, + }); + + const nodes = nodeIds.map(makeNode); + + const coll = (arr: ReturnType[]) => ({ + forEach: (f: (n: ReturnType) => void) => arr.forEach(f), + filter: (f: (n: ReturnType) => boolean) => coll(arr.filter(f)), + first: () => arr[0] ?? { empty: () => true }, + empty: () => arr.length === 0, + length: arr.length, + }); + + const cy = { + __pan: { x: 0, y: 0 }, + __zoom: 1, + destroy: () => {}, + resize: () => {}, + fit: () => {}, + png: () => null, + animate: () => {}, + minZoom: () => 0.2, + maxZoom: () => 3.5, + pan: () => cy.__pan, + zoom: () => cy.__zoom, + nodes: () => coll(nodes), + $: (sel: string) => coll(sel === 'edge' ? [] : nodes), + getElementById: (id: string) => nodes.find((n) => n.id() === id) ?? { empty: () => true }, + ready: (cb: () => void) => cb(), + on(ev: string, a: unknown, b?: unknown) { + const cb = (b ?? a) as (evt: unknown) => void; + ev.split(/\s+/).forEach((name) => ((listeners[name] ||= []).push(cb))); + }, + off(ev: string, a: unknown, b?: unknown) { + const cb = (b ?? a) as (evt: unknown) => void; + ev.split(/\s+/).forEach((name) => { + listeners[name] = (listeners[name] || []).filter((x) => x !== cb); + }); + }, + one(ev: string, cb: (evt: unknown) => void) { + const wrap = (evt: unknown) => { + cy.off(ev, wrap); + cb(evt); + }; + cy.on(ev, wrap); + }, + emit(ev: string, evt?: unknown) { + ev.split(/\s+/).forEach((name) => { + (listeners[name] || []).slice().forEach((cb) => cb(evt ?? { target: cy })); + }); + }, + }; + + return cy; +} + +let fakeCy: ReturnType; + +vi.mock('cytoscape', () => ({ __esModule: true, default: vi.fn(() => fakeCy) })); +vi.mock('cytoscape-elk', () => ({ __esModule: true, default: vi.fn() })); +vi.mock('elkjs/lib/elk.bundled.js', () => ({ __esModule: true, default: vi.fn() })); + +const CLASS_A = 'pkg.custom_schema.Alpha'; +const CLASS_B = 'pkg.custom_schema.Beta'; + +const umlState: UmlGraphState = { + package: 'pkg.custom_schema', + root: '', + classes: [ + { id: CLASS_A, name: 'Alpha', module: 'pkg.custom_schema', quantities: [] }, + { id: CLASS_B, name: 'Beta', module: 'pkg.custom_schema', quantities: [] }, + ], + edges: [], +}; + +function renderGraph() { + return render( + + ); +} + +describe('GraphView overlay geometry vs. viewport synchronization', () => { + beforeEach(() => { + boundingBoxCalls = []; + fakeCy = makeFakeCy([CLASS_A, CLASS_B]); + }); + + afterEach(() => { + cleanup(); + }); + + it('measures initial geometry and renders overlay cards', () => { + renderGraph(); + expect(new Set(boundingBoxCalls)).toEqual(new Set([CLASS_A, CLASS_B])); + expect(screen.getByText('Alpha')).toBeInTheDocument(); + expect(screen.getByText('Beta')).toBeInTheDocument(); + }); + + it('does not re-measure nodes on pan, zoom or render, but keeps the overlay transform aligned', () => { + const { container } = renderGraph(); + const wrapper = container.querySelector('div[style*="translate"]') as HTMLElement; + expect(wrapper).toBeTruthy(); + + boundingBoxCalls = []; + + fakeCy.__pan = { x: 30, y: 40 }; + act(() => fakeCy.emit('pan')); + expect(boundingBoxCalls).toEqual([]); + expect(wrapper.style.transform).toContain('translate(30px, 40px)'); + + fakeCy.__zoom = 2; + act(() => fakeCy.emit('zoom')); + expect(boundingBoxCalls).toEqual([]); + expect(wrapper.style.transform).toContain('scale(2)'); + + act(() => fakeCy.emit('render')); + expect(boundingBoxCalls).toEqual([]); + }); + + it('re-measures all nodes when the layout finishes', () => { + renderGraph(); + boundingBoxCalls = []; + + act(() => fakeCy.emit('layoutstop')); + + expect(new Set(boundingBoxCalls)).toEqual(new Set([CLASS_A, CLASS_B])); + }); + + it('measures only the dragged node while dragging, not every node', () => { + renderGraph(); + boundingBoxCalls = []; + + const card = screen.getByText('Alpha').closest('.uml-card') as HTMLElement; + expect(card).toBeTruthy(); + + fireEvent.mouseDown(card, { button: 0, clientX: 0, clientY: 0 }); + act(() => { + fireEvent.mouseMove(window, { clientX: 25, clientY: 15 }); + fireEvent.mouseMove(window, { clientX: 60, clientY: 45 }); + }); + fireEvent.mouseUp(window); + + expect(boundingBoxCalls.length).toBeGreaterThan(0); + expect(new Set(boundingBoxCalls)).toEqual(new Set([CLASS_A])); + }); +}); From ca64e2689d27c9417995b0c5c8f8d5f3c951cb46 Mon Sep 17 00:00:00 2001 From: EBB2675 Date: Fri, 4 Sep 2026 13:05:25 +0200 Subject: [PATCH 2/3] strenthen overlay drag test --- web/tests/graph-view-overlay-sync.test.tsx | 57 ++++++++++++++++------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/web/tests/graph-view-overlay-sync.test.tsx b/web/tests/graph-view-overlay-sync.test.tsx index e7ab233..8a6c135 100644 --- a/web/tests/graph-view-overlay-sync.test.tsx +++ b/web/tests/graph-view-overlay-sync.test.tsx @@ -13,21 +13,30 @@ let boundingBoxCalls: string[] = []; function makeFakeCy(nodeIds: string[]) { const listeners: Record void>> = {}; - const makeNode = (id: string) => ({ - id: () => id, - data: (key?: string) => { - const d: Record = { id, label: id, rawName: id, module: '' }; - return key ? d[key] : d; - }, - position: (pos?: { x: number; y: number }) => (pos ? undefined : { x: 0, y: 0 }), - empty: () => false, - select: () => {}, - addClass: () => {}, - boundingBox: () => { - boundingBoxCalls.push(id); - return { x1: 0, y1: 0, x2: 120, y2: 60, w: 120, h: 60 }; - }, - }); + const makeNode = (id: string) => { + let pos = { x: 0, y: 0 }; + return { + id: () => id, + data: (key?: string) => { + const d: Record = { id, label: id, rawName: id, module: '' }; + return key ? d[key] : d; + }, + position: (next?: { x: number; y: number }) => { + if (next) { + pos = { ...next }; + return undefined; + } + return pos; + }, + empty: () => false, + select: () => {}, + addClass: () => {}, + boundingBox: () => { + boundingBoxCalls.push(id); + return { x1: pos.x, y1: pos.y, x2: pos.x + 120, y2: pos.y + 60, w: 120, h: 60 }; + }, + }; + }; const nodes = nodeIds.map(makeNode); @@ -98,7 +107,7 @@ const umlState: UmlGraphState = { { id: CLASS_A, name: 'Alpha', module: 'pkg.custom_schema', quantities: [] }, { id: CLASS_B, name: 'Beta', module: 'pkg.custom_schema', quantities: [] }, ], - edges: [], + edges: [{ source: CLASS_A, target: CLASS_B, type: 'inherits' }], }; function renderGraph() { @@ -181,4 +190,20 @@ describe('GraphView overlay geometry vs. viewport synchronization', () => { expect(boundingBoxCalls.length).toBeGreaterThan(0); expect(new Set(boundingBoxCalls)).toEqual(new Set([CLASS_A])); }); + + it('keeps connector lines following the dragged card (edges are driven by cardBoxes)', () => { + const { container } = renderGraph(); + const line = () => container.querySelector('.uml-edit-edges line') as SVGLineElement; + expect(line()).toBeTruthy(); + const before = line().getAttribute('x1'); + + const card = screen.getByText('Alpha').closest('.uml-card') as HTMLElement; + fireEvent.mouseDown(card, { button: 0, clientX: 0, clientY: 0 }); + act(() => { + fireEvent.mouseMove(window, { clientX: 140, clientY: 90 }); + }); + fireEvent.mouseUp(window); + + expect(line().getAttribute('x1')).not.toEqual(before); + }); }); From d70ad396d67a94807c1db737c43bf534a7c24a80 Mon Sep 17 00:00:00 2001 From: EBB2675 Date: Fri, 4 Sep 2026 13:12:02 +0200 Subject: [PATCH 3/3] Address review: guard sameCardBox, coalesce viewport sync in rAF --- .../{index-C4GIeJ4g.js => index-CMERCfRz.js} | 86 +++++++++---------- ...ex.es-CCxox2Or.js => index.es-BZxAWXQn.js} | 2 +- api/light_mode/static/index.html | 2 +- web/src/GraphView.tsx | 26 ++++-- web/tests/graph-view-overlay-sync.test.tsx | 69 ++++++++++++++- 5 files changed, 130 insertions(+), 55 deletions(-) rename api/light_mode/static/assets/{index-C4GIeJ4g.js => index-CMERCfRz.js} (93%) rename api/light_mode/static/assets/{index.es-CCxox2Or.js => index.es-BZxAWXQn.js} (99%) diff --git a/api/light_mode/static/assets/index-C4GIeJ4g.js b/api/light_mode/static/assets/index-CMERCfRz.js similarity index 93% rename from api/light_mode/static/assets/index-C4GIeJ4g.js rename to api/light_mode/static/assets/index-CMERCfRz.js index 764feb9..86ba89a 100644 --- a/api/light_mode/static/assets/index-C4GIeJ4g.js +++ b/api/light_mode/static/assets/index-CMERCfRz.js @@ -1,12 +1,12 @@ -(function(){const h=document.createElement("link").relList;if(h&&h.supports&&h.supports("modulepreload"))return;for(const C of document.querySelectorAll('link[rel="modulepreload"]'))A(C);new MutationObserver(C=>{for(const M of C)if(M.type==="childList")for(const S of M.addedNodes)S.tagName==="LINK"&&S.rel==="modulepreload"&&A(S)}).observe(document,{childList:!0,subtree:!0});function m(C){const M={};return C.integrity&&(M.integrity=C.integrity),C.referrerPolicy&&(M.referrerPolicy=C.referrerPolicy),C.crossOrigin==="use-credentials"?M.credentials="include":C.crossOrigin==="anonymous"?M.credentials="omit":M.credentials="same-origin",M}function A(C){if(C.ep)return;C.ep=!0;const M=m(C);fetch(C.href,M)}})();var Fjn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function cxn(b){return b&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default")?b.default:b}var tzn={exports:{}},t2n={};var BGn;function wZn(){if(BGn)return t2n;BGn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.fragment");function m(A,C,M){var S=null;if(M!==void 0&&(S=""+M),C.key!==void 0&&(S=""+C.key),"key"in C){M={};for(var P in C)P!=="key"&&(M[P]=C[P])}else M=C;return C=M.ref,{$$typeof:b,type:A,key:S,ref:C!==void 0?C:null,props:M}}return t2n.Fragment=h,t2n.jsx=m,t2n.jsxs=m,t2n}var RGn;function pZn(){return RGn||(RGn=1,tzn.exports=wZn()),tzn.exports}var Mn=pZn(),rzn={exports:{}},A1={};var _Gn;function vZn(){if(_Gn)return A1;_Gn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),A=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),M=Symbol.for("react.consumer"),S=Symbol.for("react.context"),P=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),B=Symbol.for("react.memo"),$=Symbol.for("react.lazy"),V=Symbol.for("react.activity"),ee=Symbol.iterator;function W(rn){return rn===null||typeof rn!="object"?null:(rn=ee&&rn[ee]||rn["@@iterator"],typeof rn=="function"?rn:null)}var Y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},re=Object.assign,oe={};function se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}se.prototype.isReactComponent={},se.prototype.setState=function(rn,Be){if(typeof rn!="object"&&typeof rn!="function"&&rn!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,rn,Be,"setState")},se.prototype.forceUpdate=function(rn){this.updater.enqueueForceUpdate(this,rn,"forceUpdate")};function be(){}be.prototype=se.prototype;function Se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}var we=Se.prototype=new be;we.constructor=Se,re(we,se.prototype),we.isPureReactComponent=!0;var $e=Array.isArray;function Ze(){}var qe={H:null,A:null,T:null,S:null},He=Object.prototype.hasOwnProperty;function Fe(rn,Be,sn){var dn=sn.ref;return{$$typeof:b,type:rn,key:Be,ref:dn!==void 0?dn:null,props:sn}}function Ge(rn,Be){return Fe(rn.type,Be,rn.props)}function De(rn){return typeof rn=="object"&&rn!==null&&rn.$$typeof===b}function Ie(rn){var Be={"=":"=0",":":"=2"};return"$"+rn.replace(/[=:]/g,function(sn){return Be[sn]})}var Z=/\/+/g;function en(rn,Be){return typeof rn=="object"&&rn!==null&&rn.key!=null?Ie(""+rn.key):Be.toString(36)}function vn(rn){switch(rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason;default:switch(typeof rn.status=="string"?rn.then(Ze,Ze):(rn.status="pending",rn.then(function(Be){rn.status==="pending"&&(rn.status="fulfilled",rn.value=Be)},function(Be){rn.status==="pending"&&(rn.status="rejected",rn.reason=Be)})),rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason}}throw rn}function nn(rn,Be,sn,dn,An){var Bn=typeof rn;(Bn==="undefined"||Bn==="boolean")&&(rn=null);var ht=!1;if(rn===null)ht=!0;else switch(Bn){case"bigint":case"string":case"number":ht=!0;break;case"object":switch(rn.$$typeof){case b:case h:ht=!0;break;case $:return ht=rn._init,nn(ht(rn._payload),Be,sn,dn,An)}}if(ht)return An=An(rn),ht=dn===""?"."+en(rn,0):dn,$e(An)?(sn="",ht!=null&&(sn=ht.replace(Z,"$&/")+"/"),nn(An,Be,sn,"",function(Jn){return Jn})):An!=null&&(De(An)&&(An=Ge(An,sn+(An.key==null||rn&&rn.key===An.key?"":(""+An.key).replace(Z,"$&/")+"/")+ht)),Be.push(An)),1;ht=0;var _t=dn===""?".":dn+":";if($e(rn))for(var St=0;St>>1,vt=nn[Zn];if(0>>1;ZnC(sn,hn))dnC(An,sn)?(nn[Zn]=An,nn[dn]=hn,Zn=dn):(nn[Zn]=sn,nn[Be]=hn,Zn=Be);else if(dnC(An,hn))nn[Zn]=An,nn[dn]=hn,Zn=dn;else break e}}return un}function C(nn,un){var hn=nn.sortIndex-un.sortIndex;return hn!==0?hn:nn.id-un.id}if(b.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;b.unstable_now=function(){return M.now()}}else{var S=Date,P=S.now();b.unstable_now=function(){return S.now()-P}}var R=[],B=[],$=1,V=null,ee=3,W=!1,Y=!1,re=!1,oe=!1,se=typeof setTimeout=="function"?setTimeout:null,be=typeof clearTimeout=="function"?clearTimeout:null,Se=typeof setImmediate<"u"?setImmediate:null;function we(nn){for(var un=m(B);un!==null;){if(un.callback===null)A(B);else if(un.startTime<=nn)A(B),un.sortIndex=un.expirationTime,h(R,un);else break;un=m(B)}}function $e(nn){if(re=!1,we(nn),!Y)if(m(R)!==null)Y=!0,Ze||(Ze=!0,Ie());else{var un=m(B);un!==null&&vn($e,un.startTime-nn)}}var Ze=!1,qe=-1,He=5,Fe=-1;function Ge(){return oe?!0:!(b.unstable_now()-Fenn&&Ge());){var Zn=V.callback;if(typeof Zn=="function"){V.callback=null,ee=V.priorityLevel;var vt=Zn(V.expirationTime<=nn);if(nn=b.unstable_now(),typeof vt=="function"){V.callback=vt,we(nn),un=!0;break n}V===m(R)&&A(R),we(nn)}else A(R);V=m(R)}if(V!==null)un=!0;else{var rn=m(B);rn!==null&&vn($e,rn.startTime-nn),un=!1}}break e}finally{V=null,ee=hn,W=!1}un=void 0}}finally{un?Ie():Ze=!1}}}var Ie;if(typeof Se=="function")Ie=function(){Se(De)};else if(typeof MessageChannel<"u"){var Z=new MessageChannel,en=Z.port2;Z.port1.onmessage=De,Ie=function(){en.postMessage(null)}}else Ie=function(){se(De,0)};function vn(nn,un){qe=se(function(){nn(b.unstable_now())},un)}b.unstable_IdlePriority=5,b.unstable_ImmediatePriority=1,b.unstable_LowPriority=4,b.unstable_NormalPriority=3,b.unstable_Profiling=null,b.unstable_UserBlockingPriority=2,b.unstable_cancelCallback=function(nn){nn.callback=null},b.unstable_forceFrameRate=function(nn){0>nn||125Zn?(nn.sortIndex=hn,h(B,nn),m(R)===null&&nn===m(B)&&(re?(be(qe),qe=-1):re=!0,vn($e,hn-Zn))):(nn.sortIndex=vt,h(R,nn),Y||W||(Y=!0,Ze||(Ze=!0,Ie()))),nn},b.unstable_shouldYield=Ge,b.unstable_wrapCallback=function(nn){var un=ee;return function(){var hn=ee;ee=un;try{return nn.apply(this,arguments)}finally{ee=hn}}}})(uzn)),uzn}var qGn;function yZn(){return qGn||(qGn=1,czn.exports=mZn()),czn.exports}var szn={exports:{}},gL={};var zGn;function kZn(){if(zGn)return gL;zGn=1;var b=XHn();function h(R){var B="https://react.dev/errors/"+R;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(b)}catch(h){console.error(h)}}return b(),szn.exports=kZn(),szn.exports}var HGn;function SZn(){if(HGn)return r2n;HGn=1;var b=yZn(),h=XHn(),m=EZn();function A(x){var N="https://react.dev/errors/"+x;if(1vt||(x.current=Zn[vt],Zn[vt]=null,vt--)}function sn(x,N){vt++,Zn[vt]=x.current,x.current=N}var dn=rn(null),An=rn(null),Bn=rn(null),ht=rn(null);function _t(x,N){switch(sn(Bn,N),sn(An,x),sn(dn,null),N.nodeType){case 9:case 11:x=(x=N.documentElement)&&(x=x.namespaceURI)?Gde(x):0;break;default:if(x=N.tagName,N=N.namespaceURI)N=Gde(N),x=Kde(N,x);else switch(x){case"svg":x=1;break;case"math":x=2;break;default:x=0}}Be(dn),sn(dn,x)}function St(){Be(dn),Be(An),Be(Bn)}function Jn(x){x.memoizedState!==null&&sn(ht,x);var N=dn.current,_=Kde(N,x.type);N!==_&&(sn(An,x),sn(dn,_))}function Ct(x){An.current===x&&(Be(dn),Be(An)),ht.current===x&&(Be(ht),hG._currentValue=hn)}var zt,yr;function ni(x){if(zt===void 0)try{throw Error()}catch(_){var N=_.stack.trim().match(/\n( *(at )?)/);zt=N&&N[1]||"",yr=-1<_.stack.indexOf(` +(function(){const h=document.createElement("link").relList;if(h&&h.supports&&h.supports("modulepreload"))return;for(const C of document.querySelectorAll('link[rel="modulepreload"]'))A(C);new MutationObserver(C=>{for(const M of C)if(M.type==="childList")for(const S of M.addedNodes)S.tagName==="LINK"&&S.rel==="modulepreload"&&A(S)}).observe(document,{childList:!0,subtree:!0});function m(C){const M={};return C.integrity&&(M.integrity=C.integrity),C.referrerPolicy&&(M.referrerPolicy=C.referrerPolicy),C.crossOrigin==="use-credentials"?M.credentials="include":C.crossOrigin==="anonymous"?M.credentials="omit":M.credentials="same-origin",M}function A(C){if(C.ep)return;C.ep=!0;const M=m(C);fetch(C.href,M)}})();var Fjn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function cxn(b){return b&&b.__esModule&&Object.prototype.hasOwnProperty.call(b,"default")?b.default:b}var tzn={exports:{}},t2n={};var BGn;function wZn(){if(BGn)return t2n;BGn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.fragment");function m(A,C,M){var S=null;if(M!==void 0&&(S=""+M),C.key!==void 0&&(S=""+C.key),"key"in C){M={};for(var P in C)P!=="key"&&(M[P]=C[P])}else M=C;return C=M.ref,{$$typeof:b,type:A,key:S,ref:C!==void 0?C:null,props:M}}return t2n.Fragment=h,t2n.jsx=m,t2n.jsxs=m,t2n}var RGn;function pZn(){return RGn||(RGn=1,tzn.exports=wZn()),tzn.exports}var Mn=pZn(),rzn={exports:{}},A1={};var _Gn;function vZn(){if(_Gn)return A1;_Gn=1;var b=Symbol.for("react.transitional.element"),h=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),A=Symbol.for("react.strict_mode"),C=Symbol.for("react.profiler"),M=Symbol.for("react.consumer"),S=Symbol.for("react.context"),P=Symbol.for("react.forward_ref"),R=Symbol.for("react.suspense"),B=Symbol.for("react.memo"),$=Symbol.for("react.lazy"),V=Symbol.for("react.activity"),ee=Symbol.iterator;function W(rn){return rn===null||typeof rn!="object"?null:(rn=ee&&rn[ee]||rn["@@iterator"],typeof rn=="function"?rn:null)}var Y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},re=Object.assign,oe={};function se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}se.prototype.isReactComponent={},se.prototype.setState=function(rn,Be){if(typeof rn!="object"&&typeof rn!="function"&&rn!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,rn,Be,"setState")},se.prototype.forceUpdate=function(rn){this.updater.enqueueForceUpdate(this,rn,"forceUpdate")};function be(){}be.prototype=se.prototype;function Se(rn,Be,sn){this.props=rn,this.context=Be,this.refs=oe,this.updater=sn||Y}var we=Se.prototype=new be;we.constructor=Se,re(we,se.prototype),we.isPureReactComponent=!0;var $e=Array.isArray;function Ze(){}var qe={H:null,A:null,T:null,S:null},He=Object.prototype.hasOwnProperty;function Fe(rn,Be,sn){var dn=sn.ref;return{$$typeof:b,type:rn,key:Be,ref:dn!==void 0?dn:null,props:sn}}function Ge(rn,Be){return Fe(rn.type,Be,rn.props)}function De(rn){return typeof rn=="object"&&rn!==null&&rn.$$typeof===b}function Ie(rn){var Be={"=":"=0",":":"=2"};return"$"+rn.replace(/[=:]/g,function(sn){return Be[sn]})}var Z=/\/+/g;function en(rn,Be){return typeof rn=="object"&&rn!==null&&rn.key!=null?Ie(""+rn.key):Be.toString(36)}function vn(rn){switch(rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason;default:switch(typeof rn.status=="string"?rn.then(Ze,Ze):(rn.status="pending",rn.then(function(Be){rn.status==="pending"&&(rn.status="fulfilled",rn.value=Be)},function(Be){rn.status==="pending"&&(rn.status="rejected",rn.reason=Be)})),rn.status){case"fulfilled":return rn.value;case"rejected":throw rn.reason}}throw rn}function nn(rn,Be,sn,dn,An){var Bn=typeof rn;(Bn==="undefined"||Bn==="boolean")&&(rn=null);var ht=!1;if(rn===null)ht=!0;else switch(Bn){case"bigint":case"string":case"number":ht=!0;break;case"object":switch(rn.$$typeof){case b:case h:ht=!0;break;case $:return ht=rn._init,nn(ht(rn._payload),Be,sn,dn,An)}}if(ht)return An=An(rn),ht=dn===""?"."+en(rn,0):dn,$e(An)?(sn="",ht!=null&&(sn=ht.replace(Z,"$&/")+"/"),nn(An,Be,sn,"",function(Jn){return Jn})):An!=null&&(De(An)&&(An=Ge(An,sn+(An.key==null||rn&&rn.key===An.key?"":(""+An.key).replace(Z,"$&/")+"/")+ht)),Be.push(An)),1;ht=0;var _t=dn===""?".":dn+":";if($e(rn))for(var St=0;St>>1,vt=nn[Zn];if(0>>1;ZnC(sn,hn))dnC(An,sn)?(nn[Zn]=An,nn[dn]=hn,Zn=dn):(nn[Zn]=sn,nn[Be]=hn,Zn=Be);else if(dnC(An,hn))nn[Zn]=An,nn[dn]=hn,Zn=dn;else break e}}return un}function C(nn,un){var hn=nn.sortIndex-un.sortIndex;return hn!==0?hn:nn.id-un.id}if(b.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var M=performance;b.unstable_now=function(){return M.now()}}else{var S=Date,P=S.now();b.unstable_now=function(){return S.now()-P}}var R=[],B=[],$=1,V=null,ee=3,W=!1,Y=!1,re=!1,oe=!1,se=typeof setTimeout=="function"?setTimeout:null,be=typeof clearTimeout=="function"?clearTimeout:null,Se=typeof setImmediate<"u"?setImmediate:null;function we(nn){for(var un=m(B);un!==null;){if(un.callback===null)A(B);else if(un.startTime<=nn)A(B),un.sortIndex=un.expirationTime,h(R,un);else break;un=m(B)}}function $e(nn){if(re=!1,we(nn),!Y)if(m(R)!==null)Y=!0,Ze||(Ze=!0,Ie());else{var un=m(B);un!==null&&vn($e,un.startTime-nn)}}var Ze=!1,qe=-1,He=5,Fe=-1;function Ge(){return oe?!0:!(b.unstable_now()-Fenn&&Ge());){var Zn=V.callback;if(typeof Zn=="function"){V.callback=null,ee=V.priorityLevel;var vt=Zn(V.expirationTime<=nn);if(nn=b.unstable_now(),typeof vt=="function"){V.callback=vt,we(nn),un=!0;break n}V===m(R)&&A(R),we(nn)}else A(R);V=m(R)}if(V!==null)un=!0;else{var rn=m(B);rn!==null&&vn($e,rn.startTime-nn),un=!1}}break e}finally{V=null,ee=hn,W=!1}un=void 0}}finally{un?Ie():Ze=!1}}}var Ie;if(typeof Se=="function")Ie=function(){Se(De)};else if(typeof MessageChannel<"u"){var Z=new MessageChannel,en=Z.port2;Z.port1.onmessage=De,Ie=function(){en.postMessage(null)}}else Ie=function(){se(De,0)};function vn(nn,un){qe=se(function(){nn(b.unstable_now())},un)}b.unstable_IdlePriority=5,b.unstable_ImmediatePriority=1,b.unstable_LowPriority=4,b.unstable_NormalPriority=3,b.unstable_Profiling=null,b.unstable_UserBlockingPriority=2,b.unstable_cancelCallback=function(nn){nn.callback=null},b.unstable_forceFrameRate=function(nn){0>nn||125Zn?(nn.sortIndex=hn,h(B,nn),m(R)===null&&nn===m(B)&&(re?(be(qe),qe=-1):re=!0,vn($e,hn-Zn))):(nn.sortIndex=vt,h(R,nn),Y||W||(Y=!0,Ze||(Ze=!0,Ie()))),nn},b.unstable_shouldYield=Ge,b.unstable_wrapCallback=function(nn){var un=ee;return function(){var hn=ee;ee=un;try{return nn.apply(this,arguments)}finally{ee=hn}}}})(uzn)),uzn}var qGn;function yZn(){return qGn||(qGn=1,czn.exports=mZn()),czn.exports}var szn={exports:{}},gL={};var zGn;function kZn(){if(zGn)return gL;zGn=1;var b=XHn();function h(R){var B="https://react.dev/errors/"+R;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(b)}catch(h){console.error(h)}}return b(),szn.exports=kZn(),szn.exports}var HGn;function SZn(){if(HGn)return r2n;HGn=1;var b=yZn(),h=XHn(),m=EZn();function A(x){var N="https://react.dev/errors/"+x;if(1vt||(x.current=Zn[vt],Zn[vt]=null,vt--)}function sn(x,N){vt++,Zn[vt]=x.current,x.current=N}var dn=rn(null),An=rn(null),Bn=rn(null),ht=rn(null);function _t(x,N){switch(sn(Bn,N),sn(An,x),sn(dn,null),N.nodeType){case 9:case 11:x=(x=N.documentElement)&&(x=x.namespaceURI)?Gde(x):0;break;default:if(x=N.tagName,N=N.namespaceURI)N=Gde(N),x=Kde(N,x);else switch(x){case"svg":x=1;break;case"math":x=2;break;default:x=0}}Be(dn),sn(dn,x)}function St(){Be(dn),Be(An),Be(Bn)}function Jn(x){x.memoizedState!==null&&sn(ht,x);var N=dn.current,_=Kde(N,x.type);N!==_&&(sn(An,x),sn(dn,_))}function Ct(x){An.current===x&&(Be(dn),Be(An)),ht.current===x&&(Be(ht),hG._currentValue=hn)}var qt,yr;function ti(x){if(qt===void 0)try{throw Error()}catch(_){var N=_.stack.trim().match(/\n( *(at )?)/);qt=N&&N[1]||"",yr=-1<_.stack.indexOf(` at`)?" ()":-1<_.stack.indexOf("@")?"@unknown:0:0":""}return` -`+zt+x+yr}var En=!1;function Ti(x,N){if(!x||En)return"";En=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var X={DetermineComponentFrameRoot:function(){try{if(N){var Gc=function(){throw Error()};if(Object.defineProperty(Gc.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Gc,[])}catch(uc){var zi=uc}Reflect.construct(x,[],Gc)}else{try{Gc.call()}catch(uc){zi=uc}x.call(Gc.prototype)}}else{try{throw Error()}catch(uc){zi=uc}(Gc=x())&&typeof Gc.catch=="function"&&Gc.catch(function(){})}}catch(uc){if(uc&&zi&&typeof uc.stack=="string")return[uc.stack,zi.stack]}return[null,null]}};X.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var ae=Object.getOwnPropertyDescriptor(X.DetermineComponentFrameRoot,"name");ae&&ae.configurable&&Object.defineProperty(X.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var ge=X.DetermineComponentFrameRoot(),tn=ge[0],_n=ge[1];if(tn&&_n){var rr=tn.split(` +`+qt+x+yr}var En=!1;function Ti(x,N){if(!x||En)return"";En=!0;var _=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var X={DetermineComponentFrameRoot:function(){try{if(N){var Gc=function(){throw Error()};if(Object.defineProperty(Gc.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(Gc,[])}catch(sc){var zi=sc}Reflect.construct(x,[],Gc)}else{try{Gc.call()}catch(sc){zi=sc}x.call(Gc.prototype)}}else{try{throw Error()}catch(sc){zi=sc}(Gc=x())&&typeof Gc.catch=="function"&&Gc.catch(function(){})}}catch(sc){if(sc&&zi&&typeof sc.stack=="string")return[sc.stack,zi.stack]}return[null,null]}};X.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var ae=Object.getOwnPropertyDescriptor(X.DetermineComponentFrameRoot,"name");ae&&ae.configurable&&Object.defineProperty(X.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var ge=X.DetermineComponentFrameRoot(),tn=ge[0],_n=ge[1];if(tn&&_n){var rr=tn.split(` `),ji=_n.split(` `);for(ae=X=0;Xae||rr[X]!==ji[ae]){var Oc=` -`+rr[X].replace(" at new "," at ");return x.displayName&&Oc.includes("")&&(Oc=Oc.replace("",x.displayName)),Oc}while(1<=X&&0<=ae);break}}}finally{En=!1,Error.prepareStackTrace=_}return(_=x?x.displayName||x.name:"")?ni(_):""}function Wc(x,N){switch(x.tag){case 26:case 27:case 5:return ni(x.type);case 16:return ni("Lazy");case 13:return x.child!==N&&N!==null?ni("Suspense Fallback"):ni("Suspense");case 19:return ni("SuspenseList");case 0:case 15:return Ti(x.type,!1);case 11:return Ti(x.type.render,!1);case 1:return Ti(x.type,!0);case 31:return ni("Activity");default:return""}}function _c(x){try{var N="",_=null;do N+=Wc(x,_),_=x,x=x.return;while(x);return N}catch(X){return` +`+rr[X].replace(" at new "," at ");return x.displayName&&Oc.includes("")&&(Oc=Oc.replace("",x.displayName)),Oc}while(1<=X&&0<=ae);break}}}finally{En=!1,Error.prepareStackTrace=_}return(_=x?x.displayName||x.name:"")?ti(_):""}function Wc(x,N){switch(x.tag){case 26:case 27:case 5:return ti(x.type);case 16:return ti("Lazy");case 13:return x.child!==N&&N!==null?ti("Suspense Fallback"):ti("Suspense");case 19:return ti("SuspenseList");case 0:case 15:return Ti(x.type,!1);case 11:return Ti(x.type.render,!1);case 1:return Ti(x.type,!0);case 31:return ti("Activity");default:return""}}function _c(x){try{var N="",_=null;do N+=Wc(x,_),_=x,x=x.return;while(x);return N}catch(X){return` Error generating stack: `+X.message+` -`+X.stack}}var Jr=Object.prototype.hasOwnProperty,yi=b.unstable_scheduleCallback,ki=b.unstable_cancelCallback,$c=b.unstable_shouldYield,Hi=b.unstable_requestPaint,ac=b.unstable_now,fs=b.unstable_getCurrentPriorityLevel,Fu=b.unstable_ImmediatePriority,Zs=b.unstable_UserBlockingPriority,Is=b.unstable_NormalPriority,$u=b.unstable_LowPriority,vu=b.unstable_IdlePriority,kc=b.log,Fi=b.unstable_setDisableYieldValue,Ln=null,Cn=null;function at(x){if(typeof kc=="function"&&Fi(x),Cn&&typeof Cn.setStrictMode=="function")try{Cn.setStrictMode(Ln,x)}catch{}}var nr=Math.clz32?Math.clz32:Ir,qt=Math.log,wc=Math.LN2;function Ir(x){return x>>>=0,x===0?32:31-(qt(x)/wc|0)|0}var fc=256,ti=262144,Lc=4194304;function Ji(x){var N=x&42;if(N!==0)return N;switch(x&-x){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:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return x&261888;case 262144:case 524288:case 1048576:case 2097152:return x&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return x&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return x}}function hu(x,N,_){var X=x.pendingLanes;if(X===0)return 0;var ae=0,ge=x.suspendedLanes,tn=x.pingedLanes;x=x.warmLanes;var _n=X&134217727;return _n!==0?(X=_n&~ge,X!==0?ae=Ji(X):(tn&=_n,tn!==0?ae=Ji(tn):_||(_=_n&~x,_!==0&&(ae=Ji(_))))):(_n=X&~ge,_n!==0?ae=Ji(_n):tn!==0?ae=Ji(tn):_||(_=X&~x,_!==0&&(ae=Ji(_)))),ae===0?0:N!==0&&N!==ae&&(N&ge)===0&&(ge=ae&-ae,_=N&-N,ge>=_||ge===32&&(_&4194048)!==0)?N:ae}function is(x,N){return(x.pendingLanes&~(x.suspendedLanes&~x.pingedLanes)&N)===0}function mo(x,N){switch(x){case 1:case 2:case 4:case 8:case 64:return N+250;case 16:case 32: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+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function Go(){var x=Lc;return Lc<<=1,(Lc&62914560)===0&&(Lc=4194304),x}function ph(x){for(var N=[],_=0;31>_;_++)N.push(x);return N}function mu(x,N){x.pendingLanes|=N,N!==268435456&&(x.suspendedLanes=0,x.pingedLanes=0,x.warmLanes=0)}function Ka(x,N,_,X,ae,ge){var tn=x.pendingLanes;x.pendingLanes=_,x.suspendedLanes=0,x.pingedLanes=0,x.warmLanes=0,x.expiredLanes&=_,x.entangledLanes&=_,x.errorRecoveryDisabledLanes&=_,x.shellSuspendCounter=0;var _n=x.entanglements,rr=x.expirationTimes,ji=x.hiddenUpdates;for(_=tn&~_;0<_;){var Oc=31-nr(_),Gc=1<"u")return null;try{return x.activeElement||x.body}catch{return x.body}}var l0=/[\n"\\]/g;function Kw(x){return x.replace(l0,function(N){return"\\"+N.charCodeAt(0).toString(16)+" "})}function Pb(x,N,_,X,ae,ge,tn,_n){x.name="",tn!=null&&typeof tn!="function"&&typeof tn!="symbol"&&typeof tn!="boolean"?x.type=tn:x.removeAttribute("type"),N!=null?tn==="number"?(N===0&&x.value===""||x.value!=N)&&(x.value=""+Yl(N)):x.value!==""+Yl(N)&&(x.value=""+Yl(N)):tn!=="submit"&&tn!=="reset"||x.removeAttribute("value"),N!=null?GA(x,tn,Yl(N)):_!=null?GA(x,tn,Yl(_)):X!=null&&x.removeAttribute("value"),ae==null&&ge!=null&&(x.defaultChecked=!!ge),ae!=null&&(x.checked=ae&&typeof ae!="function"&&typeof ae!="symbol"),_n!=null&&typeof _n!="function"&&typeof _n!="symbol"&&typeof _n!="boolean"?x.name=""+Yl(_n):x.removeAttribute("name")}function o9(x,N,_,X,ae,ge,tn,_n){if(ge!=null&&typeof ge!="function"&&typeof ge!="symbol"&&typeof ge!="boolean"&&(x.type=ge),N!=null||_!=null){if(!(ge!=="submit"&&ge!=="reset"||N!=null)){Gw(x);return}_=_!=null?""+Yl(_):"",N=N!=null?""+Yl(N):_,_n||N===x.value||(x.value=N),x.defaultValue=N}X=X??ae,X=typeof X!="function"&&typeof X!="symbol"&&!!X,x.checked=_n?x.checked:!!X,x.defaultChecked=!!X,tn!=null&&typeof tn!="function"&&typeof tn!="symbol"&&typeof tn!="boolean"&&(x.name=tn),Gw(x)}function GA(x,N,_){N==="number"&&Ph(x.ownerDocument)===x||x.defaultValue===""+_||(x.defaultValue=""+_)}function B7(x,N,_,X){if(x=x.options,N){N={};for(var ae=0;ae<_.length;ae++)N["$"+_[ae]]=!0;for(_=0;_"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),h0=!1;if(m5)try{var op={};Object.defineProperty(op,"passive",{get:function(){h0=!0}}),window.addEventListener("test",op,op),window.removeEventListener("test",op,op)}catch{h0=!1}var y5=null,Sj=null,Ny=null;function a9(){if(Ny)return Ny;var x,N=Sj,_=N.length,X,ae="value"in y5?y5.value:y5.textContent,ge=ae.length;for(x=0;x<_&&N[x]===ae[x];x++);var tn=_-x;for(X=1;X<=tn&&N[_-X]===ae[ge-X];X++);return Ny=ae.slice(x,1=r8),YA=" ",QA=!1;function tv(x,N){switch(x){case"keyup":return Cj.indexOf(N.keyCode)!==-1;case"keydown":return N.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function F7(x){return x=x.detail,typeof x=="object"&&"data"in x?x.data:null}var Iy=!1;function AL(x,N){switch(x){case"compositionend":return F7(N);case"keypress":return N.which!==32?null:(QA=!0,YA);case"textInput":return x=N.data,x===YA&&QA?null:x;default:return null}}function k5(x,N){if(Iy)return x==="compositionend"||!t8&&tv(x,N)?(x=a9(),Ny=Sj=y5=null,Iy=!1,x):null;switch(x){case"paste":return null;case"keypress":if(!(N.ctrlKey||N.altKey||N.metaKey)||N.ctrlKey&&N.altKey){if(N.char&&1=N)return{node:_,offset:N-x};x=X}e:{for(;_;){if(_.nextSibling){_=_.nextSibling;break e}_=_.parentNode}_=void 0}_=so(_)}}function ap(x,N){return x&&N?x===N?!0:x&&x.nodeType===3?!1:N&&N.nodeType===3?ap(x,N.parentNode):"contains"in x?x.contains(N):x.compareDocumentPosition?!!(x.compareDocumentPosition(N)&16):!1:!1}function im(x){x=x!=null&&x.ownerDocument!=null&&x.ownerDocument.defaultView!=null?x.ownerDocument.defaultView:window;for(var N=Ph(x.document);N instanceof x.HTMLIFrameElement;){try{var _=typeof N.contentWindow.location.href=="string"}catch{_=!1}if(_)x=N.contentWindow;else break;N=Ph(x.document)}return N}function d3(x){var N=x&&x.nodeName&&x.nodeName.toLowerCase();return N&&(N==="input"&&(x.type==="text"||x.type==="search"||x.type==="tel"||x.type==="url"||x.type==="password")||N==="textarea"||x.contentEditable==="true")}var cm=m5&&"documentMode"in document&&11>=document.documentMode,Xw=null,Ll=null,E5=null,um=!1;function L2(x,N,_){var X=_.window===_?_.document:_.nodeType===9?_:_.ownerDocument;um||Xw==null||Xw!==Ph(X)||(X=Xw,"selectionStart"in X&&d3(X)?X={start:X.selectionStart,end:X.selectionEnd}:(X=(X.ownerDocument&&X.ownerDocument.defaultView||window).getSelection(),X={anchorNode:X.anchorNode,anchorOffset:X.anchorOffset,focusNode:X.focusNode,focusOffset:X.focusOffset}),E5&&Ja(E5,X)||(E5=X,X=GW(Ll,"onSelect"),0>=tn,ae-=tn,b9=1<<32-nr(N)+ae|_<Hl?(Xh=ya,ya=null):Xh=ya.sibling;var g0=zi(Wr,ya,Ei[Hl],Sc);if(g0===null){ya===null&&(ya=Xh);break}x&&ya&&g0.alternate===null&&N(Wr,ya),Er=ge(g0,Er,Hl),d0===null?Va=g0:d0.sibling=g0,d0=g0,ya=Xh}if(Hl===Ei.length)return _(Wr,ya),x1&&c8(Wr,Hl),Va;if(ya===null){for(;HlHl?(Xh=ya,ya=null):Xh=ya.sibling;var TP=zi(Wr,ya,g0.value,Sc);if(TP===null){ya===null&&(ya=Xh);break}x&&ya&&TP.alternate===null&&N(Wr,ya),Er=ge(TP,Er,Hl),d0===null?Va=TP:d0.sibling=TP,d0=TP,ya=Xh}if(g0.done)return _(Wr,ya),x1&&c8(Wr,Hl),Va;if(ya===null){for(;!g0.done;Hl++,g0=Ei.next())g0=Gc(Wr,g0.value,Sc),g0!==null&&(Er=ge(g0,Er,Hl),d0===null?Va=g0:d0.sibling=g0,d0=g0);return x1&&c8(Wr,Hl),Va}for(ya=X(ya);!g0.done;Hl++,g0=Ei.next())g0=uc(ya,Wr,Hl,g0.value,Sc),g0!==null&&(x&&g0.alternate!==null&&ya.delete(g0.key===null?Hl:g0.key),Er=ge(g0,Er,Hl),d0===null?Va=g0:d0.sibling=g0,d0=g0);return x&&ya.forEach(function(zL){return N(Wr,zL)}),x1&&c8(Wr,Hl),Va}function Sg(Wr,Er,Ei,Sc){if(typeof Ei=="object"&&Ei!==null&&Ei.type===re&&Ei.key===null&&(Ei=Ei.props.children),typeof Ei=="object"&&Ei!==null){switch(Ei.$$typeof){case W:e:{for(var Va=Ei.key;Er!==null;){if(Er.key===Va){if(Va=Ei.type,Va===re){if(Er.tag===7){_(Wr,Er.sibling),Sc=ae(Er,Ei.props.children),Sc.return=Wr,Wr=Sc;break e}}else if(Er.elementType===Va||typeof Va=="object"&&Va!==null&&Va.$$typeof===He&&ri(Va)===Er.type){_(Wr,Er.sibling),Sc=ae(Er,Ei.props),sl(Sc,Ei),Sc.return=Wr,Wr=Sc;break e}_(Wr,Er);break}else N(Wr,Er);Er=Er.sibling}Ei.type===re?(Sc=Tj(Ei.props.children,Wr.mode,Sc,Ei.key),Sc.return=Wr,Wr=Sc):(Sc=uP(Ei.type,Ei.key,Ei.props,null,Wr.mode,Sc),sl(Sc,Ei),Sc.return=Wr,Wr=Sc)}return tn(Wr);case Y:e:{for(Va=Ei.key;Er!==null;){if(Er.key===Va)if(Er.tag===4&&Er.stateNode.containerInfo===Ei.containerInfo&&Er.stateNode.implementation===Ei.implementation){_(Wr,Er.sibling),Sc=ae(Er,Ei.children||[]),Sc.return=Wr,Wr=Sc;break e}else{_(Wr,Er);break}else N(Wr,Er);Er=Er.sibling}Sc=sP(Ei,Wr.mode,Sc),Sc.return=Wr,Wr=Sc}return tn(Wr);case He:return Ei=ri(Ei),Sg(Wr,Er,Ei,Sc)}if(vn(Ei))return ia(Wr,Er,Ei,Sc);if(Ie(Ei)){if(Va=Ie(Ei),typeof Va!="function")throw Error(A(150));return Ei=Va.call(Ei),kf(Wr,Er,Ei,Sc)}if(typeof Ei.then=="function")return Sg(Wr,Er,ko(Ei),Sc);if(Ei.$$typeof===Se)return Sg(Wr,Er,mB(Wr,Ei),Sc);Ko(Wr,Ei)}return typeof Ei=="string"&&Ei!==""||typeof Ei=="number"||typeof Ei=="bigint"?(Ei=""+Ei,Er!==null&&Er.tag===6?(_(Wr,Er.sibling),Sc=ae(Er,Ei),Sc.return=Wr,Wr=Sc):(_(Wr,Er),Sc=wB(Ei,Wr.mode,Sc),Sc.return=Wr,Wr=Sc),tn(Wr)):_(Wr,Er)}return function(Wr,Er,Ei,Sc){try{Yo=0;var Va=Sg(Wr,Er,Ei,Sc);return Jc=null,Va}catch(ya){if(ya===vr||ya===Et)throw ya;var d0=A5(29,ya,null,Wr.mode);return d0.lanes=Sc,d0.return=Wr,d0}finally{}}}var lb=h1(!0),zl=h1(!1),Eo=!1;function Bs(x){x.updateQueue={baseState:x.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function aw(x,N){x=x.updateQueue,N.updateQueue===x&&(N.updateQueue={baseState:x.baseState,firstBaseUpdate:x.firstBaseUpdate,lastBaseUpdate:x.lastBaseUpdate,shared:x.shared,callbacks:null})}function yf(x){return{lane:x,tag:0,payload:null,callback:null,next:null}}function Ul(x,N,_){var X=x.updateQueue;if(X===null)return null;if(X=X.shared,(I0&2)!==0){var ae=X.pending;return ae===null?N.next=N:(N.next=ae.next,ae.next=N),X.pending=N,N=S5(x),gB(x,null,_),N}return dB(x,X,N,_),S5(x)}function P0(x,N,_){if(N=N.updateQueue,N!==null&&(N=N.shared,(_&4194048)!==0)){var X=N.lanes;X&=x.pendingLanes,_|=X,N.lanes=_,Nh(x,_)}}function iv(x,N){var _=x.updateQueue,X=x.alternate;if(X!==null&&(X=X.updateQueue,_===X)){var ae=null,ge=null;if(_=_.firstBaseUpdate,_!==null){do{var tn={lane:_.lane,tag:_.tag,payload:_.payload,callback:null,next:null};ge===null?ae=ge=tn:ge=ge.next=tn,_=_.next}while(_!==null);ge===null?ae=ge=N:ge=ge.next=N}else ae=ge=N;_={baseState:X.baseState,firstBaseUpdate:ae,lastBaseUpdate:ge,shared:X.shared,callbacks:X.callbacks},x.updateQueue=_;return}x=_.lastBaseUpdate,x===null?_.firstBaseUpdate=N:x.next=N,_.lastBaseUpdate=N}var p3=!1;function qg(){if(p3){var x=de;if(x!==null)throw x}}function fp(x,N,_,X){p3=!1;var ae=x.updateQueue;Eo=!1;var ge=ae.firstBaseUpdate,tn=ae.lastBaseUpdate,_n=ae.shared.pending;if(_n!==null){ae.shared.pending=null;var rr=_n,ji=rr.next;rr.next=null,tn===null?ge=ji:tn.next=ji,tn=rr;var Oc=x.alternate;Oc!==null&&(Oc=Oc.updateQueue,_n=Oc.lastBaseUpdate,_n!==tn&&(_n===null?Oc.firstBaseUpdate=ji:_n.next=ji,Oc.lastBaseUpdate=rr))}if(ge!==null){var Gc=ae.baseState;tn=0,Oc=ji=rr=null,_n=ge;do{var zi=_n.lane&-536870913,uc=zi!==_n.lane;if(uc?(K1&zi)===zi:(X&zi)===zi){zi!==0&&zi===ie&&(p3=!0),Oc!==null&&(Oc=Oc.next={lane:0,tag:_n.tag,payload:_n.payload,callback:null,next:null});e:{var ia=x,kf=_n;zi=N;var Sg=_;switch(kf.tag){case 1:if(ia=kf.payload,typeof ia=="function"){Gc=ia.call(Sg,Gc,zi);break e}Gc=ia;break e;case 3:ia.flags=ia.flags&-65537|128;case 0:if(ia=kf.payload,zi=typeof ia=="function"?ia.call(Sg,Gc,zi):ia,zi==null)break e;Gc=V({},Gc,zi);break e;case 2:Eo=!0}}zi=_n.callback,zi!==null&&(x.flags|=64,uc&&(x.flags|=8192),uc=ae.callbacks,uc===null?ae.callbacks=[zi]:uc.push(zi))}else uc={lane:zi,tag:_n.tag,payload:_n.payload,callback:_n.callback,next:null},Oc===null?(ji=Oc=uc,rr=Gc):Oc=Oc.next=uc,tn|=zi;if(_n=_n.next,_n===null){if(_n=ae.shared.pending,_n===null)break;uc=_n,_n=uc.next,uc.next=null,ae.lastBaseUpdate=uc,ae.shared.pending=null}}while(!0);Oc===null&&(rr=Gc),ae.baseState=rr,ae.firstBaseUpdate=ji,ae.lastBaseUpdate=Oc,ge===null&&(ae.shared.lanes=0),mP|=tn,x.lanes=tn,x.memoizedState=Gc}}function C5(x,N){if(typeof x!="function")throw Error(A(191,x));x.call(N)}function lp(x,N){var _=x.callbacks;if(_!==null)for(x.callbacks=null,x=0;x<_.length;x++)C5(_[x],N)}var Dh=rn(null),Sd=rn(0);function fw(x,N){x=_L,sn(Sd,x),sn(Dh,N),_L=x|N.baseLanes}function qd(){sn(Sd,_L),sn(Dh,Dh.current)}function cv(){_L=Sd.current,Be(Dh),Be(Sd)}var lw=rn(null),Ad=null;function O2(x){var N=x.alternate;sn(id,id.current&1),sn(lw,x),Ad===null&&(N===null||Dh.current!==null||N.memoizedState!==null)&&(Ad=x)}function D0(x){sn(id,id.current),sn(lw,x),Ad===null&&(Ad=x)}function hp(x){x.tag===22?(sn(id,id.current),sn(lw,x),Ad===null&&(Ad=x)):dp()}function dp(){sn(id,id.current),sn(lw,lw.current)}function kg(x){Be(lw),Ad===x&&(Ad=null),Be(id)}var id=rn(0);function T5(x){for(var N=x;N!==null;){if(N.tag===13){var _=N.memoizedState;if(_!==null&&(_=_.dehydrated,_===null||Zie(_)||ece(_)))return N}else if(N.tag===19&&(N.memoizedProps.revealOrder==="forwards"||N.memoizedProps.revealOrder==="backwards"||N.memoizedProps.revealOrder==="unstable_legacy-backwards"||N.memoizedProps.revealOrder==="together")){if((N.flags&128)!==0)return N}else if(N.child!==null){N.child.return=N,N=N.child;continue}if(N===x)break;for(;N.sibling===null;){if(N.return===null||N.return===x)return null;N=N.return}N.sibling.return=N.return,N=N.sibling}return null}var Qw=0,Qa=null,uf=null,Cd=null,J4=!1,v9=!1,Ry=!1,gp=0,Oj=0,Pj=null,p$=0;function zg(){throw Error(A(321))}function RH(x,N){if(N===null)return!1;for(var _=0;_ge?ge:8;var tn=nn.T,_n={};nn.T=_n,aie(x,!1,N,_);try{var rr=ae(),ji=nn.S;if(ji!==null&&ji(_n,rr),rr!==null&&typeof rr=="object"&&typeof rr.then=="function"){var Oc=wn(rr,X);JH(x,N,Oc,G7(x))}else JH(x,N,X,G7(x))}catch(Gc){JH(x,N,{then:function(){},status:"rejected",reason:Gc},G7())}finally{un.p=ge,tn!==null&&_n.types!==null&&(tn.types=_n.types),nn.T=tn}}function sie(){}function KH(x,N,_,X){if(x.tag!==5)throw Error(A(476));var ae=D1e(x).queue;P1e(x,ae,N,hn,_===null?sie:function(){return yW(x),_(X)})}function D1e(x){var N=x.memoizedState;if(N!==null)return N;N={memoizedState:hn,baseState:hn,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ME,lastRenderedState:hn},next:null};var _={};return N.next={memoizedState:_,baseState:_,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:ME,lastRenderedState:_},next:null},x.memoizedState=N,x=x.alternate,x!==null&&(x.memoizedState=N),N}function yW(x){var N=D1e(x);N.next===null&&(N=x.alternate.memoizedState),JH(x,N.next.queue,{},G7())}function oie(){return w3(hG)}function I1e(){return Zw().memoizedState}function B1e(){return Zw().memoizedState}function v4e(x){for(var N=x.return;N!==null;){switch(N.tag){case 24:case 3:var _=G7();x=yf(_);var X=Ul(N,x,_);X!==null&&(S9(X,N,_),P0(X,N,_)),N={cache:lP()},x.payload=N;return}N=N.return}}function m4e(x,N,_){var X=G7();_={lane:X,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null},kW(x)?_1e(N,_):(_=o$(x,N,_,X),_!==null&&(S9(_,x,X),F1e(_,N,X)))}function R1e(x,N,_){var X=G7();JH(x,N,_,X)}function JH(x,N,_,X){var ae={lane:X,revertLane:0,gesture:null,action:_,hasEagerState:!1,eagerState:null,next:null};if(kW(x))_1e(N,ae);else{var ge=x.alternate;if(x.lanes===0&&(ge===null||ge.lanes===0)&&(ge=N.lastRenderedReducer,ge!==null))try{var tn=N.lastRenderedState,_n=ge(tn,_);if(ae.hasEagerState=!0,ae.eagerState=_n,Mu(_n,tn))return dB(x,N,ae,0),hb===null&&hB(),!1}catch{}finally{}if(_=o$(x,N,ae,X),_!==null)return S9(_,x,X),F1e(_,N,X),!0}return!1}function aie(x,N,_,X){if(X={lane:2,revertLane:$ie(),gesture:null,action:X,hasEagerState:!1,eagerState:null,next:null},kW(x)){if(N)throw Error(A(479))}else N=o$(x,_,X,2),N!==null&&S9(N,x,2)}function kW(x){var N=x.alternate;return x===Qa||N!==null&&N===Qa}function _1e(x,N){v9=J4=!0;var _=x.pending;_===null?N.next=N:(N.next=_.next,_.next=N),x.pending=N}function F1e(x,N,_){if((_&4194048)!==0){var X=N.lanes;X&=x.pendingLanes,_|=X,N.lanes=_,Nh(x,_)}}var VH={readContext:w3,use:dP,useCallback:zg,useContext:zg,useEffect:zg,useImperativeHandle:zg,useLayoutEffect:zg,useInsertionEffect:zg,useMemo:zg,useReducer:zg,useRef:zg,useState:zg,useDebugValue:zg,useDeferredValue:zg,useTransition:zg,useSyncExternalStore:zg,useId:zg,useHostTransitionStatus:zg,useFormState:zg,useActionState:zg,useOptimistic:zg,useMemoCache:zg,useCacheRefresh:zg};VH.useEffectEvent=zg;var $1e={readContext:w3,use:dP,useCallback:function(x,N){return om().memoizedState=[x,N===void 0?null:N],x},useContext:w3,useEffect:S1e,useImperativeHandle:function(x,N,_){_=_!=null?_.concat([x]):null,bP(4194308,4,j1e.bind(null,N,x),_)},useLayoutEffect:function(x,N){return bP(4194308,4,x,N)},useInsertionEffect:function(x,N){bP(4,2,x,N)},useMemo:function(x,N){var _=om();N=N===void 0?null:N;var X=x();if(Ry){at(!0);try{x()}finally{at(!1)}}return _.memoizedState=[X,N],X},useReducer:function(x,N,_){var X=om();if(_!==void 0){var ae=_(N);if(Ry){at(!0);try{_(N)}finally{at(!1)}}}else ae=N;return X.memoizedState=X.baseState=ae,x={pending:null,lanes:0,dispatch:null,lastRenderedReducer:x,lastRenderedState:ae},X.queue=x,x=x.dispatch=m4e.bind(null,Qa,x),[X.memoizedState,x]},useRef:function(x){var N=om();return x={current:x},N.memoizedState=x},useState:function(x){x=Ij(x);var N=x.queue,_=R1e.bind(null,Qa,N);return N.dispatch=_,[x.memoizedState,_]},useDebugValue:uie,useDeferredValue:function(x,N){var _=om();return N1e(_,x,N)},useTransition:function(){var x=Ij(!1);return x=P1e.bind(null,Qa,x.queue,!0,!1),om().memoizedState=x,[!1,x]},useSyncExternalStore:function(x,N,_){var X=Qa,ae=om();if(x1){if(_===void 0)throw Error(A(407));_=_()}else{if(_=N(),hb===null)throw Error(A(349));(K1&127)!==0||oC(X,N,_)}ae.memoizedState=_;var ge={value:_,getSnapshot:N};return ae.queue=ge,S1e(UH.bind(null,X,ge,x),[x]),X.flags|=2048,DL(9,{destroy:void 0},zH.bind(null,X,ge,_,N),null),_},useId:function(){var x=om(),N=hb.identifierPrefix;if(x1){var _=w9,X=b9;_=(X&~(1<<32-nr(X)-1)).toString(32)+_,N="_"+N+"R_"+_,_=gp++,0<_&&(N+="H"+_.toString(32)),N+="_"}else _=p$++,N="_"+N+"r_"+_.toString(32)+"_";return x.memoizedState=N},useHostTransitionStatus:oie,useFormState:LE,useActionState:LE,useOptimistic:function(x){var N=om();N.memoizedState=N.baseState=x;var _={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return N.queue=_,N=aie.bind(null,Qa,!0,_),_.dispatch=N,[x,N]},useMemoCache:OL,useCacheRefresh:function(){return om().memoizedState=v4e.bind(null,Qa)},useEffectEvent:function(x){var N=om(),_={impl:x};return N.memoizedState=_,function(){if((I0&2)!==0)throw Error(A(440));return _.impl.apply(void 0,arguments)}}},fie={readContext:w3,use:dP,useCallback:M1e,useContext:w3,useEffect:cie,useImperativeHandle:x1e,useInsertionEffect:C1e,useLayoutEffect:T1e,useMemo:L1e,useReducer:y$,useRef:mW,useState:function(){return y$(ME)},useDebugValue:uie,useDeferredValue:function(x,N){var _=Zw();return O1e(_,uf.memoizedState,x,N)},useTransition:function(){var x=y$(ME)[0],N=Zw().memoizedState;return[typeof x=="boolean"?x:Dj(x),N]},useSyncExternalStore:k$,useId:I1e,useHostTransitionStatus:oie,useFormState:aC,useActionState:aC,useOptimistic:function(x,N){var _=Zw();return bW(_,uf,x,N)},useMemoCache:OL,useCacheRefresh:B1e};fie.useEffectEvent=A1e;var y4e={readContext:w3,use:dP,useCallback:M1e,useContext:w3,useEffect:cie,useImperativeHandle:x1e,useInsertionEffect:C1e,useLayoutEffect:T1e,useMemo:L1e,useReducer:qH,useRef:mW,useState:function(){return qH(ME)},useDebugValue:uie,useDeferredValue:function(x,N){var _=Zw();return uf===null?N1e(_,x,N):O1e(_,uf.memoizedState,x,N)},useTransition:function(){var x=qH(ME)[0],N=Zw().memoizedState;return[typeof x=="boolean"?x:Dj(x),N]},useSyncExternalStore:k$,useId:I1e,useHostTransitionStatus:oie,useFormState:A$,useActionState:A$,useOptimistic:function(x,N){var _=Zw();return uf!==null?bW(_,uf,x,N):(_.baseState=x,[x,_.queue.dispatch])},useMemoCache:OL,useCacheRefresh:B1e};y4e.useEffectEvent=A1e;function lie(x,N,_,X){N=x.memoizedState,_=_(X,N),_=_==null?N:V({},N,_),x.memoizedState=_,x.lanes===0&&(x.updateQueue.baseState=_)}var EW={enqueueSetState:function(x,N,_){x=x._reactInternals;var X=G7(),ae=yf(X);ae.payload=N,_!=null&&(ae.callback=_),N=Ul(x,ae,X),N!==null&&(S9(N,x,X),P0(N,x,X))},enqueueReplaceState:function(x,N,_){x=x._reactInternals;var X=G7(),ae=yf(X);ae.tag=1,ae.payload=N,_!=null&&(ae.callback=_),N=Ul(x,ae,X),N!==null&&(S9(N,x,X),P0(N,x,X))},enqueueForceUpdate:function(x,N){x=x._reactInternals;var _=G7(),X=yf(_);X.tag=2,N!=null&&(X.callback=N),N=Ul(x,X,_),N!==null&&(S9(N,x,_),P0(N,x,_))}};function q1e(x,N,_,X,ae,ge,tn){return x=x.stateNode,typeof x.shouldComponentUpdate=="function"?x.shouldComponentUpdate(X,ge,tn):N.prototype&&N.prototype.isPureReactComponent?!Ja(_,X)||!Ja(ae,ge):!0}function z1e(x,N,_,X){x=N.state,typeof N.componentWillReceiveProps=="function"&&N.componentWillReceiveProps(_,X),typeof N.UNSAFE_componentWillReceiveProps=="function"&&N.UNSAFE_componentWillReceiveProps(_,X),N.state!==x&&EW.enqueueReplaceState(N,N.state,null)}function AB(x,N){var _=N;if("ref"in N){_={};for(var X in N)X!=="ref"&&(_[X]=N[X])}if(x=x.defaultProps){_===N&&(_=V({},_));for(var ae in x)_[ae]===void 0&&(_[ae]=x[ae])}return _}function U1e(x){lB(x)}function SW(x){console.error(x)}function AW(x){lB(x)}function CW(x,N){try{var _=x.onUncaughtError;_(N.value,{componentStack:N.stack})}catch(X){setTimeout(function(){throw X})}}function TW(x,N,_){try{var X=x.onCaughtError;X(_.value,{componentStack:_.stack,errorBoundary:N.tag===1?N.stateNode:null})}catch(ae){setTimeout(function(){throw ae})}}function hie(x,N,_){return _=yf(_),_.tag=3,_.payload={element:null},_.callback=function(){CW(x,N)},_}function H1e(x){return x=yf(x),x.tag=3,x}function U7(x,N,_,X){var ae=_.type.getDerivedStateFromError;if(typeof ae=="function"){var ge=X.value;x.payload=function(){return ae(ge)},x.callback=function(){TW(N,_,X)}}var tn=_.stateNode;tn!==null&&typeof tn.componentDidCatch=="function"&&(x.callback=function(){TW(N,_,X),typeof ae!="function"&&(yP===null?yP=new Set([this]):yP.add(this));var _n=X.stack;this.componentDidCatch(X.value,{componentStack:_n!==null?_n:""})})}function k4e(x,N,_,X,ae){if(_.flags|=32768,X!==null&&typeof X=="object"&&typeof X.then=="function"){if(N=_.alternate,N!==null&&Nj(N,_,ae,!0),_=lw.current,_!==null){switch(_.tag){case 31:case 13:return Ad===null?FW():_.alternate===null&&bp===0&&(bp=3),_.flags&=-257,_.flags|=65536,_.lanes=ae,X===xr?_.flags|=16384:(N=_.updateQueue,N===null?_.updateQueue=new Set([X]):N.add(X),Rie(x,X,ae)),!1;case 22:return _.flags|=65536,X===xr?_.flags|=16384:(N=_.updateQueue,N===null?(N={transitions:null,markerInstances:null,retryQueue:new Set([X])},_.updateQueue=N):(_=N.retryQueue,_===null?N.retryQueue=new Set([X]):_.add(X)),Rie(x,X,ae)),!1}throw Error(A(435,_.tag))}return Rie(x,X,ae),FW(),!1}if(x1)return N=lw.current,N!==null?((N.flags&65536)===0&&(N.flags|=256),N.flags|=65536,N.lanes=ae,X!==q7&&(x=Error(A(422),{cause:X}),cC(h9(x,_)))):(X!==q7&&(N=Error(A(423),{cause:X}),cC(h9(N,_))),x=x.current.alternate,x.flags|=65536,ae&=-ae,x.lanes|=ae,X=h9(X,_),ae=hie(x.stateNode,X,ae),iv(x,ae),bp!==4&&(bp=2)),!1;var ge=Error(A(520),{cause:X});if(ge=h9(ge,_),cG===null?cG=[ge]:cG.push(ge),bp!==4&&(bp=2),N===null)return!0;X=h9(X,_),_=N;do{switch(_.tag){case 3:return _.flags|=65536,x=ae&-ae,_.lanes|=x,x=hie(_.stateNode,X,x),iv(_,x),!1;case 1:if(N=_.type,ge=_.stateNode,(_.flags&128)===0&&(typeof N.getDerivedStateFromError=="function"||ge!==null&&typeof ge.componentDidCatch=="function"&&(yP===null||!yP.has(ge))))return _.flags|=65536,ae&=-ae,_.lanes|=ae,ae=H1e(ae),U7(ae,x,_,X),iv(_,ae),!1}_=_.return}while(_!==null);return!1}var Bj=Error(A(461)),uv=!1;function _y(x,N,_,X){N.child=x===null?zl(N,null,_,X):lb(N,x.child,_,X)}function G1e(x,N,_,X,ae){_=_.render;var ge=N.ref;if("ref"in X){var tn={};for(var _n in X)_n!=="ref"&&(tn[_n]=X[_n])}else tn=X;return uC(N),X=_H(x,N,_,tn,ge,ae),_n=FH(),x!==null&&!uv?($H(x,N,ae),BL(x,N,ae)):(x1&&_n&&DH(N),N.flags|=1,_y(x,N,X,ae),N.child)}function K1e(x,N,_,X,ae){if(x===null){var ge=_.type;return typeof ge=="function"&&!f$(ge)&&ge.defaultProps===void 0&&_.compare===null?(N.tag=15,N.type=ge,J1e(x,N,ge,X,ae)):(x=uP(_.type,null,X,N,N.mode,ae),x.ref=N.ref,x.return=N,N.child=x)}if(ge=x.child,!mie(x,ae)){var tn=ge.memoizedProps;if(_=_.compare,_=_!==null?_:Ja,_(tn,X)&&x.ref===N.ref)return BL(x,N,ae)}return N.flags|=1,x=l9(ge,X),x.ref=N.ref,x.return=N,N.child=x}function J1e(x,N,_,X,ae){if(x!==null){var ge=x.memoizedProps;if(Ja(ge,X)&&x.ref===N.ref)if(uv=!1,N.pendingProps=X=ge,mie(x,ae))(x.flags&131072)!==0&&(uv=!0);else return N.lanes=x.lanes,BL(x,N,ae)}return gie(x,N,_,X,ae)}function die(x,N,_,X){var ae=X.children,ge=x!==null?x.memoizedState:null;if(x===null&&N.stateNode===null&&(N.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),X.mode==="hidden"){if((N.flags&128)!==0){if(ge=ge!==null?ge.baseLanes|_:_,x!==null){for(X=N.child=x.child,ae=0;X!==null;)ae=ae|X.lanes|X.childLanes,X=X.sibling;X=ae&~ge}else X=0,N.child=null;return V1e(x,N,ge,_,X)}if((_&536870912)!==0)N.memoizedState={baseLanes:0,cachePool:null},x!==null&&rt(N,ge!==null?ge.cachePool:null),ge!==null?fw(N,ge):qd(),hp(N);else return X=N.lanes=536870912,V1e(x,N,ge!==null?ge.baseLanes|_:_,_,X)}else ge!==null?(rt(N,ge.cachePool),fw(N,ge),dp(),N.memoizedState=null):(x!==null&&rt(N,null),qd(),dp());return _y(x,N,ae,_),N.child}function XH(x,N){return x!==null&&x.tag===22||N.stateNode!==null||(N.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),N.sibling}function V1e(x,N,_,X,ae){var ge=Gn();return ge=ge===null?null:{parent:N2._currentValue,pool:ge},N.memoizedState={baseLanes:_,cachePool:ge},x!==null&&rt(N,null),qd(),hp(N),x!==null&&Nj(x,N,X,!0),N.childLanes=ae,null}function jW(x,N){return N=$t({mode:N.mode,children:N.children},x.mode),N.ref=x.ref,x.child=N,N.return=x,N}function E4e(x,N,_){return lb(N,x.child,null,_),x=jW(N,N.pendingProps),x.flags|=2,kg(N),N.memoizedState=null,x}function S4e(x,N,_){var X=N.pendingProps,ae=(N.flags&128)!==0;if(N.flags&=-129,x===null){if(x1){if(X.mode==="hidden")return x=jW(N,X),N.lanes=536870912,XH(null,x);if(D0(N),(x=fb)?(x=Yde(x,Yw),x=x!==null&&x.data==="&"?x:null,x!==null&&(N.memoizedState={dehydrated:x,treeContext:jj!==null?{id:b9,overflow:w9}:null,retryLane:536870912,hydrationErrors:null},_=l$(x),_.return=N,N.child=_,sm=N,fb=null)):x=null,x===null)throw xj(N);return N.lanes=536870912,null}return jW(N,X)}var ge=x.memoizedState;if(ge!==null){var tn=ge.dehydrated;if(D0(N),ae)if(N.flags&256)N.flags&=-257,N=E4e(x,N,_);else if(N.memoizedState!==null)N.child=x.child,N.flags|=128,N=null;else throw Error(A(558));else if(uv||Nj(x,N,_,!1),ae=(_&x.childLanes)!==0,uv||ae){if(X=hb,X!==null&&(tn=Oh(X,_),tn!==0&&tn!==ge.retryLane))throw ge.retryLane=tn,rC(x,tn),S9(X,x,tn),Bj;FW(),N=E4e(x,N,_)}else x=ge.treeContext,fb=DE(tn.nextSibling),sm=N,x1=!0,By=null,Yw=!1,x!==null&&dW(N,x),N=jW(N,X),N.flags|=4096;return N}return x=l9(x.child,{mode:X.mode,children:X.children}),x.ref=N.ref,N.child=x,x.return=N,x}function xW(x,N){var _=N.ref;if(_===null)x!==null&&x.ref!==null&&(N.flags|=4194816);else{if(typeof _!="function"&&typeof _!="object")throw Error(A(284));(x===null||x.ref!==_)&&(N.flags|=4194816)}}function gie(x,N,_,X,ae){return uC(N),_=_H(x,N,_,X,void 0,ae),X=FH(),x!==null&&!uv?($H(x,N,ae),BL(x,N,ae)):(x1&&X&&DH(N),N.flags|=1,_y(x,N,_,ae),N.child)}function X1e(x,N,_,X,ae,ge){return uC(N),N.updateQueue=null,_=sC(N,X,_,ae),v$(x),X=FH(),x!==null&&!uv?($H(x,N,ge),BL(x,N,ge)):(x1&&X&&DH(N),N.flags|=1,_y(x,N,_,ge),N.child)}function W1e(x,N,_,X,ae){if(uC(N),N.stateNode===null){var ge=g3,tn=_.contextType;typeof tn=="object"&&tn!==null&&(ge=w3(tn)),ge=new _(X,ge),N.memoizedState=ge.state!==null&&ge.state!==void 0?ge.state:null,ge.updater=EW,N.stateNode=ge,ge._reactInternals=N,ge=N.stateNode,ge.props=X,ge.state=N.memoizedState,ge.refs={},Bs(N),tn=_.contextType,ge.context=typeof tn=="object"&&tn!==null?w3(tn):g3,ge.state=N.memoizedState,tn=_.getDerivedStateFromProps,typeof tn=="function"&&(lie(N,_,tn,X),ge.state=N.memoizedState),typeof _.getDerivedStateFromProps=="function"||typeof ge.getSnapshotBeforeUpdate=="function"||typeof ge.UNSAFE_componentWillMount!="function"&&typeof ge.componentWillMount!="function"||(tn=ge.state,typeof ge.componentWillMount=="function"&&ge.componentWillMount(),typeof ge.UNSAFE_componentWillMount=="function"&&ge.UNSAFE_componentWillMount(),tn!==ge.state&&EW.enqueueReplaceState(ge,ge.state,null),fp(N,X,ge,ae),qg(),ge.state=N.memoizedState),typeof ge.componentDidMount=="function"&&(N.flags|=4194308),X=!0}else if(x===null){ge=N.stateNode;var _n=N.memoizedProps,rr=AB(_,_n);ge.props=rr;var ji=ge.context,Oc=_.contextType;tn=g3,typeof Oc=="object"&&Oc!==null&&(tn=w3(Oc));var Gc=_.getDerivedStateFromProps;Oc=typeof Gc=="function"||typeof ge.getSnapshotBeforeUpdate=="function",_n=N.pendingProps!==_n,Oc||typeof ge.UNSAFE_componentWillReceiveProps!="function"&&typeof ge.componentWillReceiveProps!="function"||(_n||ji!==tn)&&z1e(N,ge,X,tn),Eo=!1;var zi=N.memoizedState;ge.state=zi,fp(N,X,ge,ae),qg(),ji=N.memoizedState,_n||zi!==ji||Eo?(typeof Gc=="function"&&(lie(N,_,Gc,X),ji=N.memoizedState),(rr=Eo||q1e(N,_,rr,X,zi,ji,tn))?(Oc||typeof ge.UNSAFE_componentWillMount!="function"&&typeof ge.componentWillMount!="function"||(typeof ge.componentWillMount=="function"&&ge.componentWillMount(),typeof ge.UNSAFE_componentWillMount=="function"&&ge.UNSAFE_componentWillMount()),typeof ge.componentDidMount=="function"&&(N.flags|=4194308)):(typeof ge.componentDidMount=="function"&&(N.flags|=4194308),N.memoizedProps=X,N.memoizedState=ji),ge.props=X,ge.state=ji,ge.context=tn,X=rr):(typeof ge.componentDidMount=="function"&&(N.flags|=4194308),X=!1)}else{ge=N.stateNode,aw(x,N),tn=N.memoizedProps,Oc=AB(_,tn),ge.props=Oc,Gc=N.pendingProps,zi=ge.context,ji=_.contextType,rr=g3,typeof ji=="object"&&ji!==null&&(rr=w3(ji)),_n=_.getDerivedStateFromProps,(ji=typeof _n=="function"||typeof ge.getSnapshotBeforeUpdate=="function")||typeof ge.UNSAFE_componentWillReceiveProps!="function"&&typeof ge.componentWillReceiveProps!="function"||(tn!==Gc||zi!==rr)&&z1e(N,ge,X,rr),Eo=!1,zi=N.memoizedState,ge.state=zi,fp(N,X,ge,ae),qg();var uc=N.memoizedState;tn!==Gc||zi!==uc||Eo||x!==null&&x.dependencies!==null&&vB(x.dependencies)?(typeof _n=="function"&&(lie(N,_,_n,X),uc=N.memoizedState),(Oc=Eo||q1e(N,_,Oc,X,zi,uc,rr)||x!==null&&x.dependencies!==null&&vB(x.dependencies))?(ji||typeof ge.UNSAFE_componentWillUpdate!="function"&&typeof ge.componentWillUpdate!="function"||(typeof ge.componentWillUpdate=="function"&&ge.componentWillUpdate(X,uc,rr),typeof ge.UNSAFE_componentWillUpdate=="function"&&ge.UNSAFE_componentWillUpdate(X,uc,rr)),typeof ge.componentDidUpdate=="function"&&(N.flags|=4),typeof ge.getSnapshotBeforeUpdate=="function"&&(N.flags|=1024)):(typeof ge.componentDidUpdate!="function"||tn===x.memoizedProps&&zi===x.memoizedState||(N.flags|=4),typeof ge.getSnapshotBeforeUpdate!="function"||tn===x.memoizedProps&&zi===x.memoizedState||(N.flags|=1024),N.memoizedProps=X,N.memoizedState=uc),ge.props=X,ge.state=uc,ge.context=rr,X=Oc):(typeof ge.componentDidUpdate!="function"||tn===x.memoizedProps&&zi===x.memoizedState||(N.flags|=4),typeof ge.getSnapshotBeforeUpdate!="function"||tn===x.memoizedProps&&zi===x.memoizedState||(N.flags|=1024),X=!1)}return ge=X,xW(x,N),X=(N.flags&128)!==0,ge||X?(ge=N.stateNode,_=X&&typeof _.getDerivedStateFromError!="function"?null:ge.render(),N.flags|=1,x!==null&&X?(N.child=lb(N,x.child,null,ae),N.child=lb(N,null,_,ae)):_y(x,N,_,ae),N.memoizedState=ge.state,x=N.child):x=BL(x,N,ae),x}function Y1e(x,N,_,X){return LL(),N.flags|=256,_y(x,N,_,X),N.child}var bie={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function m9(x){return{baseLanes:x,cachePool:At()}}function wie(x,N,_){return x=x!==null?x.childLanes&~_:0,N&&(x|=H7),x}function IL(x,N,_){var X=N.pendingProps,ae=!1,ge=(N.flags&128)!==0,tn;if((tn=ge)||(tn=x!==null&&x.memoizedState===null?!1:(id.current&2)!==0),tn&&(ae=!0,N.flags&=-129),tn=(N.flags&32)!==0,N.flags&=-33,x===null){if(x1){if(ae?O2(N):dp(),(x=fb)?(x=Yde(x,Yw),x=x!==null&&x.data!=="&"?x:null,x!==null&&(N.memoizedState={dehydrated:x,treeContext:jj!==null?{id:b9,overflow:w9}:null,retryLane:536870912,hydrationErrors:null},_=l$(x),_.return=N,N.child=_,sm=N,fb=null)):x=null,x===null)throw xj(N);return ece(x)?N.lanes=32:N.lanes=536870912,null}var _n=X.children;return X=X.fallback,ae?(dp(),ae=N.mode,_n=$t({mode:"hidden",children:_n},ae),X=Tj(X,ae,_,null),_n.return=N,X.return=N,_n.sibling=X,N.child=_n,X=N.child,X.memoizedState=m9(_),X.childLanes=wie(x,tn,_),N.memoizedState=bie,XH(null,X)):(O2(N),MW(N,_n))}var rr=x.memoizedState;if(rr!==null&&(_n=rr.dehydrated,_n!==null)){if(ge)N.flags&256?(O2(N),N.flags&=-257,N=pie(x,N,_)):N.memoizedState!==null?(dp(),N.child=x.child,N.flags|=128,N=null):(dp(),_n=X.fallback,ae=N.mode,X=$t({mode:"visible",children:X.children},ae),_n=Tj(_n,ae,_,null),_n.flags|=2,X.return=N,_n.return=N,X.sibling=_n,N.child=X,lb(N,x.child,null,_),X=N.child,X.memoizedState=m9(_),X.childLanes=wie(x,tn,_),N.memoizedState=bie,N=XH(null,X));else if(O2(N),ece(_n)){if(tn=_n.nextSibling&&_n.nextSibling.dataset,tn)var ji=tn.dgst;tn=ji,X=Error(A(419)),X.stack="",X.digest=tn,cC({value:X,source:null,stack:null}),N=pie(x,N,_)}else if(uv||Nj(x,N,_,!1),tn=(_&x.childLanes)!==0,uv||tn){if(tn=hb,tn!==null&&(X=Oh(tn,_),X!==0&&X!==rr.retryLane))throw rr.retryLane=X,rC(x,X),S9(tn,x,X),Bj;Zie(_n)||FW(),N=pie(x,N,_)}else Zie(_n)?(N.flags|=192,N.child=x.child,N=null):(x=rr.treeContext,fb=DE(_n.nextSibling),sm=N,x1=!0,By=null,Yw=!1,x!==null&&dW(N,x),N=MW(N,X.children),N.flags|=4096);return N}return ae?(dp(),_n=X.fallback,ae=N.mode,rr=x.child,ji=rr.sibling,X=l9(rr,{mode:"hidden",children:X.children}),X.subtreeFlags=rr.subtreeFlags&65011712,ji!==null?_n=l9(ji,_n):(_n=Tj(_n,ae,_,null),_n.flags|=2),_n.return=N,X.return=N,X.sibling=_n,N.child=X,XH(null,X),X=N.child,_n=x.child.memoizedState,_n===null?_n=m9(_):(ae=_n.cachePool,ae!==null?(rr=N2._currentValue,ae=ae.parent!==rr?{parent:rr,pool:rr}:ae):ae=At(),_n={baseLanes:_n.baseLanes|_,cachePool:ae}),X.memoizedState=_n,X.childLanes=wie(x,tn,_),N.memoizedState=bie,XH(x.child,X)):(O2(N),_=x.child,x=_.sibling,_=l9(_,{mode:"visible",children:X.children}),_.return=N,_.sibling=null,x!==null&&(tn=N.deletions,tn===null?(N.deletions=[x],N.flags|=16):tn.push(x)),N.child=_,N.memoizedState=null,_)}function MW(x,N){return N=$t({mode:"visible",children:N},x.mode),N.return=x,x.child=N}function $t(x,N){return x=A5(22,x,null,N),x.lanes=0,x}function pie(x,N,_){return lb(N,x.child,null,_),x=MW(N,N.pendingProps.children),x.flags|=2,N.memoizedState=null,x}function Q1e(x,N,_){x.lanes|=N;var X=x.alternate;X!==null&&(X.lanes|=N),fP(x.return,N,_)}function vie(x,N,_,X,ae,ge){var tn=x.memoizedState;tn===null?x.memoizedState={isBackwards:N,rendering:null,renderingStartTime:0,last:X,tail:_,tailMode:ae,treeForkCount:ge}:(tn.isBackwards=N,tn.rendering=null,tn.renderingStartTime=0,tn.last=X,tn.tail=_,tn.tailMode=ae,tn.treeForkCount=ge)}function Z1e(x,N,_){var X=N.pendingProps,ae=X.revealOrder,ge=X.tail;X=X.children;var tn=id.current,_n=(tn&2)!==0;if(_n?(tn=tn&1|2,N.flags|=128):tn&=1,sn(id,tn),_y(x,N,X,_),X=x1?pB:0,!_n&&x!==null&&(x.flags&128)!==0)e:for(x=N.child;x!==null;){if(x.tag===13)x.memoizedState!==null&&Q1e(x,_,N);else if(x.tag===19)Q1e(x,_,N);else if(x.child!==null){x.child.return=x,x=x.child;continue}if(x===N)break e;for(;x.sibling===null;){if(x.return===null||x.return===N)break e;x=x.return}x.sibling.return=x.return,x=x.sibling}switch(ae){case"forwards":for(_=N.child,ae=null;_!==null;)x=_.alternate,x!==null&&T5(x)===null&&(ae=_),_=_.sibling;_=ae,_===null?(ae=N.child,N.child=null):(ae=_.sibling,_.sibling=null),vie(N,!1,ae,_,ge,X);break;case"backwards":case"unstable_legacy-backwards":for(_=null,ae=N.child,N.child=null;ae!==null;){if(x=ae.alternate,x!==null&&T5(x)===null){N.child=ae;break}x=ae.sibling,ae.sibling=_,_=ae,ae=x}vie(N,!0,_,null,ge,X);break;case"together":vie(N,!1,null,null,void 0,X);break;default:N.memoizedState=null}return N.child}function BL(x,N,_){if(x!==null&&(N.dependencies=x.dependencies),mP|=N.lanes,(_&N.childLanes)===0)if(x!==null){if(Nj(x,N,_,!1),(_&N.childLanes)===0)return null}else return null;if(x!==null&&N.child!==x.child)throw Error(A(153));if(N.child!==null){for(x=N.child,_=l9(x,x.pendingProps),N.child=_,_.return=N;x.sibling!==null;)x=x.sibling,_=_.sibling=l9(x,x.pendingProps),_.return=N;_.sibling=null}return N.child}function mie(x,N){return(x.lanes&N)!==0?!0:(x=x.dependencies,!!(x!==null&&vB(x)))}function A4e(x,N,_){switch(N.tag){case 3:_t(N,N.stateNode.containerInfo),Lj(N,N2,x.memoizedState.cache),LL();break;case 27:case 5:Jn(N);break;case 4:_t(N,N.stateNode.containerInfo);break;case 10:Lj(N,N.type,N.memoizedProps.value);break;case 31:if(N.memoizedState!==null)return N.flags|=128,D0(N),null;break;case 13:var X=N.memoizedState;if(X!==null)return X.dehydrated!==null?(O2(N),N.flags|=128,null):(_&N.child.childLanes)!==0?IL(x,N,_):(O2(N),x=BL(x,N,_),x!==null?x.sibling:null);O2(N);break;case 19:var ae=(x.flags&128)!==0;if(X=(_&N.childLanes)!==0,X||(Nj(x,N,_,!1),X=(_&N.childLanes)!==0),ae){if(X)return Z1e(x,N,_);N.flags|=128}if(ae=N.memoizedState,ae!==null&&(ae.rendering=null,ae.tail=null,ae.lastEffect=null),sn(id,id.current),X)break;return null;case 22:return N.lanes=0,die(x,N,_,N.pendingProps);case 24:Lj(N,N2,x.memoizedState.cache)}return BL(x,N,_)}function ede(x,N,_){if(x!==null)if(x.memoizedProps!==N.pendingProps)uv=!0;else{if(!mie(x,_)&&(N.flags&128)===0)return uv=!1,A4e(x,N,_);uv=(x.flags&131072)!==0}else uv=!1,x1&&(N.flags&1048576)!==0&&hW(N,pB,N.index);switch(N.lanes=0,N.tag){case 16:e:{var X=N.pendingProps;if(x=ri(N.elementType),N.type=x,typeof x=="function")f$(x)?(X=AB(x,X),N.tag=1,N=W1e(null,N,x,X,_)):(N.tag=0,N=gie(null,N,x,X,_));else{if(x!=null){var ae=x.$$typeof;if(ae===we){N.tag=11,N=G1e(null,N,x,X,_);break e}else if(ae===qe){N.tag=14,N=K1e(null,N,x,X,_);break e}}throw N=en(x)||x,Error(A(306,N,""))}}return N;case 0:return gie(x,N,N.type,N.pendingProps,_);case 1:return X=N.type,ae=AB(X,N.pendingProps),W1e(x,N,X,ae,_);case 3:e:{if(_t(N,N.stateNode.containerInfo),x===null)throw Error(A(387));X=N.pendingProps;var ge=N.memoizedState;ae=ge.element,aw(x,N),fp(N,X,null,_);var tn=N.memoizedState;if(X=tn.cache,Lj(N,N2,X),X!==ge.cache&&NL(N,[N2],_,!0),qg(),X=tn.element,ge.isDehydrated)if(ge={element:X,isDehydrated:!1,cache:tn.cache},N.updateQueue.baseState=ge,N.memoizedState=ge,N.flags&256){N=Y1e(x,N,X,_);break e}else if(X!==ae){ae=h9(Error(A(424)),N),cC(ae),N=Y1e(x,N,X,_);break e}else{switch(x=N.stateNode.containerInfo,x.nodeType){case 9:x=x.body;break;default:x=x.nodeName==="HTML"?x.ownerDocument.body:x}for(fb=DE(x.firstChild),sm=N,x1=!0,By=null,Yw=!0,_=zl(N,null,X,_),N.child=_;_;)_.flags=_.flags&-3|4096,_=_.sibling}else{if(LL(),X===ae){N=BL(x,N,_);break e}_y(x,N,X,_)}N=N.child}return N;case 26:return xW(x,N),x===null?(_=i0e(N.type,null,N.pendingProps,null))?N.memoizedState=_:x1||(_=N.type,x=N.pendingProps,X=JW(Bn.current).createElement(_),X[sh]=N,X[rd]=x,$y(X,_,x),$g(X),N.stateNode=X):N.memoizedState=i0e(N.type,x.memoizedProps,N.pendingProps,x.memoizedState),null;case 27:return Jn(N),x===null&&x1&&(X=N.stateNode=Zde(N.type,N.pendingProps,Bn.current),sm=N,Yw=!0,ae=fb,AP(N.type)?(nce=ae,fb=DE(X.firstChild)):fb=ae),_y(x,N,N.pendingProps.children,_),xW(x,N),x===null&&(N.flags|=4194304),N.child;case 5:return x===null&&x1&&((ae=X=fb)&&(X=W4e(X,N.type,N.pendingProps,Yw),X!==null?(N.stateNode=X,sm=N,fb=DE(X.firstChild),Yw=!1,ae=!0):ae=!1),ae||xj(N)),Jn(N),ae=N.type,ge=N.pendingProps,tn=x!==null?x.memoizedProps:null,X=ge.children,Wie(ae,ge)?X=null:tn!==null&&Wie(ae,tn)&&(N.flags|=32),N.memoizedState!==null&&(ae=_H(x,N,iie,null,null,_),hG._currentValue=ae),xW(x,N),_y(x,N,X,_),N.child;case 6:return x===null&&x1&&((x=_=fb)&&(_=Y4e(_,N.pendingProps,Yw),_!==null?(N.stateNode=_,sm=N,fb=null,x=!0):x=!1),x||xj(N)),null;case 13:return IL(x,N,_);case 4:return _t(N,N.stateNode.containerInfo),X=N.pendingProps,x===null?N.child=lb(N,null,X,_):_y(x,N,X,_),N.child;case 11:return G1e(x,N,N.type,N.pendingProps,_);case 7:return _y(x,N,N.pendingProps,_),N.child;case 8:return _y(x,N,N.pendingProps.children,_),N.child;case 12:return _y(x,N,N.pendingProps.children,_),N.child;case 10:return X=N.pendingProps,Lj(N,N.type,X.value),_y(x,N,X.children,_),N.child;case 9:return ae=N.type._context,X=N.pendingProps.children,uC(N),ae=w3(ae),X=X(ae),N.flags|=1,_y(x,N,X,_),N.child;case 14:return K1e(x,N,N.type,N.pendingProps,_);case 15:return J1e(x,N,N.type,N.pendingProps,_);case 19:return Z1e(x,N,_);case 31:return S4e(x,N,_);case 22:return die(x,N,_,N.pendingProps);case 24:return uC(N),X=w3(N2),x===null?(ae=Gn(),ae===null&&(ae=hb,ge=lP(),ae.pooledCache=ge,ge.refCount++,ge!==null&&(ae.pooledCacheLanes|=_),ae=ge),N.memoizedState={parent:X,cache:ae},Bs(N),Lj(N,N2,ae)):((x.lanes&_)!==0&&(aw(x,N),fp(N,null,null,_),qg()),ae=x.memoizedState,ge=N.memoizedState,ae.parent!==X?(ae={parent:X,cache:X},N.memoizedState=ae,N.lanes===0&&(N.memoizedState=N.updateQueue.baseState=ae),Lj(N,N2,X)):(X=ge.cache,Lj(N,N2,X),X!==ae.cache&&NL(N,[N2],_,!0))),_y(x,N,N.pendingProps.children,_),N.child;case 29:throw N.pendingProps}throw Error(A(156,N.tag))}function RL(x){x.flags|=4}function yie(x,N,_,X,ae){if((N=(x.mode&32)!==0)&&(N=!1),N){if(x.flags|=16777216,(ae&335544128)===ae)if(x.stateNode.complete)x.flags|=8192;else if(vde())x.flags|=8192;else throw pc=xr,gi}else x.flags&=-16777217}function nde(x,N){if(N.type!=="stylesheet"||(N.state.loading&4)!==0)x.flags&=-16777217;else if(x.flags|=16777216,!oce(N))if(vde())x.flags|=8192;else throw pc=xr,gi}function C$(x,N){N!==null&&(x.flags|=4),x.flags&16384&&(N=x.tag!==22?Go():536870912,x.lanes|=N,L$|=N)}function WH(x,N){if(!x1)switch(x.tailMode){case"hidden":N=x.tail;for(var _=null;N!==null;)N.alternate!==null&&(_=N),N=N.sibling;_===null?x.tail=null:_.sibling=null;break;case"collapsed":_=x.tail;for(var X=null;_!==null;)_.alternate!==null&&(X=_),_=_.sibling;X===null?N||x.tail===null?x.tail=null:x.tail.sibling=null:X.sibling=null}}function hw(x){var N=x.alternate!==null&&x.alternate.child===x.child,_=0,X=0;if(N)for(var ae=x.child;ae!==null;)_|=ae.lanes|ae.childLanes,X|=ae.subtreeFlags&65011712,X|=ae.flags&65011712,ae.return=x,ae=ae.sibling;else for(ae=x.child;ae!==null;)_|=ae.lanes|ae.childLanes,X|=ae.subtreeFlags,X|=ae.flags,ae.return=x,ae=ae.sibling;return x.subtreeFlags|=X,x.childLanes=_,N}function kie(x,N,_){var X=N.pendingProps;switch(g$(N),N.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return hw(N),null;case 1:return hw(N),null;case 3:return _=N.stateNode,X=null,x!==null&&(X=x.memoizedState.cache),N.memoizedState.cache!==X&&(N.flags|=2048),p9(N2),St(),_.pendingContext&&(_.context=_.pendingContext,_.pendingContext=null),(x===null||x.child===null)&&(b3(N)?RL(N):x===null||x.memoizedState.isDehydrated&&(N.flags&256)===0||(N.flags|=1024,aP())),hw(N),null;case 26:var ae=N.type,ge=N.memoizedState;return x===null?(RL(N),ge!==null?(hw(N),nde(N,ge)):(hw(N),yie(N,ae,null,X,_))):ge?ge!==x.memoizedState?(RL(N),hw(N),nde(N,ge)):(hw(N),N.flags&=-16777217):(x=x.memoizedProps,x!==X&&RL(N),hw(N),yie(N,ae,x,X,_)),null;case 27:if(Ct(N),_=Bn.current,ae=N.type,x!==null&&N.stateNode!=null)x.memoizedProps!==X&&RL(N);else{if(!X){if(N.stateNode===null)throw Error(A(166));return hw(N),null}x=dn.current,b3(N)?IH(N):(x=Zde(ae,X,_),N.stateNode=x,RL(N))}return hw(N),null;case 5:if(Ct(N),ae=N.type,x!==null&&N.stateNode!=null)x.memoizedProps!==X&&RL(N);else{if(!X){if(N.stateNode===null)throw Error(A(166));return hw(N),null}if(ge=dn.current,b3(N))IH(N);else{var tn=JW(Bn.current);switch(ge){case 1:ge=tn.createElementNS("http://www.w3.org/2000/svg",ae);break;case 2:ge=tn.createElementNS("http://www.w3.org/1998/Math/MathML",ae);break;default:switch(ae){case"svg":ge=tn.createElementNS("http://www.w3.org/2000/svg",ae);break;case"math":ge=tn.createElementNS("http://www.w3.org/1998/Math/MathML",ae);break;case"script":ge=tn.createElement("div"),ge.innerHTML=" + diff --git a/web/src/GraphView.tsx b/web/src/GraphView.tsx index d3f1d39..42163b1 100644 --- a/web/src/GraphView.tsx +++ b/web/src/GraphView.tsx @@ -64,8 +64,9 @@ const cleanType = (t?: string | null) => { const editableCardWidth = (box: CardBox) => Math.max(box.w + 24, 200); -const sameCardBox = (a: CardBox | undefined, b: CardBox) => - a !== undefined && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h; +const sameCardBox = (a: CardBox | undefined, b: CardBox | undefined) => + a !== undefined && b !== undefined && + a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h; const sameCardBoxMap = (a: Record, b: Record) => { const ids = Object.keys(a); @@ -825,11 +826,13 @@ export default function GraphView({ const cy = cyRef.current; if (!cy) return; + let viewportRaf: number | null = null; + // Viewport synchronization: the overlay wrapper is translated/scaled to // follow Cytoscape pan/zoom. Node model positions and model-space bounding // boxes do not change when the user pans or zooms, so this path stays cheap // and must never re-measure node geometry. - const syncViewport = () => { + const applyViewport = () => { const pan = cy.pan(); const zoom = cy.zoom(); setViewport((prev) => @@ -839,6 +842,16 @@ export default function GraphView({ ); }; + // A single interaction (wheel input, cy.animate()) can emit several + // pan/zoom events per frame; coalesce them into one state update. + const scheduleViewportSync = () => { + if (viewportRaf !== null) return; + viewportRaf = requestAnimationFrame(() => { + viewportRaf = null; + applyViewport(); + }); + }; + // Full geometry synchronization: measure every node's model-space bounding // box and rebuild the card-box map. Only needed when the graph geometry // actually changes (initial overlay geometry, and when layout finishes). @@ -853,14 +866,15 @@ export default function GraphView({ // Establish initial geometry now, in case layout already completed before // this effect registered its listener. - syncViewport(); + applyViewport(); syncAllCardBoxes(); - cy.on("pan zoom", syncViewport); + cy.on("pan zoom", scheduleViewportSync); cy.on("layoutstop", syncAllCardBoxes); return () => { - cy.off("pan zoom", syncViewport); + if (viewportRaf !== null) cancelAnimationFrame(viewportRaf); + cy.off("pan zoom", scheduleViewportSync); cy.off("layoutstop", syncAllCardBoxes); }; }, [umlState, theme, umlEdges, graphNodes, showQuantityMetadata, diff]); diff --git a/web/tests/graph-view-overlay-sync.test.tsx b/web/tests/graph-view-overlay-sync.test.tsx index 8a6c135..793e8a6 100644 --- a/web/tests/graph-view-overlay-sync.test.tsx +++ b/web/tests/graph-view-overlay-sync.test.tsx @@ -38,7 +38,7 @@ function makeFakeCy(nodeIds: string[]) { }; }; - const nodes = nodeIds.map(makeNode); + let nodes = nodeIds.map(makeNode); const coll = (arr: ReturnType[]) => ({ forEach: (f: (n: ReturnType) => void) => arr.forEach(f), @@ -86,6 +86,9 @@ function makeFakeCy(nodeIds: string[]) { (listeners[name] || []).slice().forEach((cb) => cb(evt ?? { target: cy })); }); }, + __setNodes(ids: string[]) { + nodes = ids.map(makeNode); + }, }; return cy; @@ -93,6 +96,15 @@ function makeFakeCy(nodeIds: string[]) { let fakeCy: ReturnType; +// Controllable requestAnimationFrame: GraphView coalesces viewport syncs into +// one frame, so the tests queue the callbacks and flush them explicitly. +let rafQueue: FrameRequestCallback[] = []; +const flushRaf = () => { + const queued = rafQueue; + rafQueue = []; + queued.forEach((cb) => cb(0)); +}; + vi.mock('cytoscape', () => ({ __esModule: true, default: vi.fn(() => fakeCy) })); vi.mock('cytoscape-elk', () => ({ __esModule: true, default: vi.fn() })); vi.mock('elkjs/lib/elk.bundled.js', () => ({ __esModule: true, default: vi.fn() })); @@ -129,11 +141,15 @@ function renderGraph() { describe('GraphView overlay geometry vs. viewport synchronization', () => { beforeEach(() => { boundingBoxCalls = []; + rafQueue = []; fakeCy = makeFakeCy([CLASS_A, CLASS_B]); + vi.stubGlobal('requestAnimationFrame', (cb: FrameRequestCallback) => rafQueue.push(cb)); + vi.stubGlobal('cancelAnimationFrame', () => {}); }); afterEach(() => { cleanup(); + vi.unstubAllGlobals(); }); it('measures initial geometry and renders overlay cards', () => { @@ -151,19 +167,51 @@ describe('GraphView overlay geometry vs. viewport synchronization', () => { boundingBoxCalls = []; fakeCy.__pan = { x: 30, y: 40 }; - act(() => fakeCy.emit('pan')); + act(() => { + fakeCy.emit('pan'); + flushRaf(); + }); expect(boundingBoxCalls).toEqual([]); expect(wrapper.style.transform).toContain('translate(30px, 40px)'); fakeCy.__zoom = 2; - act(() => fakeCy.emit('zoom')); + act(() => { + fakeCy.emit('zoom'); + flushRaf(); + }); expect(boundingBoxCalls).toEqual([]); expect(wrapper.style.transform).toContain('scale(2)'); - act(() => fakeCy.emit('render')); + act(() => { + fakeCy.emit('render'); + flushRaf(); + }); expect(boundingBoxCalls).toEqual([]); }); + it('coalesces multiple pan/zoom events in a frame into a single viewport sync', () => { + const { container } = renderGraph(); + const wrapper = container.querySelector('div[style*="translate"]') as HTMLElement; + + rafQueue = []; + fakeCy.__pan = { x: 12, y: 8 }; + fakeCy.__zoom = 1.5; + + act(() => { + fakeCy.emit('pan'); + fakeCy.emit('zoom'); + fakeCy.emit('pan'); + }); + + // One scheduled callback for three events, and no transform update yet. + expect(rafQueue).toHaveLength(1); + expect(wrapper.style.transform).not.toContain('translate(12px, 8px)'); + + act(() => flushRaf()); + expect(wrapper.style.transform).toContain('translate(12px, 8px)'); + expect(wrapper.style.transform).toContain('scale(1.5)'); + }); + it('re-measures all nodes when the layout finishes', () => { renderGraph(); boundingBoxCalls = []; @@ -173,6 +221,19 @@ describe('GraphView overlay geometry vs. viewport synchronization', () => { expect(new Set(boundingBoxCalls)).toEqual(new Set([CLASS_A, CLASS_B])); }); + it('rebuilds the card-box map without crashing when node ids change but the count does not', () => { + renderGraph(); + boundingBoxCalls = []; + + // Same node count, entirely different ids (e.g. switching packages). + fakeCy.__setNodes(['pkg.other.Gamma', 'pkg.other.Delta']); + + expect(() => act(() => fakeCy.emit('layoutstop'))).not.toThrow(); + expect(new Set(boundingBoxCalls)).toEqual( + new Set(['pkg.other.Gamma', 'pkg.other.Delta']) + ); + }); + it('measures only the dragged node while dragging, not every node', () => { renderGraph(); boundingBoxCalls = [];