diff --git a/build/static/js/845.116b9008.chunk.js b/build/static/js/845.116b9008.chunk.js
new file mode 100644
index 0000000..6a7ec66
--- /dev/null
+++ b/build/static/js/845.116b9008.chunk.js
@@ -0,0 +1,2 @@
+"use strict";(self.webpackChunkfrontend=self.webpackChunkfrontend||[]).push([[845],{845:(e,t,n)=>{n.r(t),n.d(t,{getCLS:()=>y,getFCP:()=>g,getFID:()=>C,getLCP:()=>P,getTTFB:()=>D});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},f=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},s=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,d=function(){return"hidden"===document.visibilityState?0:1/0},p=function(){f((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=d(),p(),s((function(){setTimeout((function(){v=d(),p()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(f&&f.disconnect(),e.startTime<i.firstHiddenTime&&(r.value=e.startTime,r.entries.push(e),n(!0)))},o=window.performance&&performance.getEntriesByName&&performance.getEntriesByName("first-contentful-paint")[0],f=o?null:c("paint",a);(o||f)&&(n=m(e,r,t),o&&a(o),s((function(i){r=u("FCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,n(!0)}))}))})))},h=!1,T=-1,y=function(e,t){h||(g((function(e){T=e.value})),h=!0);var n,i=function(t){T>-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},d=c("layout-shift",v);d&&(n=m(i,r,t),f((function(){d.takeRecords().map(v),n(!0)})),s((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,F(removeEventListener),S())},S=function(){if(r>=0&&r<a-w){var e={entryType:"first-input",name:i.type,target:i.target,cancelable:i.cancelable,startTime:i.timeStamp,processingStart:i.timeStamp+r};o.forEach((function(t){t(e)})),o=[]}},b=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},F=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},C=function(e,t){var n,a=l(),v=u("FID"),d=function(e){e.startTime<a.firstHiddenTime&&(v.value=e.processingStart-e.startTime,v.entries.push(e),n(!0))},p=c("first-input",d);n=m(e,v,t),p&&f((function(){p.takeRecords().map(d),p.disconnect()}),!0),p&&s((function(){var a;v=u("FID"),n=m(e,v,t),o=[],r=-1,i=null,F(addEventListener),a=d,o.push(a),S()}))},k={},P=function(e,t){var n,i=l(),r=u("LCP"),a=function(e){var t=e.startTime;t<i.firstHiddenTime&&(r.value=t,r.entries.push(e),n())},o=c("largest-contentful-paint",a);if(o){n=m(e,r,t);var v=function(){k[r.id]||(o.takeRecords().map(a),o.disconnect(),k[r.id]=!0,n(!0))};["keydown","click"].forEach((function(e){addEventListener(e,v,{once:!0,capture:!0})})),f(v,!0),s((function(i){r=u("LCP"),n=m(e,r,t),requestAnimationFrame((function(){requestAnimationFrame((function(){r.value=performance.now()-i.timeStamp,k[r.id]=!0,n(!0)}))}))}))}},D=function(e){var t,n=u("TTFB");t=function(){try{var t=performance.getEntriesByType("navigation")[0]||function(){var e=performance.timing,t={entryType:"navigation",startTime:0};for(var n in e)"navigationStart"!==n&&"toJSON"!==n&&(t[n]=Math.max(e[n]-e.navigationStart,0));return t}();if(n.value=n.delta=t.responseStart,n.value<0||n.value>performance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]);
+//# sourceMappingURL=845.116b9008.chunk.js.map
\ No newline at end of file
diff --git a/build/static/js/845.116b9008.chunk.js.map b/build/static/js/845.116b9008.chunk.js.map
new file mode 100644
index 0000000..37233f7
--- /dev/null
+++ b/build/static/js/845.116b9008.chunk.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/js/845.116b9008.chunk.js","mappings":"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","sources":["../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["var e,t,n,i,r=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:\"v2-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12)}},a=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if(\"first-input\"===e&&!(\"PerformanceEventTiming\"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},o=function(e,t){var n=function n(i){\"pagehide\"!==i.type&&\"hidden\"!==document.visibilityState||(e(i),t&&(removeEventListener(\"visibilitychange\",n,!0),removeEventListener(\"pagehide\",n,!0)))};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},u=function(e){addEventListener(\"pageshow\",(function(t){t.persisted&&e(t)}),!0)},c=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},f=-1,s=function(){return\"hidden\"===document.visibilityState?0:1/0},m=function(){o((function(e){var t=e.timeStamp;f=t}),!0)},v=function(){return f<0&&(f=s(),m(),u((function(){setTimeout((function(){f=s(),m()}),0)}))),{get firstHiddenTime(){return f}}},d=function(e,t){var n,i=v(),o=r(\"FCP\"),f=function(e){\"first-contentful-paint\"===e.name&&(m&&m.disconnect(),e.startTime<i.firstHiddenTime&&(o.value=e.startTime,o.entries.push(e),n(!0)))},s=window.performance&&performance.getEntriesByName&&performance.getEntriesByName(\"first-contentful-paint\")[0],m=s?null:a(\"paint\",f);(s||m)&&(n=c(e,o,t),s&&f(s),u((function(i){o=r(\"FCP\"),n=c(e,o,t),requestAnimationFrame((function(){requestAnimationFrame((function(){o.value=performance.now()-i.timeStamp,n(!0)}))}))})))},p=!1,l=-1,h=function(e,t){p||(d((function(e){l=e.value})),p=!0);var n,i=function(t){l>-1&&e(t)},f=r(\"CLS\",0),s=0,m=[],v=function(e){if(!e.hadRecentInput){var t=m[0],i=m[m.length-1];s&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,m.push(e)):(s=e.value,m=[e]),s>f.value&&(f.value=s,f.entries=m,n())}},h=a(\"layout-shift\",v);h&&(n=c(i,f,t),o((function(){h.takeRecords().map(v),n(!0)})),u((function(){s=0,l=-1,f=r(\"CLS\",0),n=c(i,f,t)})))},T={passive:!0,capture:!0},y=new Date,g=function(i,r){e||(e=r,t=i,n=new Date,w(removeEventListener),E())},E=function(){if(t>=0&&t<n-y){var r={entryType:\"first-input\",name:e.type,target:e.target,cancelable:e.cancelable,startTime:e.timeStamp,processingStart:e.timeStamp+t};i.forEach((function(e){e(r)})),i=[]}},S=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){g(e,t),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",n,T),removeEventListener(\"pointercancel\",i,T)};addEventListener(\"pointerup\",n,T),addEventListener(\"pointercancel\",i,T)}(t,e):g(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,S,T)}))},L=function(n,f){var s,m=v(),d=r(\"FID\"),p=function(e){e.startTime<m.firstHiddenTime&&(d.value=e.processingStart-e.startTime,d.entries.push(e),s(!0))},l=a(\"first-input\",p);s=c(n,d,f),l&&o((function(){l.takeRecords().map(p),l.disconnect()}),!0),l&&u((function(){var a;d=r(\"FID\"),s=c(n,d,f),i=[],t=-1,e=null,w(addEventListener),a=p,i.push(a),E()}))},b={},F=function(e,t){var n,i=v(),f=r(\"LCP\"),s=function(e){var t=e.startTime;t<i.firstHiddenTime&&(f.value=t,f.entries.push(e),n())},m=a(\"largest-contentful-paint\",s);if(m){n=c(e,f,t);var d=function(){b[f.id]||(m.takeRecords().map(s),m.disconnect(),b[f.id]=!0,n(!0))};[\"keydown\",\"click\"].forEach((function(e){addEventListener(e,d,{once:!0,capture:!0})})),o(d,!0),u((function(i){f=r(\"LCP\"),n=c(e,f,t),requestAnimationFrame((function(){requestAnimationFrame((function(){f.value=performance.now()-i.timeStamp,b[f.id]=!0,n(!0)}))}))}))}},P=function(e){var t,n=r(\"TTFB\");t=function(){try{var t=performance.getEntriesByType(\"navigation\")[0]||function(){var e=performance.timing,t={entryType:\"navigation\",startTime:0};for(var n in e)\"navigationStart\"!==n&&\"toJSON\"!==n&&(t[n]=Math.max(e[n]-e.navigationStart,0));return t}();if(n.value=n.delta=t.responseStart,n.value<0||n.value>performance.now())return;n.entries=[t],e(n)}catch(e){}},\"complete\"===document.readyState?setTimeout(t,0):addEventListener(\"load\",(function(){return setTimeout(t,0)}))};export{h as getCLS,d as getFCP,L as getFID,F as getLCP,P as getTTFB};\n"],"names":["e","t","n","i","r","name","value","delta","entries","id","concat","Date","now","Math","floor","random","a","PerformanceObserver","supportedEntryTypes","includes","self","getEntries","map","observe","type","buffered","o","document","visibilityState","removeEventListener","addEventListener","u","persisted","c","f","s","m","timeStamp","v","setTimeout","firstHiddenTime","d","disconnect","startTime","push","window","performance","getEntriesByName","requestAnimationFrame","p","l","h","hadRecentInput","length","takeRecords","T","passive","capture","y","g","w","E","entryType","target","cancelable","processingStart","forEach","S","L","b","F","once","P","getEntriesByType","timing","max","navigationStart","responseStart","readyState"],"sourceRoot":""}
\ No newline at end of file
diff --git a/build/static/js/main.dd76cdc0.js b/build/static/js/main.dd76cdc0.js
new file mode 100644
index 0000000..d77b8d8
--- /dev/null
+++ b/build/static/js/main.dd76cdc0.js
@@ -0,0 +1,3 @@
+/*! For license information please see main.dd76cdc0.js.LICENSE.txt */
+(()=>{var e={97:(e,t)=>{var n;!function(){"use strict";var r={}.hasOwnProperty;function o(){for(var e="",t=0;t<arguments.length;t++){var n=arguments[t];n&&(e=i(e,a(n)))}return e}function a(e){if("string"===typeof e||"number"===typeof e)return e;if("object"!==typeof e)return"";if(Array.isArray(e))return o.apply(null,e);if(e.toString!==Object.prototype.toString&&!e.toString.toString().includes("[native code]"))return e.toString();var t="";for(var n in e)r.call(e,n)&&e[n]&&(t=i(t,n));return t}function i(e,t){return t?e?e+" "+t:e+t:e}e.exports?(o.default=o,e.exports=o):void 0===(n=function(){return o}.apply(t,[]))||(e.exports=n)}()},276:(e,t)=>{"use strict";var n,r=Symbol.for("react.element"),o=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),l=Symbol.for("react.provider"),c=Symbol.for("react.context"),u=Symbol.for("react.server_context"),d=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),p=Symbol.for("react.suspense_list"),h=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),v=Symbol.for("react.offscreen");function g(e){if("object"===typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case a:case s:case i:case f:case p:return e;default:switch(e=e&&e.$$typeof){case u:case c:case d:case m:case h:case l:return e;default:return t}}case o:return t}}}n=Symbol.for("react.module.reference"),t.ForwardRef=d,t.isMemo=function(e){return g(e)===h}},317:(e,t)=>{"use strict";t.byteLength=function(e){var t=s(e),n=t[0],r=t[1];return 3*(n+r)/4-r},t.toByteArray=function(e){var t,n,a=s(e),i=a[0],l=a[1],c=new o(function(e,t,n){return 3*(t+n)/4-n}(0,i,l)),u=0,d=l>0?i-4:i;for(n=0;n<d;n+=4)t=r[e.charCodeAt(n)]<<18|r[e.charCodeAt(n+1)]<<12|r[e.charCodeAt(n+2)]<<6|r[e.charCodeAt(n+3)],c[u++]=t>>16&255,c[u++]=t>>8&255,c[u++]=255&t;2===l&&(t=r[e.charCodeAt(n)]<<2|r[e.charCodeAt(n+1)]>>4,c[u++]=255&t);1===l&&(t=r[e.charCodeAt(n)]<<10|r[e.charCodeAt(n+1)]<<4|r[e.charCodeAt(n+2)]>>2,c[u++]=t>>8&255,c[u++]=255&t);return c},t.fromByteArray=function(e){for(var t,r=e.length,o=r%3,a=[],i=16383,s=0,c=r-o;s<c;s+=i)a.push(l(e,s,s+i>c?c:s+i));1===o?(t=e[r-1],a.push(n[t>>2]+n[t<<4&63]+"==")):2===o&&(t=(e[r-2]<<8)+e[r-1],a.push(n[t>>10]+n[t>>4&63]+n[t<<2&63]+"="));return a.join("")};for(var n=[],r=[],o="undefined"!==typeof Uint8Array?Uint8Array:Array,a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=0;i<64;++i)n[i]=a[i],r[a.charCodeAt(i)]=i;function s(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=e.indexOf("=");return-1===n&&(n=t),[n,n===t?0:4-n%4]}function l(e,t,r){for(var o,a,i=[],s=t;s<r;s+=3)o=(e[s]<<16&16711680)+(e[s+1]<<8&65280)+(255&e[s+2]),i.push(n[(a=o)>>18&63]+n[a>>12&63]+n[a>>6&63]+n[63&a]);return i.join("")}r["-".charCodeAt(0)]=62,r["_".charCodeAt(0)]=63},365:e=>{var t,n,r=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function i(e){if(t===setTimeout)return setTimeout(e,0);if((t===o||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"===typeof setTimeout?setTimeout:o}catch(e){t=o}try{n="function"===typeof clearTimeout?clearTimeout:a}catch(e){n=a}}();var s,l=[],c=!1,u=-1;function d(){c&&s&&(c=!1,s.length?l=s.concat(l):u=-1,l.length&&f())}function f(){if(!c){var e=i(d);c=!0;for(var t=l.length;t;){for(s=l,l=[];++u<t;)s&&s[u].run();u=-1,t=l.length}s=null,c=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===a||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{return n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function h(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new p(e,t)),1!==l.length||c||i(f)},p.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=h,r.addListener=h,r.once=h,r.off=h,r.removeListener=h,r.removeAllListeners=h,r.emit=h,r.prependListener=h,r.prependOnceListener=h,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},478:(e,t,n)=>{"use strict";const r=n(317),o=n(956),a="function"===typeof Symbol&&"function"===typeof Symbol.for?Symbol.for("nodejs.util.inspect.custom"):null;t.hp=l,t.IS=50;const i=2147483647;function s(e){if(e>i)throw new RangeError('The value "'+e+'" is invalid for option "size"');const t=new Uint8Array(e);return Object.setPrototypeOf(t,l.prototype),t}function l(e,t,n){if("number"===typeof e){if("string"===typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return d(e)}return c(e,t,n)}function c(e,t,n){if("string"===typeof e)return function(e,t){"string"===typeof t&&""!==t||(t="utf8");if(!l.isEncoding(t))throw new TypeError("Unknown encoding: "+t);const n=0|m(e,t);let r=s(n);const o=r.write(e,t);o!==n&&(r=r.slice(0,o));return r}(e,t);if(ArrayBuffer.isView(e))return function(e){if($(e,Uint8Array)){const t=new Uint8Array(e);return p(t.buffer,t.byteOffset,t.byteLength)}return f(e)}(e);if(null==e)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if($(e,ArrayBuffer)||e&&$(e.buffer,ArrayBuffer))return p(e,t,n);if("undefined"!==typeof SharedArrayBuffer&&($(e,SharedArrayBuffer)||e&&$(e.buffer,SharedArrayBuffer)))return p(e,t,n);if("number"===typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');const r=e.valueOf&&e.valueOf();if(null!=r&&r!==e)return l.from(r,t,n);const o=function(e){if(l.isBuffer(e)){const t=0|h(e.length),n=s(t);return 0===n.length||e.copy(n,0,0,t),n}if(void 0!==e.length)return"number"!==typeof e.length||G(e.length)?s(0):f(e);if("Buffer"===e.type&&Array.isArray(e.data))return f(e.data)}(e);if(o)return o;if("undefined"!==typeof Symbol&&null!=Symbol.toPrimitive&&"function"===typeof e[Symbol.toPrimitive])return l.from(e[Symbol.toPrimitive]("string"),t,n);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function u(e){if("number"!==typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function d(e){return u(e),s(e<0?0:0|h(e))}function f(e){const t=e.length<0?0:0|h(e.length),n=s(t);for(let r=0;r<t;r+=1)n[r]=255&e[r];return n}function p(e,t,n){if(t<0||e.byteLength<t)throw new RangeError('"offset" is outside of buffer bounds');if(e.byteLength<t+(n||0))throw new RangeError('"length" is outside of buffer bounds');let r;return r=void 0===t&&void 0===n?new Uint8Array(e):void 0===n?new Uint8Array(e,t):new Uint8Array(e,t,n),Object.setPrototypeOf(r,l.prototype),r}function h(e){if(e>=i)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i.toString(16)+" bytes");return 0|e}function m(e,t){if(l.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||$(e,ArrayBuffer))return e.byteLength;if("string"!==typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);const n=e.length,r=arguments.length>2&&!0===arguments[2];if(!r&&0===n)return 0;let o=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":return V(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return Q(e).length;default:if(o)return r?-1:V(e).length;t=(""+t).toLowerCase(),o=!0}}function v(e,t,n){let r=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return T(this,t,n);case"utf8":case"utf-8":return N(this,t,n);case"ascii":return D(this,t,n);case"latin1":case"binary":return P(this,t,n);case"base64":return C(this,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,t,n);default:if(r)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),r=!0}}function g(e,t,n){const r=e[t];e[t]=e[n],e[n]=r}function y(e,t,n,r,o){if(0===e.length)return-1;if("string"===typeof n?(r=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),G(n=+n)&&(n=o?0:e.length-1),n<0&&(n=e.length+n),n>=e.length){if(o)return-1;n=e.length-1}else if(n<0){if(!o)return-1;n=0}if("string"===typeof t&&(t=l.from(t,r)),l.isBuffer(t))return 0===t.length?-1:b(e,t,n,r,o);if("number"===typeof t)return t&=255,"function"===typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(e,t,n):Uint8Array.prototype.lastIndexOf.call(e,t,n):b(e,[t],n,r,o);throw new TypeError("val must be string, number or Buffer")}function b(e,t,n,r,o){let a,i=1,s=e.length,l=t.length;if(void 0!==r&&("ucs2"===(r=String(r).toLowerCase())||"ucs-2"===r||"utf16le"===r||"utf-16le"===r)){if(e.length<2||t.length<2)return-1;i=2,s/=2,l/=2,n/=2}function c(e,t){return 1===i?e[t]:e.readUInt16BE(t*i)}if(o){let r=-1;for(a=n;a<s;a++)if(c(e,a)===c(t,-1===r?0:a-r)){if(-1===r&&(r=a),a-r+1===l)return r*i}else-1!==r&&(a-=a-r),r=-1}else for(n+l>s&&(n=s-l),a=n;a>=0;a--){let n=!0;for(let r=0;r<l;r++)if(c(e,a+r)!==c(t,r)){n=!1;break}if(n)return a}return-1}function w(e,t,n,r){n=Number(n)||0;const o=e.length-n;r?(r=Number(r))>o&&(r=o):r=o;const a=t.length;let i;for(r>a/2&&(r=a/2),i=0;i<r;++i){const r=parseInt(t.substr(2*i,2),16);if(G(r))return i;e[n+i]=r}return i}function x(e,t,n,r){return K(V(t,e.length-n),e,n,r)}function k(e,t,n,r){return K(function(e){const t=[];for(let n=0;n<e.length;++n)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function S(e,t,n,r){return K(Q(t),e,n,r)}function E(e,t,n,r){return K(function(e,t){let n,r,o;const a=[];for(let i=0;i<e.length&&!((t-=2)<0);++i)n=e.charCodeAt(i),r=n>>8,o=n%256,a.push(o),a.push(r);return a}(t,e.length-n),e,n,r)}function C(e,t,n){return 0===t&&n===e.length?r.fromByteArray(e):r.fromByteArray(e.slice(t,n))}function N(e,t,n){n=Math.min(e.length,n);const r=[];let o=t;for(;o<n;){const t=e[o];let a=null,i=t>239?4:t>223?3:t>191?2:1;if(o+i<=n){let n,r,s,l;switch(i){case 1:t<128&&(a=t);break;case 2:n=e[o+1],128===(192&n)&&(l=(31&t)<<6|63&n,l>127&&(a=l));break;case 3:n=e[o+1],r=e[o+2],128===(192&n)&&128===(192&r)&&(l=(15&t)<<12|(63&n)<<6|63&r,l>2047&&(l<55296||l>57343)&&(a=l));break;case 4:n=e[o+1],r=e[o+2],s=e[o+3],128===(192&n)&&128===(192&r)&&128===(192&s)&&(l=(15&t)<<18|(63&n)<<12|(63&r)<<6|63&s,l>65535&&l<1114112&&(a=l))}}null===a?(a=65533,i=1):a>65535&&(a-=65536,r.push(a>>>10&1023|55296),a=56320|1023&a),r.push(a),o+=i}return function(e){const t=e.length;if(t<=j)return String.fromCharCode.apply(String,e);let n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=j));return n}(r)}l.TYPED_ARRAY_SUPPORT=function(){try{const e=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(e,t),42===e.foo()}catch(e){return!1}}(),l.TYPED_ARRAY_SUPPORT||"undefined"===typeof console||"function"!==typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(l.prototype,"parent",{enumerable:!0,get:function(){if(l.isBuffer(this))return this.buffer}}),Object.defineProperty(l.prototype,"offset",{enumerable:!0,get:function(){if(l.isBuffer(this))return this.byteOffset}}),l.poolSize=8192,l.from=function(e,t,n){return c(e,t,n)},Object.setPrototypeOf(l.prototype,Uint8Array.prototype),Object.setPrototypeOf(l,Uint8Array),l.alloc=function(e,t,n){return function(e,t,n){return u(e),e<=0?s(e):void 0!==t?"string"===typeof n?s(e).fill(t,n):s(e).fill(t):s(e)}(e,t,n)},l.allocUnsafe=function(e){return d(e)},l.allocUnsafeSlow=function(e){return d(e)},l.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==l.prototype},l.compare=function(e,t){if($(e,Uint8Array)&&(e=l.from(e,e.offset,e.byteLength)),$(t,Uint8Array)&&(t=l.from(t,t.offset,t.byteLength)),!l.isBuffer(e)||!l.isBuffer(t))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(e===t)return 0;let n=e.length,r=t.length;for(let o=0,a=Math.min(n,r);o<a;++o)if(e[o]!==t[o]){n=e[o],r=t[o];break}return n<r?-1:r<n?1:0},l.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},l.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return l.alloc(0);let n;if(void 0===t)for(t=0,n=0;n<e.length;++n)t+=e[n].length;const r=l.allocUnsafe(t);let o=0;for(n=0;n<e.length;++n){let t=e[n];if($(t,Uint8Array))o+t.length>r.length?(l.isBuffer(t)||(t=l.from(t)),t.copy(r,o)):Uint8Array.prototype.set.call(r,t,o);else{if(!l.isBuffer(t))throw new TypeError('"list" argument must be an Array of Buffers');t.copy(r,o)}o+=t.length}return r},l.byteLength=m,l.prototype._isBuffer=!0,l.prototype.swap16=function(){const e=this.length;if(e%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let t=0;t<e;t+=2)g(this,t,t+1);return this},l.prototype.swap32=function(){const e=this.length;if(e%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let t=0;t<e;t+=4)g(this,t,t+3),g(this,t+1,t+2);return this},l.prototype.swap64=function(){const e=this.length;if(e%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let t=0;t<e;t+=8)g(this,t,t+7),g(this,t+1,t+6),g(this,t+2,t+5),g(this,t+3,t+4);return this},l.prototype.toString=function(){const e=this.length;return 0===e?"":0===arguments.length?N(this,0,e):v.apply(this,arguments)},l.prototype.toLocaleString=l.prototype.toString,l.prototype.equals=function(e){if(!l.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===l.compare(this,e)},l.prototype.inspect=function(){let e="";const n=t.IS;return e=this.toString("hex",0,n).replace(/(.{2})/g,"$1 ").trim(),this.length>n&&(e+=" ... "),"<Buffer "+e+">"},a&&(l.prototype[a]=l.prototype.inspect),l.prototype.compare=function(e,t,n,r,o){if($(e,Uint8Array)&&(e=l.from(e,e.offset,e.byteLength)),!l.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(void 0===t&&(t=0),void 0===n&&(n=e?e.length:0),void 0===r&&(r=0),void 0===o&&(o=this.length),t<0||n>e.length||r<0||o>this.length)throw new RangeError("out of range index");if(r>=o&&t>=n)return 0;if(r>=o)return-1;if(t>=n)return 1;if(this===e)return 0;let a=(o>>>=0)-(r>>>=0),i=(n>>>=0)-(t>>>=0);const s=Math.min(a,i),c=this.slice(r,o),u=e.slice(t,n);for(let l=0;l<s;++l)if(c[l]!==u[l]){a=c[l],i=u[l];break}return a<i?-1:i<a?1:0},l.prototype.includes=function(e,t,n){return-1!==this.indexOf(e,t,n)},l.prototype.indexOf=function(e,t,n){return y(this,e,t,n,!0)},l.prototype.lastIndexOf=function(e,t,n){return y(this,e,t,n,!1)},l.prototype.write=function(e,t,n,r){if(void 0===t)r="utf8",n=this.length,t=0;else if(void 0===n&&"string"===typeof t)r=t,n=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(n)?(n>>>=0,void 0===r&&(r="utf8")):(r=n,n=void 0)}const o=this.length-t;if((void 0===n||n>o)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let a=!1;for(;;)switch(r){case"hex":return w(this,e,t,n);case"utf8":case"utf-8":return x(this,e,t,n);case"ascii":case"latin1":case"binary":return k(this,e,t,n);case"base64":return S(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return E(this,e,t,n);default:if(a)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),a=!0}},l.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};const j=4096;function D(e,t,n){let r="";n=Math.min(e.length,n);for(let o=t;o<n;++o)r+=String.fromCharCode(127&e[o]);return r}function P(e,t,n){let r="";n=Math.min(e.length,n);for(let o=t;o<n;++o)r+=String.fromCharCode(e[o]);return r}function T(e,t,n){const r=e.length;(!t||t<0)&&(t=0),(!n||n<0||n>r)&&(n=r);let o="";for(let a=t;a<n;++a)o+=X[e[a]];return o}function _(e,t,n){const r=e.slice(t,n);let o="";for(let a=0;a<r.length-1;a+=2)o+=String.fromCharCode(r[a]+256*r[a+1]);return o}function O(e,t,n){if(e%1!==0||e<0)throw new RangeError("offset is not uint");if(e+t>n)throw new RangeError("Trying to access beyond buffer length")}function M(e,t,n,r,o,a){if(!l.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||t<a)throw new RangeError('"value" argument is out of bounds');if(n+r>e.length)throw new RangeError("Index out of range")}function R(e,t,n,r,o){U(t,r,o,e,n,7);let a=Number(t&BigInt(4294967295));e[n++]=a,a>>=8,e[n++]=a,a>>=8,e[n++]=a,a>>=8,e[n++]=a;let i=Number(t>>BigInt(32)&BigInt(4294967295));return e[n++]=i,i>>=8,e[n++]=i,i>>=8,e[n++]=i,i>>=8,e[n++]=i,n}function A(e,t,n,r,o){U(t,r,o,e,n,7);let a=Number(t&BigInt(4294967295));e[n+7]=a,a>>=8,e[n+6]=a,a>>=8,e[n+5]=a,a>>=8,e[n+4]=a;let i=Number(t>>BigInt(32)&BigInt(4294967295));return e[n+3]=i,i>>=8,e[n+2]=i,i>>=8,e[n+1]=i,i>>=8,e[n]=i,n+8}function L(e,t,n,r,o,a){if(n+r>e.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function I(e,t,n,r,a){return t=+t,n>>>=0,a||L(e,0,n,4),o.write(e,t,n,r,23,4),n+4}function F(e,t,n,r,a){return t=+t,n>>>=0,a||L(e,0,n,8),o.write(e,t,n,r,52,8),n+8}l.prototype.slice=function(e,t){const n=this.length;(e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t<e&&(t=e);const r=this.subarray(e,t);return Object.setPrototypeOf(r,l.prototype),r},l.prototype.readUintLE=l.prototype.readUIntLE=function(e,t,n){e>>>=0,t>>>=0,n||O(e,t,this.length);let r=this[e],o=1,a=0;for(;++a<t&&(o*=256);)r+=this[e+a]*o;return r},l.prototype.readUintBE=l.prototype.readUIntBE=function(e,t,n){e>>>=0,t>>>=0,n||O(e,t,this.length);let r=this[e+--t],o=1;for(;t>0&&(o*=256);)r+=this[e+--t]*o;return r},l.prototype.readUint8=l.prototype.readUInt8=function(e,t){return e>>>=0,t||O(e,1,this.length),this[e]},l.prototype.readUint16LE=l.prototype.readUInt16LE=function(e,t){return e>>>=0,t||O(e,2,this.length),this[e]|this[e+1]<<8},l.prototype.readUint16BE=l.prototype.readUInt16BE=function(e,t){return e>>>=0,t||O(e,2,this.length),this[e]<<8|this[e+1]},l.prototype.readUint32LE=l.prototype.readUInt32LE=function(e,t){return e>>>=0,t||O(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},l.prototype.readUint32BE=l.prototype.readUInt32BE=function(e,t){return e>>>=0,t||O(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},l.prototype.readBigUInt64LE=J((function(e){Y(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||W(e,this.length-8);const r=t+256*this[++e]+65536*this[++e]+this[++e]*2**24,o=this[++e]+256*this[++e]+65536*this[++e]+n*2**24;return BigInt(r)+(BigInt(o)<<BigInt(32))})),l.prototype.readBigUInt64BE=J((function(e){Y(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||W(e,this.length-8);const r=t*2**24+65536*this[++e]+256*this[++e]+this[++e],o=this[++e]*2**24+65536*this[++e]+256*this[++e]+n;return(BigInt(r)<<BigInt(32))+BigInt(o)})),l.prototype.readIntLE=function(e,t,n){e>>>=0,t>>>=0,n||O(e,t,this.length);let r=this[e],o=1,a=0;for(;++a<t&&(o*=256);)r+=this[e+a]*o;return o*=128,r>=o&&(r-=Math.pow(2,8*t)),r},l.prototype.readIntBE=function(e,t,n){e>>>=0,t>>>=0,n||O(e,t,this.length);let r=t,o=1,a=this[e+--r];for(;r>0&&(o*=256);)a+=this[e+--r]*o;return o*=128,a>=o&&(a-=Math.pow(2,8*t)),a},l.prototype.readInt8=function(e,t){return e>>>=0,t||O(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},l.prototype.readInt16LE=function(e,t){e>>>=0,t||O(e,2,this.length);const n=this[e]|this[e+1]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt16BE=function(e,t){e>>>=0,t||O(e,2,this.length);const n=this[e+1]|this[e]<<8;return 32768&n?4294901760|n:n},l.prototype.readInt32LE=function(e,t){return e>>>=0,t||O(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},l.prototype.readInt32BE=function(e,t){return e>>>=0,t||O(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},l.prototype.readBigInt64LE=J((function(e){Y(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||W(e,this.length-8);const r=this[e+4]+256*this[e+5]+65536*this[e+6]+(n<<24);return(BigInt(r)<<BigInt(32))+BigInt(t+256*this[++e]+65536*this[++e]+this[++e]*2**24)})),l.prototype.readBigInt64BE=J((function(e){Y(e>>>=0,"offset");const t=this[e],n=this[e+7];void 0!==t&&void 0!==n||W(e,this.length-8);const r=(t<<24)+65536*this[++e]+256*this[++e]+this[++e];return(BigInt(r)<<BigInt(32))+BigInt(this[++e]*2**24+65536*this[++e]+256*this[++e]+n)})),l.prototype.readFloatLE=function(e,t){return e>>>=0,t||O(e,4,this.length),o.read(this,e,!0,23,4)},l.prototype.readFloatBE=function(e,t){return e>>>=0,t||O(e,4,this.length),o.read(this,e,!1,23,4)},l.prototype.readDoubleLE=function(e,t){return e>>>=0,t||O(e,8,this.length),o.read(this,e,!0,52,8)},l.prototype.readDoubleBE=function(e,t){return e>>>=0,t||O(e,8,this.length),o.read(this,e,!1,52,8)},l.prototype.writeUintLE=l.prototype.writeUIntLE=function(e,t,n,r){if(e=+e,t>>>=0,n>>>=0,!r){M(this,e,t,n,Math.pow(2,8*n)-1,0)}let o=1,a=0;for(this[t]=255&e;++a<n&&(o*=256);)this[t+a]=e/o&255;return t+n},l.prototype.writeUintBE=l.prototype.writeUIntBE=function(e,t,n,r){if(e=+e,t>>>=0,n>>>=0,!r){M(this,e,t,n,Math.pow(2,8*n)-1,0)}let o=n-1,a=1;for(this[t+o]=255&e;--o>=0&&(a*=256);)this[t+o]=e/a&255;return t+n},l.prototype.writeUint8=l.prototype.writeUInt8=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,1,255,0),this[t]=255&e,t+1},l.prototype.writeUint16LE=l.prototype.writeUInt16LE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,2,65535,0),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeUint16BE=l.prototype.writeUInt16BE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeUint32LE=l.prototype.writeUInt32LE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e,t+4},l.prototype.writeUint32BE=l.prototype.writeUInt32BE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeBigUInt64LE=J((function(e){return R(this,e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt("0xffffffffffffffff"))})),l.prototype.writeBigUInt64BE=J((function(e){return A(this,e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,BigInt(0),BigInt("0xffffffffffffffff"))})),l.prototype.writeIntLE=function(e,t,n,r){if(e=+e,t>>>=0,!r){const r=Math.pow(2,8*n-1);M(this,e,t,n,r-1,-r)}let o=0,a=1,i=0;for(this[t]=255&e;++o<n&&(a*=256);)e<0&&0===i&&0!==this[t+o-1]&&(i=1),this[t+o]=(e/a|0)-i&255;return t+n},l.prototype.writeIntBE=function(e,t,n,r){if(e=+e,t>>>=0,!r){const r=Math.pow(2,8*n-1);M(this,e,t,n,r-1,-r)}let o=n-1,a=1,i=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===i&&0!==this[t+o+1]&&(i=1),this[t+o]=(e/a|0)-i&255;return t+n},l.prototype.writeInt8=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=255&e,t+1},l.prototype.writeInt16LE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,2,32767,-32768),this[t]=255&e,this[t+1]=e>>>8,t+2},l.prototype.writeInt16BE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=255&e,t+2},l.prototype.writeInt32LE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,4,2147483647,-2147483648),this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4},l.prototype.writeInt32BE=function(e,t,n){return e=+e,t>>>=0,n||M(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e,t+4},l.prototype.writeBigInt64LE=J((function(e){return R(this,e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),l.prototype.writeBigInt64BE=J((function(e){return A(this,e,arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))})),l.prototype.writeFloatLE=function(e,t,n){return I(this,e,t,!0,n)},l.prototype.writeFloatBE=function(e,t,n){return I(this,e,t,!1,n)},l.prototype.writeDoubleLE=function(e,t,n){return F(this,e,t,!0,n)},l.prototype.writeDoubleBE=function(e,t,n){return F(this,e,t,!1,n)},l.prototype.copy=function(e,t,n,r){if(!l.isBuffer(e))throw new TypeError("argument should be a Buffer");if(n||(n=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<n&&(r=n),r===n)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t<r-n&&(r=e.length-t+n);const o=r-n;return this===e&&"function"===typeof Uint8Array.prototype.copyWithin?this.copyWithin(t,n,r):Uint8Array.prototype.set.call(e,this.subarray(n,r),t),o},l.prototype.fill=function(e,t,n,r){if("string"===typeof e){if("string"===typeof t?(r=t,t=0,n=this.length):"string"===typeof n&&(r=n,n=this.length),void 0!==r&&"string"!==typeof r)throw new TypeError("encoding must be a string");if("string"===typeof r&&!l.isEncoding(r))throw new TypeError("Unknown encoding: "+r);if(1===e.length){const t=e.charCodeAt(0);("utf8"===r&&t<128||"latin1"===r)&&(e=t)}}else"number"===typeof e?e&=255:"boolean"===typeof e&&(e=Number(e));if(t<0||this.length<t||this.length<n)throw new RangeError("Out of range index");if(n<=t)return this;let o;if(t>>>=0,n=void 0===n?this.length:n>>>0,e||(e=0),"number"===typeof e)for(o=t;o<n;++o)this[o]=e;else{const a=l.isBuffer(e)?e:l.from(e,r),i=a.length;if(0===i)throw new TypeError('The value "'+e+'" is invalid for argument "value"');for(o=0;o<n-t;++o)this[o+t]=a[o%i]}return this};const z={};function B(e,t,n){z[e]=class extends n{constructor(){super(),Object.defineProperty(this,"message",{value:t.apply(this,arguments),writable:!0,configurable:!0}),this.name="".concat(this.name," [").concat(e,"]"),this.stack,delete this.name}get code(){return e}set code(e){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:e,writable:!0})}toString(){return"".concat(this.name," [").concat(e,"]: ").concat(this.message)}}}function H(e){let t="",n=e.length;const r="-"===e[0]?1:0;for(;n>=r+4;n-=3)t="_".concat(e.slice(n-3,n)).concat(t);return"".concat(e.slice(0,n)).concat(t)}function U(e,t,n,r,o,a){if(e>n||e<t){const r="bigint"===typeof t?"n":"";let o;throw o=a>3?0===t||t===BigInt(0)?">= 0".concat(r," and < 2").concat(r," ** ").concat(8*(a+1)).concat(r):">= -(2".concat(r," ** ").concat(8*(a+1)-1).concat(r,") and < 2 ** ")+"".concat(8*(a+1)-1).concat(r):">= ".concat(t).concat(r," and <= ").concat(n).concat(r),new z.ERR_OUT_OF_RANGE("value",o,e)}!function(e,t,n){Y(t,"offset"),void 0!==e[t]&&void 0!==e[t+n]||W(t,e.length-(n+1))}(r,o,a)}function Y(e,t){if("number"!==typeof e)throw new z.ERR_INVALID_ARG_TYPE(t,"number",e)}function W(e,t,n){if(Math.floor(e)!==e)throw Y(e,n),new z.ERR_OUT_OF_RANGE(n||"offset","an integer",e);if(t<0)throw new z.ERR_BUFFER_OUT_OF_BOUNDS;throw new z.ERR_OUT_OF_RANGE(n||"offset",">= ".concat(n?1:0," and <= ").concat(t),e)}B("ERR_BUFFER_OUT_OF_BOUNDS",(function(e){return e?"".concat(e," is outside of buffer bounds"):"Attempt to access memory outside buffer bounds"}),RangeError),B("ERR_INVALID_ARG_TYPE",(function(e,t){return'The "'.concat(e,'" argument must be of type number. Received type ').concat(typeof t)}),TypeError),B("ERR_OUT_OF_RANGE",(function(e,t,n){let r='The value of "'.concat(e,'" is out of range.'),o=n;return Number.isInteger(n)&&Math.abs(n)>2**32?o=H(String(n)):"bigint"===typeof n&&(o=String(n),(n>BigInt(2)**BigInt(32)||n<-(BigInt(2)**BigInt(32)))&&(o=H(o)),o+="n"),r+=" It must be ".concat(t,". Received ").concat(o),r}),RangeError);const q=/[^+/0-9A-Za-z-_]/g;function V(e,t){let n;t=t||1/0;const r=e.length;let o=null;const a=[];for(let i=0;i<r;++i){if(n=e.charCodeAt(i),n>55295&&n<57344){if(!o){if(n>56319){(t-=3)>-1&&a.push(239,191,189);continue}if(i+1===r){(t-=3)>-1&&a.push(239,191,189);continue}o=n;continue}if(n<56320){(t-=3)>-1&&a.push(239,191,189),o=n;continue}n=65536+(o-55296<<10|n-56320)}else o&&(t-=3)>-1&&a.push(239,191,189);if(o=null,n<128){if((t-=1)<0)break;a.push(n)}else if(n<2048){if((t-=2)<0)break;a.push(n>>6|192,63&n|128)}else if(n<65536){if((t-=3)<0)break;a.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;a.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return a}function Q(e){return r.toByteArray(function(e){if((e=(e=e.split("=")[0]).trim().replace(q,"")).length<2)return"";for(;e.length%4!==0;)e+="=";return e}(e))}function K(e,t,n,r){let o;for(o=0;o<r&&!(o+n>=t.length||o>=e.length);++o)t[o+n]=e[o];return o}function $(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function G(e){return e!==e}const X=function(){const e="0123456789abcdef",t=new Array(256);for(let n=0;n<16;++n){const r=16*n;for(let o=0;o<16;++o)t[r+o]=e[n]+e[o]}return t}();function J(e){return"undefined"===typeof BigInt?Z:e}function Z(){throw new Error("BigInt not supported")}},483:(e,t,n)=>{"use strict";e.exports=n(592)},556:(e,t,n)=>{"use strict";var r=n(557),o=n(483),a=n(998);function i(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function s(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function l(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!==(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function c(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function u(e){if(l(e)!==e)throw Error(i(188))}function d(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e;for(e=e.child;null!==e;){if(null!==(t=d(e)))return t;e=e.sibling}return null}var f=Object.assign,p=Symbol.for("react.element"),h=Symbol.for("react.transitional.element"),m=Symbol.for("react.portal"),v=Symbol.for("react.fragment"),g=Symbol.for("react.strict_mode"),y=Symbol.for("react.profiler"),b=Symbol.for("react.provider"),w=Symbol.for("react.consumer"),x=Symbol.for("react.context"),k=Symbol.for("react.forward_ref"),S=Symbol.for("react.suspense"),E=Symbol.for("react.suspense_list"),C=Symbol.for("react.memo"),N=Symbol.for("react.lazy");Symbol.for("react.scope");var j=Symbol.for("react.activity");Symbol.for("react.legacy_hidden"),Symbol.for("react.tracing_marker");var D=Symbol.for("react.memo_cache_sentinel");Symbol.for("react.view_transition");var P=Symbol.iterator;function T(e){return null===e||"object"!==typeof e?null:"function"===typeof(e=P&&e[P]||e["@@iterator"])?e:null}var _=Symbol.for("react.client.reference");function O(e){if(null==e)return null;if("function"===typeof e)return e.$$typeof===_?null:e.displayName||e.name||null;if("string"===typeof e)return e;switch(e){case v:return"Fragment";case y:return"Profiler";case g:return"StrictMode";case S:return"Suspense";case E:return"SuspenseList";case j:return"Activity"}if("object"===typeof e)switch(e.$$typeof){case m:return"Portal";case x:return(e.displayName||"Context")+".Provider";case w:return(e._context.displayName||"Context")+".Consumer";case k:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case C:return null!==(t=e.displayName||null)?t:O(e.type)||"Memo";case N:t=e._payload,e=e._init;try{return O(e(t))}catch(n){}}return null}var M=Array.isArray,R=o.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,A=a.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,L={pending:!1,data:null,method:null,action:null},I=[],F=-1;function z(e){return{current:e}}function B(e){0>F||(e.current=I[F],I[F]=null,F--)}function H(e,t){F++,I[F]=e.current,e.current=t}var U=z(null),Y=z(null),W=z(null),q=z(null);function V(e,t){switch(H(W,t),H(Y,e),H(U,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?od(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=ad(t=od(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}B(U),H(U,e)}function Q(){B(U),B(Y),B(W)}function K(e){null!==e.memoizedState&&H(q,e);var t=U.current,n=ad(t,e.type);t!==n&&(H(Y,e),H(U,n))}function $(e){Y.current===e&&(B(U),B(Y)),q.current===e&&(B(q),Kd._currentValue=L)}var G=Object.prototype.hasOwnProperty,X=r.unstable_scheduleCallback,J=r.unstable_cancelCallback,Z=r.unstable_shouldYield,ee=r.unstable_requestPaint,te=r.unstable_now,ne=r.unstable_getCurrentPriorityLevel,re=r.unstable_ImmediatePriority,oe=r.unstable_UserBlockingPriority,ae=r.unstable_NormalPriority,ie=r.unstable_LowPriority,se=r.unstable_IdlePriority,le=r.log,ce=r.unstable_setDisableYieldValue,ue=null,de=null;function fe(e){if("function"===typeof le&&ce(e),de&&"function"===typeof de.setStrictMode)try{de.setStrictMode(ue,e)}catch(t){}}var pe=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(he(e)/me|0)|0},he=Math.log,me=Math.LN2;var ve=256,ge=4194304;function ye(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64: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:case 262144:case 524288:case 1048576:case 2097152:return 4194048&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function be(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var o=0,a=e.suspendedLanes,i=e.pingedLanes;e=e.warmLanes;var s=134217727&r;return 0!==s?0!==(r=s&~a)?o=ye(r):0!==(i&=s)?o=ye(i):n||0!==(n=s&~e)&&(o=ye(n)):0!==(s=r&~a)?o=ye(s):0!==i?o=ye(i):n||0!==(n=r&~e)&&(o=ye(n)),0===o?0:0!==t&&t!==o&&0===(t&a)&&((a=o&-o)>=(n=t&-t)||32===a&&0!==(4194048&n))?t:o}function we(e,t){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function xe(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+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 t+5e3;default:return-1}}function ke(){var e=ve;return 0===(4194048&(ve<<=1))&&(ve=256),e}function Se(){var e=ge;return 0===(62914560&(ge<<=1))&&(ge=4194304),e}function Ee(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Ce(e,t){e.pendingLanes|=t,268435456!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Ne(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-pe(t);e.entangledLanes|=t,e.entanglements[r]=1073741824|e.entanglements[r]|4194090&n}function je(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-pe(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}function De(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function Pe(e){return 2<(e&=-e)?8<e?0!==(134217727&e)?32:268435456:8:2}function Te(){var e=A.p;return 0!==e?e:void 0===(e=window.event)?32:uf(e.type)}var _e=Math.random().toString(36).slice(2),Oe="__reactFiber$"+_e,Me="__reactProps$"+_e,Re="__reactContainer$"+_e,Ae="__reactEvents$"+_e,Le="__reactListeners$"+_e,Ie="__reactHandles$"+_e,Fe="__reactResources$"+_e,ze="__reactMarker$"+_e;function Be(e){delete e[Oe],delete e[Me],delete e[Ae],delete e[Le],delete e[Ie]}function He(e){var t=e[Oe];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Re]||n[Oe]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=bd(e);null!==e;){if(n=e[Oe])return n;e=bd(e)}return t}n=(e=n).parentNode}return null}function Ue(e){if(e=e[Oe]||e[Re]){var t=e.tag;if(5===t||6===t||13===t||26===t||27===t||3===t)return e}return null}function Ye(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e.stateNode;throw Error(i(33))}function We(e){var t=e[Fe];return t||(t=e[Fe]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function qe(e){e[ze]=!0}var Ve=new Set,Qe={};function Ke(e,t){$e(e,t),$e(e+"Capture",t)}function $e(e,t){for(Qe[e]=t,e=0;e<t.length;e++)Ve.add(t[e])}var Ge,Xe,Je=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),Ze={},et={};function tt(e,t,n){if(o=t,G.call(et,o)||!G.call(Ze,o)&&(Je.test(o)?et[o]=!0:(Ze[o]=!0,0)))if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":return void e.removeAttribute(t);case"boolean":var r=t.toLowerCase().slice(0,5);if("data-"!==r&&"aria-"!==r)return void e.removeAttribute(t)}e.setAttribute(t,""+n)}var o}function nt(e,t,n){if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":return void e.removeAttribute(t)}e.setAttribute(t,""+n)}}function rt(e,t,n,r){if(null===r)e.removeAttribute(n);else{switch(typeof r){case"undefined":case"function":case"symbol":case"boolean":return void e.removeAttribute(n)}e.setAttributeNS(t,n,""+r)}}function ot(e){if(void 0===Ge)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Ge=t&&t[1]||"",Xe=-1<n.stack.indexOf("\n    at")?" (<anonymous>)":-1<n.stack.indexOf("@")?"@unknown:0:0":""}return"\n"+Ge+e+Xe}var at=!1;function it(e,t){if(!e||at)return"";at=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var n=function(){throw Error()};if(Object.defineProperty(n.prototype,"props",{set:function(){throw Error()}}),"object"===typeof Reflect&&Reflect.construct){try{Reflect.construct(n,[])}catch(o){var r=o}Reflect.construct(e,[],n)}else{try{n.call()}catch(a){r=a}e.call(n.prototype)}}else{try{throw Error()}catch(i){r=i}(n=e())&&"function"===typeof n.catch&&n.catch((function(){}))}}catch(s){if(s&&r&&"string"===typeof s.stack)return[s.stack,r.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var o=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,"name");o&&o.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var a=r.DetermineComponentFrameRoot(),i=a[0],s=a[1];if(i&&s){var l=i.split("\n"),c=s.split("\n");for(o=r=0;r<l.length&&!l[r].includes("DetermineComponentFrameRoot");)r++;for(;o<c.length&&!c[o].includes("DetermineComponentFrameRoot");)o++;if(r===l.length||o===c.length)for(r=l.length-1,o=c.length-1;1<=r&&0<=o&&l[r]!==c[o];)o--;for(;1<=r&&0<=o;r--,o--)if(l[r]!==c[o]){if(1!==r||1!==o)do{if(r--,0>--o||l[r]!==c[o]){var u="\n"+l[r].replace(" at new "," at ");return e.displayName&&u.includes("<anonymous>")&&(u=u.replace("<anonymous>",e.displayName)),u}}while(1<=r&&0<=o);break}}}finally{at=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?ot(n):""}function st(e){switch(e.tag){case 26:case 27:case 5:return ot(e.type);case 16:return ot("Lazy");case 13:return ot("Suspense");case 19:return ot("SuspenseList");case 0:case 15:return it(e.type,!1);case 11:return it(e.type.render,!1);case 1:return it(e.type,!0);case 31:return ot("Activity");default:return""}}function lt(e){try{var t="";do{t+=st(e),e=e.return}while(e);return t}catch(n){return"\nError generating stack: "+n.message+"\n"+n.stack}}function ct(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function ut(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function dt(e){e._valueTracker||(e._valueTracker=function(e){var t=ut(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&"undefined"!==typeof n&&"function"===typeof n.get&&"function"===typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function ft(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ut(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function pt(e){if("undefined"===typeof(e=e||("undefined"!==typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}var ht=/[\n"\\]/g;function mt(e){return e.replace(ht,(function(e){return"\\"+e.charCodeAt(0).toString(16)+" "}))}function vt(e,t,n,r,o,a,i,s){e.name="",null!=i&&"function"!==typeof i&&"symbol"!==typeof i&&"boolean"!==typeof i?e.type=i:e.removeAttribute("type"),null!=t?"number"===i?(0===t&&""===e.value||e.value!=t)&&(e.value=""+ct(t)):e.value!==""+ct(t)&&(e.value=""+ct(t)):"submit"!==i&&"reset"!==i||e.removeAttribute("value"),null!=t?yt(e,i,ct(t)):null!=n?yt(e,i,ct(n)):null!=r&&e.removeAttribute("value"),null==o&&null!=a&&(e.defaultChecked=!!a),null!=o&&(e.checked=o&&"function"!==typeof o&&"symbol"!==typeof o),null!=s&&"function"!==typeof s&&"symbol"!==typeof s&&"boolean"!==typeof s?e.name=""+ct(s):e.removeAttribute("name")}function gt(e,t,n,r,o,a,i,s){if(null!=a&&"function"!==typeof a&&"symbol"!==typeof a&&"boolean"!==typeof a&&(e.type=a),null!=t||null!=n){if(!("submit"!==a&&"reset"!==a||void 0!==t&&null!==t))return;n=null!=n?""+ct(n):"",t=null!=t?""+ct(t):n,s||t===e.value||(e.value=t),e.defaultValue=t}r="function"!==typeof(r=null!=r?r:o)&&"symbol"!==typeof r&&!!r,e.checked=s?e.checked:!!r,e.defaultChecked=!!r,null!=i&&"function"!==typeof i&&"symbol"!==typeof i&&"boolean"!==typeof i&&(e.name=i)}function yt(e,t,n){"number"===t&&pt(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function bt(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+ct(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function wt(e,t,n){null==t||((t=""+ct(t))!==e.value&&(e.value=t),null!=n)?e.defaultValue=null!=n?""+ct(n):"":e.defaultValue!==t&&(e.defaultValue=t)}function xt(e,t,n,r){if(null==t){if(null!=r){if(null!=n)throw Error(i(92));if(M(r)){if(1<r.length)throw Error(i(93));r=r[0]}n=r}null==n&&(n=""),t=n}n=ct(t),e.defaultValue=n,(r=e.textContent)===n&&""!==r&&null!==r&&(e.value=r)}function kt(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var St=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function Et(e,t,n){var r=0===t.indexOf("--");null==n||"boolean"===typeof n||""===n?r?e.setProperty(t,""):"float"===t?e.cssFloat="":e[t]="":r?e.setProperty(t,n):"number"!==typeof n||0===n||St.has(t)?"float"===t?e.cssFloat=n:e[t]=(""+n).trim():e[t]=n+"px"}function Ct(e,t,n){if(null!=t&&"object"!==typeof t)throw Error(i(62));if(e=e.style,null!=n){for(var r in n)!n.hasOwnProperty(r)||null!=t&&t.hasOwnProperty(r)||(0===r.indexOf("--")?e.setProperty(r,""):"float"===r?e.cssFloat="":e[r]="");for(var o in t)r=t[o],t.hasOwnProperty(o)&&n[o]!==r&&Et(e,o,r)}else for(var a in t)t.hasOwnProperty(a)&&Et(e,a,t[a])}function Nt(e){if(-1===e.indexOf("-"))return!1;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var jt=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),Dt=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function Pt(e){return Dt.test(""+e)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":e}var Tt=null;function _t(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Ot=null,Mt=null;function Rt(e){var t=Ue(e);if(t&&(e=t.stateNode)){var n=e[Me]||null;e:switch(e=t.stateNode,t.type){case"input":if(vt(e,n.value,n.defaultValue,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll('input[name="'+mt(""+t)+'"][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=r[Me]||null;if(!o)throw Error(i(90));vt(r,o.value,o.defaultValue,o.defaultValue,o.checked,o.defaultChecked,o.type,o.name)}}for(t=0;t<n.length;t++)(r=n[t]).form===e.form&&ft(r)}break e;case"textarea":wt(e,n.value,n.defaultValue);break e;case"select":null!=(t=n.value)&&bt(e,!!n.multiple,t,!1)}}}var At=!1;function Lt(e,t,n){if(At)return e(t,n);At=!0;try{return e(t)}finally{if(At=!1,(null!==Ot||null!==Mt)&&(Hc(),Ot&&(t=Ot,e=Mt,Mt=Ot=null,Rt(t),e)))for(t=0;t<e.length;t++)Rt(e[t])}}function It(e,t){var n=e.stateNode;if(null===n)return null;var r=n[Me]||null;if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!==typeof n)throw Error(i(231,t,typeof n));return n}var Ft=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),zt=!1;if(Ft)try{var Bt={};Object.defineProperty(Bt,"passive",{get:function(){zt=!0}}),window.addEventListener("test",Bt,Bt),window.removeEventListener("test",Bt,Bt)}catch(Rf){zt=!1}var Ht=null,Ut=null,Yt=null;function Wt(){if(Yt)return Yt;var e,t,n=Ut,r=n.length,o="value"in Ht?Ht.value:Ht.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var i=r-e;for(t=1;t<=i&&n[r-t]===o[a-t];t++);return Yt=o.slice(e,1<t?1-t:void 0)}function qt(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function Vt(){return!0}function Qt(){return!1}function Kt(e){function t(t,n,r,o,a){for(var i in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(i)&&(t=e[i],this[i]=t?t(o):o[i]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?Vt:Qt,this.isPropagationStopped=Qt,this}return f(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=Vt)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=Vt)},persist:function(){},isPersistent:Vt}),t}var $t,Gt,Xt,Jt={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Zt=Kt(Jt),en=f({},Jt,{view:0,detail:0}),tn=Kt(en),nn=f({},en,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:hn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Xt&&(Xt&&"mousemove"===e.type?($t=e.screenX-Xt.screenX,Gt=e.screenY-Xt.screenY):Gt=$t=0,Xt=e),$t)},movementY:function(e){return"movementY"in e?e.movementY:Gt}}),rn=Kt(nn),on=Kt(f({},nn,{dataTransfer:0})),an=Kt(f({},en,{relatedTarget:0})),sn=Kt(f({},Jt,{animationName:0,elapsedTime:0,pseudoElement:0})),ln=Kt(f({},Jt,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}})),cn=Kt(f({},Jt,{data:0})),un={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},dn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},fn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function pn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=fn[e])&&!!t[e]}function hn(){return pn}var mn=Kt(f({},en,{key:function(e){if(e.key){var t=un[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=qt(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?dn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:hn,charCode:function(e){return"keypress"===e.type?qt(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?qt(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}})),vn=Kt(f({},nn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),gn=Kt(f({},en,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:hn})),yn=Kt(f({},Jt,{propertyName:0,elapsedTime:0,pseudoElement:0})),bn=Kt(f({},nn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0})),wn=Kt(f({},Jt,{newState:0,oldState:0})),xn=[9,13,27,32],kn=Ft&&"CompositionEvent"in window,Sn=null;Ft&&"documentMode"in document&&(Sn=document.documentMode);var En=Ft&&"TextEvent"in window&&!Sn,Cn=Ft&&(!kn||Sn&&8<Sn&&11>=Sn),Nn=String.fromCharCode(32),jn=!1;function Dn(e,t){switch(e){case"keyup":return-1!==xn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Pn(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}var Tn=!1;var _n={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function On(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!_n[e.type]:"textarea"===t}function Mn(e,t,n,r){Ot?Mt?Mt.push(r):Mt=[r]:Ot=r,0<(t=Wu(t,"onChange")).length&&(n=new Zt("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var Rn=null,An=null;function Ln(e){Lu(e,0)}function In(e){if(ft(Ye(e)))return e}function Fn(e,t){if("change"===e)return t}var zn=!1;if(Ft){var Bn;if(Ft){var Hn="oninput"in document;if(!Hn){var Un=document.createElement("div");Un.setAttribute("oninput","return;"),Hn="function"===typeof Un.oninput}Bn=Hn}else Bn=!1;zn=Bn&&(!document.documentMode||9<document.documentMode)}function Yn(){Rn&&(Rn.detachEvent("onpropertychange",Wn),An=Rn=null)}function Wn(e){if("value"===e.propertyName&&In(An)){var t=[];Mn(t,An,e,_t(e)),Lt(Ln,t)}}function qn(e,t,n){"focusin"===e?(Yn(),An=n,(Rn=t).attachEvent("onpropertychange",Wn)):"focusout"===e&&Yn()}function Vn(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return In(An)}function Qn(e,t){if("click"===e)return In(t)}function Kn(e,t){if("input"===e||"change"===e)return In(t)}var $n="function"===typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e===1/t)||e!==e&&t!==t};function Gn(e,t){if($n(e,t))return!0;if("object"!==typeof e||null===e||"object"!==typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!G.call(t,o)||!$n(e[o],t[o]))return!1}return!0}function Xn(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Jn(e,t){var n,r=Xn(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Xn(r)}}function Zn(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?Zn(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function er(e){for(var t=pt((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);t instanceof e.HTMLIFrameElement;){try{var n="string"===typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=pt((e=t.contentWindow).document)}return t}function tr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var nr=Ft&&"documentMode"in document&&11>=document.documentMode,rr=null,or=null,ar=null,ir=!1;function sr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;ir||null==rr||rr!==pt(r)||("selectionStart"in(r=rr)&&tr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},ar&&Gn(ar,r)||(ar=r,0<(r=Wu(or,"onSelect")).length&&(t=new Zt("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=rr)))}function lr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var cr={animationend:lr("Animation","AnimationEnd"),animationiteration:lr("Animation","AnimationIteration"),animationstart:lr("Animation","AnimationStart"),transitionrun:lr("Transition","TransitionRun"),transitionstart:lr("Transition","TransitionStart"),transitioncancel:lr("Transition","TransitionCancel"),transitionend:lr("Transition","TransitionEnd")},ur={},dr={};function fr(e){if(ur[e])return ur[e];if(!cr[e])return e;var t,n=cr[e];for(t in n)if(n.hasOwnProperty(t)&&t in dr)return ur[e]=n[t];return e}Ft&&(dr=document.createElement("div").style,"AnimationEvent"in window||(delete cr.animationend.animation,delete cr.animationiteration.animation,delete cr.animationstart.animation),"TransitionEvent"in window||delete cr.transitionend.transition);var pr=fr("animationend"),hr=fr("animationiteration"),mr=fr("animationstart"),vr=fr("transitionrun"),gr=fr("transitionstart"),yr=fr("transitioncancel"),br=fr("transitionend"),wr=new Map,xr="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function kr(e,t){wr.set(e,t),Ke(t,[e])}xr.push("scrollEnd");var Sr=new WeakMap;function Er(e,t){if("object"===typeof e&&null!==e){var n=Sr.get(e);return void 0!==n?n:(t={value:e,source:t,stack:lt(t)},Sr.set(e,t),t)}return{value:e,source:t,stack:lt(t)}}var Cr=[],Nr=0,jr=0;function Dr(){for(var e=Nr,t=jr=Nr=0;t<e;){var n=Cr[t];Cr[t++]=null;var r=Cr[t];Cr[t++]=null;var o=Cr[t];Cr[t++]=null;var a=Cr[t];if(Cr[t++]=null,null!==r&&null!==o){var i=r.pending;null===i?o.next=o:(o.next=i.next,i.next=o),r.pending=o}0!==a&&Or(n,o,a)}}function Pr(e,t,n,r){Cr[Nr++]=e,Cr[Nr++]=t,Cr[Nr++]=n,Cr[Nr++]=r,jr|=r,e.lanes|=r,null!==(e=e.alternate)&&(e.lanes|=r)}function Tr(e,t,n,r){return Pr(e,t,n,r),Mr(e)}function _r(e,t){return Pr(e,null,null,t),Mr(e)}function Or(e,t,n){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n);for(var o=!1,a=e.return;null!==a;)a.childLanes|=n,null!==(r=a.alternate)&&(r.childLanes|=n),22===a.tag&&(null===(e=a.stateNode)||1&e._visibility||(o=!0)),e=a,a=a.return;return 3===e.tag?(a=e.stateNode,o&&null!==t&&(o=31-pe(n),null===(r=(e=a.hiddenUpdates)[o])?e[o]=[t]:r.push(t),t.lane=536870912|n),a):null}function Mr(e){if(50<Oc)throw Oc=0,Mc=null,Error(i(185));for(var t=e.return;null!==t;)t=(e=t).return;return 3===e.tag?e.stateNode:null}var Rr={};function Ar(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Lr(e,t,n,r){return new Ar(e,t,n,r)}function Ir(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Fr(e,t){var n=e.alternate;return null===n?((n=Lr(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=65011712&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n.refCleanup=e.refCleanup,n}function zr(e,t){e.flags&=65011714;var n=e.alternate;return null===n?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=n.childLanes,e.lanes=n.lanes,e.child=n.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=n.memoizedProps,e.memoizedState=n.memoizedState,e.updateQueue=n.updateQueue,e.type=n.type,t=n.dependencies,e.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function Br(e,t,n,r,o,a){var s=0;if(r=e,"function"===typeof e)Ir(e)&&(s=1);else if("string"===typeof e)s=function(e,t,n){if(1===n||null!=t.itemProp)return!1;switch(e){case"meta":case"title":return!0;case"style":if("string"!==typeof t.precedence||"string"!==typeof t.href||""===t.href)break;return!0;case"link":if("string"!==typeof t.rel||"string"!==typeof t.href||""===t.href||t.onLoad||t.onError)break;return"stylesheet"!==t.rel||(e=t.disabled,"string"===typeof t.precedence&&null==e);case"script":if(t.async&&"function"!==typeof t.async&&"symbol"!==typeof t.async&&!t.onLoad&&!t.onError&&t.src&&"string"===typeof t.src)return!0}return!1}(e,n,U.current)?26:"html"===e||"head"===e||"body"===e?27:5;else e:switch(e){case j:return(e=Lr(31,n,t,o)).elementType=j,e.lanes=a,e;case v:return Hr(n.children,o,a,t);case g:s=8,o|=24;break;case y:return(e=Lr(12,n,t,2|o)).elementType=y,e.lanes=a,e;case S:return(e=Lr(13,n,t,o)).elementType=S,e.lanes=a,e;case E:return(e=Lr(19,n,t,o)).elementType=E,e.lanes=a,e;default:if("object"===typeof e&&null!==e)switch(e.$$typeof){case b:case x:s=10;break e;case w:s=9;break e;case k:s=11;break e;case C:s=14;break e;case N:s=16,r=null;break e}s=29,n=Error(i(130,null===e?"null":typeof e,"")),r=null}return(t=Lr(s,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function Hr(e,t,n,r){return(e=Lr(7,e,r,t)).lanes=n,e}function Ur(e,t,n){return(e=Lr(6,e,null,t)).lanes=n,e}function Yr(e,t,n){return(t=Lr(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var Wr=[],qr=0,Vr=null,Qr=0,Kr=[],$r=0,Gr=null,Xr=1,Jr="";function Zr(e,t){Wr[qr++]=Qr,Wr[qr++]=Vr,Vr=e,Qr=t}function eo(e,t,n){Kr[$r++]=Xr,Kr[$r++]=Jr,Kr[$r++]=Gr,Gr=e;var r=Xr;e=Jr;var o=32-pe(r)-1;r&=~(1<<o),n+=1;var a=32-pe(t)+o;if(30<a){var i=o-o%5;a=(r&(1<<i)-1).toString(32),r>>=i,o-=i,Xr=1<<32-pe(t)+o|n<<o|r,Jr=a+e}else Xr=1<<a|n<<o|r,Jr=e}function to(e){null!==e.return&&(Zr(e,1),eo(e,1,0))}function no(e){for(;e===Vr;)Vr=Wr[--qr],Wr[qr]=null,Qr=Wr[--qr],Wr[qr]=null;for(;e===Gr;)Gr=Kr[--$r],Kr[$r]=null,Jr=Kr[--$r],Kr[$r]=null,Xr=Kr[--$r],Kr[$r]=null}var ro=null,oo=null,ao=!1,io=null,so=!1,lo=Error(i(519));function co(e){throw vo(Er(Error(i(418,"")),e)),lo}function uo(e){var t=e.stateNode,n=e.type,r=e.memoizedProps;switch(t[Oe]=e,t[Me]=r,n){case"dialog":Iu("cancel",t),Iu("close",t);break;case"iframe":case"object":case"embed":Iu("load",t);break;case"video":case"audio":for(n=0;n<Ru.length;n++)Iu(Ru[n],t);break;case"source":Iu("error",t);break;case"img":case"image":case"link":Iu("error",t),Iu("load",t);break;case"details":Iu("toggle",t);break;case"input":Iu("invalid",t),gt(t,r.value,r.defaultValue,r.checked,r.defaultChecked,r.type,r.name,!0),dt(t);break;case"select":Iu("invalid",t);break;case"textarea":Iu("invalid",t),xt(t,r.value,r.defaultValue,r.children),dt(t)}"string"!==typeof(n=r.children)&&"number"!==typeof n&&"bigint"!==typeof n||t.textContent===""+n||!0===r.suppressHydrationWarning||Gu(t.textContent,n)?(null!=r.popover&&(Iu("beforetoggle",t),Iu("toggle",t)),null!=r.onScroll&&Iu("scroll",t),null!=r.onScrollEnd&&Iu("scrollend",t),null!=r.onClick&&(t.onclick=Xu),t=!0):t=!1,t||co(e)}function fo(e){for(ro=e.return;ro;)switch(ro.tag){case 5:case 13:return void(so=!1);case 27:case 3:return void(so=!0);default:ro=ro.return}}function po(e){if(e!==ro)return!1;if(!ao)return fo(e),ao=!0,!1;var t,n=e.tag;if((t=3!==n&&27!==n)&&((t=5===n)&&(t=!("form"!==(t=e.type)&&"button"!==t)||id(e.type,e.memoizedProps)),t=!t),t&&oo&&co(e),fo(e),13===n){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(i(317));e:{for(e=e.nextSibling,n=0;e;){if(8===e.nodeType)if("/$"===(t=e.data)){if(0===n){oo=gd(e.nextSibling);break e}n--}else"$"!==t&&"$!"!==t&&"$?"!==t||n++;e=e.nextSibling}oo=null}}else 27===n?(n=oo,pd(e.type)?(e=yd,yd=null,oo=e):oo=n):oo=ro?gd(e.stateNode.nextSibling):null;return!0}function ho(){oo=ro=null,ao=!1}function mo(){var e=io;return null!==e&&(null===bc?bc=e:bc.push.apply(bc,e),io=null),e}function vo(e){null===io?io=[e]:io.push(e)}var go=z(null),yo=null,bo=null;function wo(e,t,n){H(go,t._currentValue),t._currentValue=n}function xo(e){e._currentValue=go.current,B(go)}function ko(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function So(e,t,n,r){var o=e.child;for(null!==o&&(o.return=e);null!==o;){var a=o.dependencies;if(null!==a){var s=o.child;a=a.firstContext;e:for(;null!==a;){var l=a;a=o;for(var c=0;c<t.length;c++)if(l.context===t[c]){a.lanes|=n,null!==(l=a.alternate)&&(l.lanes|=n),ko(a.return,n,e),r||(s=null);break e}a=l.next}}else if(18===o.tag){if(null===(s=o.return))throw Error(i(341));s.lanes|=n,null!==(a=s.alternate)&&(a.lanes|=n),ko(s,n,e),s=null}else s=o.child;if(null!==s)s.return=o;else for(s=o;null!==s;){if(s===e){s=null;break}if(null!==(o=s.sibling)){o.return=s.return,s=o;break}s=s.return}o=s}}function Eo(e,t,n,r){e=null;for(var o=t,a=!1;null!==o;){if(!a)if(0!==(524288&o.flags))a=!0;else if(0!==(262144&o.flags))break;if(10===o.tag){var s=o.alternate;if(null===s)throw Error(i(387));if(null!==(s=s.memoizedProps)){var l=o.type;$n(o.pendingProps.value,s.value)||(null!==e?e.push(l):e=[l])}}else if(o===q.current){if(null===(s=o.alternate))throw Error(i(387));s.memoizedState.memoizedState!==o.memoizedState.memoizedState&&(null!==e?e.push(Kd):e=[Kd])}o=o.return}null!==e&&So(t,e,n,r),t.flags|=262144}function Co(e){for(e=e.firstContext;null!==e;){if(!$n(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function No(e){yo=e,bo=null,null!==(e=e.dependencies)&&(e.firstContext=null)}function jo(e){return Po(yo,e)}function Do(e,t){return null===yo&&No(e),Po(e,t)}function Po(e,t){var n=t._currentValue;if(t={context:t,memoizedValue:n,next:null},null===bo){if(null===e)throw Error(i(308));bo=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else bo=bo.next=t;return n}var To="undefined"!==typeof AbortController?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(t,n){e.push(n)}};this.abort=function(){t.aborted=!0,e.forEach((function(e){return e()}))}},_o=r.unstable_scheduleCallback,Oo=r.unstable_NormalPriority,Mo={$$typeof:x,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Ro(){return{controller:new To,data:new Map,refCount:0}}function Ao(e){e.refCount--,0===e.refCount&&_o(Oo,(function(){e.controller.abort()}))}var Lo=null,Io=0,Fo=0,zo=null;function Bo(){if(0===--Io&&null!==Lo){null!==zo&&(zo.status="fulfilled");var e=Lo;Lo=null,Fo=0,zo=null;for(var t=0;t<e.length;t++)(0,e[t])()}}var Ho=R.S;R.S=function(e,t){"object"===typeof t&&null!==t&&"function"===typeof t.then&&function(e,t){if(null===Lo){var n=Lo=[];Io=0,Fo=Pu(),zo={status:"pending",value:void 0,then:function(e){n.push(e)}}}Io++,t.then(Bo,Bo)}(0,t),null!==Ho&&Ho(e,t)};var Uo=z(null);function Yo(){var e=Uo.current;return null!==e?e:rc.pooledCache}function Wo(e,t){H(Uo,null===t?Uo.current:t.pool)}function qo(){var e=Yo();return null===e?null:{parent:Mo._currentValue,pool:e}}var Vo=Error(i(460)),Qo=Error(i(474)),Ko=Error(i(542)),$o={then:function(){}};function Go(e){return"fulfilled"===(e=e.status)||"rejected"===e}function Xo(){}function Jo(e,t,n){switch(void 0===(n=e[n])?e.push(t):n!==t&&(t.then(Xo,Xo),t=n),t.status){case"fulfilled":return t.value;case"rejected":throw ta(e=t.reason),e;default:if("string"===typeof t.status)t.then(Xo,Xo);else{if(null!==(e=rc)&&100<e.shellSuspendCounter)throw Error(i(482));(e=t).status="pending",e.then((function(e){if("pending"===t.status){var n=t;n.status="fulfilled",n.value=e}}),(function(e){if("pending"===t.status){var n=t;n.status="rejected",n.reason=e}}))}switch(t.status){case"fulfilled":return t.value;case"rejected":throw ta(e=t.reason),e}throw Zo=t,Vo}}var Zo=null;function ea(){if(null===Zo)throw Error(i(459));var e=Zo;return Zo=null,e}function ta(e){if(e===Vo||e===Ko)throw Error(i(483))}var na=!1;function ra(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function oa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function aa(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ia(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!==(2&nc)){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,t=Mr(e),Or(e,null,n),t}return Pr(e,r,t,n),Mr(e)}function sa(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!==(4194048&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,je(e,n)}}function la(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var i={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===a?o=a=i:a=a.next=i,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var ca=!1;function ua(){if(ca){if(null!==zo)throw zo}}function da(e,t,n,r){ca=!1;var o=e.updateQueue;na=!1;var a=o.firstBaseUpdate,i=o.lastBaseUpdate,s=o.shared.pending;if(null!==s){o.shared.pending=null;var l=s,c=l.next;l.next=null,null===i?a=c:i.next=c,i=l;var u=e.alternate;null!==u&&((s=(u=u.updateQueue).lastBaseUpdate)!==i&&(null===s?u.firstBaseUpdate=c:s.next=c,u.lastBaseUpdate=l))}if(null!==a){var d=o.baseState;for(i=0,u=c=l=null,s=a;;){var p=-536870913&s.lane,h=p!==s.lane;if(h?(ac&p)===p:(r&p)===p){0!==p&&p===Fo&&(ca=!0),null!==u&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});e:{var m=e,v=s;p=t;var g=n;switch(v.tag){case 1:if("function"===typeof(m=v.payload)){d=m.call(g,d,p);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null===(p="function"===typeof(m=v.payload)?m.call(g,d,p):m)||void 0===p)break e;d=f({},d,p);break e;case 2:na=!0}}null!==(p=s.callback)&&(e.flags|=64,h&&(e.flags|=8192),null===(h=o.callbacks)?o.callbacks=[p]:h.push(p))}else h={lane:p,tag:s.tag,payload:s.payload,callback:s.callback,next:null},null===u?(c=u=h,l=d):u=u.next=h,i|=p;if(null===(s=s.next)){if(null===(s=o.shared.pending))break;s=(h=s).next,h.next=null,o.lastBaseUpdate=h,o.shared.pending=null}}null===u&&(l=d),o.baseState=l,o.firstBaseUpdate=c,o.lastBaseUpdate=u,null===a&&(o.shared.lanes=0),pc|=i,e.lanes=i,e.memoizedState=d}}function fa(e,t){if("function"!==typeof e)throw Error(i(191,e));e.call(t)}function pa(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;e<n.length;e++)fa(n[e],t)}var ha=z(null),ma=z(0);function va(e,t){H(ma,e=dc),H(ha,t),dc=e|t.baseLanes}function ga(){H(ma,dc),H(ha,ha.current)}function ya(){dc=ma.current,B(ha),B(ma)}var ba=0,wa=null,xa=null,ka=null,Sa=!1,Ea=!1,Ca=!1,Na=0,ja=0,Da=null,Pa=0;function Ta(){throw Error(i(321))}function _a(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!$n(e[n],t[n]))return!1;return!0}function Oa(e,t,n,r,o,a){return ba=a,wa=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,R.H=null===e||null===e.memoizedState?Vi:Qi,Ca=!1,a=n(r,o),Ca=!1,Ea&&(a=Ra(t,n,r,o)),Ma(e),a}function Ma(e){R.H=qi;var t=null!==xa&&null!==xa.next;if(ba=0,ka=xa=wa=null,Sa=!1,ja=0,Da=null,t)throw Error(i(300));null===e||js||null!==(e=e.dependencies)&&Co(e)&&(js=!0)}function Ra(e,t,n,r){wa=e;var o=0;do{if(Ea&&(Da=null),ja=0,Ea=!1,25<=o)throw Error(i(301));if(o+=1,ka=xa=null,null!=e.updateQueue){var a=e.updateQueue;a.lastEffect=null,a.events=null,a.stores=null,null!=a.memoCache&&(a.memoCache.index=0)}R.H=Ki,a=t(n,r)}while(Ea);return a}function Aa(){var e=R.H,t=e.useState()[0];return t="function"===typeof t.then?Ha(t):t,e=e.useState()[0],(null!==xa?xa.memoizedState:null)!==e&&(wa.flags|=1024),t}function La(){var e=0!==Na;return Na=0,e}function Ia(e,t,n){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n}function Fa(e){if(Sa){for(e=e.memoizedState;null!==e;){var t=e.queue;null!==t&&(t.pending=null),e=e.next}Sa=!1}ba=0,ka=xa=wa=null,Ea=!1,ja=Na=0,Da=null}function za(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ka?wa.memoizedState=ka=e:ka=ka.next=e,ka}function Ba(){if(null===xa){var e=wa.alternate;e=null!==e?e.memoizedState:null}else e=xa.next;var t=null===ka?wa.memoizedState:ka.next;if(null!==t)ka=t,xa=e;else{if(null===e){if(null===wa.alternate)throw Error(i(467));throw Error(i(310))}e={memoizedState:(xa=e).memoizedState,baseState:xa.baseState,baseQueue:xa.baseQueue,queue:xa.queue,next:null},null===ka?wa.memoizedState=ka=e:ka=ka.next=e}return ka}function Ha(e){var t=ja;return ja+=1,null===Da&&(Da=[]),e=Jo(Da,e,t),t=wa,null===(null===ka?t.memoizedState:ka.next)&&(t=t.alternate,R.H=null===t||null===t.memoizedState?Vi:Qi),e}function Ua(e){if(null!==e&&"object"===typeof e){if("function"===typeof e.then)return Ha(e);if(e.$$typeof===x)return jo(e)}throw Error(i(438,String(e)))}function Ya(e){var t=null,n=wa.updateQueue;if(null!==n&&(t=n.memoCache),null==t){var r=wa.alternate;null!==r&&(null!==(r=r.updateQueue)&&(null!=(r=r.memoCache)&&(t={data:r.data.map((function(e){return e.slice()})),index:0})))}if(null==t&&(t={data:[],index:0}),null===n&&(n={lastEffect:null,events:null,stores:null,memoCache:null},wa.updateQueue=n),n.memoCache=t,void 0===(n=t.data[t.index]))for(n=t.data[t.index]=Array(e),r=0;r<e;r++)n[r]=D;return t.index++,n}function Wa(e,t){return"function"===typeof t?t(e):t}function qa(e){return Va(Ba(),xa,e)}function Va(e,t,n){var r=e.queue;if(null===r)throw Error(i(311));r.lastRenderedReducer=n;var o=e.baseQueue,a=r.pending;if(null!==a){if(null!==o){var s=o.next;o.next=a.next,a.next=s}t.baseQueue=o=a,r.pending=null}if(a=e.baseState,null===o)e.memoizedState=a;else{var l=s=null,c=null,u=t=o.next,d=!1;do{var f=-536870913&u.lane;if(f!==u.lane?(ac&f)===f:(ba&f)===f){var p=u.revertLane;if(0===p)null!==c&&(c=c.next={lane:0,revertLane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),f===Fo&&(d=!0);else{if((ba&p)===p){u=u.next,p===Fo&&(d=!0);continue}f={lane:0,revertLane:u.revertLane,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null},null===c?(l=c=f,s=a):c=c.next=f,wa.lanes|=p,pc|=p}f=u.action,Ca&&n(a,f),a=u.hasEagerState?u.eagerState:n(a,f)}else p={lane:f,revertLane:u.revertLane,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null},null===c?(l=c=p,s=a):c=c.next=p,wa.lanes|=f,pc|=f;u=u.next}while(null!==u&&u!==t);if(null===c?s=a:c.next=l,!$n(a,e.memoizedState)&&(js=!0,d&&null!==(n=zo)))throw n;e.memoizedState=a,e.baseState=s,e.baseQueue=c,r.lastRenderedState=a}return null===o&&(r.lanes=0),[e.memoizedState,r.dispatch]}function Qa(e){var t=Ba(),n=t.queue;if(null===n)throw Error(i(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var s=o=o.next;do{a=e(a,s.action),s=s.next}while(s!==o);$n(a,t.memoizedState)||(js=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function Ka(e,t,n){var r=wa,o=Ba(),a=ao;if(a){if(void 0===n)throw Error(i(407));n=n()}else n=t();var s=!$n((xa||o).memoizedState,n);if(s&&(o.memoizedState=n,js=!0),o=o.queue,gi(2048,8,Xa.bind(null,r,o,e),[e]),o.getSnapshot!==t||s||null!==ka&&1&ka.memoizedState.tag){if(r.flags|=2048,hi(9,{destroy:void 0,resource:void 0},Ga.bind(null,r,o,n,t),null),null===rc)throw Error(i(349));a||0!==(124&ba)||$a(r,t,n)}return n}function $a(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=wa.updateQueue)?(t={lastEffect:null,events:null,stores:null,memoCache:null},wa.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ga(e,t,n,r){t.value=n,t.getSnapshot=r,Ja(t)&&Za(e)}function Xa(e,t,n){return n((function(){Ja(t)&&Za(e)}))}function Ja(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!$n(e,n)}catch(r){return!0}}function Za(e){var t=_r(e,2);null!==t&&Lc(t,e,2)}function ei(e){var t=za();if("function"===typeof e){var n=e;if(e=n(),Ca){fe(!0);try{n()}finally{fe(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:Wa,lastRenderedState:e},t}function ti(e,t,n,r){return e.baseState=n,Va(e,xa,"function"===typeof r?r:Wa)}function ni(e,t,n,r,o){if(Ui(e))throw Error(i(485));if(null!==(e=t.action)){var a={payload:o,action:e,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(e){a.listeners.push(e)}};null!==R.T?n(!0):a.isTransition=!1,r(a),null===(n=t.pending)?(a.next=t.pending=a,ri(t,a)):(a.next=n.next,t.pending=n.next=a)}}function ri(e,t){var n=t.action,r=t.payload,o=e.state;if(t.isTransition){var a=R.T,i={};R.T=i;try{var s=n(o,r),l=R.S;null!==l&&l(i,s),oi(e,t,s)}catch(c){ii(e,t,c)}finally{R.T=a}}else try{oi(e,t,a=n(o,r))}catch(u){ii(e,t,u)}}function oi(e,t,n){null!==n&&"object"===typeof n&&"function"===typeof n.then?n.then((function(n){ai(e,t,n)}),(function(n){return ii(e,t,n)})):ai(e,t,n)}function ai(e,t,n){t.status="fulfilled",t.value=n,si(t),e.state=n,null!==(t=e.pending)&&((n=t.next)===t?e.pending=null:(n=n.next,t.next=n,ri(e,n)))}function ii(e,t,n){var r=e.pending;if(e.pending=null,null!==r){r=r.next;do{t.status="rejected",t.reason=n,si(t),t=t.next}while(t!==r)}e.action=null}function si(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function li(e,t){return t}function ci(e,t){if(ao){var n=rc.formState;if(null!==n){e:{var r=wa;if(ao){if(oo){t:{for(var o=oo,a=so;8!==o.nodeType;){if(!a){o=null;break t}if(null===(o=gd(o.nextSibling))){o=null;break t}}o="F!"===(a=o.data)||"F"===a?o:null}if(o){oo=gd(o.nextSibling),r="F!"===o.data;break e}}co(r)}r=!1}r&&(t=n[0])}}return(n=za()).memoizedState=n.baseState=t,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:li,lastRenderedState:t},n.queue=r,n=zi.bind(null,wa,r),r.dispatch=n,r=ei(!1),a=Hi.bind(null,wa,!1,r.queue),o={state:t,dispatch:null,action:e,pending:null},(r=za()).queue=o,n=ni.bind(null,wa,o,a,n),o.dispatch=n,r.memoizedState=e,[t,n,!1]}function ui(e){return di(Ba(),xa,e)}function di(e,t,n){if(t=Va(e,t,li)[0],e=qa(Wa)[0],"object"===typeof t&&null!==t&&"function"===typeof t.then)try{var r=Ha(t)}catch(i){if(i===Vo)throw Ko;throw i}else r=t;var o=(t=Ba()).queue,a=o.dispatch;return n!==t.memoizedState&&(wa.flags|=2048,hi(9,{destroy:void 0,resource:void 0},fi.bind(null,o,n),null)),[r,a,e]}function fi(e,t){e.action=t}function pi(e){var t=Ba(),n=xa;if(null!==n)return di(t,n,e);Ba(),t=t.memoizedState;var r=(n=Ba()).queue.dispatch;return n.memoizedState=e,[t,r,!1]}function hi(e,t,n,r){return e={tag:e,create:n,deps:r,inst:t,next:null},null===(t=wa.updateQueue)&&(t={lastEffect:null,events:null,stores:null,memoCache:null},wa.updateQueue=t),null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function mi(){return Ba().memoizedState}function vi(e,t,n,r){var o=za();r=void 0===r?null:r,wa.flags|=e,o.memoizedState=hi(1|t,{destroy:void 0,resource:void 0},n,r)}function gi(e,t,n,r){var o=Ba();r=void 0===r?null:r;var a=o.memoizedState.inst;null!==xa&&null!==r&&_a(r,xa.memoizedState.deps)?o.memoizedState=hi(t,a,n,r):(wa.flags|=e,o.memoizedState=hi(1|t,a,n,r))}function yi(e,t){vi(8390656,8,e,t)}function bi(e,t){gi(2048,8,e,t)}function wi(e,t){return gi(4,2,e,t)}function xi(e,t){return gi(4,4,e,t)}function ki(e,t){if("function"===typeof t){e=e();var n=t(e);return function(){"function"===typeof n?n():t(null)}}if(null!==t&&void 0!==t)return e=e(),t.current=e,function(){t.current=null}}function Si(e,t,n){n=null!==n&&void 0!==n?n.concat([e]):null,gi(4,4,ki.bind(null,t,e),n)}function Ei(){}function Ci(e,t){var n=Ba();t=void 0===t?null:t;var r=n.memoizedState;return null!==t&&_a(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ni(e,t){var n=Ba();t=void 0===t?null:t;var r=n.memoizedState;if(null!==t&&_a(t,r[1]))return r[0];if(r=e(),Ca){fe(!0);try{e()}finally{fe(!1)}}return n.memoizedState=[r,t],r}function ji(e,t,n){return void 0===n||0!==(1073741824&ba)?e.memoizedState=t:(e.memoizedState=n,e=Ac(),wa.lanes|=e,pc|=e,n)}function Di(e,t,n,r){return $n(n,t)?n:null!==ha.current?(e=ji(e,n,r),$n(e,t)||(js=!0),e):0===(42&ba)?(js=!0,e.memoizedState=n):(e=Ac(),wa.lanes|=e,pc|=e,t)}function Pi(e,t,n,r,o){var a=A.p;A.p=0!==a&&8>a?a:8;var i=R.T,s={};R.T=s,Hi(e,!1,t,n);try{var l=o(),c=R.S;if(null!==c&&c(s,l),null!==l&&"object"===typeof l&&"function"===typeof l.then)Bi(e,t,function(e,t){var n=[],r={status:"pending",value:null,reason:null,then:function(e){n.push(e)}};return e.then((function(){r.status="fulfilled",r.value=t;for(var e=0;e<n.length;e++)(0,n[e])(t)}),(function(e){for(r.status="rejected",r.reason=e,e=0;e<n.length;e++)(0,n[e])(void 0)})),r}(l,r),Rc());else Bi(e,t,r,Rc())}catch(u){Bi(e,t,{then:function(){},status:"rejected",reason:u},Rc())}finally{A.p=a,R.T=i}}function Ti(){}function _i(e,t,n,r){if(5!==e.tag)throw Error(i(476));var o=Oi(e).queue;Pi(e,o,t,L,null===n?Ti:function(){return Mi(e),n(r)})}function Oi(e){var t=e.memoizedState;if(null!==t)return t;var n={};return(t={memoizedState:L,baseState:L,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Wa,lastRenderedState:L},next:null}).next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Wa,lastRenderedState:n},next:null},e.memoizedState=t,null!==(e=e.alternate)&&(e.memoizedState=t),t}function Mi(e){Bi(e,Oi(e).next.queue,{},Rc())}function Ri(){return jo(Kd)}function Ai(){return Ba().memoizedState}function Li(){return Ba().memoizedState}function Ii(e){for(var t=e.return;null!==t;){switch(t.tag){case 24:case 3:var n=Rc(),r=ia(t,e=aa(n),n);return null!==r&&(Lc(r,t,n),sa(r,t,n)),t={cache:Ro()},void(e.payload=t)}t=t.return}}function Fi(e,t,n){var r=Rc();n={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Ui(e)?Yi(t,n):null!==(n=Tr(e,t,n,r))&&(Lc(n,e,r),Wi(n,t,r))}function zi(e,t,n){Bi(e,t,n,Rc())}function Bi(e,t,n,r){var o={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ui(e))Yi(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var i=t.lastRenderedState,s=a(i,n);if(o.hasEagerState=!0,o.eagerState=s,$n(s,i))return Pr(e,t,o,0),null===rc&&Dr(),!1}catch(l){}if(null!==(n=Tr(e,t,o,r)))return Lc(n,e,r),Wi(n,t,r),!0}return!1}function Hi(e,t,n,r){if(r={lane:2,revertLane:Pu(),action:r,hasEagerState:!1,eagerState:null,next:null},Ui(e)){if(t)throw Error(i(479))}else null!==(t=Tr(e,n,r,2))&&Lc(t,e,2)}function Ui(e){var t=e.alternate;return e===wa||null!==t&&t===wa}function Yi(e,t){Ea=Sa=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Wi(e,t,n){if(0!==(4194048&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,je(e,n)}}var qi={readContext:jo,use:Ua,useCallback:Ta,useContext:Ta,useEffect:Ta,useImperativeHandle:Ta,useLayoutEffect:Ta,useInsertionEffect:Ta,useMemo:Ta,useReducer:Ta,useRef:Ta,useState:Ta,useDebugValue:Ta,useDeferredValue:Ta,useTransition:Ta,useSyncExternalStore:Ta,useId:Ta,useHostTransitionStatus:Ta,useFormState:Ta,useActionState:Ta,useOptimistic:Ta,useMemoCache:Ta,useCacheRefresh:Ta},Vi={readContext:jo,use:Ua,useCallback:function(e,t){return za().memoizedState=[e,void 0===t?null:t],e},useContext:jo,useEffect:yi,useImperativeHandle:function(e,t,n){n=null!==n&&void 0!==n?n.concat([e]):null,vi(4194308,4,ki.bind(null,t,e),n)},useLayoutEffect:function(e,t){return vi(4194308,4,e,t)},useInsertionEffect:function(e,t){vi(4,2,e,t)},useMemo:function(e,t){var n=za();t=void 0===t?null:t;var r=e();if(Ca){fe(!0);try{e()}finally{fe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=za();if(void 0!==n){var o=n(t);if(Ca){fe(!0);try{n(t)}finally{fe(!1)}}}else o=t;return r.memoizedState=r.baseState=o,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:o},r.queue=e,e=e.dispatch=Fi.bind(null,wa,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},za().memoizedState=e},useState:function(e){var t=(e=ei(e)).queue,n=zi.bind(null,wa,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:Ei,useDeferredValue:function(e,t){return ji(za(),e,t)},useTransition:function(){var e=ei(!1);return e=Pi.bind(null,wa,e.queue,!0,!1),za().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=wa,o=za();if(ao){if(void 0===n)throw Error(i(407));n=n()}else{if(n=t(),null===rc)throw Error(i(349));0!==(124&ac)||$a(r,t,n)}o.memoizedState=n;var a={value:n,getSnapshot:t};return o.queue=a,yi(Xa.bind(null,r,a,e),[e]),r.flags|=2048,hi(9,{destroy:void 0,resource:void 0},Ga.bind(null,r,a,n,t),null),n},useId:function(){var e=za(),t=rc.identifierPrefix;if(ao){var n=Jr;t="\xab"+t+"R"+(n=(Xr&~(1<<32-pe(Xr)-1)).toString(32)+n),0<(n=Na++)&&(t+="H"+n.toString(32)),t+="\xbb"}else t="\xab"+t+"r"+(n=Pa++).toString(32)+"\xbb";return e.memoizedState=t},useHostTransitionStatus:Ri,useFormState:ci,useActionState:ci,useOptimistic:function(e){var t=za();t.memoizedState=t.baseState=e;var n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=n,t=Hi.bind(null,wa,!0,n),n.dispatch=t,[e,t]},useMemoCache:Ya,useCacheRefresh:function(){return za().memoizedState=Ii.bind(null,wa)}},Qi={readContext:jo,use:Ua,useCallback:Ci,useContext:jo,useEffect:bi,useImperativeHandle:Si,useInsertionEffect:wi,useLayoutEffect:xi,useMemo:Ni,useReducer:qa,useRef:mi,useState:function(){return qa(Wa)},useDebugValue:Ei,useDeferredValue:function(e,t){return Di(Ba(),xa.memoizedState,e,t)},useTransition:function(){var e=qa(Wa)[0],t=Ba().memoizedState;return["boolean"===typeof e?e:Ha(e),t]},useSyncExternalStore:Ka,useId:Ai,useHostTransitionStatus:Ri,useFormState:ui,useActionState:ui,useOptimistic:function(e,t){return ti(Ba(),0,e,t)},useMemoCache:Ya,useCacheRefresh:Li},Ki={readContext:jo,use:Ua,useCallback:Ci,useContext:jo,useEffect:bi,useImperativeHandle:Si,useInsertionEffect:wi,useLayoutEffect:xi,useMemo:Ni,useReducer:Qa,useRef:mi,useState:function(){return Qa(Wa)},useDebugValue:Ei,useDeferredValue:function(e,t){var n=Ba();return null===xa?ji(n,e,t):Di(n,xa.memoizedState,e,t)},useTransition:function(){var e=Qa(Wa)[0],t=Ba().memoizedState;return["boolean"===typeof e?e:Ha(e),t]},useSyncExternalStore:Ka,useId:Ai,useHostTransitionStatus:Ri,useFormState:pi,useActionState:pi,useOptimistic:function(e,t){var n=Ba();return null!==xa?ti(n,0,e,t):(n.baseState=e,[e,n.queue.dispatch])},useMemoCache:Ya,useCacheRefresh:Li},$i=null,Gi=0;function Xi(e){var t=Gi;return Gi+=1,null===$i&&($i=[]),Jo($i,e,t)}function Ji(e,t){t=t.props.ref,e.ref=void 0!==t?t:null}function Zi(e,t){if(t.$$typeof===p)throw Error(i(525));throw e=Object.prototype.toString.call(t),Error(i(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function es(e){return(0,e._init)(e._payload)}function ts(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e){for(var t=new Map;null!==e;)null!==e.key?t.set(e.key,e):t.set(e.index,e),e=e.sibling;return t}function o(e,t){return(e=Fr(e,t)).index=0,e.sibling=null,e}function a(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=67108866,n):r:(t.flags|=67108866,n):(t.flags|=1048576,n)}function s(t){return e&&null===t.alternate&&(t.flags|=67108866),t}function l(e,t,n,r){return null===t||6!==t.tag?((t=Ur(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function c(e,t,n,r){var a=n.type;return a===v?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"===typeof a&&null!==a&&a.$$typeof===N&&es(a)===t.type)?(Ji(t=o(t,n.props),n),t.return=e,t):(Ji(t=Br(n.type,n.key,n.props,null,e.mode,r),n),t.return=e,t)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Yr(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=Hr(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function f(e,t,n){if("string"===typeof t&&""!==t||"number"===typeof t||"bigint"===typeof t)return(t=Ur(""+t,e.mode,n)).return=e,t;if("object"===typeof t&&null!==t){switch(t.$$typeof){case h:return Ji(n=Br(t.type,t.key,t.props,null,e.mode,n),t),n.return=e,n;case m:return(t=Yr(t,e.mode,n)).return=e,t;case N:return f(e,t=(0,t._init)(t._payload),n)}if(M(t)||T(t))return(t=Hr(t,e.mode,n,null)).return=e,t;if("function"===typeof t.then)return f(e,Xi(t),n);if(t.$$typeof===x)return f(e,Do(e,t),n);Zi(e,t)}return null}function p(e,t,n,r){var o=null!==t?t.key:null;if("string"===typeof n&&""!==n||"number"===typeof n||"bigint"===typeof n)return null!==o?null:l(e,t,""+n,r);if("object"===typeof n&&null!==n){switch(n.$$typeof){case h:return n.key===o?c(e,t,n,r):null;case m:return n.key===o?u(e,t,n,r):null;case N:return p(e,t,n=(o=n._init)(n._payload),r)}if(M(n)||T(n))return null!==o?null:d(e,t,n,r,null);if("function"===typeof n.then)return p(e,t,Xi(n),r);if(n.$$typeof===x)return p(e,t,Do(e,n),r);Zi(e,n)}return null}function g(e,t,n,r,o){if("string"===typeof r&&""!==r||"number"===typeof r||"bigint"===typeof r)return l(t,e=e.get(n)||null,""+r,o);if("object"===typeof r&&null!==r){switch(r.$$typeof){case h:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o);case m:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case N:return g(e,t,n,r=(0,r._init)(r._payload),o)}if(M(r)||T(r))return d(t,e=e.get(n)||null,r,o,null);if("function"===typeof r.then)return g(e,t,n,Xi(r),o);if(r.$$typeof===x)return g(e,t,n,Do(t,r),o);Zi(t,r)}return null}function y(l,c,u,d){if("object"===typeof u&&null!==u&&u.type===v&&null===u.key&&(u=u.props.children),"object"===typeof u&&null!==u){switch(u.$$typeof){case h:e:{for(var b=u.key;null!==c;){if(c.key===b){if((b=u.type)===v){if(7===c.tag){n(l,c.sibling),(d=o(c,u.props.children)).return=l,l=d;break e}}else if(c.elementType===b||"object"===typeof b&&null!==b&&b.$$typeof===N&&es(b)===c.type){n(l,c.sibling),Ji(d=o(c,u.props),u),d.return=l,l=d;break e}n(l,c);break}t(l,c),c=c.sibling}u.type===v?((d=Hr(u.props.children,l.mode,d,u.key)).return=l,l=d):(Ji(d=Br(u.type,u.key,u.props,null,l.mode,d),u),d.return=l,l=d)}return s(l);case m:e:{for(b=u.key;null!==c;){if(c.key===b){if(4===c.tag&&c.stateNode.containerInfo===u.containerInfo&&c.stateNode.implementation===u.implementation){n(l,c.sibling),(d=o(c,u.children||[])).return=l,l=d;break e}n(l,c);break}t(l,c),c=c.sibling}(d=Yr(u,l.mode,d)).return=l,l=d}return s(l);case N:return y(l,c,u=(b=u._init)(u._payload),d)}if(M(u))return function(o,i,s,l){for(var c=null,u=null,d=i,h=i=0,m=null;null!==d&&h<s.length;h++){d.index>h?(m=d,d=null):m=d.sibling;var v=p(o,d,s[h],l);if(null===v){null===d&&(d=m);break}e&&d&&null===v.alternate&&t(o,d),i=a(v,i,h),null===u?c=v:u.sibling=v,u=v,d=m}if(h===s.length)return n(o,d),ao&&Zr(o,h),c;if(null===d){for(;h<s.length;h++)null!==(d=f(o,s[h],l))&&(i=a(d,i,h),null===u?c=d:u.sibling=d,u=d);return ao&&Zr(o,h),c}for(d=r(d);h<s.length;h++)null!==(m=g(d,o,h,s[h],l))&&(e&&null!==m.alternate&&d.delete(null===m.key?h:m.key),i=a(m,i,h),null===u?c=m:u.sibling=m,u=m);return e&&d.forEach((function(e){return t(o,e)})),ao&&Zr(o,h),c}(l,c,u,d);if(T(u)){if("function"!==typeof(b=T(u)))throw Error(i(150));return function(o,s,l,c){if(null==l)throw Error(i(151));for(var u=null,d=null,h=s,m=s=0,v=null,y=l.next();null!==h&&!y.done;m++,y=l.next()){h.index>m?(v=h,h=null):v=h.sibling;var b=p(o,h,y.value,c);if(null===b){null===h&&(h=v);break}e&&h&&null===b.alternate&&t(o,h),s=a(b,s,m),null===d?u=b:d.sibling=b,d=b,h=v}if(y.done)return n(o,h),ao&&Zr(o,m),u;if(null===h){for(;!y.done;m++,y=l.next())null!==(y=f(o,y.value,c))&&(s=a(y,s,m),null===d?u=y:d.sibling=y,d=y);return ao&&Zr(o,m),u}for(h=r(h);!y.done;m++,y=l.next())null!==(y=g(h,o,m,y.value,c))&&(e&&null!==y.alternate&&h.delete(null===y.key?m:y.key),s=a(y,s,m),null===d?u=y:d.sibling=y,d=y);return e&&h.forEach((function(e){return t(o,e)})),ao&&Zr(o,m),u}(l,c,u=b.call(u),d)}if("function"===typeof u.then)return y(l,c,Xi(u),d);if(u.$$typeof===x)return y(l,c,Do(l,u),d);Zi(l,u)}return"string"===typeof u&&""!==u||"number"===typeof u||"bigint"===typeof u?(u=""+u,null!==c&&6===c.tag?(n(l,c.sibling),(d=o(c,u)).return=l,l=d):(n(l,c),(d=Ur(u,l.mode,d)).return=l,l=d),s(l)):n(l,c)}return function(e,t,n,r){try{Gi=0;var o=y(e,t,n,r);return $i=null,o}catch(i){if(i===Vo||i===Ko)throw i;var a=Lr(29,i,null,e.mode);return a.lanes=r,a.return=e,a}}}var ns=ts(!0),rs=ts(!1),os=z(null),as=null;function is(e){var t=e.alternate;H(us,1&us.current),H(os,e),null===as&&(null===t||null!==ha.current||null!==t.memoizedState)&&(as=e)}function ss(e){if(22===e.tag){if(H(us,us.current),H(os,e),null===as){var t=e.alternate;null!==t&&null!==t.memoizedState&&(as=e)}}else ls()}function ls(){H(us,us.current),H(os,os.current)}function cs(e){B(os),as===e&&(as=null),B(us)}var us=z(0);function ds(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||vd(n)))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!==(128&t.flags))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function fs(e,t,n,r){n=null===(n=n(r,t=e.memoizedState))||void 0===n?t:f({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var ps={enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Rc(),o=aa(r);o.payload=t,void 0!==n&&null!==n&&(o.callback=n),null!==(t=ia(e,o,r))&&(Lc(t,e,r),sa(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Rc(),o=aa(r);o.tag=1,o.payload=t,void 0!==n&&null!==n&&(o.callback=n),null!==(t=ia(e,o,r))&&(Lc(t,e,r),sa(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Rc(),r=aa(n);r.tag=2,void 0!==t&&null!==t&&(r.callback=t),null!==(t=ia(e,r,n))&&(Lc(t,e,n),sa(t,e,n))}};function hs(e,t,n,r,o,a,i){return"function"===typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,i):!t.prototype||!t.prototype.isPureReactComponent||(!Gn(n,r)||!Gn(o,a))}function ms(e,t,n,r){e=t.state,"function"===typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"===typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&ps.enqueueReplaceState(t,t.state,null)}function vs(e,t){var n=t;if("ref"in t)for(var r in n={},t)"ref"!==r&&(n[r]=t[r]);if(e=e.defaultProps)for(var o in n===t&&(n=f({},n)),e)void 0===n[o]&&(n[o]=e[o]);return n}var gs="function"===typeof reportError?reportError:function(e){if("object"===typeof window&&"function"===typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"===typeof e&&null!==e&&"string"===typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"===typeof process&&"function"===typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function ys(e){gs(e)}function bs(e){console.error(e)}function ws(e){gs(e)}function xs(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.stack})}catch(n){setTimeout((function(){throw n}))}}function ks(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.stack,errorBoundary:1===t.tag?t.stateNode:null})}catch(r){setTimeout((function(){throw r}))}}function Ss(e,t,n){return(n=aa(n)).tag=3,n.payload={element:null},n.callback=function(){xs(e,t)},n}function Es(e){return(e=aa(e)).tag=3,e}function Cs(e,t,n,r){var o=n.type.getDerivedStateFromError;if("function"===typeof o){var a=r.value;e.payload=function(){return o(a)},e.callback=function(){ks(t,n,r)}}var i=n.stateNode;null!==i&&"function"===typeof i.componentDidCatch&&(e.callback=function(){ks(t,n,r),"function"!==typeof o&&(null===Ec?Ec=new Set([this]):Ec.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:""})})}var Ns=Error(i(461)),js=!1;function Ds(e,t,n,r){t.child=null===e?rs(t,null,n,r):ns(t,e.child,n,r)}function Ps(e,t,n,r,o){n=n.render;var a=t.ref;if("ref"in r){var i={};for(var s in r)"ref"!==s&&(i[s]=r[s])}else i=r;return No(t),r=Oa(e,t,n,i,a,o),s=La(),null===e||js?(ao&&s&&to(t),t.flags|=1,Ds(e,t,r,o),t.child):(Ia(e,t,o),$s(e,t,o))}function Ts(e,t,n,r,o){if(null===e){var a=n.type;return"function"!==typeof a||Ir(a)||void 0!==a.defaultProps||null!==n.compare?((e=Br(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,_s(e,t,a,r,o))}if(a=e.child,!Gs(e,o)){var i=a.memoizedProps;if((n=null!==(n=n.compare)?n:Gn)(i,r)&&e.ref===t.ref)return $s(e,t,o)}return t.flags|=1,(e=Fr(a,r)).ref=t.ref,e.return=t,t.child=e}function _s(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(Gn(a,r)&&e.ref===t.ref){if(js=!1,t.pendingProps=r=a,!Gs(e,o))return t.lanes=e.lanes,$s(e,t,o);0!==(131072&e.flags)&&(js=!0)}}return As(e,t,n,r,o)}function Os(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(0!==(128&t.flags)){if(r=null!==a?a.baseLanes|n:n,null!==e){for(o=t.child=e.child,a=0;null!==o;)a=a|o.lanes|o.childLanes,o=o.sibling;t.childLanes=a&~r}else t.childLanes=0,t.child=null;return Ms(e,t,r,n)}if(0===(536870912&n))return t.lanes=t.childLanes=536870912,Ms(e,t,null!==a?a.baseLanes|n:n,n);t.memoizedState={baseLanes:0,cachePool:null},null!==e&&Wo(0,null!==a?a.cachePool:null),null!==a?va(t,a):ga(),ss(t)}else null!==a?(Wo(0,a.cachePool),va(t,a),ls(),t.memoizedState=null):(null!==e&&Wo(0,null),ga(),ls());return Ds(e,t,o,n),t.child}function Ms(e,t,n,r){var o=Yo();return o=null===o?null:{parent:Mo._currentValue,pool:o},t.memoizedState={baseLanes:n,cachePool:o},null!==e&&Wo(0,null),ga(),ss(t),null!==e&&Eo(e,t,r,!0),null}function Rs(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flags|=4194816);else{if("function"!==typeof n&&"object"!==typeof n)throw Error(i(284));null!==e&&e.ref===n||(t.flags|=4194816)}}function As(e,t,n,r,o){return No(t),n=Oa(e,t,n,r,void 0,o),r=La(),null===e||js?(ao&&r&&to(t),t.flags|=1,Ds(e,t,n,o),t.child):(Ia(e,t,o),$s(e,t,o))}function Ls(e,t,n,r,o,a){return No(t),t.updateQueue=null,n=Ra(t,r,n,o),Ma(e),r=La(),null===e||js?(ao&&r&&to(t),t.flags|=1,Ds(e,t,n,a),t.child):(Ia(e,t,a),$s(e,t,a))}function Is(e,t,n,r,o){if(No(t),null===t.stateNode){var a=Rr,i=n.contextType;"object"===typeof i&&null!==i&&(a=jo(i)),a=new n(r,a),t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,a.updater=ps,t.stateNode=a,a._reactInternals=t,(a=t.stateNode).props=r,a.state=t.memoizedState,a.refs={},ra(t),i=n.contextType,a.context="object"===typeof i&&null!==i?jo(i):Rr,a.state=t.memoizedState,"function"===typeof(i=n.getDerivedStateFromProps)&&(fs(t,n,i,r),a.state=t.memoizedState),"function"===typeof n.getDerivedStateFromProps||"function"===typeof a.getSnapshotBeforeUpdate||"function"!==typeof a.UNSAFE_componentWillMount&&"function"!==typeof a.componentWillMount||(i=a.state,"function"===typeof a.componentWillMount&&a.componentWillMount(),"function"===typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),i!==a.state&&ps.enqueueReplaceState(a,a.state,null),da(t,r,a,o),ua(),a.state=t.memoizedState),"function"===typeof a.componentDidMount&&(t.flags|=4194308),r=!0}else if(null===e){a=t.stateNode;var s=t.memoizedProps,l=vs(n,s);a.props=l;var c=a.context,u=n.contextType;i=Rr,"object"===typeof u&&null!==u&&(i=jo(u));var d=n.getDerivedStateFromProps;u="function"===typeof d||"function"===typeof a.getSnapshotBeforeUpdate,s=t.pendingProps!==s,u||"function"!==typeof a.UNSAFE_componentWillReceiveProps&&"function"!==typeof a.componentWillReceiveProps||(s||c!==i)&&ms(t,a,r,i),na=!1;var f=t.memoizedState;a.state=f,da(t,r,a,o),ua(),c=t.memoizedState,s||f!==c||na?("function"===typeof d&&(fs(t,n,d,r),c=t.memoizedState),(l=na||hs(t,n,l,r,f,c,i))?(u||"function"!==typeof a.UNSAFE_componentWillMount&&"function"!==typeof a.componentWillMount||("function"===typeof a.componentWillMount&&a.componentWillMount(),"function"===typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"===typeof a.componentDidMount&&(t.flags|=4194308)):("function"===typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=c),a.props=r,a.state=c,a.context=i,r=l):("function"===typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,oa(e,t),u=vs(n,i=t.memoizedProps),a.props=u,d=t.pendingProps,f=a.context,c=n.contextType,l=Rr,"object"===typeof c&&null!==c&&(l=jo(c)),(c="function"===typeof(s=n.getDerivedStateFromProps)||"function"===typeof a.getSnapshotBeforeUpdate)||"function"!==typeof a.UNSAFE_componentWillReceiveProps&&"function"!==typeof a.componentWillReceiveProps||(i!==d||f!==l)&&ms(t,a,r,l),na=!1,f=t.memoizedState,a.state=f,da(t,r,a,o),ua();var p=t.memoizedState;i!==d||f!==p||na||null!==e&&null!==e.dependencies&&Co(e.dependencies)?("function"===typeof s&&(fs(t,n,s,r),p=t.memoizedState),(u=na||hs(t,n,u,r,f,p,l)||null!==e&&null!==e.dependencies&&Co(e.dependencies))?(c||"function"!==typeof a.UNSAFE_componentWillUpdate&&"function"!==typeof a.componentWillUpdate||("function"===typeof a.componentWillUpdate&&a.componentWillUpdate(r,p,l),"function"===typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,p,l)),"function"===typeof a.componentDidUpdate&&(t.flags|=4),"function"===typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!==typeof a.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!==typeof a.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=p),a.props=r,a.state=p,a.context=l,r=u):("function"!==typeof a.componentDidUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=4),"function"!==typeof a.getSnapshotBeforeUpdate||i===e.memoizedProps&&f===e.memoizedState||(t.flags|=1024),r=!1)}return a=r,Rs(e,t),r=0!==(128&t.flags),a||r?(a=t.stateNode,n=r&&"function"!==typeof n.getDerivedStateFromError?null:a.render(),t.flags|=1,null!==e&&r?(t.child=ns(t,e.child,null,o),t.child=ns(t,null,n,o)):Ds(e,t,n,o),t.memoizedState=a.state,e=t.child):e=$s(e,t,o),e}function Fs(e,t,n,r){return ho(),t.flags|=256,Ds(e,t,n,r),t.child}var zs={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Bs(e){return{baseLanes:e,cachePool:qo()}}function Hs(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=vc),e}function Us(e,t,n){var r,o=t.pendingProps,a=!1,s=0!==(128&t.flags);if((r=s)||(r=(null===e||null!==e.memoizedState)&&0!==(2&us.current)),r&&(a=!0,t.flags&=-129),r=0!==(32&t.flags),t.flags&=-33,null===e){if(ao){if(a?is(t):ls(),ao){var l,c=oo;if(l=c){e:{for(l=c,c=so;8!==l.nodeType;){if(!c){c=null;break e}if(null===(l=gd(l.nextSibling))){c=null;break e}}c=l}null!==c?(t.memoizedState={dehydrated:c,treeContext:null!==Gr?{id:Xr,overflow:Jr}:null,retryLane:536870912,hydrationErrors:null},(l=Lr(18,null,null,0)).stateNode=c,l.return=t,t.child=l,ro=t,oo=null,l=!0):l=!1}l||co(t)}if(null!==(c=t.memoizedState)&&null!==(c=c.dehydrated))return vd(c)?t.lanes=32:t.lanes=536870912,null;cs(t)}return c=o.children,o=o.fallback,a?(ls(),c=Ws({mode:"hidden",children:c},a=t.mode),o=Hr(o,a,n,null),c.return=t,o.return=t,c.sibling=o,t.child=c,(a=t.child).memoizedState=Bs(n),a.childLanes=Hs(e,r,n),t.memoizedState=zs,o):(is(t),Ys(t,c))}if(null!==(l=e.memoizedState)&&null!==(c=l.dehydrated)){if(s)256&t.flags?(is(t),t.flags&=-257,t=qs(e,t,n)):null!==t.memoizedState?(ls(),t.child=e.child,t.flags|=128,t=null):(ls(),a=o.fallback,c=t.mode,o=Ws({mode:"visible",children:o.children},c),(a=Hr(a,c,n,null)).flags|=2,o.return=t,a.return=t,o.sibling=a,t.child=o,ns(t,e.child,null,n),(o=t.child).memoizedState=Bs(n),o.childLanes=Hs(e,r,n),t.memoizedState=zs,t=a);else if(is(t),vd(c)){if(r=c.nextSibling&&c.nextSibling.dataset)var u=r.dgst;r=u,(o=Error(i(419))).stack="",o.digest=r,vo({value:o,source:null,stack:null}),t=qs(e,t,n)}else if(js||Eo(e,t,n,!1),r=0!==(n&e.childLanes),js||r){if(null!==(r=rc)&&(0!==(o=0!==((o=0!==(42&(o=n&-n))?1:De(o))&(r.suspendedLanes|n))?0:o)&&o!==l.retryLane))throw l.retryLane=o,_r(e,o),Lc(r,e,o),Ns;"$?"===c.data||Qc(),t=qs(e,t,n)}else"$?"===c.data?(t.flags|=192,t.child=e.child,t=null):(e=l.treeContext,oo=gd(c.nextSibling),ro=t,ao=!0,io=null,so=!1,null!==e&&(Kr[$r++]=Xr,Kr[$r++]=Jr,Kr[$r++]=Gr,Xr=e.id,Jr=e.overflow,Gr=t),(t=Ys(t,o.children)).flags|=4096);return t}return a?(ls(),a=o.fallback,c=t.mode,u=(l=e.child).sibling,(o=Fr(l,{mode:"hidden",children:o.children})).subtreeFlags=65011712&l.subtreeFlags,null!==u?a=Fr(u,a):(a=Hr(a,c,n,null)).flags|=2,a.return=t,o.return=t,o.sibling=a,t.child=o,o=a,a=t.child,null===(c=e.child.memoizedState)?c=Bs(n):(null!==(l=c.cachePool)?(u=Mo._currentValue,l=l.parent!==u?{parent:u,pool:u}:l):l=qo(),c={baseLanes:c.baseLanes|n,cachePool:l}),a.memoizedState=c,a.childLanes=Hs(e,r,n),t.memoizedState=zs,o):(is(t),e=(n=e.child).sibling,(n=Fr(n,{mode:"visible",children:o.children})).return=t,n.sibling=null,null!==e&&(null===(r=t.deletions)?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n)}function Ys(e,t){return(t=Ws({mode:"visible",children:t},e.mode)).return=e,e.child=t}function Ws(e,t){return(e=Lr(22,e,null,t)).lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function qs(e,t,n){return ns(t,e.child,null,n),(e=Ys(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Vs(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),ko(e.return,t,n)}function Qs(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Ks(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Ds(e,t,r.children,n),0!==(2&(r=us.current)))r=1&r|2,t.flags|=128;else{if(null!==e&&0!==(128&e.flags))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Vs(e,n,t);else if(19===e.tag)Vs(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}switch(H(us,r),o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===ds(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Qs(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===ds(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Qs(t,!0,n,null,a);break;case"together":Qs(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function $s(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),pc|=t.lanes,0===(n&t.childLanes)){if(null===e)return null;if(Eo(e,t,n,!1),0===(n&t.childLanes))return null}if(null!==e&&t.child!==e.child)throw Error(i(153));if(null!==t.child){for(n=Fr(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Fr(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Gs(e,t){return 0!==(e.lanes&t)||!(null===(e=e.dependencies)||!Co(e))}function Xs(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)js=!0;else{if(!Gs(e,n)&&0===(128&t.flags))return js=!1,function(e,t,n){switch(t.tag){case 3:V(t,t.stateNode.containerInfo),wo(0,Mo,e.memoizedState.cache),ho();break;case 27:case 5:K(t);break;case 4:V(t,t.stateNode.containerInfo);break;case 10:wo(0,t.type,t.memoizedProps.value);break;case 13:var r=t.memoizedState;if(null!==r)return null!==r.dehydrated?(is(t),t.flags|=128,null):0!==(n&t.child.childLanes)?Us(e,t,n):(is(t),null!==(e=$s(e,t,n))?e.sibling:null);is(t);break;case 19:var o=0!==(128&e.flags);if((r=0!==(n&t.childLanes))||(Eo(e,t,n,!1),r=0!==(n&t.childLanes)),o){if(r)return Ks(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),H(us,us.current),r)break;return null;case 22:case 23:return t.lanes=0,Os(e,t,n);case 24:wo(0,Mo,e.memoizedState.cache)}return $s(e,t,n)}(e,t,n);js=0!==(131072&e.flags)}else js=!1,ao&&0!==(1048576&t.flags)&&eo(t,Qr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var r=t.elementType,o=r._init;if(r=o(r._payload),t.type=r,"function"!==typeof r){if(void 0!==r&&null!==r){if((o=r.$$typeof)===k){t.tag=11,t=Ps(null,t,r,e,n);break e}if(o===C){t.tag=14,t=Ts(null,t,r,e,n);break e}}throw t=O(r)||r,Error(i(306,t,""))}Ir(r)?(e=vs(r,e),t.tag=1,t=Is(null,t,r,e,n)):(t.tag=0,t=As(null,t,r,e,n))}return t;case 0:return As(e,t,t.type,t.pendingProps,n);case 1:return Is(e,t,r=t.type,o=vs(r,t.pendingProps),n);case 3:e:{if(V(t,t.stateNode.containerInfo),null===e)throw Error(i(387));r=t.pendingProps;var a=t.memoizedState;o=a.element,oa(e,t),da(t,r,null,n);var s=t.memoizedState;if(r=s.cache,wo(0,Mo,r),r!==a.cache&&So(t,[Mo],n,!0),ua(),r=s.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:s.cache},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Fs(e,t,r,n);break e}if(r!==o){vo(o=Er(Error(i(424)),t)),t=Fs(e,t,r,n);break e}if(9===(e=t.stateNode.containerInfo).nodeType)e=e.body;else e="HTML"===e.nodeName?e.ownerDocument.body:e;for(oo=gd(e.firstChild),ro=t,ao=!0,io=null,so=!0,n=rs(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ho(),r===o){t=$s(e,t,n);break e}Ds(e,t,r,n)}t=t.child}return t;case 26:return Rs(e,t),null===e?(n=Dd(t.type,null,t.pendingProps,null))?t.memoizedState=n:ao||(n=t.type,e=t.pendingProps,(r=rd(W.current).createElement(n))[Oe]=t,r[Me]=e,ed(r,n,e),qe(r),t.stateNode=r):t.memoizedState=Dd(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return K(t),null===e&&ao&&(r=t.stateNode=wd(t.type,t.pendingProps,W.current),ro=t,so=!0,o=oo,pd(t.type)?(yd=o,oo=gd(r.firstChild)):oo=o),Ds(e,t,t.pendingProps.children,n),Rs(e,t),null===e&&(t.flags|=4194304),t.child;case 5:return null===e&&ao&&((o=r=oo)&&(null!==(r=function(e,t,n,r){for(;1===e.nodeType;){var o=n;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&("INPUT"!==e.nodeName||"hidden"!==e.type))break}else if(r){if(!e[ze])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if("stylesheet"===(a=e.getAttribute("rel"))&&e.hasAttribute("data-precedence"))break;if(a!==o.rel||e.getAttribute("href")!==(null==o.href||""===o.href?null:o.href)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin)||e.getAttribute("title")!==(null==o.title?null:o.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(((a=e.getAttribute("src"))!==(null==o.src?null:o.src)||e.getAttribute("type")!==(null==o.type?null:o.type)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin))&&a&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else{if("input"!==t||"hidden"!==e.type)return e;var a=null==o.name?null:""+o.name;if("hidden"===o.type&&e.getAttribute("name")===a)return e}if(null===(e=gd(e.nextSibling)))break}return null}(r,t.type,t.pendingProps,so))?(t.stateNode=r,ro=t,oo=gd(r.firstChild),so=!1,o=!0):o=!1),o||co(t)),K(t),o=t.type,a=t.pendingProps,s=null!==e?e.memoizedProps:null,r=a.children,id(o,a)?r=null:null!==s&&id(o,s)&&(t.flags|=32),null!==t.memoizedState&&(o=Oa(e,t,Aa,null,null,n),Kd._currentValue=o),Rs(e,t),Ds(e,t,r,n),t.child;case 6:return null===e&&ao&&((e=n=oo)&&(null!==(n=function(e,t,n){if(""===t)return null;for(;3!==e.nodeType;){if((1!==e.nodeType||"INPUT"!==e.nodeName||"hidden"!==e.type)&&!n)return null;if(null===(e=gd(e.nextSibling)))return null}return e}(n,t.pendingProps,so))?(t.stateNode=n,ro=t,oo=null,e=!0):e=!1),e||co(t)),null;case 13:return Us(e,t,n);case 4:return V(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=ns(t,null,r,n):Ds(e,t,r,n),t.child;case 11:return Ps(e,t,t.type,t.pendingProps,n);case 7:return Ds(e,t,t.pendingProps,n),t.child;case 8:case 12:return Ds(e,t,t.pendingProps.children,n),t.child;case 10:return r=t.pendingProps,wo(0,t.type,r.value),Ds(e,t,r.children,n),t.child;case 9:return o=t.type._context,r=t.pendingProps.children,No(t),r=r(o=jo(o)),t.flags|=1,Ds(e,t,r,n),t.child;case 14:return Ts(e,t,t.type,t.pendingProps,n);case 15:return _s(e,t,t.type,t.pendingProps,n);case 19:return Ks(e,t,n);case 31:return r=t.pendingProps,n=t.mode,r={mode:r.mode,children:r.children},null===e?((n=Ws(r,n)).ref=t.ref,t.child=n,n.return=t,t=n):((n=Fr(e.child,r)).ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return Os(e,t,n);case 24:return No(t),r=jo(Mo),null===e?(null===(o=Yo())&&(o=rc,a=Ro(),o.pooledCache=a,a.refCount++,null!==a&&(o.pooledCacheLanes|=n),o=a),t.memoizedState={parent:r,cache:o},ra(t),wo(0,Mo,o)):(0!==(e.lanes&n)&&(oa(e,t),da(t,null,null,n),ua()),o=e.memoizedState,a=t.memoizedState,o.parent!==r?(o={parent:r,cache:r},t.memoizedState=o,0===t.lanes&&(t.memoizedState=t.updateQueue.baseState=o),wo(0,Mo,r)):(r=a.cache,wo(0,Mo,r),r!==o.cache&&So(t,[Mo],n,!0))),Ds(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(i(156,t.tag))}function Js(e){e.flags|=4}function Zs(e,t){if("stylesheet"!==t.type||0!==(4&t.state.loading))e.flags&=-16777217;else if(e.flags|=16777216,!Hd(t)){if(null!==(t=os.current)&&((4194048&ac)===ac?null!==as:(62914560&ac)!==ac&&0===(536870912&ac)||t!==as))throw Zo=$o,Qo;e.flags|=8192}}function el(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?Se():536870912,e.lanes|=t,gc|=t)}function tl(e,t){if(!ao)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function nl(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=65011712&o.subtreeFlags,r|=65011712&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function rl(e,t,n){var r=t.pendingProps;switch(no(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return nl(t),null;case 3:return n=t.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),xo(Mo),Q(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),null!==e&&null!==e.child||(po(t)?Js(t):null===e||e.memoizedState.isDehydrated&&0===(256&t.flags)||(t.flags|=1024,mo())),nl(t),null;case 26:return n=t.memoizedState,null===e?(Js(t),null!==n?(nl(t),Zs(t,n)):(nl(t),t.flags&=-16777217)):n?n!==e.memoizedState?(Js(t),nl(t),Zs(t,n)):(nl(t),t.flags&=-16777217):(e.memoizedProps!==r&&Js(t),nl(t),t.flags&=-16777217),null;case 27:$(t),n=W.current;var o=t.type;if(null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Js(t);else{if(!r){if(null===t.stateNode)throw Error(i(166));return nl(t),null}e=U.current,po(t)?uo(t):(e=wd(o,r,n),t.stateNode=e,Js(t))}return nl(t),null;case 5:if($(t),n=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Js(t);else{if(!r){if(null===t.stateNode)throw Error(i(166));return nl(t),null}if(e=U.current,po(t))uo(t);else{switch(o=rd(W.current),e){case 1:e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":(e=o.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild);break;case"select":e="string"===typeof r.is?o.createElement("select",{is:r.is}):o.createElement("select"),r.multiple?e.multiple=!0:r.size&&(e.size=r.size);break;default:e="string"===typeof r.is?o.createElement(n,{is:r.is}):o.createElement(n)}}e[Oe]=t,e[Me]=r;e:for(o=t.child;null!==o;){if(5===o.tag||6===o.tag)e.appendChild(o.stateNode);else if(4!==o.tag&&27!==o.tag&&null!==o.child){o.child.return=o,o=o.child;continue}if(o===t)break e;for(;null===o.sibling;){if(null===o.return||o.return===t)break e;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=e;e:switch(ed(e,n,r),n){case"button":case"input":case"select":case"textarea":e=!!r.autoFocus;break e;case"img":e=!0;break e;default:e=!1}e&&Js(t)}}return nl(t),t.flags&=-16777217,null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&Js(t);else{if("string"!==typeof r&&null===t.stateNode)throw Error(i(166));if(e=W.current,po(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(o=ro))switch(o.tag){case 27:case 5:r=o.memoizedProps}e[Oe]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||Gu(e.nodeValue,n)))||co(t)}else(e=rd(e).createTextNode(r))[Oe]=t,t.stateNode=e}return nl(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(o=po(t),null!==r&&null!==r.dehydrated){if(null===e){if(!o)throw Error(i(318));if(!(o=null!==(o=t.memoizedState)?o.dehydrated:null))throw Error(i(317));o[Oe]=t}else ho(),0===(128&t.flags)&&(t.memoizedState=null),t.flags|=4;nl(t),o=!1}else o=mo(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=o),o=!0;if(!o)return 256&t.flags?(cs(t),t):(cs(t),null)}if(cs(t),0!==(128&t.flags))return t.lanes=n,t;if(n=null!==r,e=null!==e&&null!==e.memoizedState,n){o=null,null!==(r=t.child).alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(o=r.alternate.memoizedState.cachePool.pool);var a=null;null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(a=r.memoizedState.cachePool.pool),a!==o&&(r.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),el(t,t.updateQueue),nl(t),null;case 4:return Q(),null===e&&Bu(t.stateNode.containerInfo),nl(t),null;case 10:return xo(t.type),nl(t),null;case 19:if(B(us),null===(o=t.memoizedState))return nl(t),null;if(r=0!==(128&t.flags),null===(a=o.rendering))if(r)tl(o,!1);else{if(0!==fc||null!==e&&0!==(128&e.flags))for(e=t.child;null!==e;){if(null!==(a=ds(e))){for(t.flags|=128,tl(o,!1),e=a.updateQueue,t.updateQueue=e,el(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)zr(n,e),n=n.sibling;return H(us,1&us.current|2),t.child}e=e.sibling}null!==o.tail&&te()>kc&&(t.flags|=128,r=!0,tl(o,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=ds(a))){if(t.flags|=128,r=!0,e=e.updateQueue,t.updateQueue=e,el(t,e),tl(o,!0),null===o.tail&&"hidden"===o.tailMode&&!a.alternate&&!ao)return nl(t),null}else 2*te()-o.renderingStartTime>kc&&536870912!==n&&(t.flags|=128,r=!0,tl(o,!1),t.lanes=4194304);o.isBackwards?(a.sibling=t.child,t.child=a):(null!==(e=o.last)?e.sibling=a:t.child=a,o.last=a)}return null!==o.tail?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=te(),t.sibling=null,e=us.current,H(us,r?1&e|2:1&e),t):(nl(t),null);case 22:case 23:return cs(t),ya(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?0!==(536870912&n)&&0===(128&t.flags)&&(nl(t),6&t.subtreeFlags&&(t.flags|=8192)):nl(t),null!==(n=t.updateQueue)&&el(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&B(Uo),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),xo(Mo),nl(t),null;case 25:case 30:return null}throw Error(i(156,t.tag))}function ol(e,t){switch(no(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return xo(Mo),Q(),0!==(65536&(e=t.flags))&&0===(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return $(t),null;case 13:if(cs(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(i(340));ho()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return B(us),null;case 4:return Q(),null;case 10:return xo(t.type),null;case 22:case 23:return cs(t),ya(),null!==e&&B(Uo),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return xo(Mo),null;default:return null}}function al(e,t){switch(no(t),t.tag){case 3:xo(Mo),Q();break;case 26:case 27:case 5:$(t);break;case 4:Q();break;case 13:cs(t);break;case 19:B(us);break;case 10:xo(t.type);break;case 22:case 23:cs(t),ya(),null!==e&&B(Uo);break;case 24:xo(Mo)}}function il(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var o=r.next;n=o;do{if((n.tag&e)===e){r=void 0;var a=n.create,i=n.inst;r=a(),i.destroy=r}n=n.next}while(n!==o)}}catch(s){uu(t,t.return,s)}}function sl(e,t,n){try{var r=t.updateQueue,o=null!==r?r.lastEffect:null;if(null!==o){var a=o.next;r=a;do{if((r.tag&e)===e){var i=r.inst,s=i.destroy;if(void 0!==s){i.destroy=void 0,o=t;var l=n,c=s;try{c()}catch(u){uu(o,l,u)}}}r=r.next}while(r!==a)}}catch(u){uu(t,t.return,u)}}function ll(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{pa(t,n)}catch(r){uu(e,e.return,r)}}}function cl(e,t,n){n.props=vs(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(r){uu(e,t,r)}}function ul(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;default:r=e.stateNode}"function"===typeof n?e.refCleanup=n(r):n.current=r}}catch(o){uu(e,t,o)}}function dl(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"===typeof r)try{r()}catch(o){uu(e,t,o)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if("function"===typeof n)try{n(null)}catch(a){uu(e,t,a)}else n.current=null}function fl(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&r.focus();break e;case"img":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(o){uu(e,e.return,o)}}function pl(e,t,n){try{var r=e.stateNode;!function(e,t,n,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var o=null,a=null,s=null,l=null,c=null,u=null,d=null;for(h in n){var f=n[h];if(n.hasOwnProperty(h)&&null!=f)switch(h){case"checked":case"value":break;case"defaultValue":c=f;default:r.hasOwnProperty(h)||Ju(e,t,h,null,r,f)}}for(var p in r){var h=r[p];if(f=n[p],r.hasOwnProperty(p)&&(null!=h||null!=f))switch(p){case"type":a=h;break;case"name":o=h;break;case"checked":u=h;break;case"defaultChecked":d=h;break;case"value":s=h;break;case"defaultValue":l=h;break;case"children":case"dangerouslySetInnerHTML":if(null!=h)throw Error(i(137,t));break;default:h!==f&&Ju(e,t,p,h,r,f)}}return void vt(e,s,l,c,u,d,a,o);case"select":for(a in h=s=l=p=null,n)if(c=n[a],n.hasOwnProperty(a)&&null!=c)switch(a){case"value":break;case"multiple":h=c;default:r.hasOwnProperty(a)||Ju(e,t,a,null,r,c)}for(o in r)if(a=r[o],c=n[o],r.hasOwnProperty(o)&&(null!=a||null!=c))switch(o){case"value":p=a;break;case"defaultValue":l=a;break;case"multiple":s=a;default:a!==c&&Ju(e,t,o,a,r,c)}return t=l,n=s,r=h,void(null!=p?bt(e,!!n,p,!1):!!r!==!!n&&(null!=t?bt(e,!!n,t,!0):bt(e,!!n,n?[]:"",!1)));case"textarea":for(l in h=p=null,n)if(o=n[l],n.hasOwnProperty(l)&&null!=o&&!r.hasOwnProperty(l))switch(l){case"value":case"children":break;default:Ju(e,t,l,null,r,o)}for(s in r)if(o=r[s],a=n[s],r.hasOwnProperty(s)&&(null!=o||null!=a))switch(s){case"value":p=o;break;case"defaultValue":h=o;break;case"children":break;case"dangerouslySetInnerHTML":if(null!=o)throw Error(i(91));break;default:o!==a&&Ju(e,t,s,o,r,a)}return void wt(e,p,h);case"option":for(var m in n)if(p=n[m],n.hasOwnProperty(m)&&null!=p&&!r.hasOwnProperty(m))if("selected"===m)e.selected=!1;else Ju(e,t,m,null,r,p);for(c in r)if(p=r[c],h=n[c],r.hasOwnProperty(c)&&p!==h&&(null!=p||null!=h))if("selected"===c)e.selected=p&&"function"!==typeof p&&"symbol"!==typeof p;else Ju(e,t,c,p,r,h);return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var v in n)p=n[v],n.hasOwnProperty(v)&&null!=p&&!r.hasOwnProperty(v)&&Ju(e,t,v,null,r,p);for(u in r)if(p=r[u],h=n[u],r.hasOwnProperty(u)&&p!==h&&(null!=p||null!=h))switch(u){case"children":case"dangerouslySetInnerHTML":if(null!=p)throw Error(i(137,t));break;default:Ju(e,t,u,p,r,h)}return;default:if(Nt(t)){for(var g in n)p=n[g],n.hasOwnProperty(g)&&void 0!==p&&!r.hasOwnProperty(g)&&Zu(e,t,g,void 0,r,p);for(d in r)p=r[d],h=n[d],!r.hasOwnProperty(d)||p===h||void 0===p&&void 0===h||Zu(e,t,d,p,r,h);return}}for(var y in n)p=n[y],n.hasOwnProperty(y)&&null!=p&&!r.hasOwnProperty(y)&&Ju(e,t,y,null,r,p);for(f in r)p=r[f],h=n[f],!r.hasOwnProperty(f)||p===h||null==p&&null==h||Ju(e,t,f,p,r,h)}(r,e.type,n,t),r[Me]=t}catch(o){uu(e,e.return,o)}}function hl(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&pd(e.type)||4===e.tag}function ml(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||hl(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&pd(e.type))continue e;if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function vl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?(9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).insertBefore(e,t):((t=9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).appendChild(e),null!==(n=n._reactRootContainer)&&void 0!==n||null!==t.onclick||(t.onclick=Xu));else if(4!==r&&(27===r&&pd(e.type)&&(n=e.stateNode,t=null),null!==(e=e.child)))for(vl(e,t,n),e=e.sibling;null!==e;)vl(e,t,n),e=e.sibling}function gl(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&(27===r&&pd(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(gl(e,t,n),e=e.sibling;null!==e;)gl(e,t,n),e=e.sibling}function yl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,o=t.attributes;o.length;)t.removeAttributeNode(o[0]);ed(t,r,n),t[Oe]=e,t[Me]=n}catch(a){uu(e,e.return,a)}}var bl=!1,wl=!1,xl=!1,kl="function"===typeof WeakSet?WeakSet:Set,Sl=null;function El(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:Il(e,n),4&r&&il(5,n);break;case 1:if(Il(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(i){uu(n,n.return,i)}else{var o=vs(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(o,t,e.__reactInternalSnapshotBeforeUpdate)}catch(s){uu(n,n.return,s)}}64&r&&ll(n),512&r&&ul(n,n.return);break;case 3:if(Il(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{pa(e,t)}catch(i){uu(n,n.return,i)}}break;case 27:null===t&&4&r&&yl(n);case 26:case 5:Il(e,n),null===t&&4&r&&fl(n),512&r&&ul(n,n.return);break;case 12:Il(e,n);break;case 13:Il(e,n),4&r&&Tl(e,n),64&r&&(null!==(e=n.memoizedState)&&(null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if("$?"!==e.data||"complete"===n.readyState)t();else{var r=function(){t(),n.removeEventListener("DOMContentLoaded",r)};n.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}(e,n=hu.bind(null,n))));break;case 22:if(!(r=null!==n.memoizedState||bl)){t=null!==t&&null!==t.memoizedState||wl,o=bl;var a=wl;bl=r,(wl=t)&&!a?zl(e,n,0!==(8772&n.subtreeFlags)):Il(e,n),bl=o,wl=a}break;case 30:break;default:Il(e,n)}}function Cl(e){var t=e.alternate;null!==t&&(e.alternate=null,Cl(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&Be(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var Nl=null,jl=!1;function Dl(e,t,n){for(n=n.child;null!==n;)Pl(e,t,n),n=n.sibling}function Pl(e,t,n){if(de&&"function"===typeof de.onCommitFiberUnmount)try{de.onCommitFiberUnmount(ue,n)}catch(a){}switch(n.tag){case 26:wl||dl(n,t),Dl(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:wl||dl(n,t);var r=Nl,o=jl;pd(n.type)&&(Nl=n.stateNode,jl=!1),Dl(e,t,n),xd(n.stateNode),Nl=r,jl=o;break;case 5:wl||dl(n,t);case 6:if(r=Nl,o=jl,Nl=null,Dl(e,t,n),jl=o,null!==(Nl=r))if(jl)try{(9===Nl.nodeType?Nl.body:"HTML"===Nl.nodeName?Nl.ownerDocument.body:Nl).removeChild(n.stateNode)}catch(i){uu(n,t,i)}else try{Nl.removeChild(n.stateNode)}catch(i){uu(n,t,i)}break;case 18:null!==Nl&&(jl?(hd(9===(e=Nl).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e,n.stateNode),Df(e)):hd(Nl,n.stateNode));break;case 4:r=Nl,o=jl,Nl=n.stateNode.containerInfo,jl=!0,Dl(e,t,n),Nl=r,jl=o;break;case 0:case 11:case 14:case 15:wl||sl(2,n,t),wl||sl(4,n,t),Dl(e,t,n);break;case 1:wl||(dl(n,t),"function"===typeof(r=n.stateNode).componentWillUnmount&&cl(n,t,r)),Dl(e,t,n);break;case 21:Dl(e,t,n);break;case 22:wl=(r=wl)||null!==n.memoizedState,Dl(e,t,n),wl=r;break;default:Dl(e,t,n)}}function Tl(e,t){if(null===t.memoizedState&&(null!==(e=t.alternate)&&(null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))))try{Df(e)}catch(n){uu(t,t.return,n)}}function _l(e,t){var n=function(e){switch(e.tag){case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new kl),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new kl),t;default:throw Error(i(435,e.tag))}}(e);t.forEach((function(t){var r=mu.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}function Ol(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r],a=e,s=t,l=s;e:for(;null!==l;){switch(l.tag){case 27:if(pd(l.type)){Nl=l.stateNode,jl=!1;break e}break;case 5:Nl=l.stateNode,jl=!1;break e;case 3:case 4:Nl=l.stateNode.containerInfo,jl=!0;break e}l=l.return}if(null===Nl)throw Error(i(160));Pl(a,s,o),Nl=null,jl=!1,null!==(a=o.alternate)&&(a.return=null),o.return=null}if(13878&t.subtreeFlags)for(t=t.child;null!==t;)Rl(t,e),t=t.sibling}var Ml=null;function Rl(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:Ol(t,e),Al(e),4&r&&(sl(3,e,e.return),il(3,e),sl(5,e,e.return));break;case 1:Ol(t,e),Al(e),512&r&&(wl||null===n||dl(n,n.return)),64&r&&bl&&(null!==(e=e.updateQueue)&&(null!==(r=e.callbacks)&&(n=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=null===n?r:n.concat(r))));break;case 26:var o=Ml;if(Ol(t,e),Al(e),512&r&&(wl||null===n||dl(n,n.return)),4&r){var a=null!==n?n.memoizedState:null;if(r=e.memoizedState,null===n)if(null===r)if(null===e.stateNode){e:{r=e.type,n=e.memoizedProps,o=o.ownerDocument||o;t:switch(r){case"title":(!(a=o.getElementsByTagName("title")[0])||a[ze]||a[Oe]||"http://www.w3.org/2000/svg"===a.namespaceURI||a.hasAttribute("itemprop"))&&(a=o.createElement(r),o.head.insertBefore(a,o.querySelector("head > title"))),ed(a,r,n),a[Oe]=e,qe(a),r=a;break e;case"link":var s=zd("link","href",o).get(r+(n.href||""));if(s)for(var l=0;l<s.length;l++)if((a=s[l]).getAttribute("href")===(null==n.href||""===n.href?null:n.href)&&a.getAttribute("rel")===(null==n.rel?null:n.rel)&&a.getAttribute("title")===(null==n.title?null:n.title)&&a.getAttribute("crossorigin")===(null==n.crossOrigin?null:n.crossOrigin)){s.splice(l,1);break t}ed(a=o.createElement(r),r,n),o.head.appendChild(a);break;case"meta":if(s=zd("meta","content",o).get(r+(n.content||"")))for(l=0;l<s.length;l++)if((a=s[l]).getAttribute("content")===(null==n.content?null:""+n.content)&&a.getAttribute("name")===(null==n.name?null:n.name)&&a.getAttribute("property")===(null==n.property?null:n.property)&&a.getAttribute("http-equiv")===(null==n.httpEquiv?null:n.httpEquiv)&&a.getAttribute("charset")===(null==n.charSet?null:n.charSet)){s.splice(l,1);break t}ed(a=o.createElement(r),r,n),o.head.appendChild(a);break;default:throw Error(i(468,r))}a[Oe]=e,qe(a),r=a}e.stateNode=r}else Bd(o,e.type,e.stateNode);else e.stateNode=Rd(o,r,e.memoizedProps);else a!==r?(null===a?null!==n.stateNode&&(n=n.stateNode).parentNode.removeChild(n):a.count--,null===r?Bd(o,e.type,e.stateNode):Rd(o,r,e.memoizedProps)):null===r&&null!==e.stateNode&&pl(e,e.memoizedProps,n.memoizedProps)}break;case 27:Ol(t,e),Al(e),512&r&&(wl||null===n||dl(n,n.return)),null!==n&&4&r&&pl(e,e.memoizedProps,n.memoizedProps);break;case 5:if(Ol(t,e),Al(e),512&r&&(wl||null===n||dl(n,n.return)),32&e.flags){o=e.stateNode;try{kt(o,"")}catch(h){uu(e,e.return,h)}}4&r&&null!=e.stateNode&&pl(e,o=e.memoizedProps,null!==n?n.memoizedProps:o),1024&r&&(xl=!0);break;case 6:if(Ol(t,e),Al(e),4&r){if(null===e.stateNode)throw Error(i(162));r=e.memoizedProps,n=e.stateNode;try{n.nodeValue=r}catch(h){uu(e,e.return,h)}}break;case 3:if(Fd=null,o=Ml,Ml=Ed(t.containerInfo),Ol(t,e),Ml=o,Al(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Df(t.containerInfo)}catch(h){uu(e,e.return,h)}xl&&(xl=!1,Ll(e));break;case 4:r=Ml,Ml=Ed(e.stateNode.containerInfo),Ol(t,e),Al(e),Ml=r;break;case 12:default:Ol(t,e),Al(e);break;case 13:Ol(t,e),Al(e),8192&e.child.flags&&null!==e.memoizedState!==(null!==n&&null!==n.memoizedState)&&(xc=te()),4&r&&(null!==(r=e.updateQueue)&&(e.updateQueue=null,_l(e,r)));break;case 22:o=null!==e.memoizedState;var c=null!==n&&null!==n.memoizedState,u=bl,d=wl;if(bl=u||o,wl=d||c,Ol(t,e),wl=d,bl=u,Al(e),8192&r)e:for(t=e.stateNode,t._visibility=o?-2&t._visibility:1|t._visibility,o&&(null===n||c||bl||wl||Fl(e)),n=null,t=e;;){if(5===t.tag||26===t.tag){if(null===n){c=n=t;try{if(a=c.stateNode,o)"function"===typeof(s=a.style).setProperty?s.setProperty("display","none","important"):s.display="none";else{l=c.stateNode;var f=c.memoizedProps.style,p=void 0!==f&&null!==f&&f.hasOwnProperty("display")?f.display:null;l.style.display=null==p||"boolean"===typeof p?"":(""+p).trim()}}catch(h){uu(c,c.return,h)}}}else if(6===t.tag){if(null===n){c=t;try{c.stateNode.nodeValue=o?"":c.memoizedProps}catch(h){uu(c,c.return,h)}}}else if((22!==t.tag&&23!==t.tag||null===t.memoizedState||t===e)&&null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break e;for(;null===t.sibling;){if(null===t.return||t.return===e)break e;n===t&&(n=null),t=t.return}n===t&&(n=null),t.sibling.return=t.return,t=t.sibling}4&r&&(null!==(r=e.updateQueue)&&(null!==(n=r.retryQueue)&&(r.retryQueue=null,_l(e,n))));break;case 19:Ol(t,e),Al(e),4&r&&(null!==(r=e.updateQueue)&&(e.updateQueue=null,_l(e,r)));case 30:case 21:}}function Al(e){var t=e.flags;if(2&t){try{for(var n,r=e.return;null!==r;){if(hl(r)){n=r;break}r=r.return}if(null==n)throw Error(i(160));switch(n.tag){case 27:var o=n.stateNode;gl(e,ml(e),o);break;case 5:var a=n.stateNode;32&n.flags&&(kt(a,""),n.flags&=-33),gl(e,ml(e),a);break;case 3:case 4:var s=n.stateNode.containerInfo;vl(e,ml(e),s);break;default:throw Error(i(161))}}catch(l){uu(e,e.return,l)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function Ll(e){if(1024&e.subtreeFlags)for(e=e.child;null!==e;){var t=e;Ll(t),5===t.tag&&1024&t.flags&&t.stateNode.reset(),e=e.sibling}}function Il(e,t){if(8772&t.subtreeFlags)for(t=t.child;null!==t;)El(e,t.alternate,t),t=t.sibling}function Fl(e){for(e=e.child;null!==e;){var t=e;switch(t.tag){case 0:case 11:case 14:case 15:sl(4,t,t.return),Fl(t);break;case 1:dl(t,t.return);var n=t.stateNode;"function"===typeof n.componentWillUnmount&&cl(t,t.return,n),Fl(t);break;case 27:xd(t.stateNode);case 26:case 5:dl(t,t.return),Fl(t);break;case 22:null===t.memoizedState&&Fl(t);break;default:Fl(t)}e=e.sibling}}function zl(e,t,n){for(n=n&&0!==(8772&t.subtreeFlags),t=t.child;null!==t;){var r=t.alternate,o=e,a=t,i=a.flags;switch(a.tag){case 0:case 11:case 15:zl(o,a,n),il(4,a);break;case 1:if(zl(o,a,n),"function"===typeof(o=(r=a).stateNode).componentDidMount)try{o.componentDidMount()}catch(c){uu(r,r.return,c)}if(null!==(o=(r=a).updateQueue)){var s=r.stateNode;try{var l=o.shared.hiddenCallbacks;if(null!==l)for(o.shared.hiddenCallbacks=null,o=0;o<l.length;o++)fa(l[o],s)}catch(c){uu(r,r.return,c)}}n&&64&i&&ll(a),ul(a,a.return);break;case 27:yl(a);case 26:case 5:zl(o,a,n),n&&null===r&&4&i&&fl(a),ul(a,a.return);break;case 12:zl(o,a,n);break;case 13:zl(o,a,n),n&&4&i&&Tl(o,a);break;case 22:null===a.memoizedState&&zl(o,a,n),ul(a,a.return);break;case 30:break;default:zl(o,a,n)}t=t.sibling}}function Bl(e,t){var n=null;null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),e=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(e=t.memoizedState.cachePool.pool),e!==n&&(null!=e&&e.refCount++,null!=n&&Ao(n))}function Hl(e,t){e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&Ao(e))}function Ul(e,t,n,r){if(10256&t.subtreeFlags)for(t=t.child;null!==t;)Yl(e,t,n,r),t=t.sibling}function Yl(e,t,n,r){var o=t.flags;switch(t.tag){case 0:case 11:case 15:Ul(e,t,n,r),2048&o&&il(9,t);break;case 1:case 13:default:Ul(e,t,n,r);break;case 3:Ul(e,t,n,r),2048&o&&(e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&Ao(e)));break;case 12:if(2048&o){Ul(e,t,n,r),e=t.stateNode;try{var a=t.memoizedProps,i=a.id,s=a.onPostCommit;"function"===typeof s&&s(i,null===t.alternate?"mount":"update",e.passiveEffectDuration,-0)}catch(l){uu(t,t.return,l)}}else Ul(e,t,n,r);break;case 23:break;case 22:a=t.stateNode,i=t.alternate,null!==t.memoizedState?2&a._visibility?Ul(e,t,n,r):ql(e,t):2&a._visibility?Ul(e,t,n,r):(a._visibility|=2,Wl(e,t,n,r,0!==(10256&t.subtreeFlags))),2048&o&&Bl(i,t);break;case 24:Ul(e,t,n,r),2048&o&&Hl(t.alternate,t)}}function Wl(e,t,n,r,o){for(o=o&&0!==(10256&t.subtreeFlags),t=t.child;null!==t;){var a=e,i=t,s=n,l=r,c=i.flags;switch(i.tag){case 0:case 11:case 15:Wl(a,i,s,l,o),il(8,i);break;case 23:break;case 22:var u=i.stateNode;null!==i.memoizedState?2&u._visibility?Wl(a,i,s,l,o):ql(a,i):(u._visibility|=2,Wl(a,i,s,l,o)),o&&2048&c&&Bl(i.alternate,i);break;case 24:Wl(a,i,s,l,o),o&&2048&c&&Hl(i.alternate,i);break;default:Wl(a,i,s,l,o)}t=t.sibling}}function ql(e,t){if(10256&t.subtreeFlags)for(t=t.child;null!==t;){var n=e,r=t,o=r.flags;switch(r.tag){case 22:ql(n,r),2048&o&&Bl(r.alternate,r);break;case 24:ql(n,r),2048&o&&Hl(r.alternate,r);break;default:ql(n,r)}t=t.sibling}}var Vl=8192;function Ql(e){if(e.subtreeFlags&Vl)for(e=e.child;null!==e;)Kl(e),e=e.sibling}function Kl(e){switch(e.tag){case 26:Ql(e),e.flags&Vl&&null!==e.memoizedState&&function(e,t,n){if(null===Ud)throw Error(i(475));var r=Ud;if("stylesheet"===t.type&&("string"!==typeof n.media||!1!==matchMedia(n.media).matches)&&0===(4&t.state.loading)){if(null===t.instance){var o=Pd(n.href),a=e.querySelector(Td(o));if(a)return null!==(e=a._p)&&"object"===typeof e&&"function"===typeof e.then&&(r.count++,r=Wd.bind(r),e.then(r,r)),t.state.loading|=4,t.instance=a,void qe(a);a=e.ownerDocument||e,n=_d(n),(o=kd.get(o))&&Ld(n,o),qe(a=a.createElement("link"));var s=a;s._p=new Promise((function(e,t){s.onload=e,s.onerror=t})),ed(a,"link",n),t.instance=a}null===r.stylesheets&&(r.stylesheets=new Map),r.stylesheets.set(t,e),(e=t.state.preload)&&0===(3&t.state.loading)&&(r.count++,t=Wd.bind(r),e.addEventListener("load",t),e.addEventListener("error",t))}}(Ml,e.memoizedState,e.memoizedProps);break;case 5:default:Ql(e);break;case 3:case 4:var t=Ml;Ml=Ed(e.stateNode.containerInfo),Ql(e),Ml=t;break;case 22:null===e.memoizedState&&(null!==(t=e.alternate)&&null!==t.memoizedState?(t=Vl,Vl=16777216,Ql(e),Vl=t):Ql(e))}}function $l(e){var t=e.alternate;if(null!==t&&null!==(e=t.child)){t.child=null;do{t=e.sibling,e.sibling=null,e=t}while(null!==e)}}function Gl(e){var t=e.deletions;if(0!==(16&e.flags)){if(null!==t)for(var n=0;n<t.length;n++){var r=t[n];Sl=r,Zl(r,e)}$l(e)}if(10256&e.subtreeFlags)for(e=e.child;null!==e;)Xl(e),e=e.sibling}function Xl(e){switch(e.tag){case 0:case 11:case 15:Gl(e),2048&e.flags&&sl(9,e,e.return);break;case 3:case 12:default:Gl(e);break;case 22:var t=e.stateNode;null!==e.memoizedState&&2&t._visibility&&(null===e.return||13!==e.return.tag)?(t._visibility&=-3,Jl(e)):Gl(e)}}function Jl(e){var t=e.deletions;if(0!==(16&e.flags)){if(null!==t)for(var n=0;n<t.length;n++){var r=t[n];Sl=r,Zl(r,e)}$l(e)}for(e=e.child;null!==e;){switch((t=e).tag){case 0:case 11:case 15:sl(8,t,t.return),Jl(t);break;case 22:2&(n=t.stateNode)._visibility&&(n._visibility&=-3,Jl(t));break;default:Jl(t)}e=e.sibling}}function Zl(e,t){for(;null!==Sl;){var n=Sl;switch(n.tag){case 0:case 11:case 15:sl(8,n,t);break;case 23:case 22:if(null!==n.memoizedState&&null!==n.memoizedState.cachePool){var r=n.memoizedState.cachePool.pool;null!=r&&r.refCount++}break;case 24:Ao(n.memoizedState.cache)}if(null!==(r=n.child))r.return=n,Sl=r;else e:for(n=e;null!==Sl;){var o=(r=Sl).sibling,a=r.return;if(Cl(r),r===n){Sl=null;break e}if(null!==o){o.return=a,Sl=o;break e}Sl=a}}}var ec={getCacheForType:function(e){var t=jo(Mo),n=t.data.get(e);return void 0===n&&(n=e(),t.data.set(e,n)),n}},tc="function"===typeof WeakMap?WeakMap:Map,nc=0,rc=null,oc=null,ac=0,ic=0,sc=null,lc=!1,cc=!1,uc=!1,dc=0,fc=0,pc=0,hc=0,mc=0,vc=0,gc=0,yc=null,bc=null,wc=!1,xc=0,kc=1/0,Sc=null,Ec=null,Cc=0,Nc=null,jc=null,Dc=0,Pc=0,Tc=null,_c=null,Oc=0,Mc=null;function Rc(){if(0!==(2&nc)&&0!==ac)return ac&-ac;if(null!==R.T){return 0!==Fo?Fo:Pu()}return Te()}function Ac(){0===vc&&(vc=0===(536870912&ac)||ao?ke():536870912);var e=os.current;return null!==e&&(e.flags|=32),vc}function Lc(e,t,n){(e!==rc||2!==ic&&9!==ic)&&null===e.cancelPendingCommit||(Yc(e,0),Bc(e,ac,vc,!1)),Ce(e,n),0!==(2&nc)&&e===rc||(e===rc&&(0===(2&nc)&&(hc|=n),4===fc&&Bc(e,ac,vc,!1)),ku(e))}function Ic(e,t,n){if(0!==(6&nc))throw Error(i(327));for(var r=!n&&0===(124&t)&&0===(t&e.expiredLanes)||we(e,t),o=r?function(e,t){var n=nc;nc|=2;var r=qc(),o=Vc();rc!==e||ac!==t?(Sc=null,kc=te()+500,Yc(e,t)):cc=we(e,t);e:for(;;)try{if(0!==ic&&null!==oc){t=oc;var a=sc;t:switch(ic){case 1:ic=0,sc=null,Zc(e,t,a,1);break;case 2:case 9:if(Go(a)){ic=0,sc=null,Jc(t);break}t=function(){2!==ic&&9!==ic||rc!==e||(ic=7),ku(e)},a.then(t,t);break e;case 3:ic=7;break e;case 4:ic=5;break e;case 7:Go(a)?(ic=0,sc=null,Jc(t)):(ic=0,sc=null,Zc(e,t,a,7));break;case 5:var s=null;switch(oc.tag){case 26:s=oc.memoizedState;case 5:case 27:var l=oc;if(!s||Hd(s)){ic=0,sc=null;var c=l.sibling;if(null!==c)oc=c;else{var u=l.return;null!==u?(oc=u,eu(u)):oc=null}break t}}ic=0,sc=null,Zc(e,t,a,5);break;case 6:ic=0,sc=null,Zc(e,t,a,6);break;case 8:Uc(),fc=6;break e;default:throw Error(i(462))}}Gc();break}catch(d){Wc(e,d)}return bo=yo=null,R.H=r,R.A=o,nc=n,null!==oc?0:(rc=null,ac=0,Dr(),fc)}(e,t):Kc(e,t,!0),a=r;;){if(0===o){cc&&!r&&Bc(e,t,0,!1);break}if(n=e.current.alternate,!a||zc(n)){if(2===o){if(a=t,e.errorRecoveryDisabledLanes&a)var s=0;else s=0!==(s=-536870913&e.pendingLanes)?s:536870912&s?536870912:0;if(0!==s){t=s;e:{var l=e;o=yc;var c=l.current.memoizedState.isDehydrated;if(c&&(Yc(l,s).flags|=256),2!==(s=Kc(l,s,!1))){if(uc&&!c){l.errorRecoveryDisabledLanes|=a,hc|=a,o=4;break e}a=bc,bc=o,null!==a&&(null===bc?bc=a:bc.push.apply(bc,a))}o=s}if(a=!1,2!==o)continue}}if(1===o){Yc(e,0),Bc(e,t,0,!0);break}e:{switch(r=e,a=o){case 0:case 1:throw Error(i(345));case 4:if((4194048&t)!==t)break;case 6:Bc(r,t,vc,!lc);break e;case 2:bc=null;break;case 3:case 5:break;default:throw Error(i(329))}if((62914560&t)===t&&10<(o=xc+300-te())){if(Bc(r,t,vc,!lc),0!==be(r,0,!0))break e;r.timeoutHandle=ld(Fc.bind(null,r,n,bc,Sc,wc,t,vc,hc,gc,lc,a,2,-0,0),o)}else Fc(r,n,bc,Sc,wc,t,vc,hc,gc,lc,a,0,-0,0)}break}o=Kc(e,t,!1),a=!1}ku(e)}function Fc(e,t,n,r,o,a,s,l,c,u,d,f,p,h){if(e.timeoutHandle=-1,(8192&(f=t.subtreeFlags)||16785408===(16785408&f))&&(Ud={stylesheets:null,count:0,unsuspend:Yd},Kl(t),null!==(f=function(){if(null===Ud)throw Error(i(475));var e=Ud;return e.stylesheets&&0===e.count&&Vd(e,e.stylesheets),0<e.count?function(t){var n=setTimeout((function(){if(e.stylesheets&&Vd(e,e.stylesheets),e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}}),6e4);return e.unsuspend=t,function(){e.unsuspend=null,clearTimeout(n)}}:null}())))return e.cancelPendingCommit=f(nu.bind(null,e,t,a,n,r,o,s,l,c,d,1,p,h)),void Bc(e,a,s,!u);nu(e,t,a,n,r,o,s,l,c)}function zc(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&(null!==(n=t.updateQueue)&&null!==(n=n.stores)))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!$n(a(),o))return!1}catch(i){return!1}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Bc(e,t,n,r){t&=~mc,t&=~hc,e.suspendedLanes|=t,e.pingedLanes&=~t,r&&(e.warmLanes|=t),r=e.expirationTimes;for(var o=t;0<o;){var a=31-pe(o),i=1<<a;r[a]=-1,o&=~i}0!==n&&Ne(e,n,t)}function Hc(){return 0!==(6&nc)||(Su(0,!1),!1)}function Uc(){if(null!==oc){if(0===ic)var e=oc.return;else bo=yo=null,Fa(e=oc),$i=null,Gi=0,e=oc;for(;null!==e;)al(e.alternate,e),e=e.return;oc=null}}function Yc(e,t){var n=e.timeoutHandle;-1!==n&&(e.timeoutHandle=-1,cd(n)),null!==(n=e.cancelPendingCommit)&&(e.cancelPendingCommit=null,n()),Uc(),rc=e,oc=n=Fr(e.current,null),ac=t,ic=0,sc=null,lc=!1,cc=we(e,t),uc=!1,gc=vc=mc=hc=pc=fc=0,bc=yc=null,wc=!1,0!==(8&t)&&(t|=32&t);var r=e.entangledLanes;if(0!==r)for(e=e.entanglements,r&=t;0<r;){var o=31-pe(r),a=1<<o;t|=e[o],r&=~a}return dc=t,Dr(),n}function Wc(e,t){wa=null,R.H=qi,t===Vo||t===Ko?(t=ea(),ic=3):t===Qo?(t=ea(),ic=4):ic=t===Ns?8:null!==t&&"object"===typeof t&&"function"===typeof t.then?6:1,sc=t,null===oc&&(fc=1,xs(e,Er(t,e.current)))}function qc(){var e=R.H;return R.H=qi,null===e?qi:e}function Vc(){var e=R.A;return R.A=ec,e}function Qc(){fc=4,lc||(4194048&ac)!==ac&&null!==os.current||(cc=!0),0===(134217727&pc)&&0===(134217727&hc)||null===rc||Bc(rc,ac,vc,!1)}function Kc(e,t,n){var r=nc;nc|=2;var o=qc(),a=Vc();rc===e&&ac===t||(Sc=null,Yc(e,t)),t=!1;var i=fc;e:for(;;)try{if(0!==ic&&null!==oc){var s=oc,l=sc;switch(ic){case 8:Uc(),i=6;break e;case 3:case 2:case 9:case 6:null===os.current&&(t=!0);var c=ic;if(ic=0,sc=null,Zc(e,s,l,c),n&&cc){i=0;break e}break;default:c=ic,ic=0,sc=null,Zc(e,s,l,c)}}$c(),i=fc;break}catch(u){Wc(e,u)}return t&&e.shellSuspendCounter++,bo=yo=null,nc=r,R.H=o,R.A=a,null===oc&&(rc=null,ac=0,Dr()),i}function $c(){for(;null!==oc;)Xc(oc)}function Gc(){for(;null!==oc&&!Z();)Xc(oc)}function Xc(e){var t=Xs(e.alternate,e,dc);e.memoizedProps=e.pendingProps,null===t?eu(e):oc=t}function Jc(e){var t=e,n=t.alternate;switch(t.tag){case 15:case 0:t=Ls(n,t,t.pendingProps,t.type,void 0,ac);break;case 11:t=Ls(n,t,t.pendingProps,t.type.render,t.ref,ac);break;case 5:Fa(t);default:al(n,t),t=Xs(n,t=oc=zr(t,dc),dc)}e.memoizedProps=e.pendingProps,null===t?eu(e):oc=t}function Zc(e,t,n,r){bo=yo=null,Fa(t),$i=null,Gi=0;var o=t.return;try{if(function(e,t,n,r,o){if(n.flags|=32768,null!==r&&"object"===typeof r&&"function"===typeof r.then){if(null!==(t=n.alternate)&&Eo(t,n,o,!0),null!==(n=os.current)){switch(n.tag){case 13:return null===as?Qc():null===n.alternate&&0===fc&&(fc=3),n.flags&=-257,n.flags|=65536,n.lanes=o,r===$o?n.flags|=16384:(null===(t=n.updateQueue)?n.updateQueue=new Set([r]):t.add(r),du(e,r,o)),!1;case 22:return n.flags|=65536,r===$o?n.flags|=16384:(null===(t=n.updateQueue)?(t={transitions:null,markerInstances:null,retryQueue:new Set([r])},n.updateQueue=t):null===(n=t.retryQueue)?t.retryQueue=new Set([r]):n.add(r),du(e,r,o)),!1}throw Error(i(435,n.tag))}return du(e,r,o),Qc(),!1}if(ao)return null!==(t=os.current)?(0===(65536&t.flags)&&(t.flags|=256),t.flags|=65536,t.lanes=o,r!==lo&&vo(Er(e=Error(i(422),{cause:r}),n))):(r!==lo&&vo(Er(t=Error(i(423),{cause:r}),n)),(e=e.current.alternate).flags|=65536,o&=-o,e.lanes|=o,r=Er(r,n),la(e,o=Ss(e.stateNode,r,o)),4!==fc&&(fc=2)),!1;var a=Error(i(520),{cause:r});if(a=Er(a,n),null===yc?yc=[a]:yc.push(a),4!==fc&&(fc=2),null===t)return!0;r=Er(r,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=o&-o,n.lanes|=e,la(n,e=Ss(n.stateNode,r,e)),!1;case 1:if(t=n.type,a=n.stateNode,0===(128&n.flags)&&("function"===typeof t.getDerivedStateFromError||null!==a&&"function"===typeof a.componentDidCatch&&(null===Ec||!Ec.has(a))))return n.flags|=65536,o&=-o,n.lanes|=o,Cs(o=Es(o),e,n,r),la(n,o),!1}n=n.return}while(null!==n);return!1}(e,o,t,n,ac))return fc=1,xs(e,Er(n,e.current)),void(oc=null)}catch(a){if(null!==o)throw oc=o,a;return fc=1,xs(e,Er(n,e.current)),void(oc=null)}32768&t.flags?(ao||1===r?e=!0:cc||0!==(536870912&ac)?e=!1:(lc=e=!0,(2===r||9===r||3===r||6===r)&&(null!==(r=os.current)&&13===r.tag&&(r.flags|=16384))),tu(t,e)):eu(t)}function eu(e){var t=e;do{if(0!==(32768&t.flags))return void tu(t,lc);e=t.return;var n=rl(t.alternate,t,dc);if(null!==n)return void(oc=n);if(null!==(t=t.sibling))return void(oc=t);oc=t=e}while(null!==t);0===fc&&(fc=5)}function tu(e,t){do{var n=ol(e.alternate,e);if(null!==n)return n.flags&=32767,void(oc=n);if(null!==(n=e.return)&&(n.flags|=32768,n.subtreeFlags=0,n.deletions=null),!t&&null!==(e=e.sibling))return void(oc=e);oc=e=n}while(null!==e);fc=6,oc=null}function nu(e,t,n,r,o,a,s,l,c){e.cancelPendingCommit=null;do{su()}while(0!==Cc);if(0!==(6&nc))throw Error(i(327));if(null!==t){if(t===e.current)throw Error(i(177));if(a=t.lanes|t.childLanes,function(e,t,n,r,o,a){var i=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,l=e.expirationTimes,c=e.hiddenUpdates;for(n=i&~n;0<n;){var u=31-pe(n),d=1<<u;s[u]=0,l[u]=-1;var f=c[u];if(null!==f)for(c[u]=null,u=0;u<f.length;u++){var p=f[u];null!==p&&(p.lane&=-536870913)}n&=~d}0!==r&&Ne(e,r,0),0!==a&&0===o&&0!==e.tag&&(e.suspendedLanes|=a&~(i&~t))}(e,n,a|=jr,s,l,c),e===rc&&(oc=rc=null,ac=0),jc=t,Nc=e,Dc=n,Pc=a,Tc=o,_c=r,0!==(10256&t.subtreeFlags)||0!==(10256&t.flags)?(e.callbackNode=null,e.callbackPriority=0,X(ae,(function(){return lu(),null}))):(e.callbackNode=null,e.callbackPriority=0),r=0!==(13878&t.flags),0!==(13878&t.subtreeFlags)||r){r=R.T,R.T=null,o=A.p,A.p=2,s=nc,nc|=4;try{!function(e,t){if(e=e.containerInfo,td=nf,tr(e=er(e))){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch(v){n=null;break e}var s=0,l=-1,c=-1,u=0,d=0,f=e,p=null;t:for(;;){for(var h;f!==n||0!==o&&3!==f.nodeType||(l=s+o),f!==a||0!==r&&3!==f.nodeType||(c=s+r),3===f.nodeType&&(s+=f.nodeValue.length),null!==(h=f.firstChild);)p=f,f=h;for(;;){if(f===e)break t;if(p===n&&++u===o&&(l=s),p===a&&++d===r&&(c=s),null!==(h=f.nextSibling))break;p=(f=p).parentNode}f=h}n=-1===l||-1===c?null:{start:l,end:c}}else n=null}n=n||{start:0,end:0}}else n=null;for(nd={focusedElem:e,selectionRange:n},nf=!1,Sl=t;null!==Sl;)if(e=(t=Sl).child,0!==(1024&t.subtreeFlags)&&null!==e)e.return=t,Sl=e;else for(;null!==Sl;){switch(a=(t=Sl).alternate,e=t.flags,t.tag){case 0:case 11:case 15:case 5:case 26:case 27:case 6:case 4:case 17:break;case 1:if(0!==(1024&e)&&null!==a){e=void 0,n=t,o=a.memoizedProps,a=a.memoizedState,r=n.stateNode;try{var m=vs(n.type,o,(n.elementType,n.type));e=r.getSnapshotBeforeUpdate(m,a),r.__reactInternalSnapshotBeforeUpdate=e}catch(g){uu(n,n.return,g)}}break;case 3:if(0!==(1024&e))if(9===(n=(e=t.stateNode.containerInfo).nodeType))md(e);else if(1===n)switch(e.nodeName){case"HEAD":case"HTML":case"BODY":md(e);break;default:e.textContent=""}break;default:if(0!==(1024&e))throw Error(i(163))}if(null!==(e=t.sibling)){e.return=t.return,Sl=e;break}Sl=t.return}}(e,t)}finally{nc=s,A.p=o,R.T=r}}Cc=1,ru(),ou(),au()}}function ru(){if(1===Cc){Cc=0;var e=Nc,t=jc,n=0!==(13878&t.flags);if(0!==(13878&t.subtreeFlags)||n){n=R.T,R.T=null;var r=A.p;A.p=2;var o=nc;nc|=4;try{Rl(t,e);var a=nd,i=er(e.containerInfo),s=a.focusedElem,l=a.selectionRange;if(i!==s&&s&&s.ownerDocument&&Zn(s.ownerDocument.documentElement,s)){if(null!==l&&tr(s)){var c=l.start,u=l.end;if(void 0===u&&(u=c),"selectionStart"in s)s.selectionStart=c,s.selectionEnd=Math.min(u,s.value.length);else{var d=s.ownerDocument||document,f=d&&d.defaultView||window;if(f.getSelection){var p=f.getSelection(),h=s.textContent.length,m=Math.min(l.start,h),v=void 0===l.end?m:Math.min(l.end,h);!p.extend&&m>v&&(i=v,v=m,m=i);var g=Jn(s,m),y=Jn(s,v);if(g&&y&&(1!==p.rangeCount||p.anchorNode!==g.node||p.anchorOffset!==g.offset||p.focusNode!==y.node||p.focusOffset!==y.offset)){var b=d.createRange();b.setStart(g.node,g.offset),p.removeAllRanges(),m>v?(p.addRange(b),p.extend(y.node,y.offset)):(b.setEnd(y.node,y.offset),p.addRange(b))}}}}for(d=[],p=s;p=p.parentNode;)1===p.nodeType&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for("function"===typeof s.focus&&s.focus(),s=0;s<d.length;s++){var w=d[s];w.element.scrollLeft=w.left,w.element.scrollTop=w.top}}nf=!!td,nd=td=null}finally{nc=o,A.p=r,R.T=n}}e.current=t,Cc=2}}function ou(){if(2===Cc){Cc=0;var e=Nc,t=jc,n=0!==(8772&t.flags);if(0!==(8772&t.subtreeFlags)||n){n=R.T,R.T=null;var r=A.p;A.p=2;var o=nc;nc|=4;try{El(e,t.alternate,t)}finally{nc=o,A.p=r,R.T=n}}Cc=3}}function au(){if(4===Cc||3===Cc){Cc=0,ee();var e=Nc,t=jc,n=Dc,r=_c;0!==(10256&t.subtreeFlags)||0!==(10256&t.flags)?Cc=5:(Cc=0,jc=Nc=null,iu(e,e.pendingLanes));var o=e.pendingLanes;if(0===o&&(Ec=null),Pe(n),t=t.stateNode,de&&"function"===typeof de.onCommitFiberRoot)try{de.onCommitFiberRoot(ue,t,void 0,128===(128&t.current.flags))}catch(l){}if(null!==r){t=R.T,o=A.p,A.p=2,R.T=null;try{for(var a=e.onRecoverableError,i=0;i<r.length;i++){var s=r[i];a(s.value,{componentStack:s.stack})}}finally{R.T=t,A.p=o}}0!==(3&Dc)&&su(),ku(e),o=e.pendingLanes,0!==(4194090&n)&&0!==(42&o)?e===Mc?Oc++:(Oc=0,Mc=e):Oc=0,Su(0,!1)}}function iu(e,t){0===(e.pooledCacheLanes&=t)&&(null!=(t=e.pooledCache)&&(e.pooledCache=null,Ao(t)))}function su(e){return ru(),ou(),au(),lu()}function lu(){if(5!==Cc)return!1;var e=Nc,t=Pc;Pc=0;var n=Pe(Dc),r=R.T,o=A.p;try{A.p=32>n?32:n,R.T=null,n=Tc,Tc=null;var a=Nc,s=Dc;if(Cc=0,jc=Nc=null,Dc=0,0!==(6&nc))throw Error(i(331));var l=nc;if(nc|=4,Xl(a.current),Yl(a,a.current,s,n),nc=l,Su(0,!1),de&&"function"===typeof de.onPostCommitFiberRoot)try{de.onPostCommitFiberRoot(ue,a)}catch(c){}return!0}finally{A.p=o,R.T=r,iu(e,t)}}function cu(e,t,n){t=Er(n,t),null!==(e=ia(e,t=Ss(e.stateNode,t,2),2))&&(Ce(e,2),ku(e))}function uu(e,t,n){if(3===e.tag)cu(e,e,n);else for(;null!==t;){if(3===t.tag){cu(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"===typeof t.type.getDerivedStateFromError||"function"===typeof r.componentDidCatch&&(null===Ec||!Ec.has(r))){e=Er(n,e),null!==(r=ia(t,n=Es(2),2))&&(Cs(n,r,t,e),Ce(r,2),ku(r));break}}t=t.return}}function du(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new tc;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(uc=!0,o.add(n),e=fu.bind(null,e,t,n),t.then(e,e))}function fu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,rc===e&&(ac&n)===n&&(4===fc||3===fc&&(62914560&ac)===ac&&300>te()-xc?0===(2&nc)&&Yc(e,0):mc|=n,gc===ac&&(gc=0)),ku(e)}function pu(e,t){0===t&&(t=Se()),null!==(e=_r(e,t))&&(Ce(e,t),ku(e))}function hu(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),pu(e,n)}function mu(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(i(314))}null!==r&&r.delete(t),pu(e,n)}var vu=null,gu=null,yu=!1,bu=!1,wu=!1,xu=0;function ku(e){e!==gu&&null===e.next&&(null===gu?vu=gu=e:gu=gu.next=e),bu=!0,yu||(yu=!0,dd((function(){0!==(6&nc)?X(re,Eu):Cu()})))}function Su(e,t){if(!wu&&bu){wu=!0;do{for(var n=!1,r=vu;null!==r;){if(!t)if(0!==e){var o=r.pendingLanes;if(0===o)var a=0;else{var i=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-pe(42|e)+1)-1,a=201326741&(a&=o&~(i&~s))?201326741&a|1:a?2|a:0}0!==a&&(n=!0,Du(r,a))}else a=ac,0===(3&(a=be(r,r===rc?a:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||we(r,a)||(n=!0,Du(r,a));r=r.next}}while(n);wu=!1}}function Eu(){Cu()}function Cu(){bu=yu=!1;var e=0;0!==xu&&(function(){var e=window.event;if(e&&"popstate"===e.type)return e!==sd&&(sd=e,!0);return sd=null,!1}()&&(e=xu),xu=0);for(var t=te(),n=null,r=vu;null!==r;){var o=r.next,a=Nu(r,t);0===a?(r.next=null,null===n?vu=o:n.next=o,null===o&&(gu=n)):(n=r,(0!==e||0!==(3&a))&&(bu=!0)),r=o}Su(e,!1)}function Nu(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=-62914561&e.pendingLanes;0<a;){var i=31-pe(a),s=1<<i,l=o[i];-1===l?0!==(s&n)&&0===(s&r)||(o[i]=xe(s,t)):l<=t&&(e.expiredLanes|=s),a&=~s}if(n=ac,n=be(e,e===(t=rc)?n:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle),r=e.callbackNode,0===n||e===t&&(2===ic||9===ic)||null!==e.cancelPendingCommit)return null!==r&&null!==r&&J(r),e.callbackNode=null,e.callbackPriority=0;if(0===(3&n)||we(e,n)){if((t=n&-n)===e.callbackPriority)return t;switch(null!==r&&J(r),Pe(n)){case 2:case 8:n=oe;break;case 32:default:n=ae;break;case 268435456:n=se}return r=ju.bind(null,e),n=X(n,r),e.callbackPriority=t,e.callbackNode=n,t}return null!==r&&null!==r&&J(r),e.callbackPriority=2,e.callbackNode=null,2}function ju(e,t){if(0!==Cc&&5!==Cc)return e.callbackNode=null,e.callbackPriority=0,null;var n=e.callbackNode;if(su()&&e.callbackNode!==n)return null;var r=ac;return 0===(r=be(e,e===rc?r:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle))?null:(Ic(e,r,t),Nu(e,te()),null!=e.callbackNode&&e.callbackNode===n?ju.bind(null,e):null)}function Du(e,t){if(su())return null;Ic(e,t,!0)}function Pu(){return 0===xu&&(xu=ke()),xu}function Tu(e){return null==e||"symbol"===typeof e||"boolean"===typeof e?null:"function"===typeof e?e:Pt(""+e)}function _u(e,t){var n=t.ownerDocument.createElement("input");return n.name=t.name,n.value=t.value,e.id&&n.setAttribute("form",e.id),t.parentNode.insertBefore(n,t),e=new FormData(e),n.parentNode.removeChild(n),e}for(var Ou=0;Ou<xr.length;Ou++){var Mu=xr[Ou];kr(Mu.toLowerCase(),"on"+(Mu[0].toUpperCase()+Mu.slice(1)))}kr(pr,"onAnimationEnd"),kr(hr,"onAnimationIteration"),kr(mr,"onAnimationStart"),kr("dblclick","onDoubleClick"),kr("focusin","onFocus"),kr("focusout","onBlur"),kr(vr,"onTransitionRun"),kr(gr,"onTransitionStart"),kr(yr,"onTransitionCancel"),kr(br,"onTransitionEnd"),$e("onMouseEnter",["mouseout","mouseover"]),$e("onMouseLeave",["mouseout","mouseover"]),$e("onPointerEnter",["pointerout","pointerover"]),$e("onPointerLeave",["pointerout","pointerover"]),Ke("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),Ke("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),Ke("onBeforeInput",["compositionend","keypress","textInput","paste"]),Ke("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),Ke("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),Ke("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ru="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Au=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(Ru));function Lu(e,t){t=0!==(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var i=r.length-1;0<=i;i--){var s=r[i],l=s.instance,c=s.currentTarget;if(s=s.listener,l!==a&&o.isPropagationStopped())break e;a=s,o.currentTarget=c;try{a(o)}catch(u){gs(u)}o.currentTarget=null,a=l}else for(i=0;i<r.length;i++){if(l=(s=r[i]).instance,c=s.currentTarget,s=s.listener,l!==a&&o.isPropagationStopped())break e;a=s,o.currentTarget=c;try{a(o)}catch(u){gs(u)}o.currentTarget=null,a=l}}}}function Iu(e,t){var n=t[Ae];void 0===n&&(n=t[Ae]=new Set);var r=e+"__bubble";n.has(r)||(Hu(t,e,2,!1),n.add(r))}function Fu(e,t,n){var r=0;t&&(r|=4),Hu(n,e,r,t)}var zu="_reactListening"+Math.random().toString(36).slice(2);function Bu(e){if(!e[zu]){e[zu]=!0,Ve.forEach((function(t){"selectionchange"!==t&&(Au.has(t)||Fu(t,!1,e),Fu(t,!0,e))}));var t=9===e.nodeType?e:e.ownerDocument;null===t||t[zu]||(t[zu]=!0,Fu("selectionchange",!1,t))}}function Hu(e,t,n,r){switch(uf(t)){case 2:var o=rf;break;case 8:o=of;break;default:o=af}n=o.bind(null,t,n,e),o=void 0,!zt||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Uu(e,t,n,r,o){var a=r;if(0===(1&t)&&0===(2&t)&&null!==r)e:for(;;){if(null===r)return;var i=r.tag;if(3===i||4===i){var s=r.stateNode.containerInfo;if(s===o)break;if(4===i)for(i=r.return;null!==i;){var c=i.tag;if((3===c||4===c)&&i.stateNode.containerInfo===o)return;i=i.return}for(;null!==s;){if(null===(i=He(s)))return;if(5===(c=i.tag)||6===c||26===c||27===c){r=a=i;continue e}s=s.parentNode}}r=r.return}Lt((function(){var r=a,o=_t(n),i=[];e:{var s=wr.get(e);if(void 0!==s){var c=Zt,u=e;switch(e){case"keypress":if(0===qt(n))break e;case"keydown":case"keyup":c=mn;break;case"focusin":u="focus",c=an;break;case"focusout":u="blur",c=an;break;case"beforeblur":case"afterblur":c=an;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":c=rn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":c=on;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":c=gn;break;case pr:case hr:case mr:c=sn;break;case br:c=yn;break;case"scroll":case"scrollend":c=tn;break;case"wheel":c=bn;break;case"copy":case"cut":case"paste":c=ln;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":c=vn;break;case"toggle":case"beforetoggle":c=wn}var d=0!==(4&t),f=!d&&("scroll"===e||"scrollend"===e),p=d?null!==s?s+"Capture":null:s;d=[];for(var h,m=r;null!==m;){var v=m;if(h=v.stateNode,5!==(v=v.tag)&&26!==v&&27!==v||null===h||null===p||null!=(v=It(m,p))&&d.push(Yu(m,v,h)),f)break;m=m.return}0<d.length&&(s=new c(s,u,null,n,o),i.push({event:s,listeners:d}))}}if(0===(7&t)){if(c="mouseout"===e||"pointerout"===e,(!(s="mouseover"===e||"pointerover"===e)||n===Tt||!(u=n.relatedTarget||n.fromElement)||!He(u)&&!u[Re])&&(c||s)&&(s=o.window===o?o:(s=o.ownerDocument)?s.defaultView||s.parentWindow:window,c?(c=r,null!==(u=(u=n.relatedTarget||n.toElement)?He(u):null)&&(f=l(u),d=u.tag,u!==f||5!==d&&27!==d&&6!==d)&&(u=null)):(c=null,u=r),c!==u)){if(d=rn,v="onMouseLeave",p="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(d=vn,v="onPointerLeave",p="onPointerEnter",m="pointer"),f=null==c?s:Ye(c),h=null==u?s:Ye(u),(s=new d(v,m+"leave",c,n,o)).target=f,s.relatedTarget=h,v=null,He(o)===r&&((d=new d(p,m+"enter",u,n,o)).target=h,d.relatedTarget=f,v=d),f=v,c&&u)e:{for(p=u,m=0,h=d=c;h;h=qu(h))m++;for(h=0,v=p;v;v=qu(v))h++;for(;0<m-h;)d=qu(d),m--;for(;0<h-m;)p=qu(p),h--;for(;m--;){if(d===p||null!==p&&d===p.alternate)break e;d=qu(d),p=qu(p)}d=null}else d=null;null!==c&&Vu(i,s,c,d,!1),null!==u&&null!==f&&Vu(i,f,u,d,!0)}if("select"===(c=(s=r?Ye(r):window).nodeName&&s.nodeName.toLowerCase())||"input"===c&&"file"===s.type)var g=Fn;else if(On(s))if(zn)g=Kn;else{g=Vn;var y=qn}else!(c=s.nodeName)||"input"!==c.toLowerCase()||"checkbox"!==s.type&&"radio"!==s.type?r&&Nt(r.elementType)&&(g=Fn):g=Qn;switch(g&&(g=g(e,r))?Mn(i,g,n,o):(y&&y(e,s,r),"focusout"===e&&r&&"number"===s.type&&null!=r.memoizedProps.value&&yt(s,"number",s.value)),y=r?Ye(r):window,e){case"focusin":(On(y)||"true"===y.contentEditable)&&(rr=y,or=r,ar=null);break;case"focusout":ar=or=rr=null;break;case"mousedown":ir=!0;break;case"contextmenu":case"mouseup":case"dragend":ir=!1,sr(i,n,o);break;case"selectionchange":if(nr)break;case"keydown":case"keyup":sr(i,n,o)}var b;if(kn)e:{switch(e){case"compositionstart":var w="onCompositionStart";break e;case"compositionend":w="onCompositionEnd";break e;case"compositionupdate":w="onCompositionUpdate";break e}w=void 0}else Tn?Dn(e,n)&&(w="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(w="onCompositionStart");w&&(Cn&&"ko"!==n.locale&&(Tn||"onCompositionStart"!==w?"onCompositionEnd"===w&&Tn&&(b=Wt()):(Ut="value"in(Ht=o)?Ht.value:Ht.textContent,Tn=!0)),0<(y=Wu(r,w)).length&&(w=new cn(w,e,null,n,o),i.push({event:w,listeners:y}),b?w.data=b:null!==(b=Pn(n))&&(w.data=b))),(b=En?function(e,t){switch(e){case"compositionend":return Pn(t);case"keypress":return 32!==t.which?null:(jn=!0,Nn);case"textInput":return(e=t.data)===Nn&&jn?null:e;default:return null}}(e,n):function(e,t){if(Tn)return"compositionend"===e||!kn&&Dn(e,t)?(e=Wt(),Yt=Ut=Ht=null,Tn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Cn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(w=Wu(r,"onBeforeInput")).length&&(y=new cn("onBeforeInput","beforeinput",null,n,o),i.push({event:y,listeners:w}),y.data=b)),function(e,t,n,r,o){if("submit"===t&&n&&n.stateNode===o){var a=Tu((o[Me]||null).action),i=r.submitter;i&&null!==(t=(t=i[Me]||null)?Tu(t.formAction):i.getAttribute("formAction"))&&(a=t,i=null);var s=new Zt("action","action",null,r,o);e.push({event:s,listeners:[{instance:null,listener:function(){if(r.defaultPrevented){if(0!==xu){var e=i?_u(o,i):new FormData(o);_i(n,{pending:!0,data:e,method:o.method,action:a},null,e)}}else"function"===typeof a&&(s.preventDefault(),e=i?_u(o,i):new FormData(o),_i(n,{pending:!0,data:e,method:o.method,action:a},a,e))},currentTarget:o}]})}}(i,e,r,n,o)}Lu(i,t)}))}function Yu(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Wu(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;if(5!==(o=o.tag)&&26!==o&&27!==o||null===a||(null!=(o=It(e,n))&&r.unshift(Yu(e,o,a)),null!=(o=It(e,t))&&r.push(Yu(e,o,a))),3===e.tag)return r;e=e.return}return[]}function qu(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag&&27!==e.tag);return e||null}function Vu(e,t,n,r,o){for(var a=t._reactName,i=[];null!==n&&n!==r;){var s=n,l=s.alternate,c=s.stateNode;if(s=s.tag,null!==l&&l===r)break;5!==s&&26!==s&&27!==s||null===c||(l=c,o?null!=(c=It(n,a))&&i.unshift(Yu(n,c,l)):o||null!=(c=It(n,a))&&i.push(Yu(n,c,l))),n=n.return}0!==i.length&&e.push({event:t,listeners:i})}var Qu=/\r\n?/g,Ku=/\u0000|\uFFFD/g;function $u(e){return("string"===typeof e?e:""+e).replace(Qu,"\n").replace(Ku,"")}function Gu(e,t){return t=$u(t),$u(e)===t}function Xu(){}function Ju(e,t,n,r,o,a){switch(n){case"children":"string"===typeof r?"body"===t||"textarea"===t&&""===r||kt(e,r):("number"===typeof r||"bigint"===typeof r)&&"body"!==t&&kt(e,""+r);break;case"className":nt(e,"class",r);break;case"tabIndex":nt(e,"tabindex",r);break;case"dir":case"role":case"viewBox":case"width":case"height":nt(e,n,r);break;case"style":Ct(e,r,a);break;case"data":if("object"!==t){nt(e,"data",r);break}case"src":case"href":if(""===r&&("a"!==t||"href"!==n)){e.removeAttribute(n);break}if(null==r||"function"===typeof r||"symbol"===typeof r||"boolean"===typeof r){e.removeAttribute(n);break}r=Pt(""+r),e.setAttribute(n,r);break;case"action":case"formAction":if("function"===typeof r){e.setAttribute(n,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}if("function"===typeof a&&("formAction"===n?("input"!==t&&Ju(e,t,"name",o.name,o,null),Ju(e,t,"formEncType",o.formEncType,o,null),Ju(e,t,"formMethod",o.formMethod,o,null),Ju(e,t,"formTarget",o.formTarget,o,null)):(Ju(e,t,"encType",o.encType,o,null),Ju(e,t,"method",o.method,o,null),Ju(e,t,"target",o.target,o,null))),null==r||"symbol"===typeof r||"boolean"===typeof r){e.removeAttribute(n);break}r=Pt(""+r),e.setAttribute(n,r);break;case"onClick":null!=r&&(e.onclick=Xu);break;case"onScroll":null!=r&&Iu("scroll",e);break;case"onScrollEnd":null!=r&&Iu("scrollend",e);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!==typeof r||!("__html"in r))throw Error(i(61));if(null!=(n=r.__html)){if(null!=o.children)throw Error(i(60));e.innerHTML=n}}break;case"multiple":e.multiple=r&&"function"!==typeof r&&"symbol"!==typeof r;break;case"muted":e.muted=r&&"function"!==typeof r&&"symbol"!==typeof r;break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":case"autoFocus":break;case"xlinkHref":if(null==r||"function"===typeof r||"boolean"===typeof r||"symbol"===typeof r){e.removeAttribute("xlink:href");break}n=Pt(""+r),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",n);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":null!=r&&"function"!==typeof r&&"symbol"!==typeof r?e.setAttribute(n,""+r):e.removeAttribute(n);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":r&&"function"!==typeof r&&"symbol"!==typeof r?e.setAttribute(n,""):e.removeAttribute(n);break;case"capture":case"download":!0===r?e.setAttribute(n,""):!1!==r&&null!=r&&"function"!==typeof r&&"symbol"!==typeof r?e.setAttribute(n,r):e.removeAttribute(n);break;case"cols":case"rows":case"size":case"span":null!=r&&"function"!==typeof r&&"symbol"!==typeof r&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case"rowSpan":case"start":null==r||"function"===typeof r||"symbol"===typeof r||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case"popover":Iu("beforetoggle",e),Iu("toggle",e),tt(e,"popover",r);break;case"xlinkActuate":rt(e,"http://www.w3.org/1999/xlink","xlink:actuate",r);break;case"xlinkArcrole":rt(e,"http://www.w3.org/1999/xlink","xlink:arcrole",r);break;case"xlinkRole":rt(e,"http://www.w3.org/1999/xlink","xlink:role",r);break;case"xlinkShow":rt(e,"http://www.w3.org/1999/xlink","xlink:show",r);break;case"xlinkTitle":rt(e,"http://www.w3.org/1999/xlink","xlink:title",r);break;case"xlinkType":rt(e,"http://www.w3.org/1999/xlink","xlink:type",r);break;case"xmlBase":rt(e,"http://www.w3.org/XML/1998/namespace","xml:base",r);break;case"xmlLang":rt(e,"http://www.w3.org/XML/1998/namespace","xml:lang",r);break;case"xmlSpace":rt(e,"http://www.w3.org/XML/1998/namespace","xml:space",r);break;case"is":tt(e,"is",r);break;case"innerText":case"textContent":break;default:(!(2<n.length)||"o"!==n[0]&&"O"!==n[0]||"n"!==n[1]&&"N"!==n[1])&&tt(e,n=jt.get(n)||n,r)}}function Zu(e,t,n,r,o,a){switch(n){case"style":Ct(e,r,a);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!==typeof r||!("__html"in r))throw Error(i(61));if(null!=(n=r.__html)){if(null!=o.children)throw Error(i(60));e.innerHTML=n}}break;case"children":"string"===typeof r?kt(e,r):("number"===typeof r||"bigint"===typeof r)&&kt(e,""+r);break;case"onScroll":null!=r&&Iu("scroll",e);break;case"onScrollEnd":null!=r&&Iu("scrollend",e);break;case"onClick":null!=r&&(e.onclick=Xu);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":case"innerText":case"textContent":break;default:Qe.hasOwnProperty(n)||("o"!==n[0]||"n"!==n[1]||(o=n.endsWith("Capture"),t=n.slice(2,o?n.length-7:void 0),"function"===typeof(a=null!=(a=e[Me]||null)?a[n]:null)&&e.removeEventListener(t,a,o),"function"!==typeof r)?n in e?e[n]=r:!0===r?e.setAttribute(n,""):tt(e,n,r):("function"!==typeof a&&null!==a&&(n in e?e[n]=null:e.hasAttribute(n)&&e.removeAttribute(n)),e.addEventListener(t,r,o)))}}function ed(e,t,n){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":Iu("error",e),Iu("load",e);var r,o=!1,a=!1;for(r in n)if(n.hasOwnProperty(r)){var s=n[r];if(null!=s)switch(r){case"src":o=!0;break;case"srcSet":a=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(i(137,t));default:Ju(e,t,r,s,n,null)}}return a&&Ju(e,t,"srcSet",n.srcSet,n,null),void(o&&Ju(e,t,"src",n.src,n,null));case"input":Iu("invalid",e);var l=r=s=a=null,c=null,u=null;for(o in n)if(n.hasOwnProperty(o)){var d=n[o];if(null!=d)switch(o){case"name":a=d;break;case"type":s=d;break;case"checked":c=d;break;case"defaultChecked":u=d;break;case"value":r=d;break;case"defaultValue":l=d;break;case"children":case"dangerouslySetInnerHTML":if(null!=d)throw Error(i(137,t));break;default:Ju(e,t,o,d,n,null)}}return gt(e,r,l,c,u,s,a,!1),void dt(e);case"select":for(a in Iu("invalid",e),o=s=r=null,n)if(n.hasOwnProperty(a)&&null!=(l=n[a]))switch(a){case"value":r=l;break;case"defaultValue":s=l;break;case"multiple":o=l;default:Ju(e,t,a,l,n,null)}return t=r,n=s,e.multiple=!!o,void(null!=t?bt(e,!!o,t,!1):null!=n&&bt(e,!!o,n,!0));case"textarea":for(s in Iu("invalid",e),r=a=o=null,n)if(n.hasOwnProperty(s)&&null!=(l=n[s]))switch(s){case"value":o=l;break;case"defaultValue":a=l;break;case"children":r=l;break;case"dangerouslySetInnerHTML":if(null!=l)throw Error(i(91));break;default:Ju(e,t,s,l,n,null)}return xt(e,o,a,r),void dt(e);case"option":for(c in n)if(n.hasOwnProperty(c)&&null!=(o=n[c]))if("selected"===c)e.selected=o&&"function"!==typeof o&&"symbol"!==typeof o;else Ju(e,t,c,o,n,null);return;case"dialog":Iu("beforetoggle",e),Iu("toggle",e),Iu("cancel",e),Iu("close",e);break;case"iframe":case"object":Iu("load",e);break;case"video":case"audio":for(o=0;o<Ru.length;o++)Iu(Ru[o],e);break;case"image":Iu("error",e),Iu("load",e);break;case"details":Iu("toggle",e);break;case"embed":case"source":case"link":Iu("error",e),Iu("load",e);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(u in n)if(n.hasOwnProperty(u)&&null!=(o=n[u]))switch(u){case"children":case"dangerouslySetInnerHTML":throw Error(i(137,t));default:Ju(e,t,u,o,n,null)}return;default:if(Nt(t)){for(d in n)n.hasOwnProperty(d)&&(void 0!==(o=n[d])&&Zu(e,t,d,o,n,void 0));return}}for(l in n)n.hasOwnProperty(l)&&(null!=(o=n[l])&&Ju(e,t,l,o,n,null))}var td=null,nd=null;function rd(e){return 9===e.nodeType?e:e.ownerDocument}function od(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function ad(e,t){if(0===e)switch(t){case"svg":return 1;case"math":return 2;default:return 0}return 1===e&&"foreignObject"===t?0:e}function id(e,t){return"textarea"===e||"noscript"===e||"string"===typeof t.children||"number"===typeof t.children||"bigint"===typeof t.children||"object"===typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var sd=null;var ld="function"===typeof setTimeout?setTimeout:void 0,cd="function"===typeof clearTimeout?clearTimeout:void 0,ud="function"===typeof Promise?Promise:void 0,dd="function"===typeof queueMicrotask?queueMicrotask:"undefined"!==typeof ud?function(e){return ud.resolve(null).then(e).catch(fd)}:ld;function fd(e){setTimeout((function(){throw e}))}function pd(e){return"head"===e}function hd(e,t){var n=t,r=0,o=0;do{var a=n.nextSibling;if(e.removeChild(n),a&&8===a.nodeType)if("/$"===(n=a.data)){if(0<r&&8>r){n=r;var i=e.ownerDocument;if(1&n&&xd(i.documentElement),2&n&&xd(i.body),4&n)for(xd(n=i.head),i=n.firstChild;i;){var s=i.nextSibling,l=i.nodeName;i[ze]||"SCRIPT"===l||"STYLE"===l||"LINK"===l&&"stylesheet"===i.rel.toLowerCase()||n.removeChild(i),i=s}}if(0===o)return e.removeChild(a),void Df(t);o--}else"$"===n||"$?"===n||"$!"===n?o++:r=n.charCodeAt(0)-48;else r=0;n=a}while(n);Df(t)}function md(e){var t=e.firstChild;for(t&&10===t.nodeType&&(t=t.nextSibling);t;){var n=t;switch(t=t.nextSibling,n.nodeName){case"HTML":case"HEAD":case"BODY":md(n),Be(n);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if("stylesheet"===n.rel.toLowerCase())continue}e.removeChild(n)}}function vd(e){return"$!"===e.data||"$?"===e.data&&"complete"===e.ownerDocument.readyState}function gd(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t||"F!"===t||"F"===t)break;if("/$"===t)return null}}return e}var yd=null;function bd(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}function wd(e,t,n){switch(t=rd(n),e){case"html":if(!(e=t.documentElement))throw Error(i(452));return e;case"head":if(!(e=t.head))throw Error(i(453));return e;case"body":if(!(e=t.body))throw Error(i(454));return e;default:throw Error(i(451))}}function xd(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);Be(e)}var kd=new Map,Sd=new Set;function Ed(e){return"function"===typeof e.getRootNode?e.getRootNode():9===e.nodeType?e:e.ownerDocument}var Cd=A.d;A.d={f:function(){var e=Cd.f(),t=Hc();return e||t},r:function(e){var t=Ue(e);null!==t&&5===t.tag&&"form"===t.type?Mi(t):Cd.r(e)},D:function(e){Cd.D(e),jd("dns-prefetch",e,null)},C:function(e,t){Cd.C(e,t),jd("preconnect",e,t)},L:function(e,t,n){Cd.L(e,t,n);var r=Nd;if(r&&e&&t){var o='link[rel="preload"][as="'+mt(t)+'"]';"image"===t&&n&&n.imageSrcSet?(o+='[imagesrcset="'+mt(n.imageSrcSet)+'"]',"string"===typeof n.imageSizes&&(o+='[imagesizes="'+mt(n.imageSizes)+'"]')):o+='[href="'+mt(e)+'"]';var a=o;switch(t){case"style":a=Pd(e);break;case"script":a=Od(e)}kd.has(a)||(e=f({rel:"preload",href:"image"===t&&n&&n.imageSrcSet?void 0:e,as:t},n),kd.set(a,e),null!==r.querySelector(o)||"style"===t&&r.querySelector(Td(a))||"script"===t&&r.querySelector(Md(a))||(ed(t=r.createElement("link"),"link",e),qe(t),r.head.appendChild(t)))}},m:function(e,t){Cd.m(e,t);var n=Nd;if(n&&e){var r=t&&"string"===typeof t.as?t.as:"script",o='link[rel="modulepreload"][as="'+mt(r)+'"][href="'+mt(e)+'"]',a=o;switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":a=Od(e)}if(!kd.has(a)&&(e=f({rel:"modulepreload",href:e},t),kd.set(a,e),null===n.querySelector(o))){switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(Md(a)))return}ed(r=n.createElement("link"),"link",e),qe(r),n.head.appendChild(r)}}},X:function(e,t){Cd.X(e,t);var n=Nd;if(n&&e){var r=We(n).hoistableScripts,o=Od(e),a=r.get(o);a||((a=n.querySelector(Md(o)))||(e=f({src:e,async:!0},t),(t=kd.get(o))&&Id(e,t),qe(a=n.createElement("script")),ed(a,"link",e),n.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},r.set(o,a))}},S:function(e,t,n){Cd.S(e,t,n);var r=Nd;if(r&&e){var o=We(r).hoistableStyles,a=Pd(e);t=t||"default";var i=o.get(a);if(!i){var s={loading:0,preload:null};if(i=r.querySelector(Td(a)))s.loading=5;else{e=f({rel:"stylesheet",href:e,"data-precedence":t},n),(n=kd.get(a))&&Ld(e,n);var l=i=r.createElement("link");qe(l),ed(l,"link",e),l._p=new Promise((function(e,t){l.onload=e,l.onerror=t})),l.addEventListener("load",(function(){s.loading|=1})),l.addEventListener("error",(function(){s.loading|=2})),s.loading|=4,Ad(i,t,r)}i={type:"stylesheet",instance:i,count:1,state:s},o.set(a,i)}}},M:function(e,t){Cd.M(e,t);var n=Nd;if(n&&e){var r=We(n).hoistableScripts,o=Od(e),a=r.get(o);a||((a=n.querySelector(Md(o)))||(e=f({src:e,async:!0,type:"module"},t),(t=kd.get(o))&&Id(e,t),qe(a=n.createElement("script")),ed(a,"link",e),n.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},r.set(o,a))}}};var Nd="undefined"===typeof document?null:document;function jd(e,t,n){var r=Nd;if(r&&"string"===typeof t&&t){var o=mt(t);o='link[rel="'+e+'"][href="'+o+'"]',"string"===typeof n&&(o+='[crossorigin="'+n+'"]'),Sd.has(o)||(Sd.add(o),e={rel:e,crossOrigin:n,href:t},null===r.querySelector(o)&&(ed(t=r.createElement("link"),"link",e),qe(t),r.head.appendChild(t)))}}function Dd(e,t,n,r){var o,a,s,l,c=(c=W.current)?Ed(c):null;if(!c)throw Error(i(446));switch(e){case"meta":case"title":return null;case"style":return"string"===typeof n.precedence&&"string"===typeof n.href?(t=Pd(n.href),(r=(n=We(c).hoistableStyles).get(t))||(r={type:"style",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if("stylesheet"===n.rel&&"string"===typeof n.href&&"string"===typeof n.precedence){e=Pd(n.href);var u=We(c).hoistableStyles,d=u.get(e);if(d||(c=c.ownerDocument||c,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,d),(u=c.querySelector(Td(e)))&&!u._p&&(d.instance=u,d.state.loading=5),kd.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},kd.set(e,n),u||(o=c,a=e,s=n,l=d.state,o.querySelector('link[rel="preload"][as="style"]['+a+"]")?l.loading=1:(a=o.createElement("link"),l.preload=a,a.addEventListener("load",(function(){return l.loading|=1})),a.addEventListener("error",(function(){return l.loading|=2})),ed(a,"link",s),qe(a),o.head.appendChild(a))))),t&&null===r)throw Error(i(528,""));return d}if(t&&null!==r)throw Error(i(529,""));return null;case"script":return t=n.async,"string"===typeof(n=n.src)&&t&&"function"!==typeof t&&"symbol"!==typeof t?(t=Od(n),(r=(n=We(c).hoistableScripts).get(t))||(r={type:"script",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(i(444,e))}}function Pd(e){return'href="'+mt(e)+'"'}function Td(e){return'link[rel="stylesheet"]['+e+"]"}function _d(e){return f({},e,{"data-precedence":e.precedence,precedence:null})}function Od(e){return'[src="'+mt(e)+'"]'}function Md(e){return"script[async]"+e}function Rd(e,t,n){if(t.count++,null===t.instance)switch(t.type){case"style":var r=e.querySelector('style[data-href~="'+mt(n.href)+'"]');if(r)return t.instance=r,qe(r),r;var o=f({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return qe(r=(e.ownerDocument||e).createElement("style")),ed(r,"style",o),Ad(r,n.precedence,e),t.instance=r;case"stylesheet":o=Pd(n.href);var a=e.querySelector(Td(o));if(a)return t.state.loading|=4,t.instance=a,qe(a),a;r=_d(n),(o=kd.get(o))&&Ld(r,o),qe(a=(e.ownerDocument||e).createElement("link"));var s=a;return s._p=new Promise((function(e,t){s.onload=e,s.onerror=t})),ed(a,"link",r),t.state.loading|=4,Ad(a,n.precedence,e),t.instance=a;case"script":return a=Od(n.src),(o=e.querySelector(Md(a)))?(t.instance=o,qe(o),o):(r=n,(o=kd.get(a))&&Id(r=f({},n),o),qe(o=(e=e.ownerDocument||e).createElement("script")),ed(o,"link",r),e.head.appendChild(o),t.instance=o);case"void":return null;default:throw Error(i(443,t.type))}else"stylesheet"===t.type&&0===(4&t.state.loading)&&(r=t.instance,t.state.loading|=4,Ad(r,n.precedence,e));return t.instance}function Ad(e,t,n){for(var r=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),o=r.length?r[r.length-1]:null,a=o,i=0;i<r.length;i++){var s=r[i];if(s.dataset.precedence===t)a=s;else if(a!==o)break}a?a.parentNode.insertBefore(e,a.nextSibling):(t=9===n.nodeType?n.head:n).insertBefore(e,t.firstChild)}function Ld(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.title&&(e.title=t.title)}function Id(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.integrity&&(e.integrity=t.integrity)}var Fd=null;function zd(e,t,n){if(null===Fd){var r=new Map,o=Fd=new Map;o.set(n,r)}else(r=(o=Fd).get(n))||(r=new Map,o.set(n,r));if(r.has(e))return r;for(r.set(e,null),n=n.getElementsByTagName(e),o=0;o<n.length;o++){var a=n[o];if(!(a[ze]||a[Oe]||"link"===e&&"stylesheet"===a.getAttribute("rel"))&&"http://www.w3.org/2000/svg"!==a.namespaceURI){var i=a.getAttribute(t)||"";i=e+i;var s=r.get(i);s?s.push(a):r.set(i,[a])}}return r}function Bd(e,t,n){(e=e.ownerDocument||e).head.insertBefore(n,"title"===t?e.querySelector("head > title"):null)}function Hd(e){return"stylesheet"!==e.type||0!==(3&e.state.loading)}var Ud=null;function Yd(){}function Wd(){if(this.count--,0===this.count)if(this.stylesheets)Vd(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}var qd=null;function Vd(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,qd=new Map,t.forEach(Qd,e),qd=null,Wd.call(e))}function Qd(e,t){if(!(4&t.state.loading)){var n=qd.get(e);if(n)var r=n.get(null);else{n=new Map,qd.set(e,n);for(var o=e.querySelectorAll("link[data-precedence],style[data-precedence]"),a=0;a<o.length;a++){var i=o[a];"LINK"!==i.nodeName&&"not all"===i.getAttribute("media")||(n.set(i.dataset.precedence,i),r=i)}r&&n.set(null,r)}i=(o=t.instance).getAttribute("data-precedence"),(a=n.get(i)||r)===r&&n.set(null,o),n.set(i,o),this.count++,r=Wd.bind(this),o.addEventListener("load",r),o.addEventListener("error",r),a?a.parentNode.insertBefore(o,a.nextSibling):(e=9===e.nodeType?e.head:e).insertBefore(o,e.firstChild),t.state.loading|=4}}var Kd={$$typeof:x,Provider:null,Consumer:null,_currentValue:L,_currentValue2:L,_threadCount:0};function $d(e,t,n,r,o,a,i,s){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=Ee(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ee(0),this.hiddenUpdates=Ee(null),this.identifierPrefix=r,this.onUncaughtError=o,this.onCaughtError=a,this.onRecoverableError=i,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=s,this.incompleteTransitions=new Map}function Gd(e,t,n,r,o,a,i,s,l,c,u,d){return e=new $d(e,t,n,i,s,l,c,d),t=1,!0===a&&(t|=24),a=Lr(3,null,null,t),e.current=a,a.stateNode=e,(t=Ro()).refCount++,e.pooledCache=t,t.refCount++,a.memoizedState={element:r,isDehydrated:n,cache:t},ra(a),e}function Xd(e){return e?e=Rr:Rr}function Jd(e,t,n,r,o,a){o=Xd(o),null===r.context?r.context=o:r.pendingContext=o,(r=aa(t)).payload={element:n},null!==(a=void 0===a?null:a)&&(r.callback=a),null!==(n=ia(e,r,t))&&(Lc(n,0,t),sa(n,e,t))}function Zd(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function ef(e,t){Zd(e,t),(e=e.alternate)&&Zd(e,t)}function tf(e){if(13===e.tag){var t=_r(e,67108864);null!==t&&Lc(t,0,67108864),ef(e,67108864)}}var nf=!0;function rf(e,t,n,r){var o=R.T;R.T=null;var a=A.p;try{A.p=2,af(e,t,n,r)}finally{A.p=a,R.T=o}}function of(e,t,n,r){var o=R.T;R.T=null;var a=A.p;try{A.p=8,af(e,t,n,r)}finally{A.p=a,R.T=o}}function af(e,t,n,r){if(nf){var o=sf(r);if(null===o)Uu(e,t,r,lf,n),bf(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return ff=wf(ff,e,t,n,r,o),!0;case"dragenter":return pf=wf(pf,e,t,n,r,o),!0;case"mouseover":return hf=wf(hf,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return mf.set(a,wf(mf.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,vf.set(a,wf(vf.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(bf(e,r),4&t&&-1<yf.indexOf(e)){for(;null!==o;){var a=Ue(o);if(null!==a)switch(a.tag){case 3:if((a=a.stateNode).current.memoizedState.isDehydrated){var i=ye(a.pendingLanes);if(0!==i){var s=a;for(s.pendingLanes|=2,s.entangledLanes|=2;i;){var l=1<<31-pe(i);s.entanglements[1]|=l,i&=~l}ku(a),0===(6&nc)&&(kc=te()+500,Su(0,!1))}}break;case 13:null!==(s=_r(a,2))&&Lc(s,0,2),Hc(),ef(a,2)}if(null===(a=sf(r))&&Uu(e,t,r,lf,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Uu(e,t,r,null,n)}}function sf(e){return cf(e=_t(e))}var lf=null;function cf(e){if(lf=null,null!==(e=He(e))){var t=l(e);if(null===t)e=null;else{var n=t.tag;if(13===n){if(null!==(e=c(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return lf=e,null}function uf(e){switch(e){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(ne()){case re:return 2;case oe:return 8;case ae:case ie:return 32;case se:return 268435456;default:return 32}default:return 32}}var df=!1,ff=null,pf=null,hf=null,mf=new Map,vf=new Map,gf=[],yf="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function bf(e,t){switch(e){case"focusin":case"focusout":ff=null;break;case"dragenter":case"dragleave":pf=null;break;case"mouseover":case"mouseout":hf=null;break;case"pointerover":case"pointerout":mf.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":vf.delete(t.pointerId)}}function wf(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=Ue(t))&&tf(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function xf(e){var t=He(e.target);if(null!==t){var n=l(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=c(n)))return e.blockedOn=t,void function(e,t){var n=A.p;try{return A.p=e,t()}finally{A.p=n}}(e.priority,(function(){if(13===n.tag){var e=Rc();e=De(e);var t=_r(n,e);null!==t&&Lc(t,0,e),ef(n,e)}}))}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function kf(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=sf(e.nativeEvent);if(null!==n)return null!==(t=Ue(n))&&tf(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);Tt=r,n.target.dispatchEvent(r),Tt=null,t.shift()}return!0}function Sf(e,t,n){kf(e)&&n.delete(t)}function Ef(){df=!1,null!==ff&&kf(ff)&&(ff=null),null!==pf&&kf(pf)&&(pf=null),null!==hf&&kf(hf)&&(hf=null),mf.forEach(Sf),vf.forEach(Sf)}function Cf(e,t){e.blockedOn===t&&(e.blockedOn=null,df||(df=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Ef)))}var Nf=null;function jf(e){Nf!==e&&(Nf=e,r.unstable_scheduleCallback(r.unstable_NormalPriority,(function(){Nf===e&&(Nf=null);for(var t=0;t<e.length;t+=3){var n=e[t],r=e[t+1],o=e[t+2];if("function"!==typeof r){if(null===cf(r||n))continue;break}var a=Ue(n);null!==a&&(e.splice(t,3),t-=3,_i(a,{pending:!0,data:o,method:n.method,action:r},r,o))}})))}function Df(e){function t(t){return Cf(t,e)}null!==ff&&Cf(ff,e),null!==pf&&Cf(pf,e),null!==hf&&Cf(hf,e),mf.forEach(t),vf.forEach(t);for(var n=0;n<gf.length;n++){var r=gf[n];r.blockedOn===e&&(r.blockedOn=null)}for(;0<gf.length&&null===(n=gf[0]).blockedOn;)xf(n),null===n.blockedOn&&gf.shift();if(null!=(n=(e.ownerDocument||e).$$reactFormReplay))for(r=0;r<n.length;r+=3){var o=n[r],a=n[r+1],i=o[Me]||null;if("function"===typeof a)i||jf(n);else if(i){var s=null;if(a&&a.hasAttribute("formAction")){if(o=a,i=a[Me]||null)s=i.formAction;else if(null!==cf(o))continue}else s=i.action;"function"===typeof s?n[r+1]=s:(n.splice(r,3),r-=3),jf(n)}}}function Pf(e){this._internalRoot=e}function Tf(e){this._internalRoot=e}Tf.prototype.render=Pf.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(i(409));Jd(t.current,Rc(),e,t,null,null)},Tf.prototype.unmount=Pf.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;Jd(e.current,2,null,e,null,null),Hc(),t[Re]=null}},Tf.prototype.unstable_scheduleHydration=function(e){if(e){var t=Te();e={blockedOn:null,target:e,priority:t};for(var n=0;n<gf.length&&0!==t&&t<gf[n].priority;n++);gf.splice(n,0,e),0===n&&xf(e)}};var _f=o.version;if("19.1.0"!==_f)throw Error(i(527,_f,"19.1.0"));A.findDOMNode=function(e){var t=e._reactInternals;if(void 0===t){if("function"===typeof e.render)throw Error(i(188));throw e=Object.keys(e).join(","),Error(i(268,e))}return e=function(e){var t=e.alternate;if(!t){if(null===(t=l(e)))throw Error(i(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var a=o.alternate;if(null===a){if(null!==(r=o.return)){n=r;continue}break}if(o.child===a.child){for(a=o.child;a;){if(a===n)return u(o),e;if(a===r)return u(o),t;a=a.sibling}throw Error(i(188))}if(n.return!==r.return)n=o,r=a;else{for(var s=!1,c=o.child;c;){if(c===n){s=!0,n=o,r=a;break}if(c===r){s=!0,r=o,n=a;break}c=c.sibling}if(!s){for(c=a.child;c;){if(c===n){s=!0,n=a,r=o;break}if(c===r){s=!0,r=a,n=o;break}c=c.sibling}if(!s)throw Error(i(189))}}if(n.alternate!==r)throw Error(i(190))}if(3!==n.tag)throw Error(i(188));return n.stateNode.current===n?e:t}(t),e=null===(e=null!==e?d(e):null)?null:e.stateNode};var Of={bundleType:0,version:"19.1.0",rendererPackageName:"react-dom",currentDispatcherRef:R,reconcilerVersion:"19.1.0"};if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var Mf=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Mf.isDisabled&&Mf.supportsFiber)try{ue=Mf.inject(Of),de=Mf}catch(Af){}}t.createRoot=function(e,t){if(!s(e))throw Error(i(299));var n=!1,r="",o=ys,a=bs,l=ws;return null!==t&&void 0!==t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onUncaughtError&&(o=t.onUncaughtError),void 0!==t.onCaughtError&&(a=t.onCaughtError),void 0!==t.onRecoverableError&&(l=t.onRecoverableError),void 0!==t.unstable_transitionCallbacks&&t.unstable_transitionCallbacks),t=Gd(e,1,!1,null,0,n,r,o,a,l,0,null),e[Re]=t.current,Bu(e),new Pf(t)},t.hydrateRoot=function(e,t,n){if(!s(e))throw Error(i(299));var r=!1,o="",a=ys,l=bs,c=ws,u=null;return null!==n&&void 0!==n&&(!0===n.unstable_strictMode&&(r=!0),void 0!==n.identifierPrefix&&(o=n.identifierPrefix),void 0!==n.onUncaughtError&&(a=n.onUncaughtError),void 0!==n.onCaughtError&&(l=n.onCaughtError),void 0!==n.onRecoverableError&&(c=n.onRecoverableError),void 0!==n.unstable_transitionCallbacks&&n.unstable_transitionCallbacks,void 0!==n.formState&&(u=n.formState)),(t=Gd(e,1,!0,t,0,r,o,a,l,c,0,u)).context=Xd(null),n=t.current,(o=aa(r=De(r=Rc()))).callback=null,ia(n,o,r),n=r,t.current.lanes=n,Ce(t,n),ku(t),e[Re]=t.current,Bu(e),new Tf(t)},t.version="19.1.0"},557:(e,t,n)=>{"use strict";e.exports=n(696)},592:(e,t)=>{"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.consumer"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),f=Symbol.for("react.lazy"),p=Symbol.iterator;var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,v={};function g(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||h}function y(){}function b(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||h}g.prototype.isReactComponent={},g.prototype.setState=function(e,t){if("object"!==typeof e&&"function"!==typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},g.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=g.prototype;var w=b.prototype=new y;w.constructor=b,m(w,g.prototype),w.isPureReactComponent=!0;var x=Array.isArray,k={H:null,A:null,T:null,S:null,V:null},S=Object.prototype.hasOwnProperty;function E(e,t,r,o,a,i){return r=i.ref,{$$typeof:n,type:e,key:t,ref:void 0!==r?r:null,props:i}}function C(e){return"object"===typeof e&&null!==e&&e.$$typeof===n}var N=/\/+/g;function j(e,t){return"object"===typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,(function(e){return t[e]}))}(""+e.key):t.toString(36)}function D(){}function P(e,t,o,a,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var l,c,u=!1;if(null===e)u=!0;else switch(s){case"bigint":case"string":case"number":u=!0;break;case"object":switch(e.$$typeof){case n:case r:u=!0;break;case f:return P((u=e._init)(e._payload),t,o,a,i)}}if(u)return i=i(e),u=""===a?"."+j(e,0):a,x(i)?(o="",null!=u&&(o=u.replace(N,"$&/")+"/"),P(i,t,o,"",(function(e){return e}))):null!=i&&(C(i)&&(l=i,c=o+(null==i.key||e&&e.key===i.key?"":(""+i.key).replace(N,"$&/")+"/")+u,i=E(l.type,c,void 0,0,0,l.props)),t.push(i)),1;u=0;var d,h=""===a?".":a+":";if(x(e))for(var m=0;m<e.length;m++)u+=P(a=e[m],t,o,s=h+j(a,m),i);else if("function"===typeof(m=null===(d=e)||"object"!==typeof d?null:"function"===typeof(d=p&&d[p]||d["@@iterator"])?d:null))for(e=m.call(e),m=0;!(a=e.next()).done;)u+=P(a=a.value,t,o,s=h+j(a,m++),i);else if("object"===s){if("function"===typeof e.then)return P(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"===typeof e.status?e.then(D,D):(e.status="pending",e.then((function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)}),(function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)}))),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(e),t,o,a,i);throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.")}return u}function T(e,t,n){if(null==e)return e;var r=[],o=0;return P(e,r,"","",(function(e){return t.call(n,e,o++)})),r}function _(e){if(-1===e._status){var t=e._result;(t=t()).then((function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)}),(function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)})),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var O="function"===typeof reportError?reportError:function(e){if("object"===typeof window&&"function"===typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"===typeof e&&null!==e&&"string"===typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"===typeof process&&"function"===typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function M(){}t.Children={map:T,forEach:function(e,t,n){T(e,(function(){t.apply(this,arguments)}),n)},count:function(e){var t=0;return T(e,(function(){t++})),t},toArray:function(e){return T(e,(function(e){return e}))||[]},only:function(e){if(!C(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=g,t.Fragment=o,t.Profiler=i,t.PureComponent=b,t.StrictMode=a,t.Suspense=u,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=k,t.__COMPILER_RUNTIME={__proto__:null,c:function(e){return k.H.useMemoCache(e)}},t.cache=function(e){return function(){return e.apply(null,arguments)}},t.cloneElement=function(e,t,n){if(null===e||void 0===e)throw Error("The argument must be a React element, but you passed "+e+".");var r=m({},e.props),o=e.key;if(null!=t)for(a in void 0!==t.ref&&void 0,void 0!==t.key&&(o=""+t.key),t)!S.call(t,a)||"key"===a||"__self"===a||"__source"===a||"ref"===a&&void 0===t.ref||(r[a]=t[a]);var a=arguments.length-2;if(1===a)r.children=n;else if(1<a){for(var i=Array(a),s=0;s<a;s++)i[s]=arguments[s+2];r.children=i}return E(e.type,o,void 0,0,0,r)},t.createContext=function(e){return(e={$$typeof:l,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:s,_context:e},e},t.createElement=function(e,t,n){var r,o={},a=null;if(null!=t)for(r in void 0!==t.key&&(a=""+t.key),t)S.call(t,r)&&"key"!==r&&"__self"!==r&&"__source"!==r&&(o[r]=t[r]);var i=arguments.length-2;if(1===i)o.children=n;else if(1<i){for(var s=Array(i),l=0;l<i;l++)s[l]=arguments[l+2];o.children=s}if(e&&e.defaultProps)for(r in i=e.defaultProps)void 0===o[r]&&(o[r]=i[r]);return E(e,a,void 0,0,0,o)},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:c,render:e}},t.isValidElement=C,t.lazy=function(e){return{$$typeof:f,_payload:{_status:-1,_result:e},_init:_}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=k.T,n={};k.T=n;try{var r=e(),o=k.S;null!==o&&o(n,r),"object"===typeof r&&null!==r&&"function"===typeof r.then&&r.then(M,O)}catch(a){O(a)}finally{k.T=t}},t.unstable_useCacheRefresh=function(){return k.H.useCacheRefresh()},t.use=function(e){return k.H.use(e)},t.useActionState=function(e,t,n){return k.H.useActionState(e,t,n)},t.useCallback=function(e,t){return k.H.useCallback(e,t)},t.useContext=function(e){return k.H.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e,t){return k.H.useDeferredValue(e,t)},t.useEffect=function(e,t,n){var r=k.H;if("function"===typeof n)throw Error("useEffect CRUD overload is not enabled in this build of React.");return r.useEffect(e,t)},t.useId=function(){return k.H.useId()},t.useImperativeHandle=function(e,t,n){return k.H.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return k.H.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return k.H.useLayoutEffect(e,t)},t.useMemo=function(e,t){return k.H.useMemo(e,t)},t.useOptimistic=function(e,t){return k.H.useOptimistic(e,t)},t.useReducer=function(e,t,n){return k.H.useReducer(e,t,n)},t.useRef=function(e){return k.H.useRef(e)},t.useState=function(e){return k.H.useState(e)},t.useSyncExternalStore=function(e,t,n){return k.H.useSyncExternalStore(e,t,n)},t.useTransition=function(){return k.H.useTransition()},t.version="19.1.0"},696:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,i=o>>>1;r<i;){var s=2*(r+1)-1,l=e[s],c=s+1,u=e[c];if(0>a(l,n))c<o&&0>a(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[s]=n,r=s);else{if(!(c<o&&0>a(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"===typeof performance&&"function"===typeof performance.now){var i=performance;t.unstable_now=function(){return i.now()}}else{var s=Date,l=s.now();t.unstable_now=function(){return s.now()-l}}var c=[],u=[],d=1,f=null,p=3,h=!1,m=!1,v=!1,g=!1,y="function"===typeof setTimeout?setTimeout:null,b="function"===typeof clearTimeout?clearTimeout:null,w="undefined"!==typeof setImmediate?setImmediate:null;function x(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(c,t)}t=r(u)}}function k(e){if(v=!1,x(e),!m)if(null!==r(c))m=!0,E||(E=!0,S());else{var t=r(u);null!==t&&O(k,t.startTime-e)}}var S,E=!1,C=-1,N=5,j=-1;function D(){return!!g||!(t.unstable_now()-j<N)}function P(){if(g=!1,E){var e=t.unstable_now();j=e;var n=!0;try{e:{m=!1,v&&(v=!1,b(C),C=-1),h=!0;var a=p;try{t:{for(x(e),f=r(c);null!==f&&!(f.expirationTime>e&&D());){var i=f.callback;if("function"===typeof i){f.callback=null,p=f.priorityLevel;var s=i(f.expirationTime<=e);if(e=t.unstable_now(),"function"===typeof s){f.callback=s,x(e),n=!0;break t}f===r(c)&&o(c),x(e)}else o(c);f=r(c)}if(null!==f)n=!0;else{var l=r(u);null!==l&&O(k,l.startTime-e),n=!1}}break e}finally{f=null,p=a,h=!1}n=void 0}}finally{n?S():E=!1}}}if("function"===typeof w)S=function(){w(P)};else if("undefined"!==typeof MessageChannel){var T=new MessageChannel,_=T.port2;T.port1.onmessage=P,S=function(){_.postMessage(null)}}else S=function(){y(P,0)};function O(e,n){C=y((function(){e(t.unstable_now())}),n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):N=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return p},t.unstable_next=function(e){switch(p){case 1:case 2:case 3:var t=3;break;default:t=p}var n=p;p=t;try{return e()}finally{p=n}},t.unstable_requestPaint=function(){g=!0},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=p;p=e;try{return t()}finally{p=n}},t.unstable_scheduleCallback=function(e,o,a){var i=t.unstable_now();switch("object"===typeof a&&null!==a?a="number"===typeof(a=a.delay)&&0<a?i+a:i:a=i,e){case 1:var s=-1;break;case 2:s=250;break;case 5:s=1073741823;break;case 4:s=1e4;break;default:s=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:s=a+s,sortIndex:-1},a>i?(e.sortIndex=a,n(u,e),null===r(c)&&e===r(u)&&(v?(b(C),C=-1):v=!0,O(k,a-i))):(e.sortIndex=s,n(c,e),m||h||(m=!0,E||(E=!0,S()))),e},t.unstable_shouldYield=D,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},719:(e,t)=>{"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=""+t.key),"key"in t)for(var a in r={},t)"key"!==a&&(r[a]=t[a]);else r=t;return t=r.ref,{$$typeof:n,type:e,key:o,ref:void 0!==t?t:null,props:r}}t.Fragment=r,t.jsx=o,t.jsxs=o},723:(e,t,n)=>{"use strict";e.exports=n(719)},775:(e,t,n)=>{"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(556)},808:(e,t,n)=>{"use strict";e.exports=n(276)},904:(e,t,n)=>{"use strict";var r=n(483);function o(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function a(){}var i={d:{f:a,r:function(){throw Error(o(522))},D:a,C:a,L:a,m:a,X:a,S:a,M:a},p:0,findDOMNode:null},s=Symbol.for("react.portal");var l=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function c(e,t){return"font"===e?"":"string"===typeof t?"use-credentials"===t?t:"":void 0}t.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!t||1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType)throw Error(o(299));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:s,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.flushSync=function(e){var t=l.T,n=i.p;try{if(l.T=null,i.p=2,e)return e()}finally{l.T=t,i.p=n,i.d.f()}},t.preconnect=function(e,t){"string"===typeof e&&(t?t="string"===typeof(t=t.crossOrigin)?"use-credentials"===t?t:"":void 0:t=null,i.d.C(e,t))},t.prefetchDNS=function(e){"string"===typeof e&&i.d.D(e)},t.preinit=function(e,t){if("string"===typeof e&&t&&"string"===typeof t.as){var n=t.as,r=c(n,t.crossOrigin),o="string"===typeof t.integrity?t.integrity:void 0,a="string"===typeof t.fetchPriority?t.fetchPriority:void 0;"style"===n?i.d.S(e,"string"===typeof t.precedence?t.precedence:void 0,{crossOrigin:r,integrity:o,fetchPriority:a}):"script"===n&&i.d.X(e,{crossOrigin:r,integrity:o,fetchPriority:a,nonce:"string"===typeof t.nonce?t.nonce:void 0})}},t.preinitModule=function(e,t){if("string"===typeof e)if("object"===typeof t&&null!==t){if(null==t.as||"script"===t.as){var n=c(t.as,t.crossOrigin);i.d.M(e,{crossOrigin:n,integrity:"string"===typeof t.integrity?t.integrity:void 0,nonce:"string"===typeof t.nonce?t.nonce:void 0})}}else null==t&&i.d.M(e)},t.preload=function(e,t){if("string"===typeof e&&"object"===typeof t&&null!==t&&"string"===typeof t.as){var n=t.as,r=c(n,t.crossOrigin);i.d.L(e,n,{crossOrigin:r,integrity:"string"===typeof t.integrity?t.integrity:void 0,nonce:"string"===typeof t.nonce?t.nonce:void 0,type:"string"===typeof t.type?t.type:void 0,fetchPriority:"string"===typeof t.fetchPriority?t.fetchPriority:void 0,referrerPolicy:"string"===typeof t.referrerPolicy?t.referrerPolicy:void 0,imageSrcSet:"string"===typeof t.imageSrcSet?t.imageSrcSet:void 0,imageSizes:"string"===typeof t.imageSizes?t.imageSizes:void 0,media:"string"===typeof t.media?t.media:void 0})}},t.preloadModule=function(e,t){if("string"===typeof e)if(t){var n=c(t.as,t.crossOrigin);i.d.m(e,{as:"string"===typeof t.as&&"script"!==t.as?t.as:void 0,crossOrigin:n,integrity:"string"===typeof t.integrity?t.integrity:void 0})}else i.d.m(e)},t.requestFormReset=function(e){i.d.r(e)},t.unstable_batchedUpdates=function(e,t){return e(t)},t.useFormState=function(e,t,n){return l.H.useFormState(e,t,n)},t.useFormStatus=function(){return l.H.useHostTransitionStatus()},t.version="19.1.0"},956:(e,t)=>{t.read=function(e,t,n,r,o){var a,i,s=8*o-r-1,l=(1<<s)-1,c=l>>1,u=-7,d=n?o-1:0,f=n?-1:1,p=e[t+d];for(d+=f,a=p&(1<<-u)-1,p>>=-u,u+=s;u>0;a=256*a+e[t+d],d+=f,u-=8);for(i=a&(1<<-u)-1,a>>=-u,u+=r;u>0;i=256*i+e[t+d],d+=f,u-=8);if(0===a)a=1-c;else{if(a===l)return i?NaN:1/0*(p?-1:1);i+=Math.pow(2,r),a-=c}return(p?-1:1)*i*Math.pow(2,a-r)},t.write=function(e,t,n,r,o,a){var i,s,l,c=8*a-o-1,u=(1<<c)-1,d=u>>1,f=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,p=r?0:a-1,h=r?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(s=isNaN(t)?1:0,i=u):(i=Math.floor(Math.log(t)/Math.LN2),t*(l=Math.pow(2,-i))<1&&(i--,l*=2),(t+=i+d>=1?f/l:f*Math.pow(2,1-d))*l>=2&&(i++,l/=2),i+d>=u?(s=0,i=u):i+d>=1?(s=(t*l-1)*Math.pow(2,o),i+=d):(s=t*Math.pow(2,d-1)*Math.pow(2,o),i=0));o>=8;e[n+p]=255&s,p+=h,s/=256,o-=8);for(i=i<<o|s,c+=o;c>0;e[n+p]=255&i,p+=h,i/=256,c-=8);e[n+p-h]|=128*m}},998:(e,t,n)=>{"use strict";!function e(){if("undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(904)}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,n),a.exports}n.m=e,n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},(()=>{var e,t=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;n.t=function(r,o){if(1&o&&(r=this(r)),8&o)return r;if("object"===typeof r&&r){if(4&o&&r.__esModule)return r;if(16&o&&"function"===typeof r.then)return r}var a=Object.create(null);n.r(a);var i={};e=e||[null,t({}),t([]),t(t)];for(var s=2&o&&r;"object"==typeof s&&!~e.indexOf(s);s=t(s))Object.getOwnPropertyNames(s).forEach((e=>i[e]=()=>r[e]));return i.default=()=>r,n.d(a,i),a}})(),n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((t,r)=>(n.f[r](e,t),t)),[])),n.u=e=>"static/js/"+e+".116b9008.chunk.js",n.miniCssF=e=>{},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="frontend:";n.l=(r,o,a,i)=>{if(e[r])e[r].push(o);else{var s,l;if(void 0!==a)for(var c=document.getElementsByTagName("script"),u=0;u<c.length;u++){var d=c[u];if(d.getAttribute("src")==r||d.getAttribute("data-webpack")==t+a){s=d;break}}s||(l=!0,(s=document.createElement("script")).charset="utf-8",s.timeout=120,n.nc&&s.setAttribute("nonce",n.nc),s.setAttribute("data-webpack",t+a),s.src=r),e[r]=[o];var f=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var o=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),o&&o.forEach((e=>e(n))),t)return t(n)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=f.bind(null,s.onerror),s.onload=f.bind(null,s.onload),l&&document.head.appendChild(s)}}})(),n.r=e=>{"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.p="/",(()=>{var e={792:0};n.f.j=(t,r)=>{var o=n.o(e,t)?e[t]:void 0;if(0!==o)if(o)r.push(o[2]);else{var a=new Promise(((n,r)=>o=e[t]=[n,r]));r.push(o[2]=a);var i=n.p+n.u(t),s=new Error;n.l(i,(r=>{if(n.o(e,t)&&(0!==(o=e[t])&&(e[t]=void 0),o)){var a=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+a+": "+i+")",s.name="ChunkLoadError",s.type=a,s.request=i,o[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var o,a,i=r[0],s=r[1],l=r[2],c=0;if(i.some((t=>0!==e[t]))){for(o in s)n.o(s,o)&&(n.m[o]=s[o]);if(l)l(n)}for(t&&t(r);c<i.length;c++)a=i[c],n.o(e,a)&&e[a]&&e[a][0](),e[a]=0},r=self.webpackChunkfrontend=self.webpackChunkfrontend||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";var e={};n.r(e),n.d(e,{hasBrowserEnv:()=>Ft,hasStandardBrowserEnv:()=>Bt,hasStandardBrowserWebWorkerEnv:()=>Ht,navigator:()=>zt,origin:()=>Ut});var t,r=n(483),o=n.t(r,2),a=n(775),i=n(998),s=n.t(i,2);function l(){return l=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},l.apply(this,arguments)}!function(e){e.Pop="POP",e.Push="PUSH",e.Replace="REPLACE"}(t||(t={}));const c="popstate";function u(e,t){if(!1===e||null===e||"undefined"===typeof e)throw new Error(t)}function d(e,t){if(!e){"undefined"!==typeof console&&console.warn(t);try{throw new Error(t)}catch(n){}}}function f(e,t){return{usr:e.state,key:e.key,idx:t}}function p(e,t,n,r){return void 0===n&&(n=null),l({pathname:"string"===typeof e?e:e.pathname,search:"",hash:""},"string"===typeof t?m(t):t,{state:n,key:t&&t.key||r||Math.random().toString(36).substr(2,8)})}function h(e){let{pathname:t="/",search:n="",hash:r=""}=e;return n&&"?"!==n&&(t+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(t+="#"===r.charAt(0)?r:"#"+r),t}function m(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substr(n),e=e.substr(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function v(e,n,r,o){void 0===o&&(o={});let{window:a=document.defaultView,v5Compat:i=!1}=o,s=a.history,d=t.Pop,m=null,v=g();function g(){return(s.state||{idx:null}).idx}function y(){d=t.Pop;let e=g(),n=null==e?null:e-v;v=e,m&&m({action:d,location:w.location,delta:n})}function b(e){let t="null"!==a.location.origin?a.location.origin:a.location.href,n="string"===typeof e?e:h(e);return n=n.replace(/ $/,"%20"),u(t,"No window.location.(origin|href) available to create URL for href: "+n),new URL(n,t)}null==v&&(v=0,s.replaceState(l({},s.state,{idx:v}),""));let w={get action(){return d},get location(){return e(a,s)},listen(e){if(m)throw new Error("A history only accepts one active listener");return a.addEventListener(c,y),m=e,()=>{a.removeEventListener(c,y),m=null}},createHref:e=>n(a,e),createURL:b,encodeLocation(e){let t=b(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,n){d=t.Push;let o=p(w.location,e,n);r&&r(o,e),v=g()+1;let l=f(o,v),c=w.createHref(o);try{s.pushState(l,"",c)}catch(u){if(u instanceof DOMException&&"DataCloneError"===u.name)throw u;a.location.assign(c)}i&&m&&m({action:d,location:w.location,delta:1})},replace:function(e,n){d=t.Replace;let o=p(w.location,e,n);r&&r(o,e),v=g();let a=f(o,v),l=w.createHref(o);s.replaceState(a,"",l),i&&m&&m({action:d,location:w.location,delta:0})},go:e=>s.go(e)};return w}var g;!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(g||(g={}));new Set(["lazy","caseSensitive","path","id","index","children"]);function y(e,t,n){return void 0===n&&(n="/"),b(e,t,n,!1)}function b(e,t,n,r){let o=M(("string"===typeof t?m(t):t).pathname||"/",n);if(null==o)return null;let a=w(e);!function(e){e.sort(((e,t)=>e.score!==t.score?t.score-e.score:function(e,t){let n=e.length===t.length&&e.slice(0,-1).every(((e,n)=>e===t[n]));return n?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((e=>e.childrenIndex)),t.routesMeta.map((e=>e.childrenIndex)))))}(a);let i=null;for(let s=0;null==i&&s<a.length;++s){let e=O(o);i=T(a[s],e,r)}return i}function w(e,t,n,r){void 0===t&&(t=[]),void 0===n&&(n=[]),void 0===r&&(r="");let o=(e,o,a)=>{let i={relativePath:void 0===a?e.path||"":a,caseSensitive:!0===e.caseSensitive,childrenIndex:o,route:e};i.relativePath.startsWith("/")&&(u(i.relativePath.startsWith(r),'Absolute route path "'+i.relativePath+'" nested under path "'+r+'" is not valid. An absolute child route path must start with the combined path of all its parent routes.'),i.relativePath=i.relativePath.slice(r.length));let s=F([r,i.relativePath]),l=n.concat(i);e.children&&e.children.length>0&&(u(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+s+'".'),w(e.children,t,l,s)),(null!=e.path||e.index)&&t.push({path:s,score:P(s,e.index),routesMeta:l})};return e.forEach(((e,t)=>{var n;if(""!==e.path&&null!=(n=e.path)&&n.includes("?"))for(let r of x(e.path))o(e,t,r);else o(e,t)})),t}function x(e){let t=e.split("/");if(0===t.length)return[];let[n,...r]=t,o=n.endsWith("?"),a=n.replace(/\?$/,"");if(0===r.length)return o?[a,""]:[a];let i=x(r.join("/")),s=[];return s.push(...i.map((e=>""===e?a:[a,e].join("/")))),o&&s.push(...i),s.map((t=>e.startsWith("/")&&""===t?"/":t))}const k=/^:[\w-]+$/,S=3,E=2,C=1,N=10,j=-2,D=e=>"*"===e;function P(e,t){let n=e.split("/"),r=n.length;return n.some(D)&&(r+=j),t&&(r+=E),n.filter((e=>!D(e))).reduce(((e,t)=>e+(k.test(t)?S:""===t?C:N)),r)}function T(e,t,n){void 0===n&&(n=!1);let{routesMeta:r}=e,o={},a="/",i=[];for(let s=0;s<r.length;++s){let e=r[s],l=s===r.length-1,c="/"===a?t:t.slice(a.length)||"/",u=_({path:e.relativePath,caseSensitive:e.caseSensitive,end:l},c),d=e.route;if(!u&&l&&n&&!r[r.length-1].route.index&&(u=_({path:e.relativePath,caseSensitive:e.caseSensitive,end:!1},c)),!u)return null;Object.assign(o,u.params),i.push({params:o,pathname:F([a,u.pathname]),pathnameBase:z(F([a,u.pathnameBase])),route:d}),"/"!==u.pathnameBase&&(a=F([a,u.pathnameBase]))}return i}function _(e,t){"string"===typeof e&&(e={path:e,caseSensitive:!1,end:!0});let[n,r]=function(e,t,n){void 0===t&&(t=!1);void 0===n&&(n=!0);d("*"===e||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were "'+e.replace(/\*$/,"/*")+'" because the `*` character must always follow a `/` in the pattern. To get rid of this warning, please change the route path to "'+e.replace(/\*$/,"/*")+'".');let r=[],o="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,((e,t,n)=>(r.push({paramName:t,isOptional:null!=n}),n?"/?([^\\/]+)?":"/([^\\/]+)")));e.endsWith("*")?(r.push({paramName:"*"}),o+="*"===e||"/*"===e?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?o+="\\/*$":""!==e&&"/"!==e&&(o+="(?:(?=\\/|$))");let a=new RegExp(o,t?void 0:"i");return[a,r]}(e.path,e.caseSensitive,e.end),o=t.match(n);if(!o)return null;let a=o[0],i=a.replace(/(.)\/+$/,"$1"),s=o.slice(1),l=r.reduce(((e,t,n)=>{let{paramName:r,isOptional:o}=t;if("*"===r){let e=s[n]||"";i=a.slice(0,a.length-e.length).replace(/(.)\/+$/,"$1")}const l=s[n];return e[r]=o&&!l?void 0:(l||"").replace(/%2F/g,"/"),e}),{});return{params:l,pathname:a,pathnameBase:i,pattern:e}}function O(e){try{return e.split("/").map((e=>decodeURIComponent(e).replace(/\//g,"%2F"))).join("/")}catch(t){return d(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent encoding ('+t+")."),e}}function M(e,t){if("/"===t)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&"/"!==r?null:e.slice(n)||"/"}function R(e,t,n,r){return"Cannot include a '"+e+"' character in a manually specified `to."+t+"` field ["+JSON.stringify(r)+"].  Please separate it out to the `to."+n+'` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.'}function A(e){return e.filter(((e,t)=>0===t||e.route.path&&e.route.path.length>0))}function L(e,t){let n=A(e);return t?n.map(((e,t)=>t===n.length-1?e.pathname:e.pathnameBase)):n.map((e=>e.pathnameBase))}function I(e,t,n,r){let o;void 0===r&&(r=!1),"string"===typeof e?o=m(e):(o=l({},e),u(!o.pathname||!o.pathname.includes("?"),R("?","pathname","search",o)),u(!o.pathname||!o.pathname.includes("#"),R("#","pathname","hash",o)),u(!o.search||!o.search.includes("#"),R("#","search","hash",o)));let a,i=""===e||""===o.pathname,s=i?"/":o.pathname;if(null==s)a=n;else{let e=t.length-1;if(!r&&s.startsWith("..")){let t=s.split("/");for(;".."===t[0];)t.shift(),e-=1;o.pathname=t.join("/")}a=e>=0?t[e]:"/"}let c=function(e,t){void 0===t&&(t="/");let{pathname:n,search:r="",hash:o=""}="string"===typeof e?m(e):e,a=n?n.startsWith("/")?n:function(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((e=>{".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}(n,t):t;return{pathname:a,search:B(r),hash:H(o)}}(o,a),d=s&&"/"!==s&&s.endsWith("/"),f=(i||"."===s)&&n.endsWith("/");return c.pathname.endsWith("/")||!d&&!f||(c.pathname+="/"),c}const F=e=>e.join("/").replace(/\/\/+/g,"/"),z=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),B=e=>e&&"?"!==e?e.startsWith("?")?e:"?"+e:"",H=e=>e&&"#"!==e?e.startsWith("#")?e:"#"+e:"";Error;function U(e){return null!=e&&"number"===typeof e.status&&"string"===typeof e.statusText&&"boolean"===typeof e.internal&&"data"in e}const Y=["post","put","patch","delete"],W=(new Set(Y),["get",...Y]);new Set(W),new Set([301,302,303,307,308]),new Set([307,308]);Symbol("deferred");function q(){return q=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},q.apply(this,arguments)}const V=r.createContext(null);const Q=r.createContext(null);const K=r.createContext(null);const $=r.createContext(null);const G=r.createContext({outlet:null,matches:[],isDataRoute:!1});const X=r.createContext(null);function J(){return null!=r.useContext($)}function Z(){return J()||u(!1),r.useContext($).location}function ee(e){r.useContext(K).static||r.useLayoutEffect(e)}function te(){let{isDataRoute:e}=r.useContext(G);return e?function(){let{router:e}=fe(ue.UseNavigateStable),t=he(de.UseNavigateStable),n=r.useRef(!1);return ee((()=>{n.current=!0})),r.useCallback((function(r,o){void 0===o&&(o={}),n.current&&("number"===typeof r?e.navigate(r):e.navigate(r,q({fromRouteId:t},o)))}),[e,t])}():function(){J()||u(!1);let e=r.useContext(V),{basename:t,future:n,navigator:o}=r.useContext(K),{matches:a}=r.useContext(G),{pathname:i}=Z(),s=JSON.stringify(L(a,n.v7_relativeSplatPath)),l=r.useRef(!1);return ee((()=>{l.current=!0})),r.useCallback((function(n,r){if(void 0===r&&(r={}),!l.current)return;if("number"===typeof n)return void o.go(n);let a=I(n,JSON.parse(s),i,"path"===r.relative);null==e&&"/"!==t&&(a.pathname="/"===a.pathname?t:F([t,a.pathname])),(r.replace?o.replace:o.push)(a,r.state,r)}),[t,o,s,i,e])}()}const ne=r.createContext(null);function re(){let{matches:e}=r.useContext(G),t=e[e.length-1];return t?t.params:{}}function oe(e,n,o,a){J()||u(!1);let{navigator:i,static:s}=r.useContext(K),{matches:l}=r.useContext(G),c=l[l.length-1],d=c?c.params:{},f=(c&&c.pathname,c?c.pathnameBase:"/");c&&c.route;let p,h=Z();if(n){var v;let e="string"===typeof n?m(n):n;"/"===f||(null==(v=e.pathname)?void 0:v.startsWith(f))||u(!1),p=e}else p=h;let g=p.pathname||"/",b=g;if("/"!==f){let e=f.replace(/^\//,"").split("/");b="/"+g.replace(/^\//,"").split("/").slice(e.length).join("/")}let w=!s&&o&&o.matches&&o.matches.length>0?o.matches:y(e,{pathname:b});let x=ce(w&&w.map((e=>Object.assign({},e,{params:Object.assign({},d,e.params),pathname:F([f,i.encodeLocation?i.encodeLocation(e.pathname).pathname:e.pathname]),pathnameBase:"/"===e.pathnameBase?f:F([f,i.encodeLocation?i.encodeLocation(e.pathnameBase).pathname:e.pathnameBase])}))),l,o,a);return n&&x?r.createElement($.Provider,{value:{location:q({pathname:"/",search:"",hash:"",state:null,key:"default"},p),navigationType:t.Pop}},x):x}function ae(){let e=function(){var e;let t=r.useContext(X),n=pe(de.UseRouteError),o=he(de.UseRouteError);if(void 0!==t)return t;return null==(e=n.errors)?void 0:e[o]}(),t=U(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,o="rgba(200,200,200, 0.5)",a={padding:"0.5rem",backgroundColor:o};return r.createElement(r.Fragment,null,r.createElement("h2",null,"Unexpected Application Error!"),r.createElement("h3",{style:{fontStyle:"italic"}},t),n?r.createElement("pre",{style:a},n):null,null)}const ie=r.createElement(ae,null);class se extends r.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||"idle"!==t.revalidation&&"idle"===e.revalidation?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:void 0!==e.error?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){console.error("React Router caught the following error during render",e,t)}render(){return void 0!==this.state.error?r.createElement(G.Provider,{value:this.props.routeContext},r.createElement(X.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function le(e){let{routeContext:t,match:n,children:o}=e,a=r.useContext(V);return a&&a.static&&a.staticContext&&(n.route.errorElement||n.route.ErrorBoundary)&&(a.staticContext._deepestRenderedBoundaryId=n.route.id),r.createElement(G.Provider,{value:t},o)}function ce(e,t,n,o){var a;if(void 0===t&&(t=[]),void 0===n&&(n=null),void 0===o&&(o=null),null==e){var i;if(!n)return null;if(n.errors)e=n.matches;else{if(!(null!=(i=o)&&i.v7_partialHydration&&0===t.length&&!n.initialized&&n.matches.length>0))return null;e=n.matches}}let s=e,l=null==(a=n)?void 0:a.errors;if(null!=l){let e=s.findIndex((e=>e.route.id&&void 0!==(null==l?void 0:l[e.route.id])));e>=0||u(!1),s=s.slice(0,Math.min(s.length,e+1))}let c=!1,d=-1;if(n&&o&&o.v7_partialHydration)for(let r=0;r<s.length;r++){let e=s[r];if((e.route.HydrateFallback||e.route.hydrateFallbackElement)&&(d=r),e.route.id){let{loaderData:t,errors:r}=n,o=e.route.loader&&void 0===t[e.route.id]&&(!r||void 0===r[e.route.id]);if(e.route.lazy||o){c=!0,s=d>=0?s.slice(0,d+1):[s[0]];break}}}return s.reduceRight(((e,o,a)=>{let i,u=!1,f=null,p=null;var h;n&&(i=l&&o.route.id?l[o.route.id]:void 0,f=o.route.errorElement||ie,c&&(d<0&&0===a?(h="route-fallback",!1||me[h]||(me[h]=!0),u=!0,p=null):d===a&&(u=!0,p=o.route.hydrateFallbackElement||null)));let m=t.concat(s.slice(0,a+1)),v=()=>{let t;return t=i?f:u?p:o.route.Component?r.createElement(o.route.Component,null):o.route.element?o.route.element:e,r.createElement(le,{match:o,routeContext:{outlet:e,matches:m,isDataRoute:null!=n},children:t})};return n&&(o.route.ErrorBoundary||o.route.errorElement||0===a)?r.createElement(se,{location:n.location,revalidation:n.revalidation,component:f,error:i,children:v(),routeContext:{outlet:null,matches:m,isDataRoute:!0}}):v()}),null)}var ue=function(e){return e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e}(ue||{}),de=function(e){return e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId",e}(de||{});function fe(e){let t=r.useContext(V);return t||u(!1),t}function pe(e){let t=r.useContext(Q);return t||u(!1),t}function he(e){let t=function(){let e=r.useContext(G);return e||u(!1),e}(),n=t.matches[t.matches.length-1];return n.route.id||u(!1),n.route.id}const me={};function ve(e,t){null==e||e.v7_startTransition,void 0===(null==e?void 0:e.v7_relativeSplatPath)&&(!t||t.v7_relativeSplatPath),t&&(t.v7_fetcherPersist,t.v7_normalizeFormMethod,t.v7_partialHydration,t.v7_skipActionErrorRevalidation)}o.startTransition;function ge(e){let{to:t,replace:n,state:o,relative:a}=e;J()||u(!1);let{future:i,static:s}=r.useContext(K),{matches:l}=r.useContext(G),{pathname:c}=Z(),d=te(),f=I(t,L(l,i.v7_relativeSplatPath),c,"path"===a),p=JSON.stringify(f);return r.useEffect((()=>d(JSON.parse(p),{replace:n,state:o,relative:a})),[d,p,a,n,o]),null}function ye(e){return function(e){let t=r.useContext(G).outlet;return t?r.createElement(ne.Provider,{value:e},t):t}(e.context)}function be(e){u(!1)}function we(e){let{basename:n="/",children:o=null,location:a,navigationType:i=t.Pop,navigator:s,static:l=!1,future:c}=e;J()&&u(!1);let d=n.replace(/^\/*/,"/"),f=r.useMemo((()=>({basename:d,navigator:s,static:l,future:q({v7_relativeSplatPath:!1},c)})),[d,c,s,l]);"string"===typeof a&&(a=m(a));let{pathname:p="/",search:h="",hash:v="",state:g=null,key:y="default"}=a,b=r.useMemo((()=>{let e=M(p,d);return null==e?null:{location:{pathname:e,search:h,hash:v,state:g,key:y},navigationType:i}}),[d,p,h,v,g,y,i]);return null==b?null:r.createElement(K.Provider,{value:f},r.createElement($.Provider,{children:o,value:b}))}function xe(e){let{children:t,location:n}=e;return oe(ke(t),n)}new Promise((()=>{}));r.Component;function ke(e,t){void 0===t&&(t=[]);let n=[];return r.Children.forEach(e,((e,o)=>{if(!r.isValidElement(e))return;let a=[...t,o];if(e.type===r.Fragment)return void n.push.apply(n,ke(e.props.children,a));e.type!==be&&u(!1),e.props.index&&e.props.children&&u(!1);let i={id:e.props.id||a.join("-"),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,loader:e.props.loader,action:e.props.action,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:null!=e.props.ErrorBoundary||null!=e.props.errorElement,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(i.children=ke(e.props.children,a)),n.push(i)})),n}new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);try{window.__reactRouterVersion="6"}catch(Dy){}new Map;const Se=o.startTransition;s.flushSync,o.useId;function Ee(e){let{basename:t,children:n,future:o,window:a}=e,i=r.useRef();var s;null==i.current&&(i.current=(void 0===(s={window:a,v5Compat:!0})&&(s={}),v((function(e,t){let{pathname:n,search:r,hash:o}=e.location;return p("",{pathname:n,search:r,hash:o},t.state&&t.state.usr||null,t.state&&t.state.key||"default")}),(function(e,t){return"string"===typeof t?t:h(t)}),null,s)));let l=i.current,[c,u]=r.useState({action:l.action,location:l.location}),{v7_startTransition:d}=o||{},f=r.useCallback((e=>{d&&Se?Se((()=>u(e))):u(e)}),[u,d]);return r.useLayoutEffect((()=>l.listen(f)),[l,f]),r.useEffect((()=>ve(o)),[o]),r.createElement(we,{basename:t,children:n,location:c.location,navigationType:c.action,navigator:l,future:o})}"undefined"!==typeof window&&"undefined"!==typeof window.document&&window.document.createElement;var Ce,Ne;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(Ce||(Ce={})),function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"}(Ne||(Ne={}));function je(e){return je="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},je(e)}function De(e){var t=function(e,t){if("object"!=je(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=je(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==je(t)?t:t+""}function Pe(e,t,n){return(t=De(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Te(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _e(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Te(Object(n),!0).forEach((function(t){Pe(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Te(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function Oe(e,t){return function(){return e.apply(t,arguments)}}const{toString:Me}=Object.prototype,{getPrototypeOf:Re}=Object,{iterator:Ae,toStringTag:Le}=Symbol,Ie=(Fe=Object.create(null),e=>{const t=Me.call(e);return Fe[t]||(Fe[t]=t.slice(8,-1).toLowerCase())});var Fe;const ze=e=>(e=e.toLowerCase(),t=>Ie(t)===e),Be=e=>t=>typeof t===e,{isArray:He}=Array,Ue=Be("undefined");const Ye=ze("ArrayBuffer");const We=Be("string"),qe=Be("function"),Ve=Be("number"),Qe=e=>null!==e&&"object"===typeof e,Ke=e=>{if("object"!==Ie(e))return!1;const t=Re(e);return(null===t||t===Object.prototype||null===Object.getPrototypeOf(t))&&!(Le in e)&&!(Ae in e)},$e=ze("Date"),Ge=ze("File"),Xe=ze("Blob"),Je=ze("FileList"),Ze=ze("URLSearchParams"),[et,tt,nt,rt]=["ReadableStream","Request","Response","Headers"].map(ze);function ot(e,t){let n,r,{allOwnKeys:o=!1}=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(null!==e&&"undefined"!==typeof e)if("object"!==typeof e&&(e=[e]),He(e))for(n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else{const r=o?Object.getOwnPropertyNames(e):Object.keys(e),a=r.length;let i;for(n=0;n<a;n++)i=r[n],t.call(null,e[i],i,e)}}function at(e,t){t=t.toLowerCase();const n=Object.keys(e);let r,o=n.length;for(;o-- >0;)if(r=n[o],t===r.toLowerCase())return r;return null}const it="undefined"!==typeof globalThis?globalThis:"undefined"!==typeof self?self:"undefined"!==typeof window?window:global,st=e=>!Ue(e)&&e!==it;const lt=(ct="undefined"!==typeof Uint8Array&&Re(Uint8Array),e=>ct&&e instanceof ct);var ct;const ut=ze("HTMLFormElement"),dt=(e=>{let{hasOwnProperty:t}=e;return(e,n)=>t.call(e,n)})(Object.prototype),ft=ze("RegExp"),pt=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};ot(n,((n,o)=>{let a;!1!==(a=t(n,o,e))&&(r[o]=a||n)})),Object.defineProperties(e,r)};const ht=ze("AsyncFunction"),mt=(vt="function"===typeof setImmediate,gt=qe(it.postMessage),vt?setImmediate:gt?((e,t)=>(it.addEventListener("message",(n=>{let{source:r,data:o}=n;r===it&&o===e&&t.length&&t.shift()()}),!1),n=>{t.push(n),it.postMessage(e,"*")}))("axios@".concat(Math.random()),[]):e=>setTimeout(e));var vt,gt;const yt="undefined"!==typeof queueMicrotask?queueMicrotask.bind(it):"undefined"!==typeof process&&process.nextTick||mt,bt={isArray:He,isArrayBuffer:Ye,isBuffer:function(e){return null!==e&&!Ue(e)&&null!==e.constructor&&!Ue(e.constructor)&&qe(e.constructor.isBuffer)&&e.constructor.isBuffer(e)},isFormData:e=>{let t;return e&&("function"===typeof FormData&&e instanceof FormData||qe(e.append)&&("formdata"===(t=Ie(e))||"object"===t&&qe(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){let t;return t="undefined"!==typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&Ye(e.buffer),t},isString:We,isNumber:Ve,isBoolean:e=>!0===e||!1===e,isObject:Qe,isPlainObject:Ke,isReadableStream:et,isRequest:tt,isResponse:nt,isHeaders:rt,isUndefined:Ue,isDate:$e,isFile:Ge,isBlob:Xe,isRegExp:ft,isFunction:qe,isStream:e=>Qe(e)&&qe(e.pipe),isURLSearchParams:Ze,isTypedArray:lt,isFileList:Je,forEach:ot,merge:function e(){const{caseless:t}=st(this)&&this||{},n={},r=(r,o)=>{const a=t&&at(n,o)||o;Ke(n[a])&&Ke(r)?n[a]=e(n[a],r):Ke(r)?n[a]=e({},r):He(r)?n[a]=r.slice():n[a]=r};for(let o=0,a=arguments.length;o<a;o++)arguments[o]&&ot(arguments[o],r);return n},extend:function(e,t,n){let{allOwnKeys:r}=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return ot(t,((t,r)=>{n&&qe(t)?e[r]=Oe(t,n):e[r]=t}),{allOwnKeys:r}),e},trim:e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""),stripBOM:e=>(65279===e.charCodeAt(0)&&(e=e.slice(1)),e),inherits:(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},toFlatObject:(e,t,n,r)=>{let o,a,i;const s={};if(t=t||{},null==e)return t;do{for(o=Object.getOwnPropertyNames(e),a=o.length;a-- >0;)i=o[a],r&&!r(i,e,t)||s[i]||(t[i]=e[i],s[i]=!0);e=!1!==n&&Re(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},kindOf:Ie,kindOfTest:ze,endsWith:(e,t,n)=>{e=String(e),(void 0===n||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return-1!==r&&r===n},toArray:e=>{if(!e)return null;if(He(e))return e;let t=e.length;if(!Ve(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},forEachEntry:(e,t)=>{const n=(e&&e[Ae]).call(e);let r;for(;(r=n.next())&&!r.done;){const n=r.value;t.call(e,n[0],n[1])}},matchAll:(e,t)=>{let n;const r=[];for(;null!==(n=e.exec(t));)r.push(n);return r},isHTMLForm:ut,hasOwnProperty:dt,hasOwnProp:dt,reduceDescriptors:pt,freezeMethods:e=>{pt(e,((t,n)=>{if(qe(e)&&-1!==["arguments","caller","callee"].indexOf(n))return!1;const r=e[n];qe(r)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")}))}))},toObjectSet:(e,t)=>{const n={},r=e=>{e.forEach((e=>{n[e]=!0}))};return He(e)?r(e):r(String(e).split(t)),n},toCamelCase:e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,n){return t.toUpperCase()+n})),noop:()=>{},toFiniteNumber:(e,t)=>null!=e&&Number.isFinite(e=+e)?e:t,findKey:at,global:it,isContextDefined:st,isSpecCompliantForm:function(e){return!!(e&&qe(e.append)&&"FormData"===e[Le]&&e[Ae])},toJSONObject:e=>{const t=new Array(10),n=(e,r)=>{if(Qe(e)){if(t.indexOf(e)>=0)return;if(!("toJSON"in e)){t[r]=e;const o=He(e)?[]:{};return ot(e,((e,t)=>{const a=n(e,r+1);!Ue(a)&&(o[t]=a)})),t[r]=void 0,o}}return e};return n(e,0)},isAsyncFn:ht,isThenable:e=>e&&(Qe(e)||qe(e))&&qe(e.then)&&qe(e.catch),setImmediate:mt,asap:yt,isIterable:e=>null!=e&&qe(e[Ae])};function wt(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}bt.inherits(wt,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:bt.toJSONObject(this.config),code:this.code,status:this.status}}});const xt=wt.prototype,kt={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((e=>{kt[e]={value:e}})),Object.defineProperties(wt,kt),Object.defineProperty(xt,"isAxiosError",{value:!0}),wt.from=(e,t,n,r,o,a)=>{const i=Object.create(xt);return bt.toFlatObject(e,i,(function(e){return e!==Error.prototype}),(e=>"isAxiosError"!==e)),wt.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,a&&Object.assign(i,a),i};const St=wt;function Et(e){return bt.isPlainObject(e)||bt.isArray(e)}function Ct(e){return bt.endsWith(e,"[]")?e.slice(0,-2):e}function Nt(e,t,n){return e?e.concat(t).map((function(e,t){return e=Ct(e),!n&&t?"["+e+"]":e})).join(n?".":""):t}const jt=bt.toFlatObject(bt,{},null,(function(e){return/^is[A-Z]/.test(e)}));const Dt=function(e,t,n){if(!bt.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;const r=(n=bt.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!bt.isUndefined(t[e])}))).metaTokens,o=n.visitor||c,a=n.dots,i=n.indexes,s=(n.Blob||"undefined"!==typeof Blob&&Blob)&&bt.isSpecCompliantForm(t);if(!bt.isFunction(o))throw new TypeError("visitor must be a function");function l(e){if(null===e)return"";if(bt.isDate(e))return e.toISOString();if(!s&&bt.isBlob(e))throw new St("Blob is not supported. Use a Buffer instead.");return bt.isArrayBuffer(e)||bt.isTypedArray(e)?s&&"function"===typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,n,o){let s=e;if(e&&!o&&"object"===typeof e)if(bt.endsWith(n,"{}"))n=r?n:n.slice(0,-2),e=JSON.stringify(e);else if(bt.isArray(e)&&function(e){return bt.isArray(e)&&!e.some(Et)}(e)||(bt.isFileList(e)||bt.endsWith(n,"[]"))&&(s=bt.toArray(e)))return n=Ct(n),s.forEach((function(e,r){!bt.isUndefined(e)&&null!==e&&t.append(!0===i?Nt([n],r,a):null===i?n:n+"[]",l(e))})),!1;return!!Et(e)||(t.append(Nt(o,n,a),l(e)),!1)}const u=[],d=Object.assign(jt,{defaultVisitor:c,convertValue:l,isVisitable:Et});if(!bt.isObject(e))throw new TypeError("data must be an object");return function e(n,r){if(!bt.isUndefined(n)){if(-1!==u.indexOf(n))throw Error("Circular reference detected in "+r.join("."));u.push(n),bt.forEach(n,(function(n,a){!0===(!(bt.isUndefined(n)||null===n)&&o.call(t,n,bt.isString(a)?a.trim():a,r,d))&&e(n,r?r.concat(a):[a])})),u.pop()}}(e),t};function Pt(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Tt(e,t){this._pairs=[],e&&Dt(e,this,t)}const _t=Tt.prototype;_t.append=function(e,t){this._pairs.push([e,t])},_t.toString=function(e){const t=e?function(t){return e.call(this,t,Pt)}:Pt;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};const Ot=Tt;function Mt(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Rt(e,t,n){if(!t)return e;const r=n&&n.encode||Mt;bt.isFunction(n)&&(n={serialize:n});const o=n&&n.serialize;let a;if(a=o?o(t,n):bt.isURLSearchParams(t)?t.toString():new Ot(t,n).toString(r),a){const t=e.indexOf("#");-1!==t&&(e=e.slice(0,t)),e+=(-1===e.indexOf("?")?"?":"&")+a}return e}const At=class{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!n&&n.synchronous,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){bt.forEach(this.handlers,(function(t){null!==t&&e(t)}))}},Lt={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},It={isBrowser:!0,classes:{URLSearchParams:"undefined"!==typeof URLSearchParams?URLSearchParams:Ot,FormData:"undefined"!==typeof FormData?FormData:null,Blob:"undefined"!==typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},Ft="undefined"!==typeof window&&"undefined"!==typeof document,zt="object"===typeof navigator&&navigator||void 0,Bt=Ft&&(!zt||["ReactNative","NativeScript","NS"].indexOf(zt.product)<0),Ht="undefined"!==typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"===typeof self.importScripts,Ut=Ft&&window.location.href||"http://localhost",Yt=_e(_e({},e),It);const Wt=function(e){function t(e,n,r,o){let a=e[o++];if("__proto__"===a)return!0;const i=Number.isFinite(+a),s=o>=e.length;if(a=!a&&bt.isArray(r)?r.length:a,s)return bt.hasOwnProp(r,a)?r[a]=[r[a],n]:r[a]=n,!i;r[a]&&bt.isObject(r[a])||(r[a]=[]);return t(e,n,r[a],o)&&bt.isArray(r[a])&&(r[a]=function(e){const t={},n=Object.keys(e);let r;const o=n.length;let a;for(r=0;r<o;r++)a=n[r],t[a]=e[a];return t}(r[a])),!i}if(bt.isFormData(e)&&bt.isFunction(e.entries)){const n={};return bt.forEachEntry(e,((e,r)=>{t(function(e){return bt.matchAll(/\w+|\[(\w*)]/g,e).map((e=>"[]"===e[0]?"":e[1]||e[0]))}(e),r,n,0)})),n}return null};const qt={transitional:Lt,adapter:["xhr","http","fetch"],transformRequest:[function(e,t){const n=t.getContentType()||"",r=n.indexOf("application/json")>-1,o=bt.isObject(e);o&&bt.isHTMLForm(e)&&(e=new FormData(e));if(bt.isFormData(e))return r?JSON.stringify(Wt(e)):e;if(bt.isArrayBuffer(e)||bt.isBuffer(e)||bt.isStream(e)||bt.isFile(e)||bt.isBlob(e)||bt.isReadableStream(e))return e;if(bt.isArrayBufferView(e))return e.buffer;if(bt.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let a;if(o){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Dt(e,new Yt.classes.URLSearchParams,Object.assign({visitor:function(e,t,n,r){return Yt.isNode&&bt.isBuffer(e)?(this.append(t,e.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((a=bt.isFileList(e))||n.indexOf("multipart/form-data")>-1){const t=this.env&&this.env.FormData;return Dt(a?{"files[]":e}:e,t&&new t,this.formSerializer)}}return o||r?(t.setContentType("application/json",!1),function(e,t,n){if(bt.isString(e))try{return(t||JSON.parse)(e),bt.trim(e)}catch(Dy){if("SyntaxError"!==Dy.name)throw Dy}return(n||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){const t=this.transitional||qt.transitional,n=t&&t.forcedJSONParsing,r="json"===this.responseType;if(bt.isResponse(e)||bt.isReadableStream(e))return e;if(e&&bt.isString(e)&&(n&&!this.responseType||r)){const n=!(t&&t.silentJSONParsing)&&r;try{return JSON.parse(e)}catch(Dy){if(n){if("SyntaxError"===Dy.name)throw St.from(Dy,St.ERR_BAD_RESPONSE,this,null,this.response);throw Dy}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Yt.classes.FormData,Blob:Yt.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};bt.forEach(["delete","get","head","post","put","patch"],(e=>{qt.headers[e]={}}));const Vt=qt,Qt=bt.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Kt=Symbol("internals");function $t(e){return e&&String(e).trim().toLowerCase()}function Gt(e){return!1===e||null==e?e:bt.isArray(e)?e.map(Gt):String(e)}function Xt(e,t,n,r,o){return bt.isFunction(r)?r.call(this,t,n):(o&&(t=n),bt.isString(t)?bt.isString(r)?-1!==t.indexOf(r):bt.isRegExp(r)?r.test(t):void 0:void 0)}class Jt{constructor(e){e&&this.set(e)}set(e,t,n){const r=this;function o(e,t,n){const o=$t(t);if(!o)throw new Error("header name must be a non-empty string");const a=bt.findKey(r,o);(!a||void 0===r[a]||!0===n||void 0===n&&!1!==r[a])&&(r[a||t]=Gt(e))}const a=(e,t)=>bt.forEach(e,((e,n)=>o(e,n,t)));if(bt.isPlainObject(e)||e instanceof this.constructor)a(e,t);else if(bt.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))a((e=>{const t={};let n,r,o;return e&&e.split("\n").forEach((function(e){o=e.indexOf(":"),n=e.substring(0,o).trim().toLowerCase(),r=e.substring(o+1).trim(),!n||t[n]&&Qt[n]||("set-cookie"===n?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)})),t})(e),t);else if(bt.isObject(e)&&bt.isIterable(e)){let n,r,o={};for(const t of e){if(!bt.isArray(t))throw TypeError("Object iterator must return a key-value pair");o[r=t[0]]=(n=o[r])?bt.isArray(n)?[...n,t[1]]:[n,t[1]]:t[1]}a(o,t)}else null!=e&&o(t,e,n);return this}get(e,t){if(e=$t(e)){const n=bt.findKey(this,e);if(n){const e=this[n];if(!t)return e;if(!0===t)return function(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}(e);if(bt.isFunction(t))return t.call(this,e,n);if(bt.isRegExp(t))return t.exec(e);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,t){if(e=$t(e)){const n=bt.findKey(this,e);return!(!n||void 0===this[n]||t&&!Xt(0,this[n],n,t))}return!1}delete(e,t){const n=this;let r=!1;function o(e){if(e=$t(e)){const o=bt.findKey(n,e);!o||t&&!Xt(0,n[o],o,t)||(delete n[o],r=!0)}}return bt.isArray(e)?e.forEach(o):o(e),r}clear(e){const t=Object.keys(this);let n=t.length,r=!1;for(;n--;){const o=t[n];e&&!Xt(0,this[o],o,e,!0)||(delete this[o],r=!0)}return r}normalize(e){const t=this,n={};return bt.forEach(this,((r,o)=>{const a=bt.findKey(n,o);if(a)return t[a]=Gt(r),void delete t[o];const i=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,((e,t,n)=>t.toUpperCase()+n))}(o):String(o).trim();i!==o&&delete t[o],t[i]=Gt(r),n[i]=!0})),this}concat(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return this.constructor.concat(this,...t)}toJSON(e){const t=Object.create(null);return bt.forEach(this,((n,r)=>{null!=n&&!1!==n&&(t[r]=e&&bt.isArray(n)?n.join(", "):n)})),t}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map((e=>{let[t,n]=e;return t+": "+n})).join("\n")}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e){const t=new this(e);for(var n=arguments.length,r=new Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];return r.forEach((e=>t.set(e))),t}static accessor(e){const t=(this[Kt]=this[Kt]={accessors:{}}).accessors,n=this.prototype;function r(e){const r=$t(e);t[r]||(!function(e,t){const n=bt.toCamelCase(" "+t);["get","set","has"].forEach((r=>{Object.defineProperty(e,r+n,{value:function(e,n,o){return this[r].call(this,t,e,n,o)},configurable:!0})}))}(n,e),t[r]=!0)}return bt.isArray(e)?e.forEach(r):r(e),this}}Jt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),bt.reduceDescriptors(Jt.prototype,((e,t)=>{let{value:n}=e,r=t[0].toUpperCase()+t.slice(1);return{get:()=>n,set(e){this[r]=e}}})),bt.freezeMethods(Jt);const Zt=Jt;function en(e,t){const n=this||Vt,r=t||n,o=Zt.from(r.headers);let a=r.data;return bt.forEach(e,(function(e){a=e.call(n,a,o.normalize(),t?t.status:void 0)})),o.normalize(),a}function tn(e){return!(!e||!e.__CANCEL__)}function nn(e,t,n){St.call(this,null==e?"canceled":e,St.ERR_CANCELED,t,n),this.name="CanceledError"}bt.inherits(nn,St,{__CANCEL__:!0});const rn=nn;function on(e,t,n){const r=n.config.validateStatus;n.status&&r&&!r(n.status)?t(new St("Request failed with status code "+n.status,[St.ERR_BAD_REQUEST,St.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n)):e(n)}const an=function(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o,a=0,i=0;return t=void 0!==t?t:1e3,function(s){const l=Date.now(),c=r[i];o||(o=l),n[a]=s,r[a]=l;let u=i,d=0;for(;u!==a;)d+=n[u++],u%=e;if(a=(a+1)%e,a===i&&(i=(i+1)%e),l-o<t)return;const f=c&&l-c;return f?Math.round(1e3*d/f):void 0}};const sn=function(e,t){let n,r,o=0,a=1e3/t;const i=function(t){let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now();o=a,n=null,r&&(clearTimeout(r),r=null),e.apply(null,t)};return[function(){const e=Date.now(),t=e-o;for(var s=arguments.length,l=new Array(s),c=0;c<s;c++)l[c]=arguments[c];t>=a?i(l,e):(n=l,r||(r=setTimeout((()=>{r=null,i(n)}),a-t)))},()=>n&&i(n)]},ln=function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,r=0;const o=an(50,250);return sn((n=>{const a=n.loaded,i=n.lengthComputable?n.total:void 0,s=a-r,l=o(s);r=a;e({loaded:a,total:i,progress:i?a/i:void 0,bytes:s,rate:l||void 0,estimated:l&&i&&a<=i?(i-a)/l:void 0,event:n,lengthComputable:null!=i,[t?"download":"upload"]:!0})}),n)},cn=(e,t)=>{const n=null!=e;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},un=e=>function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return bt.asap((()=>e(...n)))},dn=Yt.hasStandardBrowserEnv?((e,t)=>n=>(n=new URL(n,Yt.origin),e.protocol===n.protocol&&e.host===n.host&&(t||e.port===n.port)))(new URL(Yt.origin),Yt.navigator&&/(msie|trident)/i.test(Yt.navigator.userAgent)):()=>!0,fn=Yt.hasStandardBrowserEnv?{write(e,t,n,r,o,a){const i=[e+"="+encodeURIComponent(t)];bt.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),bt.isString(r)&&i.push("path="+r),bt.isString(o)&&i.push("domain="+o),!0===a&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read:()=>null,remove(){}};function pn(e,t,n){let r=!/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t);return e&&(r||0==n)?function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}(e,t):t}const hn=e=>e instanceof Zt?_e({},e):e;function mn(e,t){t=t||{};const n={};function r(e,t,n,r){return bt.isPlainObject(e)&&bt.isPlainObject(t)?bt.merge.call({caseless:r},e,t):bt.isPlainObject(t)?bt.merge({},t):bt.isArray(t)?t.slice():t}function o(e,t,n,o){return bt.isUndefined(t)?bt.isUndefined(e)?void 0:r(void 0,e,0,o):r(e,t,0,o)}function a(e,t){if(!bt.isUndefined(t))return r(void 0,t)}function i(e,t){return bt.isUndefined(t)?bt.isUndefined(e)?void 0:r(void 0,e):r(void 0,t)}function s(n,o,a){return a in t?r(n,o):a in e?r(void 0,n):void 0}const l={url:a,method:a,data:a,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:s,headers:(e,t,n)=>o(hn(e),hn(t),0,!0)};return bt.forEach(Object.keys(Object.assign({},e,t)),(function(r){const a=l[r]||o,i=a(e[r],t[r],r);bt.isUndefined(i)&&a!==s||(n[r]=i)})),n}const vn=e=>{const t=mn({},e);let n,{data:r,withXSRFToken:o,xsrfHeaderName:a,xsrfCookieName:i,headers:s,auth:l}=t;if(t.headers=s=Zt.from(s),t.url=Rt(pn(t.baseURL,t.url,t.allowAbsoluteUrls),e.params,e.paramsSerializer),l&&s.set("Authorization","Basic "+btoa((l.username||"")+":"+(l.password?unescape(encodeURIComponent(l.password)):""))),bt.isFormData(r))if(Yt.hasStandardBrowserEnv||Yt.hasStandardBrowserWebWorkerEnv)s.setContentType(void 0);else if(!1!==(n=s.getContentType())){const[e,...t]=n?n.split(";").map((e=>e.trim())).filter(Boolean):[];s.setContentType([e||"multipart/form-data",...t].join("; "))}if(Yt.hasStandardBrowserEnv&&(o&&bt.isFunction(o)&&(o=o(t)),o||!1!==o&&dn(t.url))){const e=a&&i&&fn.read(i);e&&s.set(a,e)}return t},gn="undefined"!==typeof XMLHttpRequest&&function(e){return new Promise((function(t,n){const r=vn(e);let o=r.data;const a=Zt.from(r.headers).normalize();let i,s,l,c,u,{responseType:d,onUploadProgress:f,onDownloadProgress:p}=r;function h(){c&&c(),u&&u(),r.cancelToken&&r.cancelToken.unsubscribe(i),r.signal&&r.signal.removeEventListener("abort",i)}let m=new XMLHttpRequest;function v(){if(!m)return;const r=Zt.from("getAllResponseHeaders"in m&&m.getAllResponseHeaders());on((function(e){t(e),h()}),(function(e){n(e),h()}),{data:d&&"text"!==d&&"json"!==d?m.response:m.responseText,status:m.status,statusText:m.statusText,headers:r,config:e,request:m}),m=null}m.open(r.method.toUpperCase(),r.url,!0),m.timeout=r.timeout,"onloadend"in m?m.onloadend=v:m.onreadystatechange=function(){m&&4===m.readyState&&(0!==m.status||m.responseURL&&0===m.responseURL.indexOf("file:"))&&setTimeout(v)},m.onabort=function(){m&&(n(new St("Request aborted",St.ECONNABORTED,e,m)),m=null)},m.onerror=function(){n(new St("Network Error",St.ERR_NETWORK,e,m)),m=null},m.ontimeout=function(){let t=r.timeout?"timeout of "+r.timeout+"ms exceeded":"timeout exceeded";const o=r.transitional||Lt;r.timeoutErrorMessage&&(t=r.timeoutErrorMessage),n(new St(t,o.clarifyTimeoutError?St.ETIMEDOUT:St.ECONNABORTED,e,m)),m=null},void 0===o&&a.setContentType(null),"setRequestHeader"in m&&bt.forEach(a.toJSON(),(function(e,t){m.setRequestHeader(t,e)})),bt.isUndefined(r.withCredentials)||(m.withCredentials=!!r.withCredentials),d&&"json"!==d&&(m.responseType=r.responseType),p&&([l,u]=ln(p,!0),m.addEventListener("progress",l)),f&&m.upload&&([s,c]=ln(f),m.upload.addEventListener("progress",s),m.upload.addEventListener("loadend",c)),(r.cancelToken||r.signal)&&(i=t=>{m&&(n(!t||t.type?new rn(null,e,m):t),m.abort(),m=null)},r.cancelToken&&r.cancelToken.subscribe(i),r.signal&&(r.signal.aborted?i():r.signal.addEventListener("abort",i)));const g=function(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}(r.url);g&&-1===Yt.protocols.indexOf(g)?n(new St("Unsupported protocol "+g+":",St.ERR_BAD_REQUEST,e)):m.send(o||null)}))},yn=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let n,r=new AbortController;const o=function(e){if(!n){n=!0,i();const t=e instanceof Error?e:this.reason;r.abort(t instanceof St?t:new rn(t instanceof Error?t.message:t))}};let a=t&&setTimeout((()=>{a=null,o(new St("timeout ".concat(t," of ms exceeded"),St.ETIMEDOUT))}),t);const i=()=>{e&&(a&&clearTimeout(a),a=null,e.forEach((e=>{e.unsubscribe?e.unsubscribe(o):e.removeEventListener("abort",o)})),e=null)};e.forEach((e=>e.addEventListener("abort",o)));const{signal:s}=r;return s.unsubscribe=()=>bt.asap(i),s}};function bn(e,t){this.v=e,this.k=t}function wn(e){return function(){return new xn(e.apply(this,arguments))}}function xn(e){var t,n;function r(t,n){try{var a=e[t](n),i=a.value,s=i instanceof bn;Promise.resolve(s?i.v:i).then((function(n){if(s){var l="return"===t?"return":"next";if(!i.k||n.done)return r(l,n);n=e[l](n).value}o(a.done?"return":"normal",n)}),(function(e){r("throw",e)}))}catch(e){o("throw",e)}}function o(e,o){switch(e){case"return":t.resolve({value:o,done:!0});break;case"throw":t.reject(o);break;default:t.resolve({value:o,done:!1})}(t=t.next)?r(t.key,t.arg):n=null}this._invoke=function(e,o){return new Promise((function(a,i){var s={key:e,arg:o,resolve:a,reject:i,next:null};n?n=n.next=s:(t=n=s,r(e,o))}))},"function"!=typeof e.return&&(this.return=void 0)}function kn(e){return new bn(e,0)}function Sn(e){var t={},n=!1;function r(t,r){return n=!0,r=new Promise((function(n){n(e[t](r))})),{done:!1,value:new bn(r,1)}}return t["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},t.next=function(e){return n?(n=!1,e):r("next",e)},"function"==typeof e.throw&&(t.throw=function(e){if(n)throw n=!1,e;return r("throw",e)}),"function"==typeof e.return&&(t.return=function(e){return n?(n=!1,e):r("return",e)}),t}function En(e){var t,n,r,o=2;for("undefined"!=typeof Symbol&&(n=Symbol.asyncIterator,r=Symbol.iterator);o--;){if(n&&null!=(t=e[n]))return t.call(e);if(r&&null!=(t=e[r]))return new Cn(t.call(e));n="@@asyncIterator",r="@@iterator"}throw new TypeError("Object is not async iterable")}function Cn(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return Cn=function(e){this.s=e,this.n=e.next},Cn.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var n=this.s.return;return void 0===n?Promise.resolve({value:e,done:!0}):t(n.apply(this.s,arguments))},throw:function(e){var n=this.s.return;return void 0===n?Promise.reject(e):t(n.apply(this.s,arguments))}},new Cn(e)}xn.prototype["function"==typeof Symbol&&Symbol.asyncIterator||"@@asyncIterator"]=function(){return this},xn.prototype.next=function(e){return this._invoke("next",e)},xn.prototype.throw=function(e){return this._invoke("throw",e)},xn.prototype.return=function(e){return this._invoke("return",e)};const Nn=function*(e,t){let n=e.byteLength;if(!t||n<t)return void(yield e);let r,o=0;for(;o<n;)r=o+t,yield e.slice(o,r),o=r},jn=function(){var e=wn((function*(e,t){var n,r=!1,o=!1;try{for(var a,i=En(Dn(e));r=!(a=yield kn(i.next())).done;r=!1){const e=a.value;yield*Sn(En(Nn(e,t)))}}catch(s){o=!0,n=s}finally{try{r&&null!=i.return&&(yield kn(i.return()))}finally{if(o)throw n}}}));return function(t,n){return e.apply(this,arguments)}}(),Dn=function(){var e=wn((function*(e){if(e[Symbol.asyncIterator])return void(yield*Sn(En(e)));const t=e.getReader();try{for(;;){const{done:e,value:n}=yield kn(t.read());if(e)break;yield n}}finally{yield kn(t.cancel())}}));return function(t){return e.apply(this,arguments)}}(),Pn=(e,t,n,r)=>{const o=jn(e,t);let a,i=0,s=e=>{a||(a=!0,r&&r(e))};return new ReadableStream({async pull(e){try{const{done:t,value:r}=await o.next();if(t)return s(),void e.close();let a=r.byteLength;if(n){let e=i+=a;n(e)}e.enqueue(new Uint8Array(r))}catch(t){throw s(t),t}},cancel:e=>(s(e),o.return())},{highWaterMark:2})},Tn="function"===typeof fetch&&"function"===typeof Request&&"function"===typeof Response,_n=Tn&&"function"===typeof ReadableStream,On=Tn&&("function"===typeof TextEncoder?(Mn=new TextEncoder,e=>Mn.encode(e)):async e=>new Uint8Array(await new Response(e).arrayBuffer()));var Mn;const Rn=function(e){try{for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return!!e(...n)}catch(Dy){return!1}},An=_n&&Rn((()=>{let e=!1;const t=new Request(Yt.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})),Ln=_n&&Rn((()=>bt.isReadableStream(new Response("").body))),In={stream:Ln&&(e=>e.body)};var Fn;Tn&&(Fn=new Response,["text","arrayBuffer","blob","formData","stream"].forEach((e=>{!In[e]&&(In[e]=bt.isFunction(Fn[e])?t=>t[e]():(t,n)=>{throw new St("Response type '".concat(e,"' is not supported"),St.ERR_NOT_SUPPORT,n)})})));const zn=async(e,t)=>{const n=bt.toFiniteNumber(e.getContentLength());return null==n?(async e=>{if(null==e)return 0;if(bt.isBlob(e))return e.size;if(bt.isSpecCompliantForm(e)){const t=new Request(Yt.origin,{method:"POST",body:e});return(await t.arrayBuffer()).byteLength}return bt.isArrayBufferView(e)||bt.isArrayBuffer(e)?e.byteLength:(bt.isURLSearchParams(e)&&(e+=""),bt.isString(e)?(await On(e)).byteLength:void 0)})(t):n},Bn=Tn&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:a,timeout:i,onDownloadProgress:s,onUploadProgress:l,responseType:c,headers:u,withCredentials:d="same-origin",fetchOptions:f}=vn(e);c=c?(c+"").toLowerCase():"text";let p,h=yn([o,a&&a.toAbortSignal()],i);const m=h&&h.unsubscribe&&(()=>{h.unsubscribe()});let v;try{if(l&&An&&"get"!==n&&"head"!==n&&0!==(v=await zn(u,r))){let e,n=new Request(t,{method:"POST",body:r,duplex:"half"});if(bt.isFormData(r)&&(e=n.headers.get("content-type"))&&u.setContentType(e),n.body){const[e,t]=cn(v,ln(un(l)));r=Pn(n.body,65536,e,t)}}bt.isString(d)||(d=d?"include":"omit");const o="credentials"in Request.prototype;p=new Request(t,_e(_e({},f),{},{signal:h,method:n.toUpperCase(),headers:u.normalize().toJSON(),body:r,duplex:"half",credentials:o?d:void 0}));let a=await fetch(p);const i=Ln&&("stream"===c||"response"===c);if(Ln&&(s||i&&m)){const e={};["status","statusText","headers"].forEach((t=>{e[t]=a[t]}));const t=bt.toFiniteNumber(a.headers.get("content-length")),[n,r]=s&&cn(t,ln(un(s),!0))||[];a=new Response(Pn(a.body,65536,n,(()=>{r&&r(),m&&m()})),e)}c=c||"text";let g=await In[bt.findKey(In,c)||"text"](a,e);return!i&&m&&m(),await new Promise(((t,n)=>{on(t,n,{data:g,headers:Zt.from(a.headers),status:a.status,statusText:a.statusText,config:e,request:p})}))}catch(g){if(m&&m(),g&&"TypeError"===g.name&&/Load failed|fetch/i.test(g.message))throw Object.assign(new St("Network Error",St.ERR_NETWORK,e,p),{cause:g.cause||g});throw St.from(g,g&&g.code,e,p)}}),Hn={http:null,xhr:gn,fetch:Bn};bt.forEach(Hn,((e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch(Dy){}Object.defineProperty(e,"adapterName",{value:t})}}));const Un=e=>"- ".concat(e),Yn=e=>bt.isFunction(e)||null===e||!1===e,Wn=e=>{e=bt.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let a=0;a<t;a++){let t;if(n=e[a],r=n,!Yn(n)&&(r=Hn[(t=String(n)).toLowerCase()],void 0===r))throw new St("Unknown adapter '".concat(t,"'"));if(r)break;o[t||"#"+a]=r}if(!r){const e=Object.entries(o).map((e=>{let[t,n]=e;return"adapter ".concat(t," ")+(!1===n?"is not supported by the environment":"is not available in the build")}));let n=t?e.length>1?"since :\n"+e.map(Un).join("\n"):" "+Un(e[0]):"as no adapter specified";throw new St("There is no suitable adapter to dispatch the request "+n,"ERR_NOT_SUPPORT")}return r};function qn(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new rn(null,e)}function Vn(e){qn(e),e.headers=Zt.from(e.headers),e.data=en.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1);return Wn(e.adapter||Vt.adapter)(e).then((function(t){return qn(e),t.data=en.call(e,e.transformResponse,t),t.headers=Zt.from(t.headers),t}),(function(t){return tn(t)||(qn(e),t&&t.response&&(t.response.data=en.call(e,e.transformResponse,t.response),t.response.headers=Zt.from(t.response.headers))),Promise.reject(t)}))}const Qn="1.9.0",Kn={};["object","boolean","number","function","string","symbol"].forEach(((e,t)=>{Kn[e]=function(n){return typeof n===e||"a"+(t<1?"n ":" ")+e}}));const $n={};Kn.transitional=function(e,t,n){function r(e,t){return"[Axios v1.9.0] Transitional option '"+e+"'"+t+(n?". "+n:"")}return(n,o,a)=>{if(!1===e)throw new St(r(o," has been removed"+(t?" in "+t:"")),St.ERR_DEPRECATED);return t&&!$n[o]&&($n[o]=!0,console.warn(r(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(n,o,a)}},Kn.spelling=function(e){return(t,n)=>(console.warn("".concat(n," is likely a misspelling of ").concat(e)),!0)};const Gn={assertOptions:function(e,t,n){if("object"!==typeof e)throw new St("options must be an object",St.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const a=r[o],i=t[a];if(i){const t=e[a],n=void 0===t||i(t,a,e);if(!0!==n)throw new St("option "+a+" must be "+n,St.ERR_BAD_OPTION_VALUE)}else if(!0!==n)throw new St("Unknown option "+a,St.ERR_BAD_OPTION)}},validators:Kn},Xn=Gn.validators;class Jn{constructor(e){this.defaults=e||{},this.interceptors={request:new At,response:new At}}async request(e,t){try{return await this._request(e,t)}catch(n){if(n instanceof Error){let e={};Error.captureStackTrace?Error.captureStackTrace(e):e=new Error;const t=e.stack?e.stack.replace(/^.+\n/,""):"";try{n.stack?t&&!String(n.stack).endsWith(t.replace(/^.+\n.+\n/,""))&&(n.stack+="\n"+t):n.stack=t}catch(Dy){}}throw n}}_request(e,t){"string"===typeof e?(t=t||{}).url=e:t=e||{},t=mn(this.defaults,t);const{transitional:n,paramsSerializer:r,headers:o}=t;void 0!==n&&Gn.assertOptions(n,{silentJSONParsing:Xn.transitional(Xn.boolean),forcedJSONParsing:Xn.transitional(Xn.boolean),clarifyTimeoutError:Xn.transitional(Xn.boolean)},!1),null!=r&&(bt.isFunction(r)?t.paramsSerializer={serialize:r}:Gn.assertOptions(r,{encode:Xn.function,serialize:Xn.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),Gn.assertOptions(t,{baseUrl:Xn.spelling("baseURL"),withXsrfToken:Xn.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();let a=o&&bt.merge(o.common,o[t.method]);o&&bt.forEach(["delete","get","head","post","put","patch","common"],(e=>{delete o[e]})),t.headers=Zt.concat(a,o);const i=[];let s=!0;this.interceptors.request.forEach((function(e){"function"===typeof e.runWhen&&!1===e.runWhen(t)||(s=s&&e.synchronous,i.unshift(e.fulfilled,e.rejected))}));const l=[];let c;this.interceptors.response.forEach((function(e){l.push(e.fulfilled,e.rejected)}));let u,d=0;if(!s){const e=[Vn.bind(this),void 0];for(e.unshift.apply(e,i),e.push.apply(e,l),u=e.length,c=Promise.resolve(t);d<u;)c=c.then(e[d++],e[d++]);return c}u=i.length;let f=t;for(d=0;d<u;){const e=i[d++],t=i[d++];try{f=e(f)}catch(p){t.call(this,p);break}}try{c=Vn.call(this,f)}catch(p){return Promise.reject(p)}for(d=0,u=l.length;d<u;)c=c.then(l[d++],l[d++]);return c}getUri(e){return Rt(pn((e=mn(this.defaults,e)).baseURL,e.url,e.allowAbsoluteUrls),e.params,e.paramsSerializer)}}bt.forEach(["delete","get","head","options"],(function(e){Jn.prototype[e]=function(t,n){return this.request(mn(n||{},{method:e,url:t,data:(n||{}).data}))}})),bt.forEach(["post","put","patch"],(function(e){function t(t){return function(n,r,o){return this.request(mn(o||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:n,data:r}))}}Jn.prototype[e]=t(),Jn.prototype[e+"Form"]=t(!0)}));const Zn=Jn;class er{constructor(e){if("function"!==typeof e)throw new TypeError("executor must be a function.");let t;this.promise=new Promise((function(e){t=e}));const n=this;this.promise.then((e=>{if(!n._listeners)return;let t=n._listeners.length;for(;t-- >0;)n._listeners[t](e);n._listeners=null})),this.promise.then=e=>{let t;const r=new Promise((e=>{n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},e((function(e,r,o){n.reason||(n.reason=new rn(e,r,o),t(n.reason))}))}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=t=>{e.abort(t)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new er((function(t){e=t})),cancel:e}}}const tr=er;const nr={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(nr).forEach((e=>{let[t,n]=e;nr[n]=t}));const rr=nr;const or=function e(t){const n=new Zn(t),r=Oe(Zn.prototype.request,n);return bt.extend(r,Zn.prototype,n,{allOwnKeys:!0}),bt.extend(r,n,null,{allOwnKeys:!0}),r.create=function(n){return e(mn(t,n))},r}(Vt);or.Axios=Zn,or.CanceledError=rn,or.CancelToken=tr,or.isCancel=tn,or.VERSION=Qn,or.toFormData=Dt,or.AxiosError=St,or.Cancel=or.CanceledError,or.all=function(e){return Promise.all(e)},or.spread=function(e){return function(t){return e.apply(null,t)}},or.isAxiosError=function(e){return bt.isObject(e)&&!0===e.isAxiosError},or.mergeConfig=mn,or.AxiosHeaders=Zt,or.formToJSON=e=>Wt(bt.isHTMLForm(e)?new FormData(e):e),or.getAdapter=Wn,or.HttpStatusCode=rr,or.default=or;const ar=or,ir=ar.create({baseURL:"http://localhost:8088",timeout:5e3});ir.interceptors.request.use((e=>{const t=localStorage.getItem("token");return t&&(e.headers.Authorization="Bearer ".concat(t)),e}));const sr=async()=>{try{const e=await ir.get("/user/userInfo");if(200===e.data.code)return e.data.data;throw new Error(e.data.message||"\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25")}catch(e){throw console.error("\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25:",e),e}};const lr=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:5;return ir.get("/torrent/search",{params:{keyword:e,page:t,size:n}})},cr=e=>ir.get("/help/posts/".concat(e)),ur=e=>ir.get("/request/posts/".concat(e));function dr(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function fr(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}function pr(e,t){if(e){if("string"==typeof e)return dr(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?dr(e,t):void 0}}function hr(e){return function(e){if(Array.isArray(e))return dr(e)}(e)||fr(e)||pr(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}const mr=r.createContext({}),vr="ant",gr="anticon",yr=r.createContext({getPrefixCls:(e,t)=>t||(e?"".concat(vr,"-").concat(e):vr),iconPrefixCls:gr}),{Consumer:br}=yr;function wr(e){if(Array.isArray(e))return e}function xr(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function kr(e,t){return wr(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,s=[],l=!0,c=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=a.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw o}}return s}}(e,t)||pr(e,t)||xr()}const Sr=function(e){for(var t,n=0,r=0,o=e.length;o>=4;++r,o-=4)t=1540483477*(65535&(t=255&e.charCodeAt(r)|(255&e.charCodeAt(++r))<<8|(255&e.charCodeAt(++r))<<16|(255&e.charCodeAt(++r))<<24))+(59797*(t>>>16)<<16),n=1540483477*(65535&(t^=t>>>24))+(59797*(t>>>16)<<16)^1540483477*(65535&n)+(59797*(n>>>16)<<16);switch(o){case 3:n^=(255&e.charCodeAt(r+2))<<16;case 2:n^=(255&e.charCodeAt(r+1))<<8;case 1:n=1540483477*(65535&(n^=255&e.charCodeAt(r)))+(59797*(n>>>16)<<16)}return(((n=1540483477*(65535&(n^=n>>>13))+(59797*(n>>>16)<<16))^n>>>15)>>>0).toString(36)};function Er(){return!("undefined"===typeof window||!window.document||!window.document.createElement)}var Cr="data-rc-order",Nr="data-rc-priority",jr=new Map;function Dr(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).mark;return e?e.startsWith("data-")?e:"data-".concat(e):"rc-util-key"}function Pr(e){return e.attachTo?e.attachTo:document.querySelector("head")||document.body}function Tr(e){return Array.from((jr.get(e)||e).children).filter((function(e){return"STYLE"===e.tagName}))}function _r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Er())return null;var n=t.csp,r=t.prepend,o=t.priority,a=void 0===o?0:o,i=function(e){return"queue"===e?"prependQueue":e?"prepend":"append"}(r),s="prependQueue"===i,l=document.createElement("style");l.setAttribute(Cr,i),s&&a&&l.setAttribute(Nr,"".concat(a)),null!==n&&void 0!==n&&n.nonce&&(l.nonce=null===n||void 0===n?void 0:n.nonce),l.innerHTML=e;var c=Pr(t),u=c.firstChild;if(r){if(s){var d=(t.styles||Tr(c)).filter((function(e){if(!["prepend","prependQueue"].includes(e.getAttribute(Cr)))return!1;var t=Number(e.getAttribute(Nr)||0);return a>=t}));if(d.length)return c.insertBefore(l,d[d.length-1].nextSibling),l}c.insertBefore(l,u)}else c.appendChild(l);return l}function Or(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Pr(t);return(t.styles||Tr(n)).find((function(n){return n.getAttribute(Dr(t))===e}))}function Mr(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Or(e,t);n&&Pr(t).removeChild(n)}function Rr(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=Pr(n),o=Tr(r),a=_e(_e({},n),{},{styles:o});!function(e,t){var n=jr.get(e);if(!n||!function(e,t){if(!e)return!1;if(e.contains)return e.contains(t);for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}(document,n)){var r=_r("",t),o=r.parentNode;jr.set(e,o),e.removeChild(r)}}(r,a);var i=Or(t,a);if(i){var s,l,c;if(null!==(s=a.csp)&&void 0!==s&&s.nonce&&i.nonce!==(null===(l=a.csp)||void 0===l?void 0:l.nonce))i.nonce=null===(c=a.csp)||void 0===c?void 0:c.nonce;return i.innerHTML!==e&&(i.innerHTML=e),i}var u=_r(e,a);return u.setAttribute(Dr(a),t),u}function Ar(e,t,n){var o=r.useRef({});return"value"in o.current&&!n(o.current.condition,t)||(o.current.value=e(),o.current.condition=t),o.current.value}var Lr={},Ir=[];function Fr(e,t){}function zr(e,t){}function Br(e,t,n){t||Lr[n]||(e(!1,n),Lr[n]=!0)}function Hr(e,t){Br(Fr,e,t)}Hr.preMessage=function(e){Ir.push(e)},Hr.resetWarned=function(){Lr={}},Hr.noteOnce=function(e,t){Br(zr,e,t)};const Ur=Hr;const Yr=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=new Set;return function e(t,o){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,i=r.has(t);if(Ur(!i,"Warning: There may be circular references"),i)return!1;if(t===o)return!0;if(n&&a>1)return!1;r.add(t);var s=a+1;if(Array.isArray(t)){if(!Array.isArray(o)||t.length!==o.length)return!1;for(var l=0;l<t.length;l++)if(!e(t[l],o[l],s))return!1;return!0}if(t&&o&&"object"===je(t)&&"object"===je(o)){var c=Object.keys(t);return c.length===Object.keys(o).length&&c.every((function(n){return e(t[n],o[n],s)}))}return!1}(e,t)};function Wr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function qr(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,De(r.key),r)}}function Vr(e,t,n){return t&&qr(e.prototype,t),n&&qr(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function Qr(e){return e.join("%")}var Kr=function(){function e(t){Wr(this,e),Pe(this,"instanceId",void 0),Pe(this,"cache",new Map),this.instanceId=t}return Vr(e,[{key:"get",value:function(e){return this.opGet(Qr(e))}},{key:"opGet",value:function(e){return this.cache.get(e)||null}},{key:"update",value:function(e,t){return this.opUpdate(Qr(e),t)}},{key:"opUpdate",value:function(e,t){var n=t(this.cache.get(e));null===n?this.cache.delete(e):this.cache.set(e,n)}}]),e}();const $r=Kr;var Gr="data-token-hash",Xr="data-css-hash",Jr="__cssinjs_instance__";function Zr(){var e=Math.random().toString(12).slice(2);if("undefined"!==typeof document&&document.head&&document.body){var t=document.body.querySelectorAll("style[".concat(Xr,"]"))||[],n=document.head.firstChild;Array.from(t).forEach((function(t){t[Jr]=t[Jr]||e,t[Jr]===e&&document.head.insertBefore(t,n)}));var r={};Array.from(document.querySelectorAll("style[".concat(Xr,"]"))).forEach((function(t){var n,o=t.getAttribute(Xr);r[o]?t[Jr]===e&&(null===(n=t.parentNode)||void 0===n||n.removeChild(t)):r[o]=!0}))}return new $r(e)}var eo=r.createContext({hashPriority:"low",cache:Zr(),defaultCache:!0});const to=eo;var no="CALC_UNIT";new RegExp(no,"g");var ro=function(){function e(){Wr(this,e),Pe(this,"cache",void 0),Pe(this,"keys",void 0),Pe(this,"cacheCallTimes",void 0),this.cache=new Map,this.keys=[],this.cacheCallTimes=0}return Vr(e,[{key:"size",value:function(){return this.keys.length}},{key:"internalGet",value:function(e){var t,n,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o={map:this.cache};return e.forEach((function(e){var t;o?o=null===(t=o)||void 0===t||null===(t=t.map)||void 0===t?void 0:t.get(e):o=void 0})),null!==(t=o)&&void 0!==t&&t.value&&r&&(o.value[1]=this.cacheCallTimes++),null===(n=o)||void 0===n?void 0:n.value}},{key:"get",value:function(e){var t;return null===(t=this.internalGet(e,!0))||void 0===t?void 0:t[0]}},{key:"has",value:function(e){return!!this.internalGet(e)}},{key:"set",value:function(t,n){var r=this;if(!this.has(t)){if(this.size()+1>e.MAX_CACHE_SIZE+e.MAX_CACHE_OFFSET){var o=this.keys.reduce((function(e,t){var n=kr(e,2)[1];return r.internalGet(t)[1]<n?[t,r.internalGet(t)[1]]:e}),[this.keys[0],this.cacheCallTimes]),a=kr(o,1)[0];this.delete(a)}this.keys.push(t)}var i=this.cache;t.forEach((function(e,o){if(o===t.length-1)i.set(e,{value:[n,r.cacheCallTimes++]});else{var a=i.get(e);a?a.map||(a.map=new Map):i.set(e,{map:new Map}),i=i.get(e).map}}))}},{key:"deleteByPath",value:function(e,t){var n,r=e.get(t[0]);if(1===t.length)return r.map?e.set(t[0],{map:r.map}):e.delete(t[0]),null===(n=r.value)||void 0===n?void 0:n[0];var o=this.deleteByPath(r.map,t.slice(1));return r.map&&0!==r.map.size||r.value||e.delete(t[0]),o}},{key:"delete",value:function(e){if(this.has(e))return this.keys=this.keys.filter((function(t){return!function(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}(t,e)})),this.deleteByPath(this.cache,e)}}]),e}();Pe(ro,"MAX_CACHE_SIZE",20),Pe(ro,"MAX_CACHE_OFFSET",5);var oo=0,ao=function(){function e(t){Wr(this,e),Pe(this,"derivatives",void 0),Pe(this,"id",void 0),this.derivatives=Array.isArray(t)?t:[t],this.id=oo,0===t.length&&t.length,oo+=1}return Vr(e,[{key:"getDerivativeToken",value:function(e){return this.derivatives.reduce((function(t,n){return n(e,t)}),void 0)}}]),e}(),io=new ro;function so(e){var t=Array.isArray(e)?e:[e];return io.has(t)||io.set(t,new ao(t)),io.get(t)}var lo=new WeakMap,co={};var uo=new WeakMap;function fo(e){var t=uo.get(e)||"";return t||(Object.keys(e).forEach((function(n){var r=e[n];t+=n,r instanceof ao?t+=r.id:r&&"object"===je(r)?t+=fo(r):t+=r})),t=Sr(t),uo.set(e,t)),t}function po(e,t){return Sr("".concat(t,"_").concat(fo(e)))}"random-".concat(Date.now(),"-").concat(Math.random()).replace(/\./g,"");var ho=Er();function mo(e){return"number"===typeof e?"".concat(e,"px"):e}function vo(e,t,n){var r;if(arguments.length>4&&void 0!==arguments[4]&&arguments[4])return e;var o=_e(_e({},arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}),{},(Pe(r={},Gr,t),Pe(r,Xr,n),r)),a=Object.keys(o).map((function(e){var t=o[e];return t?"".concat(e,'="').concat(t,'"'):null})).filter((function(e){return e})).join(" ");return"<style ".concat(a,">").concat(e,"</style>")}var go=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"--".concat(t?"".concat(t,"-"):"").concat(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z0-9]+)/g,"$1-$2").replace(/([a-z])([A-Z0-9])/g,"$1-$2").toLowerCase()},yo=function(e,t,n){return Object.keys(e).length?".".concat(t).concat(null!==n&&void 0!==n&&n.scope?".".concat(n.scope):"","{").concat(Object.entries(e).map((function(e){var t=kr(e,2),n=t[0],r=t[1];return"".concat(n,":").concat(r,";")})).join(""),"}"):""},bo=function(e,t,n){var r={},o={};return Object.entries(e).forEach((function(e){var t,a,i=kr(e,2),s=i[0],l=i[1];if(null!==n&&void 0!==n&&null!==(t=n.preserve)&&void 0!==t&&t[s])o[s]=l;else if(("string"===typeof l||"number"===typeof l)&&(null===n||void 0===n||null===(a=n.ignore)||void 0===a||!a[s])){var c,u=go(s,null===n||void 0===n?void 0:n.prefix);r[u]="number"!==typeof l||null!==n&&void 0!==n&&null!==(c=n.unitless)&&void 0!==c&&c[s]?String(l):"".concat(l,"px"),o[s]="var(".concat(u,")")}})),[o,yo(r,t,{scope:null===n||void 0===n?void 0:n.scope})]},wo=Er()?r.useLayoutEffect:r.useEffect,xo=function(e,t){var n=r.useRef(!0);wo((function(){return e(n.current)}),t),wo((function(){return n.current=!1,function(){n.current=!0}}),[])};const ko=xo;var So=_e({},o).useInsertionEffect;const Eo=So?function(e,t,n){return So((function(){return e(),t()}),n)}:function(e,t,n){r.useMemo(e,n),ko((function(){return t(!0)}),n)};const Co="undefined"!==typeof _e({},o).useInsertionEffect?function(e){var t=[],n=!1;return r.useEffect((function(){return n=!1,function(){n=!0,t.length&&t.forEach((function(e){return e()}))}}),e),function(e){n||t.push(e)}}:function(){return function(e){e()}};const No=function(){return!1};function jo(e,t,n,o,a){var i=r.useContext(to).cache,s=Qr([e].concat(hr(t))),l=Co([s]),c=(No(),function(e){i.opUpdate(s,(function(t){var r=kr(t||[void 0,void 0],2),o=r[0];var a=[void 0===o?0:o,r[1]||n()];return e?e(a):a}))});r.useMemo((function(){c()}),[s]);var u=i.opGet(s)[1];return Eo((function(){null===a||void 0===a||a(u)}),(function(e){return c((function(t){var n=kr(t,2),r=n[0],o=n[1];return e&&0===r&&(null===a||void 0===a||a(u)),[r+1,o]})),function(){i.opUpdate(s,(function(t){var n=kr(t||[],2),r=n[0],a=void 0===r?0:r,c=n[1];return 0===a-1?(l((function(){!e&&i.opGet(s)||null===o||void 0===o||o(c,!1)})),null):[a-1,c]}))}}),[s]),u}var Do={},Po=new Map;function To(e,t){Po.set(e,(Po.get(e)||0)-1);var n=Array.from(Po.keys()),r=n.filter((function(e){return(Po.get(e)||0)<=0}));n.length-r.length>0&&r.forEach((function(e){!function(e,t){"undefined"!==typeof document&&document.querySelectorAll("style[".concat(Gr,'="').concat(e,'"]')).forEach((function(e){var n;e[Jr]===t&&(null===(n=e.parentNode)||void 0===n||n.removeChild(e))}))}(e,t),Po.delete(e)}))}var _o="token";function Oo(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=(0,r.useContext)(to),a=o.cache.instanceId,i=o.container,s=n.salt,l=void 0===s?"":s,c=n.override,u=void 0===c?Do:c,d=n.formatToken,f=n.getComputedToken,p=n.cssVar,h=function(e,t){for(var n=lo,r=0;r<t.length;r+=1){var o=t[r];n.has(o)||n.set(o,new WeakMap),n=n.get(o)}return n.has(co)||n.set(co,e()),n.get(co)}((function(){return Object.assign.apply(Object,[{}].concat(hr(t)))}),t),m=fo(h),v=fo(u),g=p?fo(p):"",y=jo(_o,[l,e.id,m,v,g],(function(){var t,n=f?f(h,u,e):function(e,t,n,r){var o=_e(_e({},n.getDerivativeToken(e)),t);return r&&(o=r(o)),o}(h,u,e,d),r=_e({},n),o="";if(p){var a=kr(bo(n,p.key,{prefix:p.prefix,ignore:p.ignore,unitless:p.unitless,preserve:p.preserve}),2);n=a[0],o=a[1]}var i=po(n,l);n._tokenKey=i,r._tokenKey=po(r,l);var s=null!==(t=null===p||void 0===p?void 0:p.key)&&void 0!==t?t:i;n._themeKey=s,function(e){Po.set(e,(Po.get(e)||0)+1)}(s);var c="".concat("css","-").concat(Sr(i));return n._hashId=c,[n,c,r,o,(null===p||void 0===p?void 0:p.key)||""]}),(function(e){To(e[0]._themeKey,a)}),(function(e){var t=kr(e,4),n=t[0],r=t[3];if(p&&r){var o=Rr(r,Sr("css-variables-".concat(n._themeKey)),{mark:Xr,prepend:"queue",attachTo:i,priority:-999});o[Jr]=a,o.setAttribute(Gr,n._themeKey)}}));return y}function Mo(){return Mo=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Mo.apply(null,arguments)}const Ro={animationIterationCount:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1};var Ao="comm",Lo="rule",Io="decl",Fo=Math.abs,zo=String.fromCharCode;Object.assign;function Bo(e){return e.trim()}function Ho(e,t,n){return e.replace(t,n)}function Uo(e,t,n){return e.indexOf(t,n)}function Yo(e,t){return 0|e.charCodeAt(t)}function Wo(e,t,n){return e.slice(t,n)}function qo(e){return e.length}function Vo(e,t){return t.push(e),e}function Qo(e,t){for(var n="",r=0;r<e.length;r++)n+=t(e[r],r,e,t)||"";return n}function Ko(e,t,n,r){switch(e.type){case"@layer":if(e.children.length)break;case"@import":case"@namespace":case Io:return e.return=e.return||e.value;case Ao:return"";case"@keyframes":return e.return=e.value+"{"+Qo(e.children,r)+"}";case Lo:if(!qo(e.value=e.props.join(",")))return""}return qo(n=Qo(e.children,r))?e.return=e.value+"{"+n+"}":""}var $o=1,Go=1,Xo=0,Jo=0,Zo=0,ea="";function ta(e,t,n,r,o,a,i,s){return{value:e,root:t,parent:n,type:r,props:o,children:a,line:$o,column:Go,length:i,return:"",siblings:s}}function na(){return Zo=Jo>0?Yo(ea,--Jo):0,Go--,10===Zo&&(Go=1,$o--),Zo}function ra(){return Zo=Jo<Xo?Yo(ea,Jo++):0,Go++,10===Zo&&(Go=1,$o++),Zo}function oa(){return Yo(ea,Jo)}function aa(){return Jo}function ia(e,t){return Wo(ea,e,t)}function sa(e){switch(e){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function la(e){return $o=Go=1,Xo=qo(ea=e),Jo=0,[]}function ca(e){return ea="",e}function ua(e){return Bo(ia(Jo-1,pa(91===e?e+2:40===e?e+1:e)))}function da(e){for(;(Zo=oa())&&Zo<33;)ra();return sa(e)>2||sa(Zo)>3?"":" "}function fa(e,t){for(;--t&&ra()&&!(Zo<48||Zo>102||Zo>57&&Zo<65||Zo>70&&Zo<97););return ia(e,aa()+(t<6&&32==oa()&&32==ra()))}function pa(e){for(;ra();)switch(Zo){case e:return Jo;case 34:case 39:34!==e&&39!==e&&pa(Zo);break;case 40:41===e&&pa(e);break;case 92:ra()}return Jo}function ha(e,t){for(;ra()&&e+Zo!==57&&(e+Zo!==84||47!==oa()););return"/*"+ia(t,Jo-1)+"*"+zo(47===e?e:ra())}function ma(e){for(;!sa(oa());)ra();return ia(e,Jo)}function va(e){return ca(ga("",null,null,null,[""],e=la(e),0,[0],e))}function ga(e,t,n,r,o,a,i,s,l){for(var c=0,u=0,d=i,f=0,p=0,h=0,m=1,v=1,g=1,y=0,b="",w=o,x=a,k=r,S=b;v;)switch(h=y,y=ra()){case 40:if(108!=h&&58==Yo(S,d-1)){-1!=Uo(S+=Ho(ua(y),"&","&\f"),"&\f",Fo(c?s[c-1]:0))&&(g=-1);break}case 34:case 39:case 91:S+=ua(y);break;case 9:case 10:case 13:case 32:S+=da(h);break;case 92:S+=fa(aa()-1,7);continue;case 47:switch(oa()){case 42:case 47:Vo(ba(ha(ra(),aa()),t,n,l),l),5!=sa(h||1)&&5!=sa(oa()||1)||!qo(S)||" "===Wo(S,-1,void 0)||(S+=" ");break;default:S+="/"}break;case 123*m:s[c++]=qo(S)*g;case 125*m:case 59:case 0:switch(y){case 0:case 125:v=0;case 59+u:-1==g&&(S=Ho(S,/\f/g,"")),p>0&&(qo(S)-d||0===m&&47===h)&&Vo(p>32?wa(S+";",r,n,d-1,l):wa(Ho(S," ","")+";",r,n,d-2,l),l);break;case 59:S+=";";default:if(Vo(k=ya(S,t,n,c,u,o,s,b,w=[],x=[],d,a),a),123===y)if(0===u)ga(S,t,k,k,w,a,d,s,x);else{switch(f){case 99:if(110===Yo(S,3))break;case 108:if(97===Yo(S,2))break;default:u=0;case 100:case 109:case 115:}u?ga(e,k,k,r&&Vo(ya(e,k,k,0,0,o,s,b,o,w=[],d,x),x),o,x,d,s,r?w:x):ga(S,k,k,k,[""],x,0,s,x)}}c=u=p=0,m=g=1,b=S="",d=i;break;case 58:d=1+qo(S),p=h;default:if(m<1)if(123==y)--m;else if(125==y&&0==m++&&125==na())continue;switch(S+=zo(y),y*m){case 38:g=u>0?1:(S+="\f",-1);break;case 44:s[c++]=(qo(S)-1)*g,g=1;break;case 64:45===oa()&&(S+=ua(ra())),f=oa(),u=d=qo(b=S+=ma(aa())),y++;break;case 45:45===h&&2==qo(S)&&(m=0)}}return a}function ya(e,t,n,r,o,a,i,s,l,c,u,d){for(var f=o-1,p=0===o?a:[""],h=function(e){return e.length}(p),m=0,v=0,g=0;m<r;++m)for(var y=0,b=Wo(e,f+1,f=Fo(v=i[m])),w=e;y<h;++y)(w=Bo(v>0?p[y]+" "+b:Ho(b,/&\f/g,p[y])))&&(l[g++]=w);return ta(e,t,n,0===o?Lo:s,l,c,u,d)}function ba(e,t,n,r){return ta(e,t,n,Ao,zo(Zo),Wo(e,2,-2),0,r)}function wa(e,t,n,r,o){return ta(e,t,n,Io,Wo(e,0,r),Wo(e,r+1,-1),r,o)}var xa,ka="data-ant-cssinjs-cache-path",Sa="_FILE_STYLE__";var Ea=!0;function Ca(e){return function(){if(!xa&&(xa={},Er())){var e=document.createElement("div");e.className=ka,e.style.position="fixed",e.style.visibility="hidden",e.style.top="-9999px",document.body.appendChild(e);var t=getComputedStyle(e).content||"";(t=t.replace(/^"/,"").replace(/"$/,"")).split(";").forEach((function(e){var t=kr(e.split(":"),2),n=t[0],r=t[1];xa[n]=r}));var n,r=document.querySelector("style[".concat(ka,"]"));r&&(Ea=!1,null===(n=r.parentNode)||void 0===n||n.removeChild(r)),document.body.removeChild(e)}}(),!!xa[e]}var Na="_multi_value_";function ja(e){return Qo(va(e),Ko).replace(/\{%%%\:[^;];}/g,";")}function Da(e,t,n){if(!t)return e;var r=".".concat(t),o="low"===n?":where(".concat(r,")"):r;return e.split(",").map((function(e){var t,n=e.trim().split(/\s+/),r=n[0]||"",a=(null===(t=r.match(/^\w+/))||void 0===t?void 0:t[0])||"";return[r="".concat(a).concat(o).concat(r.slice(a.length))].concat(hr(n.slice(1))).join(" ")})).join(",")}var Pa=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{root:!0,parentSelectors:[]},o=r.root,a=r.injectHash,i=r.parentSelectors,s=n.hashId,l=n.layer,c=(n.path,n.hashPriority),u=n.transformers,d=void 0===u?[]:u,f=(n.linters,""),p={};function h(t){var r=t.getName(s);if(!p[r]){var o=kr(e(t.style,n,{root:!1,parentSelectors:i}),1)[0];p[r]="@keyframes ".concat(t.getName(s)).concat(o)}}var m=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return t.forEach((function(t){Array.isArray(t)?e(t,n):t&&n.push(t)})),n}(Array.isArray(t)?t:[t]);return m.forEach((function(t){var r="string"!==typeof t||o?t:{};if("string"===typeof r)f+="".concat(r,"\n");else if(r._keyframe)h(r);else{var l=d.reduce((function(e,t){var n;return(null===t||void 0===t||null===(n=t.visit)||void 0===n?void 0:n.call(t,e))||e}),r);Object.keys(l).forEach((function(t){var r=l[t];if("object"!==je(r)||!r||"animationName"===t&&r._keyframe||function(e){return"object"===je(e)&&e&&("_skip_check_"in e||Na in e)}(r)){var u;function x(e,t){var n=e.replace(/[A-Z]/g,(function(e){return"-".concat(e.toLowerCase())})),r=t;Ro[e]||"number"!==typeof r||0===r||(r="".concat(r,"px")),"animationName"===e&&null!==t&&void 0!==t&&t._keyframe&&(h(t),r=t.getName(s)),f+="".concat(n,":").concat(r,";")}var d=null!==(u=null===r||void 0===r?void 0:r.value)&&void 0!==u?u:r;"object"===je(r)&&null!==r&&void 0!==r&&r[Na]&&Array.isArray(d)?d.forEach((function(e){x(t,e)})):x(t,d)}else{var m=!1,v=t.trim(),g=!1;(o||a)&&s?v.startsWith("@")?m=!0:v=Da("&"===v?"":t,s,c):!o||s||"&"!==v&&""!==v||(v="",g=!0);var y=kr(e(r,n,{root:g,injectHash:m,parentSelectors:[].concat(hr(i),[v])}),2),b=y[0],w=y[1];p=_e(_e({},p),w),f+="".concat(v).concat(b)}}))}})),o?l&&(f&&(f="@layer ".concat(l.name," {").concat(f,"}")),l.dependencies&&(p["@layer ".concat(l.name)]=l.dependencies.map((function(e){return"@layer ".concat(e,", ").concat(l.name,";")})).join("\n"))):f="{".concat(f,"}"),[f,p]};function Ta(e,t){return Sr("".concat(e.join("%")).concat(t))}function _a(){return null}var Oa="style";function Ma(e,t){var n=e.token,o=e.path,a=e.hashId,i=e.layer,s=e.nonce,l=e.clientOnly,c=e.order,u=void 0===c?0:c,d=r.useContext(to),f=d.autoClear,p=(d.mock,d.defaultCache),h=d.hashPriority,m=d.container,v=d.ssrInline,g=d.transformers,y=d.linters,b=d.cache,w=d.layer,x=n._tokenKey,k=[x];w&&k.push("layer"),k.push.apply(k,hr(o));var S=ho;var E=jo(Oa,k,(function(){var e=k.join("|");if(Ca(e)){var n=function(e){var t=xa[e],n=null;if(t&&Er())if(Ea)n=Sa;else{var r=document.querySelector("style[".concat(Xr,'="').concat(xa[e],'"]'));r?n=r.innerHTML:delete xa[e]}return[n,t]}(e),r=kr(n,2),s=r[0],c=r[1];if(s)return[s,x,c,{},l,u]}var d=t(),f=kr(Pa(d,{hashId:a,hashPriority:h,layer:w?i:void 0,path:o.join("-"),transformers:g,linters:y}),2),p=f[0],m=f[1],v=ja(p),b=Ta(k,v);return[v,x,b,m,l,u]}),(function(e,t){var n=kr(e,3)[2];(t||f)&&ho&&Mr(n,{mark:Xr})}),(function(e){var t=kr(e,4),n=t[0],r=(t[1],t[2]),o=t[3];if(S&&n!==Sa){var a={mark:Xr,prepend:!w&&"queue",attachTo:m,priority:u},i="function"===typeof s?s():s;i&&(a.csp={nonce:i});var l=[],c=[];Object.keys(o).forEach((function(e){e.startsWith("@layer")?l.push(e):c.push(e)})),l.forEach((function(e){Rr(ja(o[e]),"_layer-".concat(e),_e(_e({},a),{},{prepend:!0}))}));var d=Rr(n,r,a);d[Jr]=b.instanceId,d.setAttribute(Gr,x),c.forEach((function(e){Rr(ja(o[e]),"_effect-".concat(e),a)}))}})),C=kr(E,3),N=C[0],j=C[1],D=C[2];return function(e){var t,n;v&&!S&&p?t=r.createElement("style",Mo({},(Pe(n={},Gr,j),Pe(n,Xr,D),n),{dangerouslySetInnerHTML:{__html:N}})):t=r.createElement(_a,null);return r.createElement(r.Fragment,null,t,e)}}var Ra="cssVar";const Aa=function(e,t){var n=e.key,o=e.prefix,a=e.unitless,i=e.ignore,s=e.token,l=e.scope,c=void 0===l?"":l,u=(0,r.useContext)(to),d=u.cache.instanceId,f=u.container,p=s._tokenKey,h=[].concat(hr(e.path),[n,c,p]),m=jo(Ra,h,(function(){var e=t(),r=kr(bo(e,n,{prefix:o,unitless:a,ignore:i,scope:c}),2),s=r[0],l=r[1];return[s,l,Ta(h,l),n]}),(function(e){var t=kr(e,3)[2];ho&&Mr(t,{mark:Xr})}),(function(e){var t=kr(e,3),r=t[1],o=t[2];if(r){var a=Rr(r,o,{mark:Xr,prepend:"queue",attachTo:f,priority:-999});a[Jr]=d,a.setAttribute(Gr,n)}}));return m};var La;Pe(La={},Oa,(function(e,t,n){var r=kr(e,6),o=r[0],a=r[1],i=r[2],s=r[3],l=r[4],c=r[5],u=(n||{}).plain;if(l)return null;var d=o,f={"data-rc-order":"prependQueue","data-rc-priority":"".concat(c)};return d=vo(o,a,i,f,u),s&&Object.keys(s).forEach((function(e){if(!t[e]){t[e]=!0;var n=vo(ja(s[e]),a,"_effect-".concat(e),f,u);e.startsWith("@layer")?d=n+d:d+=n}})),[c,i,d]})),Pe(La,_o,(function(e,t,n){var r=kr(e,5),o=r[2],a=r[3],i=r[4],s=(n||{}).plain;if(!a)return null;var l=o._tokenKey;return[-999,l,vo(a,i,l,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]})),Pe(La,Ra,(function(e,t,n){var r=kr(e,4),o=r[1],a=r[2],i=r[3],s=(n||{}).plain;if(!o)return null;return[-999,a,vo(o,i,a,{"data-rc-order":"prependQueue","data-rc-priority":"".concat(-999)},s)]}));var Ia=function(){function e(t,n){Wr(this,e),Pe(this,"name",void 0),Pe(this,"style",void 0),Pe(this,"_keyframe",!0),this.name=t,this.style=n}return Vr(e,[{key:"getName",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e?"".concat(e,"-").concat(this.name):this.name}}]),e}();const Fa=Ia;function za(e){return e.notSplit=!0,e}za(["borderTop","borderBottom"]),za(["borderTop"]),za(["borderBottom"]),za(["borderLeft","borderRight"]),za(["borderLeft"]),za(["borderRight"]);const Ba=(0,r.createContext)({});function Ha(e,t){for(var n=e,r=0;r<t.length;r+=1){if(null===n||void 0===n)return;n=n[t[r]]}return n}function Ua(e,t,n,r){if(!t.length)return n;var o,a=function(e){return wr(e)||fr(e)||pr(e)||xr()}(t),i=a[0],s=a.slice(1);return o=e||"number"!==typeof i?Array.isArray(e)?hr(e):_e({},e):[],r&&void 0===n&&1===s.length?delete o[i][s[0]]:o[i]=Ua(o[i],s,n,r),o}function Ya(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];return t.length&&r&&void 0===n&&!Ha(e,t.slice(0,-1))?e:Ua(e,t,n,r)}function Wa(e){return Array.isArray(e)?[]:{}}var qa="undefined"===typeof Reflect?Object.keys:Reflect.ownKeys;function Va(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=Wa(t[0]);return t.forEach((function(e){!function t(n,o){var a,i=new Set(o),s=Ha(e,n),l=Array.isArray(s);if(l||"object"===je(a=s)&&null!==a&&Object.getPrototypeOf(a)===Object.prototype){if(!i.has(s)){i.add(s);var c=Ha(r,n);l?r=Ya(r,n,[]):c&&"object"===je(c)||(r=Ya(r,n,Wa(s))),qa(s).forEach((function(e){t([].concat(hr(n),[e]),i)}))}}else r=Ya(r,n,s)}([])})),r}function Qa(){}const Ka=r.createContext({}),$a=()=>{const e=()=>{};return e.deprecated=Qa,e},Ga=(0,r.createContext)(void 0);const Xa={items_per_page:"/ page",jump_to:"Go to",jump_to_confirm:"confirm",page:"Page",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages",page_size:"Page Size"};const Ja=_e(_e({},{yearFormat:"YYYY",dayFormat:"D",cellMeridiemFormat:"A",monthBeforeYear:!0}),{},{locale:"en_US",today:"Today",now:"Now",backToToday:"Back to today",ok:"OK",clear:"Clear",week:"Week",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",dateFormat:"M/D/YYYY",dateTimeFormat:"M/D/YYYY HH:mm:ss",previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"}),Za={placeholder:"Select time",rangePlaceholder:["Start time","End time"]},ei={lang:Object.assign({placeholder:"Select date",yearPlaceholder:"Select year",quarterPlaceholder:"Select quarter",monthPlaceholder:"Select month",weekPlaceholder:"Select week",rangePlaceholder:["Start date","End date"],rangeYearPlaceholder:["Start year","End year"],rangeQuarterPlaceholder:["Start quarter","End quarter"],rangeMonthPlaceholder:["Start month","End month"],rangeWeekPlaceholder:["Start week","End week"]},Ja),timePickerLocale:Object.assign({},Za)},ti="${label} is not a valid ${type}",ni={locale:"en",Pagination:Xa,DatePicker:ei,TimePicker:Za,Calendar:ei,global:{placeholder:"Please select",close:"Close"},Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",filterEmptyText:"No filters",filterCheckAll:"Select all items",filterSearchPlaceholder:"Search in filters",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page",selectNone:"Clear all data",selectionAll:"Select all data",sortTitle:"Sort",expand:"Expand row",collapse:"Collapse row",triggerDesc:"Click to sort descending",triggerAsc:"Click to sort ascending",cancelSort:"Click to cancel sorting"},Tour:{Next:"Next",Previous:"Previous",Finish:"Finish"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items",remove:"Remove",selectCurrent:"Select current page",removeCurrent:"Remove current page",selectAll:"Select all data",deselectAll:"Deselect all data",removeAll:"Remove all data",selectInvert:"Invert current page"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file",downloadFile:"Download file"},Empty:{description:"No data"},Icon:{icon:"icon"},Text:{edit:"Edit",copy:"Copy",copied:"Copied",expand:"Expand",collapse:"Collapse"},Form:{optional:"(optional)",defaultValidateMessages:{default:"Field validation error for ${label}",required:"Please enter ${label}",enum:"${label} must be one of [${enum}]",whitespace:"${label} cannot be a blank character",date:{format:"${label} date format is invalid",parse:"${label} cannot be converted to a date",invalid:"${label} is an invalid date"},types:{string:ti,method:ti,array:ti,object:ti,number:ti,date:ti,boolean:ti,integer:ti,float:ti,regexp:ti,email:ti,url:ti,hex:ti},string:{len:"${label} must be ${len} characters",min:"${label} must be at least ${min} characters",max:"${label} must be up to ${max} characters",range:"${label} must be between ${min}-${max} characters"},number:{len:"${label} must be equal to ${len}",min:"${label} must be minimum ${min}",max:"${label} must be maximum ${max}",range:"${label} must be between ${min}-${max}"},array:{len:"Must be ${len} ${label}",min:"At least ${min} ${label}",max:"At most ${max} ${label}",range:"The amount of ${label} must be between ${min}-${max}"},pattern:{mismatch:"${label} does not match the pattern ${pattern}"}}},Image:{preview:"Preview"},QRCode:{expired:"QR code expired",refresh:"Refresh",scanned:"Scanned"},ColorPicker:{presetEmpty:"Empty",transparent:"Transparent",singleColor:"Single",gradientColor:"Gradient"}};let ri=Object.assign({},ni.Modal),oi=[];const ai=()=>oi.reduce(((e,t)=>Object.assign(Object.assign({},e),t)),ni.Modal);const ii=(0,r.createContext)(void 0);const si=e=>{const{locale:t={},children:n,_ANT_MARK__:o}=e;r.useEffect((()=>{const e=function(e){if(e){const t=Object.assign({},e);return oi.push(t),ri=ai(),()=>{oi=oi.filter((e=>e!==t)),ri=ai()}}ri=Object.assign({},ni.Modal)}(null===t||void 0===t?void 0:t.Modal);return e}),[t]);const a=r.useMemo((()=>Object.assign(Object.assign({},t),{exist:!0})),[t]);return r.createElement(ii.Provider,{value:a},n)},li=Math.round;function ci(e,t){const n=e.replace(/^[^(]*\((.*)/,"$1").replace(/\).*/,"").match(/\d*\.?\d+%?/g)||[],r=n.map((e=>parseFloat(e)));for(let o=0;o<3;o+=1)r[o]=t(r[o]||0,n[o]||"",o);return n[3]?r[3]=n[3].includes("%")?r[3]/100:r[3]:r[3]=1,r}const ui=(e,t,n)=>0===n?e:e/100;function di(e,t){const n=t||255;return e>n?n:e<0?0:e}class fi{constructor(e){function t(t){return t[0]in e&&t[1]in e&&t[2]in e}if(Pe(this,"isValid",!0),Pe(this,"r",0),Pe(this,"g",0),Pe(this,"b",0),Pe(this,"a",1),Pe(this,"_h",void 0),Pe(this,"_s",void 0),Pe(this,"_l",void 0),Pe(this,"_v",void 0),Pe(this,"_max",void 0),Pe(this,"_min",void 0),Pe(this,"_brightness",void 0),e)if("string"===typeof e){const n=e.trim();function r(e){return n.startsWith(e)}/^#?[A-F\d]{3,8}$/i.test(n)?this.fromHexString(n):r("rgb")?this.fromRgbString(n):r("hsl")?this.fromHslString(n):(r("hsv")||r("hsb"))&&this.fromHsvString(n)}else if(e instanceof fi)this.r=e.r,this.g=e.g,this.b=e.b,this.a=e.a,this._h=e._h,this._s=e._s,this._l=e._l,this._v=e._v;else if(t("rgb"))this.r=di(e.r),this.g=di(e.g),this.b=di(e.b),this.a="number"===typeof e.a?di(e.a,1):1;else if(t("hsl"))this.fromHsl(e);else{if(!t("hsv"))throw new Error("@ant-design/fast-color: unsupported input "+JSON.stringify(e));this.fromHsv(e)}else;}setR(e){return this._sc("r",e)}setG(e){return this._sc("g",e)}setB(e){return this._sc("b",e)}setA(e){return this._sc("a",e,1)}setHue(e){const t=this.toHsv();return t.h=e,this._c(t)}getLuminance(){function e(e){const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}return.2126*e(this.r)+.7152*e(this.g)+.0722*e(this.b)}getHue(){if("undefined"===typeof this._h){const e=this.getMax()-this.getMin();this._h=0===e?0:li(60*(this.r===this.getMax()?(this.g-this.b)/e+(this.g<this.b?6:0):this.g===this.getMax()?(this.b-this.r)/e+2:(this.r-this.g)/e+4))}return this._h}getSaturation(){if("undefined"===typeof this._s){const e=this.getMax()-this.getMin();this._s=0===e?0:e/this.getMax()}return this._s}getLightness(){return"undefined"===typeof this._l&&(this._l=(this.getMax()+this.getMin())/510),this._l}getValue(){return"undefined"===typeof this._v&&(this._v=this.getMax()/255),this._v}getBrightness(){return"undefined"===typeof this._brightness&&(this._brightness=(299*this.r+587*this.g+114*this.b)/1e3),this._brightness}darken(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10;const t=this.getHue(),n=this.getSaturation();let r=this.getLightness()-e/100;return r<0&&(r=0),this._c({h:t,s:n,l:r,a:this.a})}lighten(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10;const t=this.getHue(),n=this.getSaturation();let r=this.getLightness()+e/100;return r>1&&(r=1),this._c({h:t,s:n,l:r,a:this.a})}mix(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50;const n=this._c(e),r=t/100,o=e=>(n[e]-this[e])*r+this[e],a={r:li(o("r")),g:li(o("g")),b:li(o("b")),a:li(100*o("a"))/100};return this._c(a)}tint(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10;return this.mix({r:255,g:255,b:255,a:1},e)}shade(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10;return this.mix({r:0,g:0,b:0,a:1},e)}onBackground(e){const t=this._c(e),n=this.a+t.a*(1-this.a),r=e=>li((this[e]*this.a+t[e]*t.a*(1-this.a))/n);return this._c({r:r("r"),g:r("g"),b:r("b"),a:n})}isDark(){return this.getBrightness()<128}isLight(){return this.getBrightness()>=128}equals(e){return this.r===e.r&&this.g===e.g&&this.b===e.b&&this.a===e.a}clone(){return this._c(this)}toHexString(){let e="#";const t=(this.r||0).toString(16);e+=2===t.length?t:"0"+t;const n=(this.g||0).toString(16);e+=2===n.length?n:"0"+n;const r=(this.b||0).toString(16);if(e+=2===r.length?r:"0"+r,"number"===typeof this.a&&this.a>=0&&this.a<1){const t=li(255*this.a).toString(16);e+=2===t.length?t:"0"+t}return e}toHsl(){return{h:this.getHue(),s:this.getSaturation(),l:this.getLightness(),a:this.a}}toHslString(){const e=this.getHue(),t=li(100*this.getSaturation()),n=li(100*this.getLightness());return 1!==this.a?"hsla(".concat(e,",").concat(t,"%,").concat(n,"%,").concat(this.a,")"):"hsl(".concat(e,",").concat(t,"%,").concat(n,"%)")}toHsv(){return{h:this.getHue(),s:this.getSaturation(),v:this.getValue(),a:this.a}}toRgb(){return{r:this.r,g:this.g,b:this.b,a:this.a}}toRgbString(){return 1!==this.a?"rgba(".concat(this.r,",").concat(this.g,",").concat(this.b,",").concat(this.a,")"):"rgb(".concat(this.r,",").concat(this.g,",").concat(this.b,")")}toString(){return this.toRgbString()}_sc(e,t,n){const r=this.clone();return r[e]=di(t,n),r}_c(e){return new this.constructor(e)}getMax(){return"undefined"===typeof this._max&&(this._max=Math.max(this.r,this.g,this.b)),this._max}getMin(){return"undefined"===typeof this._min&&(this._min=Math.min(this.r,this.g,this.b)),this._min}fromHexString(e){const t=e.replace("#","");function n(e,n){return parseInt(t[e]+t[n||e],16)}t.length<6?(this.r=n(0),this.g=n(1),this.b=n(2),this.a=t[3]?n(3)/255:1):(this.r=n(0,1),this.g=n(2,3),this.b=n(4,5),this.a=t[6]?n(6,7)/255:1)}fromHsl(e){let{h:t,s:n,l:r,a:o}=e;if(this._h=t%360,this._s=n,this._l=r,this.a="number"===typeof o?o:1,n<=0){const e=li(255*r);this.r=e,this.g=e,this.b=e}let a=0,i=0,s=0;const l=t/60,c=(1-Math.abs(2*r-1))*n,u=c*(1-Math.abs(l%2-1));l>=0&&l<1?(a=c,i=u):l>=1&&l<2?(a=u,i=c):l>=2&&l<3?(i=c,s=u):l>=3&&l<4?(i=u,s=c):l>=4&&l<5?(a=u,s=c):l>=5&&l<6&&(a=c,s=u);const d=r-c/2;this.r=li(255*(a+d)),this.g=li(255*(i+d)),this.b=li(255*(s+d))}fromHsv(e){let{h:t,s:n,v:r,a:o}=e;this._h=t%360,this._s=n,this._v=r,this.a="number"===typeof o?o:1;const a=li(255*r);if(this.r=a,this.g=a,this.b=a,n<=0)return;const i=t/60,s=Math.floor(i),l=i-s,c=li(r*(1-n)*255),u=li(r*(1-n*l)*255),d=li(r*(1-n*(1-l))*255);switch(s){case 0:this.g=d,this.b=c;break;case 1:this.r=u,this.b=c;break;case 2:this.r=c,this.b=d;break;case 3:this.r=c,this.g=u;break;case 4:this.r=d,this.g=c;break;default:this.g=c,this.b=u}}fromHsvString(e){const t=ci(e,ui);this.fromHsv({h:t[0],s:t[1],v:t[2],a:t[3]})}fromHslString(e){const t=ci(e,ui);this.fromHsl({h:t[0],s:t[1],l:t[2],a:t[3]})}fromRgbString(e){const t=ci(e,((e,t)=>t.includes("%")?li(e/100*255):e));this.r=t[0],this.g=t[1],this.b=t[2],this.a=t[3]}}var pi=[{index:7,amount:15},{index:6,amount:25},{index:5,amount:30},{index:5,amount:45},{index:5,amount:65},{index:5,amount:85},{index:4,amount:90},{index:3,amount:95},{index:2,amount:97},{index:1,amount:98}];function hi(e,t,n){var r;return(r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-2*t:Math.round(e.h)+2*t:n?Math.round(e.h)+2*t:Math.round(e.h)-2*t)<0?r+=360:r>=360&&(r-=360),r}function mi(e,t,n){return 0===e.h&&0===e.s?e.s:((r=n?e.s-.16*t:4===t?e.s+.16:e.s+.05*t)>1&&(r=1),n&&5===t&&r>.1&&(r=.1),r<.06&&(r=.06),Math.round(100*r)/100);var r}function vi(e,t,n){var r;return r=n?e.v+.05*t:e.v-.15*t,r=Math.max(0,Math.min(1,r)),Math.round(100*r)/100}function gi(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[],r=new fi(e),o=r.toHsv(),a=5;a>0;a-=1){var i=new fi({h:hi(o,a,!0),s:mi(o,a,!0),v:vi(o,a,!0)});n.push(i)}n.push(r);for(var s=1;s<=4;s+=1){var l=new fi({h:hi(o,s),s:mi(o,s),v:vi(o,s)});n.push(l)}return"dark"===t.theme?pi.map((function(e){var r=e.index,o=e.amount;return new fi(t.backgroundColor||"#141414").mix(n[r],o).toHexString()})):n.map((function(e){return e.toHexString()}))}var yi={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1677FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},bi=["#fff1f0","#ffccc7","#ffa39e","#ff7875","#ff4d4f","#f5222d","#cf1322","#a8071a","#820014","#5c0011"];bi.primary=bi[5];var wi=["#fff2e8","#ffd8bf","#ffbb96","#ff9c6e","#ff7a45","#fa541c","#d4380d","#ad2102","#871400","#610b00"];wi.primary=wi[5];var xi=["#fff7e6","#ffe7ba","#ffd591","#ffc069","#ffa940","#fa8c16","#d46b08","#ad4e00","#873800","#612500"];xi.primary=xi[5];var ki=["#fffbe6","#fff1b8","#ffe58f","#ffd666","#ffc53d","#faad14","#d48806","#ad6800","#874d00","#613400"];ki.primary=ki[5];var Si=["#feffe6","#ffffb8","#fffb8f","#fff566","#ffec3d","#fadb14","#d4b106","#ad8b00","#876800","#614700"];Si.primary=Si[5];var Ei=["#fcffe6","#f4ffb8","#eaff8f","#d3f261","#bae637","#a0d911","#7cb305","#5b8c00","#3f6600","#254000"];Ei.primary=Ei[5];var Ci=["#f6ffed","#d9f7be","#b7eb8f","#95de64","#73d13d","#52c41a","#389e0d","#237804","#135200","#092b00"];Ci.primary=Ci[5];var Ni=["#e6fffb","#b5f5ec","#87e8de","#5cdbd3","#36cfc9","#13c2c2","#08979c","#006d75","#00474f","#002329"];Ni.primary=Ni[5];var ji=["#e6f4ff","#bae0ff","#91caff","#69b1ff","#4096ff","#1677ff","#0958d9","#003eb3","#002c8c","#001d66"];ji.primary=ji[5];var Di=["#f0f5ff","#d6e4ff","#adc6ff","#85a5ff","#597ef7","#2f54eb","#1d39c4","#10239e","#061178","#030852"];Di.primary=Di[5];var Pi=["#f9f0ff","#efdbff","#d3adf7","#b37feb","#9254de","#722ed1","#531dab","#391085","#22075e","#120338"];Pi.primary=Pi[5];var Ti=["#fff0f6","#ffd6e7","#ffadd2","#ff85c0","#f759ab","#eb2f96","#c41d7f","#9e1068","#780650","#520339"];Ti.primary=Ti[5];var _i=["#a6a6a6","#999999","#8c8c8c","#808080","#737373","#666666","#404040","#1a1a1a","#000000","#000000"];_i.primary=_i[5];var Oi={red:bi,volcano:wi,orange:xi,gold:ki,yellow:Si,lime:Ei,green:Ci,cyan:Ni,blue:ji,geekblue:Di,purple:Pi,magenta:Ti,grey:_i},Mi=["#2a1215","#431418","#58181c","#791a1f","#a61d24","#d32029","#e84749","#f37370","#f89f9a","#fac8c3"];Mi.primary=Mi[5];var Ri=["#2b1611","#441d12","#592716","#7c3118","#aa3e19","#d84a1b","#e87040","#f3956a","#f8b692","#fad4bc"];Ri.primary=Ri[5];var Ai=["#2b1d11","#442a11","#593815","#7c4a15","#aa6215","#d87a16","#e89a3c","#f3b765","#f8cf8d","#fae3b7"];Ai.primary=Ai[5];var Li=["#2b2111","#443111","#594214","#7c5914","#aa7714","#d89614","#e8b339","#f3cc62","#f8df8b","#faedb5"];Li.primary=Li[5];var Ii=["#2b2611","#443b11","#595014","#7c6e14","#aa9514","#d8bd14","#e8d639","#f3ea62","#f8f48b","#fafab5"];Ii.primary=Ii[5];var Fi=["#1f2611","#2e3c10","#3e4f13","#536d13","#6f9412","#8bbb11","#a9d134","#c9e75d","#e4f88b","#f0fab5"];Fi.primary=Fi[5];var zi=["#162312","#1d3712","#274916","#306317","#3c8618","#49aa19","#6abe39","#8fd460","#b2e58b","#d5f2bb"];zi.primary=zi[5];var Bi=["#112123","#113536","#144848","#146262","#138585","#13a8a8","#33bcb7","#58d1c9","#84e2d8","#b2f1e8"];Bi.primary=Bi[5];var Hi=["#111a2c","#112545","#15325b","#15417e","#1554ad","#1668dc","#3c89e8","#65a9f3","#8dc5f8","#b7dcfa"];Hi.primary=Hi[5];var Ui=["#131629","#161d40","#1c2755","#203175","#263ea0","#2b4acb","#5273e0","#7f9ef3","#a8c1f8","#d2e0fa"];Ui.primary=Ui[5];var Yi=["#1a1325","#24163a","#301c4d","#3e2069","#51258f","#642ab5","#854eca","#ab7ae0","#cda8f0","#ebd7fa"];Yi.primary=Yi[5];var Wi=["#291321","#40162f","#551c3b","#75204f","#a02669","#cb2b83","#e0529c","#f37fb7","#f8a8cc","#fad2e3"];Wi.primary=Wi[5];var qi=["#151515","#1f1f1f","#2d2d2d","#393939","#494949","#5a5a5a","#6a6a6a","#7b7b7b","#888888","#969696"];qi.primary=qi[5];const Vi={blue:"#1677FF",purple:"#722ED1",cyan:"#13C2C2",green:"#52C41A",magenta:"#EB2F96",pink:"#EB2F96",red:"#F5222D",orange:"#FA8C16",yellow:"#FADB14",volcano:"#FA541C",geekblue:"#2F54EB",gold:"#FAAD14",lime:"#A0D911"},Qi=Object.assign(Object.assign({},Vi),{colorPrimary:"#1677ff",colorSuccess:"#52c41a",colorWarning:"#faad14",colorError:"#ff4d4f",colorInfo:"#1677ff",colorLink:"",colorTextBase:"",colorBgBase:"",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'",fontFamilyCode:"'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",fontSize:14,lineWidth:1,lineType:"solid",motionUnit:.1,motionBase:0,motionEaseOutCirc:"cubic-bezier(0.08, 0.82, 0.17, 1)",motionEaseInOutCirc:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",motionEaseOut:"cubic-bezier(0.215, 0.61, 0.355, 1)",motionEaseInOut:"cubic-bezier(0.645, 0.045, 0.355, 1)",motionEaseOutBack:"cubic-bezier(0.12, 0.4, 0.29, 1.46)",motionEaseInBack:"cubic-bezier(0.71, -0.46, 0.88, 0.6)",motionEaseInQuint:"cubic-bezier(0.755, 0.05, 0.855, 0.06)",motionEaseOutQuint:"cubic-bezier(0.23, 1, 0.32, 1)",borderRadius:6,sizeUnit:4,sizeStep:4,sizePopupArrow:16,controlHeight:32,zIndexBase:0,zIndexPopupBase:1e3,opacityImage:1,wireframe:!1,motion:!0});const Ki=e=>{let t=e,n=e,r=e,o=e;return e<6&&e>=5?t=e+1:e<16&&e>=6?t=e+2:e>=16&&(t=16),e<7&&e>=5?n=4:e<8&&e>=7?n=5:e<14&&e>=8?n=6:e<16&&e>=14?n=7:e>=16&&(n=8),e<6&&e>=2?r=1:e>=6&&(r=2),e>4&&e<8?o=4:e>=8&&(o=6),{borderRadius:e,borderRadiusXS:r,borderRadiusSM:n,borderRadiusLG:t,borderRadiusOuter:o}};const $i=e=>{const{controlHeight:t}=e;return{controlHeightSM:.75*t,controlHeightXS:.5*t,controlHeightLG:1.25*t}};const Gi=e=>{const t=function(e){const t=Array.from({length:10}).map(((t,n)=>{const r=n-1,o=e*Math.pow(Math.E,r/5),a=n>1?Math.floor(o):Math.ceil(o);return 2*Math.floor(a/2)}));return t[1]=e,t.map((e=>{return{size:e,lineHeight:(t=e,(t+8)/t)};var t}))}(e),n=t.map((e=>e.size)),r=t.map((e=>e.lineHeight)),o=n[1],a=n[0],i=n[2],s=r[1],l=r[0],c=r[2];return{fontSizeSM:a,fontSize:o,fontSizeLG:i,fontSizeXL:n[3],fontSizeHeading1:n[6],fontSizeHeading2:n[5],fontSizeHeading3:n[4],fontSizeHeading4:n[3],fontSizeHeading5:n[2],lineHeight:s,lineHeightLG:c,lineHeightSM:l,fontHeight:Math.round(s*o),fontHeightLG:Math.round(c*i),fontHeightSM:Math.round(l*a),lineHeightHeading1:r[6],lineHeightHeading2:r[5],lineHeightHeading3:r[4],lineHeightHeading4:r[3],lineHeightHeading5:r[2]}};const Xi=(e,t)=>new fi(e).setA(t).toRgbString(),Ji=(e,t)=>new fi(e).darken(t).toHexString(),Zi=e=>{const t=gi(e);return{1:t[0],2:t[1],3:t[2],4:t[3],5:t[4],6:t[5],7:t[6],8:t[4],9:t[5],10:t[6]}},es=(e,t)=>{const n=e||"#fff",r=t||"#000";return{colorBgBase:n,colorTextBase:r,colorText:Xi(r,.88),colorTextSecondary:Xi(r,.65),colorTextTertiary:Xi(r,.45),colorTextQuaternary:Xi(r,.25),colorFill:Xi(r,.15),colorFillSecondary:Xi(r,.06),colorFillTertiary:Xi(r,.04),colorFillQuaternary:Xi(r,.02),colorBgSolid:Xi(r,1),colorBgSolidHover:Xi(r,.75),colorBgSolidActive:Xi(r,.95),colorBgLayout:Ji(n,4),colorBgContainer:Ji(n,0),colorBgElevated:Ji(n,0),colorBgSpotlight:Xi(r,.85),colorBgBlur:"transparent",colorBorder:Ji(n,15),colorBorderSecondary:Ji(n,6)}};const ts=so((function(e){yi.pink=yi.magenta,Oi.pink=Oi.magenta;const t=Object.keys(Vi).map((t=>{const n=e[t]===yi[t]?Oi[t]:gi(e[t]);return Array.from({length:10},(()=>1)).reduce(((e,r,o)=>(e["".concat(t,"-").concat(o+1)]=n[o],e["".concat(t).concat(o+1)]=n[o],e)),{})})).reduce(((e,t)=>e=Object.assign(Object.assign({},e),t)),{});return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},e),t),function(e,t){let{generateColorPalettes:n,generateNeutralColorPalettes:r}=t;const{colorSuccess:o,colorWarning:a,colorError:i,colorInfo:s,colorPrimary:l,colorBgBase:c,colorTextBase:u}=e,d=n(l),f=n(o),p=n(a),h=n(i),m=n(s),v=r(c,u),g=n(e.colorLink||e.colorInfo),y=new fi(h[1]).mix(new fi(h[3]),50).toHexString();return Object.assign(Object.assign({},v),{colorPrimaryBg:d[1],colorPrimaryBgHover:d[2],colorPrimaryBorder:d[3],colorPrimaryBorderHover:d[4],colorPrimaryHover:d[5],colorPrimary:d[6],colorPrimaryActive:d[7],colorPrimaryTextHover:d[8],colorPrimaryText:d[9],colorPrimaryTextActive:d[10],colorSuccessBg:f[1],colorSuccessBgHover:f[2],colorSuccessBorder:f[3],colorSuccessBorderHover:f[4],colorSuccessHover:f[4],colorSuccess:f[6],colorSuccessActive:f[7],colorSuccessTextHover:f[8],colorSuccessText:f[9],colorSuccessTextActive:f[10],colorErrorBg:h[1],colorErrorBgHover:h[2],colorErrorBgFilledHover:y,colorErrorBgActive:h[3],colorErrorBorder:h[3],colorErrorBorderHover:h[4],colorErrorHover:h[5],colorError:h[6],colorErrorActive:h[7],colorErrorTextHover:h[8],colorErrorText:h[9],colorErrorTextActive:h[10],colorWarningBg:p[1],colorWarningBgHover:p[2],colorWarningBorder:p[3],colorWarningBorderHover:p[4],colorWarningHover:p[4],colorWarning:p[6],colorWarningActive:p[7],colorWarningTextHover:p[8],colorWarningText:p[9],colorWarningTextActive:p[10],colorInfoBg:m[1],colorInfoBgHover:m[2],colorInfoBorder:m[3],colorInfoBorderHover:m[4],colorInfoHover:m[4],colorInfo:m[6],colorInfoActive:m[7],colorInfoTextHover:m[8],colorInfoText:m[9],colorInfoTextActive:m[10],colorLinkHover:g[4],colorLink:g[6],colorLinkActive:g[7],colorBgMask:new fi("#000").setA(.45).toRgbString(),colorWhite:"#fff"})}(e,{generateColorPalettes:Zi,generateNeutralColorPalettes:es})),Gi(e.fontSize)),function(e){const{sizeUnit:t,sizeStep:n}=e;return{sizeXXL:t*(n+8),sizeXL:t*(n+4),sizeLG:t*(n+2),sizeMD:t*(n+1),sizeMS:t*n,size:t*n,sizeSM:t*(n-1),sizeXS:t*(n-2),sizeXXS:t*(n-3)}}(e)),$i(e)),function(e){const{motionUnit:t,motionBase:n,borderRadius:r,lineWidth:o}=e;return Object.assign({motionDurationFast:"".concat((n+t).toFixed(1),"s"),motionDurationMid:"".concat((n+2*t).toFixed(1),"s"),motionDurationSlow:"".concat((n+3*t).toFixed(1),"s"),lineWidthBold:o+1},Ki(r))}(e))})),ns=ts,rs={token:Qi,override:{override:Qi},hashed:!0},os=r.createContext(rs),as="-ant-".concat(Date.now(),"-").concat(Math.random());function is(e,t){const n=function(e,t){const n={},r=(e,t)=>{let n=e.clone();return n=(null===t||void 0===t?void 0:t(n))||n,n.toRgbString()},o=(e,t)=>{const o=new fi(e),a=gi(o.toRgbString());n["".concat(t,"-color")]=r(o),n["".concat(t,"-color-disabled")]=a[1],n["".concat(t,"-color-hover")]=a[4],n["".concat(t,"-color-active")]=a[6],n["".concat(t,"-color-outline")]=o.clone().setA(.2).toRgbString(),n["".concat(t,"-color-deprecated-bg")]=a[0],n["".concat(t,"-color-deprecated-border")]=a[2]};if(t.primaryColor){o(t.primaryColor,"primary");const e=new fi(t.primaryColor),a=gi(e.toRgbString());a.forEach(((e,t)=>{n["primary-".concat(t+1)]=e})),n["primary-color-deprecated-l-35"]=r(e,(e=>e.lighten(35))),n["primary-color-deprecated-l-20"]=r(e,(e=>e.lighten(20))),n["primary-color-deprecated-t-20"]=r(e,(e=>e.tint(20))),n["primary-color-deprecated-t-50"]=r(e,(e=>e.tint(50))),n["primary-color-deprecated-f-12"]=r(e,(e=>e.setA(.12*e.a)));const i=new fi(a[0]);n["primary-color-active-deprecated-f-30"]=r(i,(e=>e.setA(.3*e.a))),n["primary-color-active-deprecated-d-02"]=r(i,(e=>e.darken(2)))}t.successColor&&o(t.successColor,"success"),t.warningColor&&o(t.warningColor,"warning"),t.errorColor&&o(t.errorColor,"error"),t.infoColor&&o(t.infoColor,"info");const a=Object.keys(n).map((t=>"--".concat(e,"-").concat(t,": ").concat(n[t],";")));return"\n  :root {\n    ".concat(a.join("\n"),"\n  }\n  ").trim()}(e,t);Er()&&Rr(n,"".concat(as,"-dynamic-theme"))}const ss=r.createContext(!1),ls=e=>{let{children:t,disabled:n}=e;const o=r.useContext(ss);return r.createElement(ss.Provider,{value:null!==n&&void 0!==n?n:o},t)},cs=ss,us=r.createContext(void 0),ds=e=>{let{children:t,size:n}=e;const o=r.useContext(us);return r.createElement(us.Provider,{value:n||o},t)},fs=us;const ps=function(){return{componentDisabled:(0,r.useContext)(cs),componentSize:(0,r.useContext)(fs)}},hs=Object.assign({},o),{useId:ms}=hs,vs="undefined"===typeof ms?()=>"":ms;var gs=n(97),ys=n.n(gs);function bs(e){return e instanceof HTMLElement||e instanceof SVGElement}function ws(e){var t,n=function(e){return e&&"object"===je(e)&&bs(e.nativeElement)?e.nativeElement:bs(e)?e:null}(e);return n||(e instanceof r.Component?null===(t=i.findDOMNode)||void 0===t?void 0:t.call(i,e):null)}var xs=n(808),ks=Symbol.for("react.element"),Ss=Symbol.for("react.transitional.element"),Es=Symbol.for("react.fragment");var Cs=Number(r.version.split(".")[0]),Ns=function(e,t){"function"===typeof e?e(t):"object"===je(e)&&e&&"current"in e&&(e.current=t)},js=function(e){var t,n;if(!e)return!1;if(Ds(e)&&Cs>=19)return!0;var r=(0,xs.isMemo)(e)?e.type.type:e.type;return!!("function"!==typeof r||null!==(t=r.prototype)&&void 0!==t&&t.render||r.$$typeof===xs.ForwardRef)&&!!("function"!==typeof e||null!==(n=e.prototype)&&void 0!==n&&n.render||e.$$typeof===xs.ForwardRef)};function Ds(e){return(0,r.isValidElement)(e)&&!((t=e)&&"object"===je(t)&&(t.$$typeof===ks||t.$$typeof===Ss)&&t.type===Es);var t}function Ps(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],-1===t.indexOf(n)&&{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ts=["children"],_s=r.createContext({});function Os(e){var t=e.children,n=Ps(e,Ts);return r.createElement(_s.Provider,{value:n},t)}function Ms(e,t){return Ms=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},Ms(e,t)}function Rs(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&Ms(e,t)}function As(e){return As=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},As(e)}function Ls(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(e){}return(Ls=function(){return!!e})()}function Is(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function Fs(e){var t=Ls();return function(){var n,r=As(e);if(t){var o=As(this).constructor;n=Reflect.construct(r,arguments,o)}else n=r.apply(this,arguments);return function(e,t){if(t&&("object"==je(t)||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return Is(e)}(this,n)}}const zs=function(e){Rs(n,e);var t=Fs(n);function n(){return Wr(this,n),t.apply(this,arguments)}return Vr(n,[{key:"render",value:function(){return this.props.children}}]),n}(r.Component);function Bs(e){var t=r.useRef();t.current=e;var n=r.useCallback((function(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return null===(e=t.current)||void 0===e?void 0:e.call.apply(e,[t].concat(r))}),[]);return n}function Hs(e){var t=r.useRef(!1),n=kr(r.useState(e),2),o=n[0],a=n[1];return r.useEffect((function(){return t.current=!1,function(){t.current=!0}}),[]),[o,function(e,n){n&&t.current||a(e)}]}var Us="none",Ys="appear",Ws="enter",qs="leave",Vs="none",Qs="prepare",Ks="start",$s="active",Gs="end",Xs="prepared";function Js(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit".concat(e)]="webkit".concat(t),n["Moz".concat(e)]="moz".concat(t),n["ms".concat(e)]="MS".concat(t),n["O".concat(e)]="o".concat(t.toLowerCase()),n}var Zs=function(e,t){var n={animationend:Js("Animation","AnimationEnd"),transitionend:Js("Transition","TransitionEnd")};return e&&("AnimationEvent"in t||delete n.animationend.animation,"TransitionEvent"in t||delete n.transitionend.transition),n}(Er(),"undefined"!==typeof window?window:{}),el={};if(Er()){var tl=document.createElement("div");el=tl.style}var nl={};function rl(e){if(nl[e])return nl[e];var t=Zs[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o<r;o+=1){var a=n[o];if(Object.prototype.hasOwnProperty.call(t,a)&&a in el)return nl[e]=t[a],nl[e]}return""}var ol=rl("animationend"),al=rl("transitionend"),il=!(!ol||!al),sl=ol||"animationend",ll=al||"transitionend";function cl(e,t){if(!e)return null;if("object"===je(e)){var n=t.replace(/-\w/g,(function(e){return e[1].toUpperCase()}));return e[n]}return"".concat(e,"-").concat(t)}const ul=Er()?r.useLayoutEffect:r.useEffect;var dl=function(e){return+setTimeout(e,16)},fl=function(e){return clearTimeout(e)};"undefined"!==typeof window&&"requestAnimationFrame"in window&&(dl=function(e){return window.requestAnimationFrame(e)},fl=function(e){return window.cancelAnimationFrame(e)});var pl=0,hl=new Map;function ml(e){hl.delete(e)}var vl=function(e){var t=pl+=1;return function n(r){if(0===r)ml(t),e();else{var o=dl((function(){n(r-1)}));hl.set(t,o)}}(arguments.length>1&&void 0!==arguments[1]?arguments[1]:1),t};vl.cancel=function(e){var t=hl.get(e);return ml(e),fl(t)};const gl=vl;var yl=[Qs,Ks,$s,Gs],bl=[Qs,Xs],wl=!1;function xl(e){return e===$s||e===Gs}const kl=function(e,t,n){var o=kr(Hs(Vs),2),a=o[0],i=o[1],s=function(){var e=r.useRef(null);function t(){gl.cancel(e.current)}return r.useEffect((function(){return function(){t()}}),[]),[function n(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;t();var a=gl((function(){o<=1?r({isCanceled:function(){return a!==e.current}}):n(r,o-1)}));e.current=a},t]}(),l=kr(s,2),c=l[0],u=l[1];var d=t?bl:yl;return ul((function(){if(a!==Vs&&a!==Gs){var e=d.indexOf(a),t=d[e+1],r=n(a);r===wl?i(t,!0):t&&c((function(e){function n(){e.isCanceled()||i(t,!0)}!0===r?n():Promise.resolve(r).then(n)}))}}),[e,a]),r.useEffect((function(){return function(){u()}}),[]),[function(){i(Qs,!0)},a]};function Sl(e,t,n,o){var a=o.motionEnter,i=void 0===a||a,s=o.motionAppear,l=void 0===s||s,c=o.motionLeave,u=void 0===c||c,d=o.motionDeadline,f=o.motionLeaveImmediately,p=o.onAppearPrepare,h=o.onEnterPrepare,m=o.onLeavePrepare,v=o.onAppearStart,g=o.onEnterStart,y=o.onLeaveStart,b=o.onAppearActive,w=o.onEnterActive,x=o.onLeaveActive,k=o.onAppearEnd,S=o.onEnterEnd,E=o.onLeaveEnd,C=o.onVisibleChanged,N=kr(Hs(),2),j=N[0],D=N[1],P=function(e){var t=kr(r.useReducer((function(e){return e+1}),0),2)[1],n=r.useRef(e);return[Bs((function(){return n.current})),Bs((function(e){n.current="function"===typeof e?e(n.current):e,t()}))]}(Us),T=kr(P,2),_=T[0],O=T[1],M=kr(Hs(null),2),R=M[0],A=M[1],L=_(),I=(0,r.useRef)(!1),F=(0,r.useRef)(null);function z(){return n()}var B=(0,r.useRef)(!1);function H(){O(Us),A(null,!0)}var U=Bs((function(e){var t=_();if(t!==Us){var n=z();if(!e||e.deadline||e.target===n){var r,o=B.current;t===Ys&&o?r=null===k||void 0===k?void 0:k(n,e):t===Ws&&o?r=null===S||void 0===S?void 0:S(n,e):t===qs&&o&&(r=null===E||void 0===E?void 0:E(n,e)),o&&!1!==r&&H()}}})),Y=function(e){var t=(0,r.useRef)();function n(t){t&&(t.removeEventListener(ll,e),t.removeEventListener(sl,e))}return r.useEffect((function(){return function(){n(t.current)}}),[]),[function(r){t.current&&t.current!==r&&n(t.current),r&&r!==t.current&&(r.addEventListener(ll,e),r.addEventListener(sl,e),t.current=r)},n]}(U),W=kr(Y,1)[0],q=function(e){switch(e){case Ys:return Pe(Pe(Pe({},Qs,p),Ks,v),$s,b);case Ws:return Pe(Pe(Pe({},Qs,h),Ks,g),$s,w);case qs:return Pe(Pe(Pe({},Qs,m),Ks,y),$s,x);default:return{}}},V=r.useMemo((function(){return q(L)}),[L]),Q=kr(kl(L,!e,(function(e){if(e===Qs){var t=V[Qs];return t?t(z()):wl}var n;$ in V&&A((null===(n=V[$])||void 0===n?void 0:n.call(V,z(),null))||null);return $===$s&&L!==Us&&(W(z()),d>0&&(clearTimeout(F.current),F.current=setTimeout((function(){U({deadline:!0})}),d))),$===Xs&&H(),true})),2),K=Q[0],$=Q[1],G=xl($);B.current=G;var X=(0,r.useRef)(null);ul((function(){if(!I.current||X.current!==t){D(t);var n,r=I.current;I.current=!0,!r&&t&&l&&(n=Ys),r&&t&&i&&(n=Ws),(r&&!t&&u||!r&&f&&!t&&u)&&(n=qs);var o=q(n);n&&(e||o[Qs])?(O(n),K()):O(Us),X.current=t}}),[t]),(0,r.useEffect)((function(){(L===Ys&&!l||L===Ws&&!i||L===qs&&!u)&&O(Us)}),[l,i,u]),(0,r.useEffect)((function(){return function(){I.current=!1,clearTimeout(F.current)}}),[]);var J=r.useRef(!1);(0,r.useEffect)((function(){j&&(J.current=!0),void 0!==j&&L===Us&&((J.current||j)&&(null===C||void 0===C||C(j)),J.current=!0)}),[j,L]);var Z=R;return V[Qs]&&$===Ks&&(Z=_e({transition:"none"},Z)),[L,$,Z,null!==j&&void 0!==j?j:t]}const El=function(e){var t=e;"object"===je(e)&&(t=e.transitionSupport);var n=r.forwardRef((function(e,n){var o=e.visible,a=void 0===o||o,i=e.removeOnLeave,s=void 0===i||i,l=e.forceRender,c=e.children,u=e.motionName,d=e.leavedClassName,f=e.eventProps,p=function(e,n){return!(!e.motionName||!t||!1===n)}(e,r.useContext(_s).motion),h=(0,r.useRef)(),m=(0,r.useRef)();var v=kr(Sl(p,a,(function(){try{return h.current instanceof HTMLElement?h.current:ws(m.current)}catch(Dy){return null}}),e),4),g=v[0],y=v[1],b=v[2],w=v[3],x=r.useRef(w);w&&(x.current=!0);var k,S=r.useCallback((function(e){h.current=e,Ns(n,e)}),[n]),E=_e(_e({},f),{},{visible:a});if(c)if(g===Us)k=w?c(_e({},E),S):!s&&x.current&&d?c(_e(_e({},E),{},{className:d}),S):l||!s&&!d?c(_e(_e({},E),{},{style:{display:"none"}}),S):null;else{var C;y===Qs?C="prepare":xl(y)?C="active":y===Ks&&(C="start");var N=cl(u,"".concat(g,"-").concat(C));k=c(_e(_e({},E),{},{className:ys()(cl(u,g),Pe(Pe({},N,N&&C),u,"string"===typeof u)),style:b}),S)}else k=null;if(r.isValidElement(k)&&js(k)){var j=function(e){if(e&&Ds(e)){var t=e;return t.props.propertyIsEnumerable("ref")?t.props.ref:t.ref}return null}(k);j||(k=r.cloneElement(k,{ref:S}))}return r.createElement(zs,{ref:m},k)}));return n.displayName="CSSMotion",n}(il);var Cl="add",Nl="keep",jl="remove",Dl="removed";function Pl(e){var t;return _e(_e({},t=e&&"object"===je(e)&&"key"in e?e:{key:e}),{},{key:String(t.key)})}function Tl(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).map(Pl)}var _l=["component","children","onVisibleChanged","onAllRemoved"],Ol=["status"],Ml=["eventProps","visible","children","motionName","motionAppear","motionEnter","motionLeave","motionLeaveImmediately","motionDeadline","removeOnLeave","leavedClassName","onAppearPrepare","onAppearStart","onAppearActive","onAppearEnd","onEnterStart","onEnterActive","onEnterEnd","onLeaveStart","onLeaveActive","onLeaveEnd"];const Rl=function(){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:El,t=function(t){Rs(o,t);var n=Fs(o);function o(){var e;Wr(this,o);for(var t=arguments.length,r=new Array(t),a=0;a<t;a++)r[a]=arguments[a];return Pe(Is(e=n.call.apply(n,[this].concat(r))),"state",{keyEntities:[]}),Pe(Is(e),"removeKey",(function(t){e.setState((function(e){return{keyEntities:e.keyEntities.map((function(e){return e.key!==t?e:_e(_e({},e),{},{status:Dl})}))}}),(function(){0===e.state.keyEntities.filter((function(e){return e.status!==Dl})).length&&e.props.onAllRemoved&&e.props.onAllRemoved()}))})),e}return Vr(o,[{key:"render",value:function(){var t=this,n=this.state.keyEntities,o=this.props,a=o.component,i=o.children,s=o.onVisibleChanged,l=(o.onAllRemoved,Ps(o,_l)),c=a||r.Fragment,u={};return Ml.forEach((function(e){u[e]=l[e],delete l[e]})),delete l.keys,r.createElement(c,l,n.map((function(n,o){var a=n.status,l=Ps(n,Ol),c=a===Cl||a===Nl;return r.createElement(e,Mo({},u,{key:l.key,visible:c,eventProps:l,onVisibleChanged:function(e){null===s||void 0===s||s(e,{key:l.key}),e||t.removeKey(l.key)}}),(function(e,t){return i(_e(_e({},e),{},{index:o}),t)}))})))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=e.keys,r=t.keyEntities,o=Tl(n),a=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=[],r=0,o=t.length,a=Tl(e),i=Tl(t);a.forEach((function(e){for(var t=!1,a=r;a<o;a+=1){var s=i[a];if(s.key===e.key){r<a&&(n=n.concat(i.slice(r,a).map((function(e){return _e(_e({},e),{},{status:Cl})}))),r=a),n.push(_e(_e({},s),{},{status:Nl})),r+=1,t=!0;break}}t||n.push(_e(_e({},e),{},{status:jl}))})),r<o&&(n=n.concat(i.slice(r).map((function(e){return _e(_e({},e),{},{status:Cl})}))));var s={};return n.forEach((function(e){var t=e.key;s[t]=(s[t]||0)+1})),Object.keys(s).filter((function(e){return s[e]>1})).forEach((function(e){(n=n.filter((function(t){var n=t.key,r=t.status;return n!==e||r!==jl}))).forEach((function(t){t.key===e&&(t.status=Nl)}))})),n}(r,o);return{keyEntities:a.filter((function(e){var t=r.find((function(t){var n=t.key;return e.key===n}));return!t||t.status!==Dl||e.status!==jl}))}}}]),o}(r.Component);return Pe(t,"defaultProps",{component:"div"}),t}(il);function Al(e){return e>=0&&e<=255}const Ll=function(e,t){const{r:n,g:r,b:o,a:a}=new fi(e).toRgb();if(a<1)return e;const{r:i,g:s,b:l}=new fi(t).toRgb();for(let c=.01;c<=1;c+=.01){const e=Math.round((n-i*(1-c))/c),t=Math.round((r-s*(1-c))/c),a=Math.round((o-l*(1-c))/c);if(Al(e)&&Al(t)&&Al(a))return new fi({r:e,g:t,b:a,a:Math.round(100*c)/100}).toRgbString()}return new fi({r:n,g:r,b:o,a:1}).toRgbString()};var Il=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n};function Fl(e){const{override:t}=e,n=Il(e,["override"]),r=Object.assign({},t);Object.keys(Qi).forEach((e=>{delete r[e]}));const o=Object.assign(Object.assign({},n),r),a=1200,i=1600;if(!1===o.motion){const e="0s";o.motionDurationFast=e,o.motionDurationMid=e,o.motionDurationSlow=e}return Object.assign(Object.assign(Object.assign({},o),{colorFillContent:o.colorFillSecondary,colorFillContentHover:o.colorFill,colorFillAlter:o.colorFillQuaternary,colorBgContainerDisabled:o.colorFillTertiary,colorBorderBg:o.colorBgContainer,colorSplit:Ll(o.colorBorderSecondary,o.colorBgContainer),colorTextPlaceholder:o.colorTextQuaternary,colorTextDisabled:o.colorTextQuaternary,colorTextHeading:o.colorText,colorTextLabel:o.colorTextSecondary,colorTextDescription:o.colorTextTertiary,colorTextLightSolid:o.colorWhite,colorHighlight:o.colorError,colorBgTextHover:o.colorFillSecondary,colorBgTextActive:o.colorFill,colorIcon:o.colorTextTertiary,colorIconHover:o.colorText,colorErrorOutline:Ll(o.colorErrorBg,o.colorBgContainer),colorWarningOutline:Ll(o.colorWarningBg,o.colorBgContainer),fontSizeIcon:o.fontSizeSM,lineWidthFocus:3*o.lineWidth,lineWidth:o.lineWidth,controlOutlineWidth:2*o.lineWidth,controlInteractiveSize:o.controlHeight/2,controlItemBgHover:o.colorFillTertiary,controlItemBgActive:o.colorPrimaryBg,controlItemBgActiveHover:o.colorPrimaryBgHover,controlItemBgActiveDisabled:o.colorFill,controlTmpOutline:o.colorFillQuaternary,controlOutline:Ll(o.colorPrimaryBg,o.colorBgContainer),lineType:o.lineType,borderRadius:o.borderRadius,borderRadiusXS:o.borderRadiusXS,borderRadiusSM:o.borderRadiusSM,borderRadiusLG:o.borderRadiusLG,fontWeightStrong:600,opacityLoading:.65,linkDecoration:"none",linkHoverDecoration:"none",linkFocusDecoration:"none",controlPaddingHorizontal:12,controlPaddingHorizontalSM:8,paddingXXS:o.sizeXXS,paddingXS:o.sizeXS,paddingSM:o.sizeSM,padding:o.size,paddingMD:o.sizeMD,paddingLG:o.sizeLG,paddingXL:o.sizeXL,paddingContentHorizontalLG:o.sizeLG,paddingContentVerticalLG:o.sizeMS,paddingContentHorizontal:o.sizeMS,paddingContentVertical:o.sizeSM,paddingContentHorizontalSM:o.size,paddingContentVerticalSM:o.sizeXS,marginXXS:o.sizeXXS,marginXS:o.sizeXS,marginSM:o.sizeSM,margin:o.size,marginMD:o.sizeMD,marginLG:o.sizeLG,marginXL:o.sizeXL,marginXXL:o.sizeXXL,boxShadow:"\n      0 6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 9px 28px 8px rgba(0, 0, 0, 0.05)\n    ",boxShadowSecondary:"\n      0 6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 9px 28px 8px rgba(0, 0, 0, 0.05)\n    ",boxShadowTertiary:"\n      0 1px 2px 0 rgba(0, 0, 0, 0.03),\n      0 1px 6px -1px rgba(0, 0, 0, 0.02),\n      0 2px 4px 0 rgba(0, 0, 0, 0.02)\n    ",screenXS:480,screenXSMin:480,screenXSMax:575,screenSM:576,screenSMMin:576,screenSMMax:767,screenMD:768,screenMDMin:768,screenMDMax:991,screenLG:992,screenLGMin:992,screenLGMax:1199,screenXL:a,screenXLMin:a,screenXLMax:1599,screenXXL:i,screenXXLMin:i,boxShadowPopoverArrow:"2px 2px 5px rgba(0, 0, 0, 0.05)",boxShadowCard:"\n      0 1px 2px -2px ".concat(new fi("rgba(0, 0, 0, 0.16)").toRgbString(),",\n      0 3px 6px 0 ").concat(new fi("rgba(0, 0, 0, 0.12)").toRgbString(),",\n      0 5px 12px 4px ").concat(new fi("rgba(0, 0, 0, 0.09)").toRgbString(),"\n    "),boxShadowDrawerRight:"\n      -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n      -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n      -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n    ",boxShadowDrawerLeft:"\n      6px 0 16px 0 rgba(0, 0, 0, 0.08),\n      3px 0 6px -4px rgba(0, 0, 0, 0.12),\n      9px 0 28px 8px rgba(0, 0, 0, 0.05)\n    ",boxShadowDrawerUp:"\n      0 6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 9px 28px 8px rgba(0, 0, 0, 0.05)\n    ",boxShadowDrawerDown:"\n      0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n    ",boxShadowTabsOverflowLeft:"inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowRight:"inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowTop:"inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)",boxShadowTabsOverflowBottom:"inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)"}),r)}var zl=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n};const Bl={lineHeight:!0,lineHeightSM:!0,lineHeightLG:!0,lineHeightHeading1:!0,lineHeightHeading2:!0,lineHeightHeading3:!0,lineHeightHeading4:!0,lineHeightHeading5:!0,opacityLoading:!0,fontWeightStrong:!0,zIndexPopupBase:!0,zIndexBase:!0,opacityImage:!0},Hl={size:!0,sizeSM:!0,sizeLG:!0,sizeMD:!0,sizeXS:!0,sizeXXS:!0,sizeMS:!0,sizeXL:!0,sizeXXL:!0,sizeUnit:!0,sizeStep:!0,motionBase:!0,motionUnit:!0},Ul={screenXS:!0,screenXSMin:!0,screenXSMax:!0,screenSM:!0,screenSMMin:!0,screenSMMax:!0,screenMD:!0,screenMDMin:!0,screenMDMax:!0,screenLG:!0,screenLGMin:!0,screenLGMax:!0,screenXL:!0,screenXLMin:!0,screenXLMax:!0,screenXXL:!0,screenXXLMin:!0},Yl=(e,t,n)=>{const r=n.getDerivativeToken(e),{override:o}=t,a=zl(t,["override"]);let i=Object.assign(Object.assign({},r),{override:o});return i=Fl(i),a&&Object.entries(a).forEach((e=>{let[t,n]=e;const{theme:r}=n,o=zl(n,["theme"]);let a=o;r&&(a=Yl(Object.assign(Object.assign({},i),o),{override:o},r)),i[t]=a})),i};function Wl(){const{token:e,hashed:t,theme:n,override:o,cssVar:a}=r.useContext(os),i="".concat("5.25.4","-").concat(t||""),s=n||ns,[l,c,u]=Oo(s,[Qi,e],{salt:i,override:o,getComputedToken:Yl,formatToken:Fl,cssVar:a&&{prefix:a.prefix,key:a.key,unitless:Bl,ignore:Hl,preserve:Ul}});return[s,u,t?c:"",l,a]}function ql(e){const{children:t}=e,[,n]=Wl(),{motion:o}=n,a=r.useRef(!1);return a.current=a.current||!1===o,a.current?r.createElement(Os,{motion:o},t):t}const Vl=()=>null,Ql=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return{boxSizing:"border-box",margin:0,padding:0,color:e.colorText,fontSize:e.fontSize,lineHeight:e.lineHeight,listStyle:"none",fontFamily:t?"inherit":e.fontFamily}},Kl=e=>({[".".concat(e)]:Object.assign(Object.assign({},{display:"inline-flex",alignItems:"center",color:"inherit",fontStyle:"normal",lineHeight:0,textAlign:"center",textTransform:"none",verticalAlign:"-0.125em",textRendering:"optimizeLegibility","-webkit-font-smoothing":"antialiased","-moz-osx-font-smoothing":"grayscale","> *":{lineHeight:1},svg:{display:"inline-block"}}),{[".".concat(e," .").concat(e,"-icon")]:{display:"block"}})}),$l=(e,t)=>{const[n,r]=Wl();return Ma({theme:n,token:r,hashId:"",path:["ant-design-icons",e],nonce:()=>null===t||void 0===t?void 0:t.nonce,layer:{name:"antd"}},(()=>[Kl(e)]))};var Gl=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n};const Xl=["getTargetContainer","getPopupContainer","renderEmpty","input","pagination","form","select","button"];let Jl,Zl,ec,tc;function nc(){return Jl||vr}function rc(){return Zl||gr}const oc=()=>({getPrefixCls:(e,t)=>t||(e?"".concat(nc(),"-").concat(e):nc()),getIconPrefixCls:rc,getRootPrefixCls:()=>Jl||nc(),getTheme:()=>ec,holderRender:tc}),ac=e=>{const{children:t,csp:n,autoInsertSpaceInButton:o,alert:a,anchor:i,form:s,locale:l,componentSize:c,direction:u,space:d,splitter:f,virtual:p,dropdownMatchSelectWidth:h,popupMatchSelectWidth:m,popupOverflow:v,legacyLocale:g,parentContext:y,iconPrefixCls:b,theme:w,componentDisabled:x,segmented:k,statistic:S,spin:E,calendar:C,carousel:N,cascader:j,collapse:D,typography:P,checkbox:T,descriptions:_,divider:O,drawer:M,skeleton:R,steps:A,image:L,layout:I,list:F,mentions:z,modal:B,progress:H,result:U,slider:Y,breadcrumb:W,menu:q,pagination:V,input:Q,textArea:K,empty:$,badge:G,radio:X,rate:J,switch:Z,transfer:ee,avatar:te,message:ne,tag:re,table:oe,card:ae,tabs:ie,timeline:se,timePicker:le,upload:ce,notification:ue,tree:de,colorPicker:fe,datePicker:pe,rangePicker:he,flex:me,wave:ve,dropdown:ge,warning:ye,tour:be,tooltip:we,popover:xe,popconfirm:ke,floatButtonGroup:Se,variant:Ee,inputNumber:Ce,treeSelect:Ne}=e,je=r.useCallback(((t,n)=>{const{prefixCls:r}=e;if(n)return n;const o=r||y.getPrefixCls("");return t?"".concat(o,"-").concat(t):o}),[y.getPrefixCls,e.prefixCls]),De=b||y.iconPrefixCls||gr,Pe=n||y.csp;$l(De,Pe);const Te=function(e,t,n){var r;$a("ConfigProvider");const o=e||{},a=!1!==o.inherit&&t?t:Object.assign(Object.assign({},rs),{hashed:null!==(r=null===t||void 0===t?void 0:t.hashed)&&void 0!==r?r:rs.hashed,cssVar:null===t||void 0===t?void 0:t.cssVar}),i=vs();return Ar((()=>{var r,s;if(!e)return t;const l=Object.assign({},a.components);Object.keys(e.components||{}).forEach((t=>{l[t]=Object.assign(Object.assign({},l[t]),e.components[t])}));const c="css-var-".concat(i.replace(/:/g,"")),u=(null!==(r=o.cssVar)&&void 0!==r?r:a.cssVar)&&Object.assign(Object.assign(Object.assign({prefix:null===n||void 0===n?void 0:n.prefixCls},"object"===typeof a.cssVar?a.cssVar:{}),"object"===typeof o.cssVar?o.cssVar:{}),{key:"object"===typeof o.cssVar&&(null===(s=o.cssVar)||void 0===s?void 0:s.key)||c});return Object.assign(Object.assign(Object.assign({},a),o),{token:Object.assign(Object.assign({},a.token),o.token),components:l,cssVar:u})}),[o,a],((e,t)=>e.some(((e,n)=>{const r=t[n];return!Yr(e,r,!0)}))))}(w,y.theme,{prefixCls:je("")});const _e={csp:Pe,autoInsertSpaceInButton:o,alert:a,anchor:i,locale:l||g,direction:u,space:d,splitter:f,virtual:p,popupMatchSelectWidth:null!==m&&void 0!==m?m:h,popupOverflow:v,getPrefixCls:je,iconPrefixCls:De,theme:Te,segmented:k,statistic:S,spin:E,calendar:C,carousel:N,cascader:j,collapse:D,typography:P,checkbox:T,descriptions:_,divider:O,drawer:M,skeleton:R,steps:A,image:L,input:Q,textArea:K,layout:I,list:F,mentions:z,modal:B,progress:H,result:U,slider:Y,breadcrumb:W,menu:q,pagination:V,empty:$,badge:G,radio:X,rate:J,switch:Z,transfer:ee,avatar:te,message:ne,tag:re,table:oe,card:ae,tabs:ie,timeline:se,timePicker:le,upload:ce,notification:ue,tree:de,colorPicker:fe,datePicker:pe,rangePicker:he,flex:me,wave:ve,dropdown:ge,warning:ye,tour:be,tooltip:we,popover:xe,popconfirm:ke,floatButtonGroup:Se,variant:Ee,inputNumber:Ce,treeSelect:Ne};const Oe=Object.assign({},y);Object.keys(_e).forEach((e=>{void 0!==_e[e]&&(Oe[e]=_e[e])})),Xl.forEach((t=>{const n=e[t];n&&(Oe[t]=n)})),"undefined"!==typeof o&&(Oe.button=Object.assign({autoInsertSpace:o},Oe.button));const Me=Ar((()=>Oe),Oe,((e,t)=>{const n=Object.keys(e),r=Object.keys(t);return n.length!==r.length||n.some((n=>e[n]!==t[n]))})),{layer:Re}=r.useContext(to),Ae=r.useMemo((()=>({prefixCls:De,csp:Pe,layer:Re?"antd":void 0})),[De,Pe,Re]);let Le=r.createElement(r.Fragment,null,r.createElement(Vl,{dropdownMatchSelectWidth:h}),t);const Ie=r.useMemo((()=>{var e,t,n,r;return Va((null===(e=ni.Form)||void 0===e?void 0:e.defaultValidateMessages)||{},(null===(n=null===(t=Me.locale)||void 0===t?void 0:t.Form)||void 0===n?void 0:n.defaultValidateMessages)||{},(null===(r=Me.form)||void 0===r?void 0:r.validateMessages)||{},(null===s||void 0===s?void 0:s.validateMessages)||{})}),[Me,null===s||void 0===s?void 0:s.validateMessages]);Object.keys(Ie).length>0&&(Le=r.createElement(Ga.Provider,{value:Ie},Le)),l&&(Le=r.createElement(si,{locale:l,_ANT_MARK__:"internalMark"},Le)),(De||Pe)&&(Le=r.createElement(Ba.Provider,{value:Ae},Le)),c&&(Le=r.createElement(ds,{size:c},Le)),Le=r.createElement(ql,null,Le);const Fe=r.useMemo((()=>{const e=Te||{},{algorithm:t,token:n,components:r,cssVar:o}=e,a=Gl(e,["algorithm","token","components","cssVar"]),i=t&&(!Array.isArray(t)||t.length>0)?so(t):ns,s={};Object.entries(r||{}).forEach((e=>{let[t,n]=e;const r=Object.assign({},n);"algorithm"in r&&(!0===r.algorithm?r.theme=i:(Array.isArray(r.algorithm)||"function"===typeof r.algorithm)&&(r.theme=so(r.algorithm)),delete r.algorithm),s[t]=r}));const l=Object.assign(Object.assign({},Qi),n);return Object.assign(Object.assign({},a),{theme:i,token:l,components:s,override:Object.assign({override:l},s),cssVar:o})}),[Te]);return w&&(Le=r.createElement(os.Provider,{value:Fe},Le)),Me.warning&&(Le=r.createElement(Ka.Provider,{value:Me.warning},Le)),void 0!==x&&(Le=r.createElement(ls,{disabled:x},Le)),r.createElement(yr.Provider,{value:Me},Le)},ic=e=>{const t=r.useContext(yr),n=r.useContext(ii);return r.createElement(ac,Object.assign({parentContext:t,legacyLocale:n},e))};ic.ConfigContext=yr,ic.SizeContext=fs,ic.config=e=>{const{prefixCls:t,iconPrefixCls:n,theme:r,holderRender:o}=e;void 0!==t&&(Jl=t),void 0!==n&&(Zl=n),"holderRender"in e&&(tc=o),r&&(!function(e){return Object.keys(e).some((e=>e.endsWith("Color")))}(r)?ec=r:is(nc(),r))},ic.useConfig=ps,Object.defineProperty(ic,"SizeContext",{get:()=>fs});const sc=ic;function lc(){lc=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o="function"==typeof Symbol?Symbol:{},a=o.iterator||"@@iterator",i=o.asyncIterator||"@@asyncIterator",s=o.toStringTag||"@@toStringTag";function l(e,t,n,r){return Object.defineProperty(e,t,{value:n,enumerable:!r,configurable:!r,writable:!r})}try{l({},"")}catch(e){l=function(e,t,n){return e[t]=n}}function c(t,n,r,o){var a=n&&n.prototype instanceof f?n:f,i=Object.create(a.prototype);return l(i,"_invoke",function(t,n,r){var o=1;return function(a,i){if(3===o)throw Error("Generator is already running");if(4===o){if("throw"===a)throw i;return{value:e,done:!0}}for(r.method=a,r.arg=i;;){var s=r.delegate;if(s){var l=x(s,r);if(l){if(l===d)continue;return l}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(1===o)throw o=4,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=3;var c=u(t,n,r);if("normal"===c.type){if(o=r.done?4:2,c.arg===d)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(o=4,r.method="throw",r.arg=c.arg)}}}(t,r,new E(o||[])),!0),i}function u(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=c;var d={};function f(){}function p(){}function h(){}var m={};l(m,a,(function(){return this}));var v=Object.getPrototypeOf,g=v&&v(v(C([])));g&&g!==n&&r.call(g,a)&&(m=g);var y=h.prototype=f.prototype=Object.create(m);function b(e){["next","throw","return"].forEach((function(t){l(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){function n(o,a,i,s){var l=u(e[o],e,a);if("throw"!==l.type){var c=l.arg,d=c.value;return d&&"object"==je(d)&&r.call(d,"__await")?t.resolve(d.__await).then((function(e){n("next",e,i,s)}),(function(e){n("throw",e,i,s)})):t.resolve(d).then((function(e){c.value=e,i(c)}),(function(e){return n("throw",e,i,s)}))}s(l.arg)}var o;l(this,"_invoke",(function(e,r){function a(){return new t((function(t,o){n(e,r,t,o)}))}return o=o?o.then(a,a):a()}),!0)}function x(t,n){var r=n.method,o=t.i[r];if(o===e)return n.delegate=null,"throw"===r&&t.i.return&&(n.method="return",n.arg=e,x(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),d;var a=u(o,t.i,n.arg);if("throw"===a.type)return n.method="throw",n.arg=a.arg,n.delegate=null,d;var i=a.arg;return i?i.done?(n[t.r]=i.value,n.next=t.n,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,d):i:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,d)}function k(e){this.tryEntries.push(e)}function S(t){var n=t[4]||{};n.type="normal",n.arg=e,t[4]=n}function E(e){this.tryEntries=[[-1]],e.forEach(k,this),this.reset(!0)}function C(t){if(null!=t){var n=t[a];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,i=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return i.next=i}}throw new TypeError(je(t)+" is not iterable")}return p.prototype=h,l(y,"constructor",h),l(h,"constructor",p),p.displayName=l(h,s,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===p||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,h):(e.__proto__=h,l(e,s,"GeneratorFunction")),e.prototype=Object.create(y),e},t.awrap=function(e){return{__await:e}},b(w.prototype),l(w.prototype,i,(function(){return this})),t.AsyncIterator=w,t.async=function(e,n,r,o,a){void 0===a&&(a=Promise);var i=new w(c(e,n,r,o),a);return t.isGeneratorFunction(n)?i:i.next().then((function(e){return e.done?e.value:i.next()}))},b(y),l(y,s,"Generator"),l(y,a,(function(){return this})),l(y,"toString",(function(){return"[object Generator]"})),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.unshift(r);return function e(){for(;n.length;)if((r=n.pop())in t)return e.value=r,e.done=!1,e;return e.done=!0,e}},t.values=C,E.prototype={constructor:E,reset:function(t){if(this.prev=this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(S),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0][4];if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function r(e){i.type="throw",i.arg=t,n.next=e}for(var o=n.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],i=a[4],s=this.prev,l=a[1],c=a[2];if(-1===a[0])return r("end"),!1;if(!l&&!c)throw Error("try statement without catch or finally");if(null!=a[0]&&a[0]<=s){if(s<l)return this.method="next",this.arg=e,r(l),!0;if(s<c)return r(c),!1}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r[0]>-1&&r[0]<=this.prev&&this.prev<r[2]){var o=r;break}}o&&("break"===e||"continue"===e)&&o[0]<=t&&t<=o[2]&&(o=null);var a=o?o[4]:{};return a.type=e,a.arg=t,o?(this.method="next",this.next=o[2],d):this.complete(a)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),d},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n[2]===e)return this.complete(n[4],n[3]),S(n),d}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n[0]===e){var r=n[4];if("throw"===r.type){var o=r.arg;S(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={i:C(t),r:n,n:r},"next"===this.method&&(this.arg=e),d}},t}function cc(e,t,n,r,o,a,i){try{var s=e[a](i),l=s.value}catch(e){return void n(e)}s.done?t(l):Promise.resolve(l).then(r,o)}function uc(e){return function(){var t=this,n=arguments;return new Promise((function(r,o){var a=e.apply(t,n);function i(e){cc(a,r,o,i,s,"next",e)}function s(e){cc(a,r,o,i,s,"throw",e)}i(void 0)}))}}var dc,fc=_e({},s),pc=fc.version,hc=fc.render,mc=fc.unmountComponentAtNode;try{Number((pc||"").split(".")[0])>=18&&(dc=fc.createRoot)}catch(Dy){}function vc(e){var t=fc.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;t&&"object"===je(t)&&(t.usingClientEntryPoint=e)}var gc="__rc_react_root__";function yc(e,t){dc?function(e,t){vc(!0);var n=t[gc]||dc(t);vc(!1),n.render(e),t[gc]=n}(e,t):function(e,t){null===hc||void 0===hc||hc(e,t)}(e,t)}function bc(e){return wc.apply(this,arguments)}function wc(){return(wc=uc(lc().mark((function e(t){return lc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",Promise.resolve().then((function(){var e;null===(e=t[gc])||void 0===e||e.unmount(),delete t[gc]})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function xc(e){mc(e)}function kc(){return(kc=uc(lc().mark((function e(t){return lc().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0===dc){e.next=2;break}return e.abrupt("return",bc(t));case 2:xc(t);case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}let Sc=(e,t)=>(yc(e,t),()=>function(e){return kc.apply(this,arguments)}(t));const Ec={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z"}}]},name:"check-circle",theme:"filled"};function Cc(e){var t;return null===e||void 0===e||null===(t=e.getRootNode)||void 0===t?void 0:t.call(e)}function Nc(e){return function(e){return Cc(e)instanceof ShadowRoot}(e)?Cc(e):null}function jc(e){return"object"===je(e)&&"string"===typeof e.name&&"string"===typeof e.theme&&("object"===je(e.icon)||"function"===typeof e.icon)}function Dc(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce((function(t,n){var r,o=e[n];if("class"===n)t.className=o,delete t.class;else delete t[n],t[(r=n,r.replace(/-(.)/g,(function(e,t){return t.toUpperCase()})))]=o;return t}),{})}function Pc(e,t,n){return n?r.createElement(e.tag,_e(_e({key:t},Dc(e.attrs)),n),(e.children||[]).map((function(n,r){return Pc(n,"".concat(t,"-").concat(e.tag,"-").concat(r))}))):r.createElement(e.tag,_e({key:t},Dc(e.attrs)),(e.children||[]).map((function(n,r){return Pc(n,"".concat(t,"-").concat(e.tag,"-").concat(r))})))}function Tc(e){return gi(e)[0]}function _c(e){return e?Array.isArray(e)?e:[e]:[]}var Oc=["icon","className","onClick","style","primaryColor","secondaryColor"],Mc={primaryColor:"#333",secondaryColor:"#E6E6E6",calculated:!1};var Rc=function(e){var t=e.icon,n=e.className,o=e.onClick,a=e.style,i=e.primaryColor,s=e.secondaryColor,l=Ps(e,Oc),c=r.useRef(),u=Mc;if(i&&(u={primaryColor:i,secondaryColor:s||Tc(i)}),function(e){var t=(0,r.useContext)(Ba),n=t.csp,o=t.prefixCls,a=t.layer,i="\n.anticon {\n  display: inline-flex;\n  align-items: center;\n  color: inherit;\n  font-style: normal;\n  line-height: 0;\n  text-align: center;\n  text-transform: none;\n  vertical-align: -0.125em;\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n  line-height: 1;\n}\n\n.anticon svg {\n  display: inline-block;\n}\n\n.anticon::before {\n  display: none;\n}\n\n.anticon .anticon-icon {\n  display: block;\n}\n\n.anticon[tabindex] {\n  cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n  display: inline-block;\n  -webkit-animation: loadingCircle 1s infinite linear;\n  animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes loadingCircle {\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n";o&&(i=i.replace(/anticon/g,o)),a&&(i="@layer ".concat(a," {\n").concat(i,"\n}")),(0,r.useEffect)((function(){var t=Nc(e.current);Rr(i,"@ant-design-icons",{prepend:!a,csp:n,attachTo:t})}),[])}(c),function(e,t){Ur(e,"[@ant-design/icons] ".concat(t))}(jc(t),"icon should be icon definiton, but got ".concat(t)),!jc(t))return null;var d=t;return d&&"function"===typeof d.icon&&(d=_e(_e({},d),{},{icon:d.icon(u.primaryColor,u.secondaryColor)})),Pc(d.icon,"svg-".concat(d.name),_e(_e({className:n,onClick:o,style:a,"data-icon":d.name,width:"1em",height:"1em",fill:"currentColor","aria-hidden":"true"},l),{},{ref:c}))};Rc.displayName="IconReact",Rc.getTwoToneColors=function(){return _e({},Mc)},Rc.setTwoToneColors=function(e){var t=e.primaryColor,n=e.secondaryColor;Mc.primaryColor=t,Mc.secondaryColor=n||Tc(t),Mc.calculated=!!n};const Ac=Rc;function Lc(e){var t=kr(_c(e),2),n=t[0],r=t[1];return Ac.setTwoToneColors({primaryColor:n,secondaryColor:r})}var Ic=["className","icon","spin","rotate","tabIndex","onClick","twoToneColor"];Lc(ji.primary);var Fc=r.forwardRef((function(e,t){var n=e.className,o=e.icon,a=e.spin,i=e.rotate,s=e.tabIndex,l=e.onClick,c=e.twoToneColor,u=Ps(e,Ic),d=r.useContext(Ba),f=d.prefixCls,p=void 0===f?"anticon":f,h=d.rootClassName,m=ys()(h,p,Pe(Pe({},"".concat(p,"-").concat(o.name),!!o.name),"".concat(p,"-spin"),!!a||"loading"===o.name),n),v=s;void 0===v&&l&&(v=-1);var g=i?{msTransform:"rotate(".concat(i,"deg)"),transform:"rotate(".concat(i,"deg)")}:void 0,y=kr(_c(c),2),b=y[0],w=y[1];return r.createElement("span",Mo({role:"img","aria-label":o.name},u,{ref:t,tabIndex:v,onClick:l,className:m}),r.createElement(Ac,{icon:o,primaryColor:b,secondaryColor:w,style:g}))}));Fc.displayName="AntdIcon",Fc.getTwoToneColor=function(){var e=Ac.getTwoToneColors();return e.calculated?[e.primaryColor,e.secondaryColor]:e.primaryColor},Fc.setTwoToneColor=Lc;const zc=Fc;var Bc=function(e,t){return r.createElement(zc,Mo({},e,{ref:t,icon:Ec}))};const Hc=r.forwardRef(Bc);const Uc={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z"}}]},name:"close-circle",theme:"filled"};var Yc=function(e,t){return r.createElement(zc,Mo({},e,{ref:t,icon:Uc}))};const Wc=r.forwardRef(Yc);const qc={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"}}]},name:"exclamation-circle",theme:"filled"};var Vc=function(e,t){return r.createElement(zc,Mo({},e,{ref:t,icon:qc}))};const Qc=r.forwardRef(Vc);const Kc={icon:{tag:"svg",attrs:{viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z"}}]},name:"info-circle",theme:"filled"};var $c=function(e,t){return r.createElement(zc,Mo({},e,{ref:t,icon:Kc}))};const Gc=r.forwardRef($c);const Xc={icon:{tag:"svg",attrs:{viewBox:"0 0 1024 1024",focusable:"false"},children:[{tag:"path",attrs:{d:"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z"}}]},name:"loading",theme:"outlined"};var Jc=function(e,t){return r.createElement(zc,Mo({},e,{ref:t,icon:Xc}))};const Zc=r.forwardRef(Jc);var eu={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229,isTextModifyingKeyEvent:function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=eu.F1&&t<=eu.F12)return!1;switch(t){case eu.ALT:case eu.CAPS_LOCK:case eu.CONTEXT_MENU:case eu.CTRL:case eu.DOWN:case eu.END:case eu.ESC:case eu.HOME:case eu.INSERT:case eu.LEFT:case eu.MAC_FF_META:case eu.META:case eu.NUMLOCK:case eu.NUM_CENTER:case eu.PAGE_DOWN:case eu.PAGE_UP:case eu.PAUSE:case eu.PRINT_SCREEN:case eu.RIGHT:case eu.SHIFT:case eu.UP:case eu.WIN_KEY:case eu.WIN_KEY_RIGHT:return!1;default:return!0}},isCharacterKey:function(e){if(e>=eu.ZERO&&e<=eu.NINE)return!0;if(e>=eu.NUM_ZERO&&e<=eu.NUM_MULTIPLY)return!0;if(e>=eu.A&&e<=eu.Z)return!0;if(-1!==window.navigator.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case eu.SPACE:case eu.QUESTION_MARK:case eu.NUM_PLUS:case eu.NUM_MINUS:case eu.NUM_PERIOD:case eu.NUM_DIVISION:case eu.SEMICOLON:case eu.DASH:case eu.EQUALS:case eu.COMMA:case eu.PERIOD:case eu.SLASH:case eu.APOSTROPHE:case eu.SINGLE_QUOTE:case eu.OPEN_SQUARE_BRACKET:case eu.BACKSLASH:case eu.CLOSE_SQUARE_BRACKET:return!0;default:return!1}}};const tu=eu;var nu="".concat("accept acceptCharset accessKey action allowFullScreen allowTransparency\n    alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\n    charSet checked classID className colSpan cols content contentEditable contextMenu\n    controls coords crossOrigin data dateTime default defer dir disabled download draggable\n    encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\n    headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\n    is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\n    mediaGroup method min minLength multiple muted name noValidate nonce open\n    optimum pattern placeholder poster preload radioGroup readOnly rel required\n    reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\n    shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\n    summary tabIndex target title type useMap value width wmode wrap"," ").concat("onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\n    onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\n    onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\n    onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\n    onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\n    onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\n    onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError").split(/[\s\n]+/);function ru(e,t){return 0===e.indexOf(t)}var ou=r.forwardRef((function(e,t){var n=e.prefixCls,o=e.style,a=e.className,i=e.duration,s=void 0===i?4.5:i,l=e.showProgress,c=e.pauseOnHover,u=void 0===c||c,d=e.eventKey,f=e.content,p=e.closable,h=e.closeIcon,m=void 0===h?"x":h,v=e.props,g=e.onClick,y=e.onNoticeClose,b=e.times,w=e.hovering,x=kr(r.useState(!1),2),k=x[0],S=x[1],E=kr(r.useState(0),2),C=E[0],N=E[1],j=kr(r.useState(0),2),D=j[0],P=j[1],T=w||k,_=s>0&&l,O=function(){y(d)};r.useEffect((function(){if(!T&&s>0){var e=Date.now()-D,t=setTimeout((function(){O()}),1e3*s-D);return function(){u&&clearTimeout(t),P(Date.now()-e)}}}),[s,T,b]),r.useEffect((function(){if(!T&&_&&(u||0===D)){var e,t=performance.now();return function n(){cancelAnimationFrame(e),e=requestAnimationFrame((function(e){var r=e+D-t,o=Math.min(r/(1e3*s),1);N(100*o),o<1&&n()}))}(),function(){u&&cancelAnimationFrame(e)}}}),[s,D,T,_,b]);var M=r.useMemo((function(){return"object"===je(p)&&null!==p?p:p?{closeIcon:m}:{}}),[p,m]),R=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];t=!1===n?{aria:!0,data:!0,attr:!0}:!0===n?{aria:!0}:_e({},n);var r={};return Object.keys(e).forEach((function(n){(t.aria&&("role"===n||ru(n,"aria-"))||t.data&&ru(n,"data-")||t.attr&&nu.includes(n))&&(r[n]=e[n])})),r}(M,!0),A=100-(!C||C<0?0:C>100?100:C),L="".concat(n,"-notice");return r.createElement("div",Mo({},v,{ref:t,className:ys()(L,a,Pe({},"".concat(L,"-closable"),p)),style:o,onMouseEnter:function(e){var t;S(!0),null===v||void 0===v||null===(t=v.onMouseEnter)||void 0===t||t.call(v,e)},onMouseLeave:function(e){var t;S(!1),null===v||void 0===v||null===(t=v.onMouseLeave)||void 0===t||t.call(v,e)},onClick:g}),r.createElement("div",{className:"".concat(L,"-content")},f),p&&r.createElement("a",Mo({tabIndex:0,className:"".concat(L,"-close"),onKeyDown:function(e){"Enter"!==e.key&&"Enter"!==e.code&&e.keyCode!==tu.ENTER||O()},"aria-label":"Close"},R,{onClick:function(e){e.preventDefault(),e.stopPropagation(),O()}}),M.closeIcon),_&&r.createElement("progress",{className:"".concat(L,"-progress"),max:"100",value:A},A+"%"))}));const au=ou;var iu=r.createContext({});const su=function(e){var t=e.children,n=e.classNames;return r.createElement(iu.Provider,{value:{classNames:n}},t)};const lu=function(e){var t,n,r,o={offset:8,threshold:3,gap:16};e&&"object"===je(e)&&(o.offset=null!==(t=e.offset)&&void 0!==t?t:8,o.threshold=null!==(n=e.threshold)&&void 0!==n?n:3,o.gap=null!==(r=e.gap)&&void 0!==r?r:16);return[!!e,o]};var cu=["className","style","classNames","styles"];const uu=function(e){var t=e.configList,n=e.placement,o=e.prefixCls,a=e.className,i=e.style,s=e.motion,l=e.onAllNoticeRemoved,c=e.onNoticeClose,u=e.stack,d=(0,r.useContext)(iu).classNames,f=(0,r.useRef)({}),p=kr((0,r.useState)(null),2),h=p[0],m=p[1],v=kr((0,r.useState)([]),2),g=v[0],y=v[1],b=t.map((function(e){return{config:e,key:String(e.key)}})),w=kr(lu(u),2),x=w[0],k=w[1],S=k.offset,E=k.threshold,C=k.gap,N=x&&(g.length>0||b.length<=E),j="function"===typeof s?s(n):s;return(0,r.useEffect)((function(){x&&g.length>1&&y((function(e){return e.filter((function(e){return b.some((function(t){var n=t.key;return e===n}))}))}))}),[g,b,x]),(0,r.useEffect)((function(){var e,t;x&&f.current[null===(e=b[b.length-1])||void 0===e?void 0:e.key]&&m(f.current[null===(t=b[b.length-1])||void 0===t?void 0:t.key])}),[b,x]),r.createElement(Rl,Mo({key:n,className:ys()(o,"".concat(o,"-").concat(n),null===d||void 0===d?void 0:d.list,a,Pe(Pe({},"".concat(o,"-stack"),!!x),"".concat(o,"-stack-expanded"),N)),style:i,keys:b,motionAppear:!0},j,{onAllRemoved:function(){l(n)}}),(function(e,t){var a=e.config,i=e.className,s=e.style,l=e.index,u=a,p=u.key,m=u.times,v=String(p),w=a,k=w.className,E=w.style,j=w.classNames,D=w.styles,P=Ps(w,cu),T=b.findIndex((function(e){return e.key===v})),_={};if(x){var O=b.length-1-(T>-1?T:l-1),M="top"===n||"bottom"===n?"-50%":"0";if(O>0){var R,A,L;_.height=N?null===(R=f.current[v])||void 0===R?void 0:R.offsetHeight:null===h||void 0===h?void 0:h.offsetHeight;for(var I=0,F=0;F<O;F++){var z;I+=(null===(z=f.current[b[b.length-1-F].key])||void 0===z?void 0:z.offsetHeight)+C}var B=(N?I:O*S)*(n.startsWith("top")?1:-1),H=!N&&null!==h&&void 0!==h&&h.offsetWidth&&null!==(A=f.current[v])&&void 0!==A&&A.offsetWidth?((null===h||void 0===h?void 0:h.offsetWidth)-2*S*(O<3?O:3))/(null===(L=f.current[v])||void 0===L?void 0:L.offsetWidth):1;_.transform="translate3d(".concat(M,", ").concat(B,"px, 0) scaleX(").concat(H,")")}else _.transform="translate3d(".concat(M,", 0, 0)")}return r.createElement("div",{ref:t,className:ys()("".concat(o,"-notice-wrapper"),i,null===j||void 0===j?void 0:j.wrapper),style:_e(_e(_e({},s),_),null===D||void 0===D?void 0:D.wrapper),onMouseEnter:function(){return y((function(e){return e.includes(v)?e:[].concat(hr(e),[v])}))},onMouseLeave:function(){return y((function(e){return e.filter((function(e){return e!==v}))}))}},r.createElement(au,Mo({},P,{ref:function(e){T>-1?f.current[v]=e:delete f.current[v]},prefixCls:o,classNames:j,styles:D,className:ys()(k,null===d||void 0===d?void 0:d.notice),style:E,times:m,key:p,eventKey:p,onNoticeClose:c,hovering:x&&g.length>0})))}))};var du=r.forwardRef((function(e,t){var n=e.prefixCls,o=void 0===n?"rc-notification":n,a=e.container,s=e.motion,l=e.maxCount,c=e.className,u=e.style,d=e.onAllRemoved,f=e.stack,p=e.renderNotifications,h=kr(r.useState([]),2),m=h[0],v=h[1],g=function(e){var t,n=m.find((function(t){return t.key===e}));null===n||void 0===n||null===(t=n.onClose)||void 0===t||t.call(n),v((function(t){return t.filter((function(t){return t.key!==e}))}))};r.useImperativeHandle(t,(function(){return{open:function(e){v((function(t){var n,r=hr(t),o=r.findIndex((function(t){return t.key===e.key})),a=_e({},e);o>=0?(a.times=((null===(n=t[o])||void 0===n?void 0:n.times)||0)+1,r[o]=a):(a.times=0,r.push(a));return l>0&&r.length>l&&(r=r.slice(-l)),r}))},close:function(e){g(e)},destroy:function(){v([])}}}));var y=kr(r.useState({}),2),b=y[0],w=y[1];r.useEffect((function(){var e={};m.forEach((function(t){var n=t.placement,r=void 0===n?"topRight":n;r&&(e[r]=e[r]||[],e[r].push(t))})),Object.keys(b).forEach((function(t){e[t]=e[t]||[]})),w(e)}),[m]);var x=function(e){w((function(t){var n=_e({},t);return(n[e]||[]).length||delete n[e],n}))},k=r.useRef(!1);if(r.useEffect((function(){Object.keys(b).length>0?k.current=!0:k.current&&(null===d||void 0===d||d(),k.current=!1)}),[b]),!a)return null;var S=Object.keys(b);return(0,i.createPortal)(r.createElement(r.Fragment,null,S.map((function(e){var t=b[e],n=r.createElement(uu,{key:e,configList:t,placement:e,prefixCls:o,className:null===c||void 0===c?void 0:c(e),style:null===u||void 0===u?void 0:u(e),motion:s,onNoticeClose:g,onAllNoticeRemoved:x,stack:f});return p?p(n,{prefixCls:o,key:e}):n}))),a)}));const fu=du;var pu=["getContainer","motion","prefixCls","maxCount","className","style","onAllRemoved","stack","renderNotifications"],hu=function(){return document.body},mu=0;function vu(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.getContainer,n=void 0===t?hu:t,o=e.motion,a=e.prefixCls,i=e.maxCount,s=e.className,l=e.style,c=e.onAllRemoved,u=e.stack,d=e.renderNotifications,f=Ps(e,pu),p=kr(r.useState(),2),h=p[0],m=p[1],v=r.useRef(),g=r.createElement(fu,{container:h,ref:v,prefixCls:a,motion:o,maxCount:i,className:s,style:l,onAllRemoved:c,stack:u,renderNotifications:d}),y=kr(r.useState([]),2),b=y[0],w=y[1],x=Bs((function(e){var t=function(){for(var e={},t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return n.forEach((function(t){t&&Object.keys(t).forEach((function(n){var r=t[n];void 0!==r&&(e[n]=r)}))})),e}(f,e);null!==t.key&&void 0!==t.key||(t.key="rc-notification-".concat(mu),mu+=1),w((function(e){return[].concat(hr(e),[{type:"open",config:t}])}))})),k=r.useMemo((function(){return{open:x,close:function(e){w((function(t){return[].concat(hr(t),[{type:"close",key:e}])}))},destroy:function(){w((function(e){return[].concat(hr(e),[{type:"destroy"}])}))}}}),[]);return r.useEffect((function(){m(n())})),r.useEffect((function(){var e,t;v.current&&b.length&&(b.forEach((function(e){switch(e.type){case"open":v.current.open(e.config);break;case"close":v.current.close(e.key);break;case"destroy":v.current.destroy()}})),w((function(n){return e===n&&t||(e=n,t=n.filter((function(e){return!b.includes(e)}))),t})))}),[b]),[k,g]}const gu=e=>{const[,,,,t]=Wl();return t?"".concat(e,"-css-var"):""};const yu=Vr((function e(){Wr(this,e)}));var bu="CALC_UNIT",wu=new RegExp(bu,"g");function xu(e){return"number"===typeof e?"".concat(e).concat(bu):e}var ku=function(e){Rs(n,e);var t=Fs(n);function n(e,r){var o;Wr(this,n),Pe(Is(o=t.call(this)),"result",""),Pe(Is(o),"unitlessCssVar",void 0),Pe(Is(o),"lowPriority",void 0);var a=je(e);return o.unitlessCssVar=r,e instanceof n?o.result="(".concat(e.result,")"):"number"===a?o.result=xu(e):"string"===a&&(o.result=e),o}return Vr(n,[{key:"add",value:function(e){return e instanceof n?this.result="".concat(this.result," + ").concat(e.getResult()):"number"!==typeof e&&"string"!==typeof e||(this.result="".concat(this.result," + ").concat(xu(e))),this.lowPriority=!0,this}},{key:"sub",value:function(e){return e instanceof n?this.result="".concat(this.result," - ").concat(e.getResult()):"number"!==typeof e&&"string"!==typeof e||(this.result="".concat(this.result," - ").concat(xu(e))),this.lowPriority=!0,this}},{key:"mul",value:function(e){return this.lowPriority&&(this.result="(".concat(this.result,")")),e instanceof n?this.result="".concat(this.result," * ").concat(e.getResult(!0)):"number"!==typeof e&&"string"!==typeof e||(this.result="".concat(this.result," * ").concat(e)),this.lowPriority=!1,this}},{key:"div",value:function(e){return this.lowPriority&&(this.result="(".concat(this.result,")")),e instanceof n?this.result="".concat(this.result," / ").concat(e.getResult(!0)):"number"!==typeof e&&"string"!==typeof e||(this.result="".concat(this.result," / ").concat(e)),this.lowPriority=!1,this}},{key:"getResult",value:function(e){return this.lowPriority||e?"(".concat(this.result,")"):this.result}},{key:"equal",value:function(e){var t=this,n=(e||{}).unit,r=!0;return"boolean"===typeof n?r=n:Array.from(this.unitlessCssVar).some((function(e){return t.result.includes(e)}))&&(r=!1),this.result=this.result.replace(wu,r?"px":""),"undefined"!==typeof this.lowPriority?"calc(".concat(this.result,")"):this.result}}]),n}(yu);const Su=function(e){Rs(n,e);var t=Fs(n);function n(e){var r;return Wr(this,n),Pe(Is(r=t.call(this)),"result",0),e instanceof n?r.result=e.result:"number"===typeof e&&(r.result=e),r}return Vr(n,[{key:"add",value:function(e){return e instanceof n?this.result+=e.result:"number"===typeof e&&(this.result+=e),this}},{key:"sub",value:function(e){return e instanceof n?this.result-=e.result:"number"===typeof e&&(this.result-=e),this}},{key:"mul",value:function(e){return e instanceof n?this.result*=e.result:"number"===typeof e&&(this.result*=e),this}},{key:"div",value:function(e){return e instanceof n?this.result/=e.result:"number"===typeof e&&(this.result/=e),this}},{key:"equal",value:function(){return this.result}}]),n}(yu);const Eu=function(e,t){var n="css"===e?ku:Su;return function(e){return new n(e,t)}};const Cu=function(e,t){return"".concat([t,e.replace(/([A-Z]+)([A-Z][a-z]+)/g,"$1-$2").replace(/([a-z])([A-Z])/g,"$1-$2")].filter(Boolean).join("-"))};const Nu=function(e,t,n,r){var o=_e({},t[e]);null!==r&&void 0!==r&&r.deprecatedTokens&&r.deprecatedTokens.forEach((function(e){var t,n=kr(e,2),r=n[0],a=n[1];(null!==o&&void 0!==o&&o[r]||null!==o&&void 0!==o&&o[a])&&(null!==(t=o[a])&&void 0!==t||(o[a]=null===o||void 0===o?void 0:o[r]))}));var a=_e(_e({},n),o);return Object.keys(a).forEach((function(e){a[e]===t[e]&&delete a[e]})),a};var ju="undefined"!==typeof CSSINJS_STATISTIC,Du=!0;function Pu(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(!ju)return Object.assign.apply(Object,[{}].concat(t));Du=!1;var r={};return t.forEach((function(e){"object"===je(e)&&Object.keys(e).forEach((function(t){Object.defineProperty(r,t,{configurable:!0,enumerable:!0,get:function(){return e[t]}})}))})),Du=!0,r}var Tu={};function _u(){}const Ou=function(e){var t,n=e,r=_u;return ju&&"undefined"!==typeof Proxy&&(t=new Set,n=new Proxy(e,{get:function(e,n){var r;Du&&(null===(r=t)||void 0===r||r.add(n));return e[n]}}),r=function(e,n){var r;Tu[e]={global:Array.from(t),component:_e(_e({},null===(r=Tu[e])||void 0===r?void 0:r.component),n)}}),{token:n,keys:t,flush:r}};const Mu=function(e,t,n){var r;return"function"===typeof n?n(Pu(t,null!==(r=t[e])&&void 0!==r?r:{})):null!==n&&void 0!==n?n:{}};const Ru=function(e){return"js"===e?{max:Math.max,min:Math.min}:{max:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return"max(".concat(t.map((function(e){return mo(e)})).join(","),")")},min:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return"min(".concat(t.map((function(e){return mo(e)})).join(","),")")}}};var Au=function(){function e(){Wr(this,e),Pe(this,"map",new Map),Pe(this,"objectIDMap",new WeakMap),Pe(this,"nextID",0),Pe(this,"lastAccessBeat",new Map),Pe(this,"accessBeat",0)}return Vr(e,[{key:"set",value:function(e,t){this.clear();var n=this.getCompositeKey(e);this.map.set(n,t),this.lastAccessBeat.set(n,Date.now())}},{key:"get",value:function(e){var t=this.getCompositeKey(e),n=this.map.get(t);return this.lastAccessBeat.set(t,Date.now()),this.accessBeat+=1,n}},{key:"getCompositeKey",value:function(e){var t=this;return e.map((function(e){return e&&"object"===je(e)?"obj_".concat(t.getObjectID(e)):"".concat(je(e),"_").concat(e)})).join("|")}},{key:"getObjectID",value:function(e){if(this.objectIDMap.has(e))return this.objectIDMap.get(e);var t=this.nextID;return this.objectIDMap.set(e,t),this.nextID+=1,t}},{key:"clear",value:function(){var e=this;if(this.accessBeat>1e4){var t=Date.now();this.lastAccessBeat.forEach((function(n,r){t-n>6e5&&(e.map.delete(r),e.lastAccessBeat.delete(r))})),this.accessBeat=0}}}]),e}(),Lu=new Au;const Iu=function(e,t){return r.useMemo((function(){var n=Lu.get(t);if(n)return n;var r=e();return Lu.set(t,r),r}),t)};const Fu=function(){return{}};const zu=function(e){var t=e.useCSP,n=void 0===t?Fu:t,o=e.useToken,a=e.usePrefix,i=e.getResetStyles,s=e.getCommonStyle,l=e.getCompUnitless;function c(t,r,l){var c=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},u=Array.isArray(t)?t:[t,t],d=kr(u,1)[0],f=u.join("-"),p=e.layer||{name:"antd"};return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,u=o(),h=u.theme,m=u.realToken,v=u.hashId,g=u.token,y=u.cssVar,b=a(),w=b.rootPrefixCls,x=b.iconPrefixCls,k=n(),S=y?"css":"js",E=Iu((function(){var e=new Set;return y&&Object.keys(c.unitless||{}).forEach((function(t){e.add(go(t,y.prefix)),e.add(go(t,Cu(d,y.prefix)))})),Eu(S,e)}),[S,d,null===y||void 0===y?void 0:y.prefix]),C=Ru(S),N=C.max,j=C.min,D={theme:h,token:g,hashId:v,nonce:function(){return k.nonce},clientOnly:c.clientOnly,layer:p,order:c.order||-999};return"function"===typeof i&&Ma(_e(_e({},D),{},{clientOnly:!1,path:["Shared",w]}),(function(){return i(g,{prefix:{rootPrefixCls:w,iconPrefixCls:x},csp:k})})),[Ma(_e(_e({},D),{},{path:[f,e,x]}),(function(){if(!1===c.injectStyle)return[];var n=Ou(g),o=n.token,a=n.flush,i=Mu(d,m,l),u=".".concat(e),f=Nu(d,m,i,{deprecatedTokens:c.deprecatedTokens});y&&i&&"object"===je(i)&&Object.keys(i).forEach((function(e){i[e]="var(".concat(go(e,Cu(d,y.prefix)),")")}));var p=Pu(o,{componentCls:u,prefixCls:e,iconCls:".".concat(x),antCls:".".concat(w),calc:E,max:N,min:j},y?i:f),h=r(p,{hashId:v,prefixCls:e,rootPrefixCls:w,iconPrefixCls:x});a(d,f);var b="function"===typeof s?s(p,e,t,c.resetFont):null;return[!1===c.resetStyle?null:b,h]})),v]}}return{genStyleHooks:function(e,t,n,a){var i=Array.isArray(e)?e[0]:e;function s(e){return"".concat(String(i)).concat(e.slice(0,1).toUpperCase()).concat(e.slice(1))}var u=(null===a||void 0===a?void 0:a.unitless)||{},d=_e(_e({},"function"===typeof l?l(e):{}),{},Pe({},s("zIndexPopup"),!0));Object.keys(u).forEach((function(e){d[s(e)]=u[e]}));var f=_e(_e({},a),{},{unitless:d,prefixToken:s}),p=c(e,t,n,f),h=function(e,t,n){var a=n.unitless,i=n.injectStyle,s=void 0===i||i,l=n.prefixToken,c=n.ignore,u=function(r){var i=r.rootCls,s=r.cssVar,u=void 0===s?{}:s,d=o().realToken;return Aa({path:[e],prefix:u.prefix,key:u.key,unitless:a,ignore:c,token:d,scope:i},(function(){var r=Mu(e,d,t),o=Nu(e,d,r,{deprecatedTokens:null===n||void 0===n?void 0:n.deprecatedTokens});return Object.keys(r).forEach((function(e){o[l(e)]=o[e],delete o[e]})),o})),null},d=function(t){var n=o().cssVar;return[function(o){return s&&n?r.createElement(r.Fragment,null,r.createElement(u,{rootCls:t,cssVar:n,component:e}),o):o},null===n||void 0===n?void 0:n.key]};return d}(i,n,f);return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,n=kr(p(e,t),2)[1],r=kr(h(t),2);return[r[0],n,r[1]]}},genSubStyleComponent:function(e,t,n){var r=c(e,t,n,_e({resetStyle:!1,order:-998},arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}));return function(e){var t=e.prefixCls,n=e.rootCls;return r(t,void 0===n?t:n),null}},genComponentStyleHook:c}},{genStyleHooks:Bu,genComponentStyleHook:Hu,genSubStyleComponent:Uu}=zu({usePrefix:()=>{const{getPrefixCls:e,iconPrefixCls:t}=(0,r.useContext)(yr);return{rootPrefixCls:e(),iconPrefixCls:t}},useToken:()=>{const[e,t,n,r,o]=Wl();return{theme:e,realToken:t,hashId:n,token:r,cssVar:o}},useCSP:()=>{const{csp:e}=(0,r.useContext)(yr);return null!==e&&void 0!==e?e:{}},getResetStyles:(e,t)=>{var n;const r=(e=>({a:{color:e.colorLink,textDecoration:e.linkDecoration,backgroundColor:"transparent",outline:"none",cursor:"pointer",transition:"color ".concat(e.motionDurationSlow),"-webkit-text-decoration-skip":"objects","&:hover":{color:e.colorLinkHover},"&:active":{color:e.colorLinkActive},"&:active, &:hover":{textDecoration:e.linkHoverDecoration,outline:0},"&:focus":{textDecoration:e.linkFocusDecoration,outline:0},"&[disabled]":{color:e.colorTextDisabled,cursor:"not-allowed"}}}))(e);return[r,{"&":r},Kl(null!==(n=null===t||void 0===t?void 0:t.prefix.iconPrefixCls)&&void 0!==n?n:gr)]},getCommonStyle:(e,t,n,r)=>{const o='[class^="'.concat(t,'"], [class*=" ').concat(t,'"]'),a=n?".".concat(n):o,i={boxSizing:"border-box","&::before, &::after":{boxSizing:"border-box"}};let s={};return!1!==r&&(s={fontFamily:e.fontFamily,fontSize:e.fontSize}),{[a]:Object.assign(Object.assign(Object.assign({},s),i),{[o]:i})}},getCompUnitless:()=>Bl}),Yu=e=>{const{componentCls:t,iconCls:n,boxShadow:r,colorText:o,colorSuccess:a,colorError:i,colorWarning:s,colorInfo:l,fontSizeLG:c,motionEaseInOutCirc:u,motionDurationSlow:d,marginXS:f,paddingXS:p,borderRadiusLG:h,zIndexPopup:m,contentPadding:v,contentBg:g}=e,y="".concat(t,"-notice"),b=new Fa("MessageMoveIn",{"0%":{padding:0,transform:"translateY(-100%)",opacity:0},"100%":{padding:p,transform:"translateY(0)",opacity:1}}),w=new Fa("MessageMoveOut",{"0%":{maxHeight:e.height,padding:p,opacity:1},"100%":{maxHeight:0,padding:0,opacity:0}}),x={padding:p,textAlign:"center",["".concat(t,"-custom-content")]:{display:"flex",alignItems:"center"},["".concat(t,"-custom-content > ").concat(n)]:{marginInlineEnd:f,fontSize:c},["".concat(y,"-content")]:{display:"inline-block",padding:v,background:g,borderRadius:h,boxShadow:r,pointerEvents:"all"},["".concat(t,"-success > ").concat(n)]:{color:a},["".concat(t,"-error > ").concat(n)]:{color:i},["".concat(t,"-warning > ").concat(n)]:{color:s},["".concat(t,"-info > ").concat(n,",\n      ").concat(t,"-loading > ").concat(n)]:{color:l}};return[{[t]:Object.assign(Object.assign({},Ql(e)),{color:o,position:"fixed",top:f,width:"100%",pointerEvents:"none",zIndex:m,["".concat(t,"-move-up")]:{animationFillMode:"forwards"},["\n        ".concat(t,"-move-up-appear,\n        ").concat(t,"-move-up-enter\n      ")]:{animationName:b,animationDuration:d,animationPlayState:"paused",animationTimingFunction:u},["\n        ".concat(t,"-move-up-appear").concat(t,"-move-up-appear-active,\n        ").concat(t,"-move-up-enter").concat(t,"-move-up-enter-active\n      ")]:{animationPlayState:"running"},["".concat(t,"-move-up-leave")]:{animationName:w,animationDuration:d,animationPlayState:"paused",animationTimingFunction:u},["".concat(t,"-move-up-leave").concat(t,"-move-up-leave-active")]:{animationPlayState:"running"},"&-rtl":{direction:"rtl",span:{direction:"rtl"}}})},{[t]:{["".concat(y,"-wrapper")]:Object.assign({},x)}},{["".concat(t,"-notice-pure-panel")]:Object.assign(Object.assign({},x),{padding:0,textAlign:"start"})}]},Wu=Bu("Message",(e=>{const t=Pu(e,{height:150});return[Yu(t)]}),(e=>({zIndexPopup:e.zIndexPopupBase+1e3+10,contentBg:e.colorBgElevated,contentPadding:"".concat((e.controlHeightLG-e.fontSize*e.lineHeight)/2,"px ").concat(e.paddingSM,"px")})));var qu=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n};const Vu={info:r.createElement(Gc,null),success:r.createElement(Hc,null),error:r.createElement(Wc,null),warning:r.createElement(Qc,null),loading:r.createElement(Zc,null)},Qu=e=>{let{prefixCls:t,type:n,icon:o,children:a}=e;return r.createElement("div",{className:ys()("".concat(t,"-custom-content"),"".concat(t,"-").concat(n))},o||Vu[n],r.createElement("span",null,a))},Ku=e=>{const{prefixCls:t,className:n,type:o,icon:a,content:i}=e,s=qu(e,["prefixCls","className","type","icon","content"]),{getPrefixCls:l}=r.useContext(yr),c=t||l("message"),u=gu(c),[d,f,p]=Wu(c,u);return d(r.createElement(au,Object.assign({},s,{prefixCls:c,className:ys()(n,f,"".concat(c,"-notice-pure-panel"),p,u),eventKey:"pure",duration:null,content:r.createElement(Qu,{prefixCls:c,type:o,icon:a},i)})))};const $u={icon:{tag:"svg",attrs:{"fill-rule":"evenodd",viewBox:"64 64 896 896",focusable:"false"},children:[{tag:"path",attrs:{d:"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z"}}]},name:"close",theme:"outlined"};var Gu=function(e,t){return r.createElement(zc,Mo({},e,{ref:t,icon:$u}))};const Xu=r.forwardRef(Gu);function Ju(e){let t;const n=new Promise((n=>{t=e((()=>{n(!0)}))})),r=()=>{null===t||void 0===t||t()};return r.then=(e,t)=>n.then(e,t),r.promise=n,r}var Zu=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"===typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n};const ed=3,td=e=>{let{children:t,prefixCls:n}=e;const o=gu(n),[a,i,s]=Wu(n,o);return a(r.createElement(su,{classNames:{list:ys()(i,s,o)}},t))},nd=(e,t)=>{let{prefixCls:n,key:o}=t;return r.createElement(td,{prefixCls:n,key:o},e)},rd=r.forwardRef(((e,t)=>{const{top:n,prefixCls:o,getContainer:a,maxCount:i,duration:s=ed,rtl:l,transitionName:c,onAllRemoved:u}=e,{getPrefixCls:d,getPopupContainer:f,message:p,direction:h}=r.useContext(yr),m=o||d("message"),v=r.createElement("span",{className:"".concat(m,"-close-x")},r.createElement(Xu,{className:"".concat(m,"-close-icon")})),[g,y]=vu({prefixCls:m,style:()=>({left:"50%",transform:"translateX(-50%)",top:null!==n&&void 0!==n?n:8}),className:()=>ys()({["".concat(m,"-rtl")]:null!==l&&void 0!==l?l:"rtl"===h}),motion:()=>function(e,t){return{motionName:null!==t&&void 0!==t?t:"".concat(e,"-move-up")}}(m,c),closable:!1,closeIcon:v,duration:s,getContainer:()=>(null===a||void 0===a?void 0:a())||(null===f||void 0===f?void 0:f())||document.body,maxCount:i,onAllRemoved:u,renderNotifications:nd});return r.useImperativeHandle(t,(()=>Object.assign(Object.assign({},g),{prefixCls:m,message:p}))),y}));let od=0;function ad(e){const t=r.useRef(null),n=($a("Message"),r.useMemo((()=>{const e=e=>{var n;null===(n=t.current)||void 0===n||n.close(e)},n=n=>{if(!t.current){const e=()=>{};return e.then=()=>{},e}const{open:o,prefixCls:a,message:i}=t.current,s="".concat(a,"-notice"),{content:l,icon:c,type:u,key:d,className:f,style:p,onClose:h}=n,m=Zu(n,["content","icon","type","key","className","style","onClose"]);let v=d;return void 0!==v&&null!==v||(od+=1,v="antd-message-".concat(od)),Ju((t=>(o(Object.assign(Object.assign({},m),{key:v,content:r.createElement(Qu,{prefixCls:a,type:u,icon:c},l),placement:"top",className:ys()(u&&"".concat(s,"-").concat(u),f,null===i||void 0===i?void 0:i.className),style:Object.assign(Object.assign({},null===i||void 0===i?void 0:i.style),p),onClose:()=>{null===h||void 0===h||h(),t()}})),()=>{e(v)})))},o={open:n,destroy:n=>{var r;void 0!==n?e(n):null===(r=t.current)||void 0===r||r.destroy()}};return["info","success","warning","error","loading"].forEach((e=>{o[e]=(t,r,o)=>{let a,i,s;a=t&&"object"===typeof t&&"content"in t?t:{content:t},"function"===typeof r?s=r:(i=r,s=o);const l=Object.assign(Object.assign({onClose:s,duration:i},a),{type:e});return n(l)}})),o}),[]));return[n,r.createElement(rd,Object.assign({key:"message-holder"},e,{ref:t}))]}let id=null,sd=e=>e(),ld=[],cd={};function ud(){const{getContainer:e,duration:t,rtl:n,maxCount:r,top:o}=cd,a=(null===e||void 0===e?void 0:e())||document.body;return{getContainer:()=>a,duration:t,rtl:n,maxCount:r,top:o}}const dd=r.forwardRef(((e,t)=>{const{messageConfig:n,sync:o}=e,{getPrefixCls:a}=(0,r.useContext)(yr),i=cd.prefixCls||a("message"),s=(0,r.useContext)(mr),[l,c]=ad(Object.assign(Object.assign(Object.assign({},n),{prefixCls:i}),s.message));return r.useImperativeHandle(t,(()=>{const e=Object.assign({},l);return Object.keys(e).forEach((t=>{e[t]=function(){o();for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return l[t].apply(l,n)}})),{instance:e,sync:o}})),c})),fd=r.forwardRef(((e,t)=>{const[n,o]=r.useState(ud),a=()=>{o(ud)};r.useEffect(a,[]);const i=oc(),s=i.getRootPrefixCls(),l=i.getIconPrefixCls(),c=i.getTheme(),u=r.createElement(dd,{ref:t,sync:a,messageConfig:n});return r.createElement(sc,{prefixCls:s,iconPrefixCls:l,theme:c},i.holderRender?i.holderRender(u):u)}));function pd(){if(!id){const e=document.createDocumentFragment(),t={fragment:e};return id=t,void sd((()=>{const n=function(e){return e&&(Sc=e),Sc}();n(r.createElement(fd,{ref:e=>{const{instance:n,sync:r}=e||{};Promise.resolve().then((()=>{!t.instance&&n&&(t.instance=n,t.sync=r,pd())}))}}),e)}))}id.instance&&(ld.forEach((e=>{const{type:t,skipped:n}=e;if(!n)switch(t){case"open":sd((()=>{const t=id.instance.open(Object.assign(Object.assign({},cd),e.config));null===t||void 0===t||t.then(e.resolve),e.setCloseFn(t)}));break;case"destroy":sd((()=>{null===id||void 0===id||id.instance.destroy(e.key)}));break;default:sd((()=>{var n;const r=(n=id.instance)[t].apply(n,hr(e.args));null===r||void 0===r||r.then(e.resolve),e.setCloseFn(r)}))}})),ld=[])}const hd={open:function(e){const t=Ju((t=>{let n;const r={type:"open",config:e,resolve:t,setCloseFn:e=>{n=e}};return ld.push(r),()=>{n?sd((()=>{n()})):r.skipped=!0}}));return pd(),t},destroy:e=>{ld.push({type:"destroy",key:e}),pd()},config:function(e){cd=Object.assign(Object.assign({},cd),e),sd((()=>{var e;null===(e=null===id||void 0===id?void 0:id.sync)||void 0===e||e.call(id)}))},useMessage:function(e){return ad(e)},_InternalPanelDoNotUseOrYouWillBeFired:Ku},md=hd;["success","info","warning","error","loading"].forEach((e=>{md[e]=function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];return function(e,t){oc();const n=Ju((n=>{let r;const o={type:e,args:t,resolve:n,setCloseFn:e=>{r=e}};return ld.push(o),()=>{r?sd((()=>{r()})):o.skipped=!0}}));return pd(),n}(e,n)}}));const vd=md,gd="http://localhost:8088",yd=async()=>{try{const n=await ar.get("".concat(gd,"/discount/all"),{headers:{Authorization:localStorage.getItem("token")}});var e,t;if(n.data&&200===n.data.code)return(null===(e=n.data.data)||void 0===e?void 0:e.data)||n.data.data||[];throw new Error((null===(t=n.data)||void 0===t?void 0:t.message)||"\u83b7\u53d6\u6298\u6263\u4fe1\u606f\u5931\u8d25")}catch(n){throw console.error("\u83b7\u53d6\u6298\u6263\u5217\u8868\u5931\u8d25:",n),n}};var bd=n(723);const wd=e=>{var t;let{onLogout:n}=e;const o=Z(),[a,i]=(0,r.useState)(null),[s,l]=(0,r.useState)(!1),[c,u]=(0,r.useState)(""),[d,f]=(0,r.useState)(0),p=te(),{tab:h}=re(),[m,v]=(0,r.useState)(!1),[g,y]=(0,r.useState)(!1),[b,w]=(0,r.useState)({name:"",type:"",region:"",subtitle:"",resolution:"",file:null,description:""}),[x,k]=(0,r.useState)(!1),[S,E]=(0,r.useState)(""),[C,N]=(0,r.useState)(""),[j,D]=(0,r.useState)(null),[P,T]=(0,r.useState)([]),[_,O]=(0,r.useState)(!1),[M,R]=(0,r.useState)(null),[A,L]=(0,r.useState)(1),[I,F]=(0,r.useState)(1),[z,B]=(0,r.useState)({}),[H,U]=(0,r.useState)([]),[Y,W]=(0,r.useState)([]),[q,V]=(0,r.useState)(!1),[Q,K]=(0,r.useState)(null),[$,G]=(0,r.useState)([]),[X,J]=(0,r.useState)([]),[ee,ne]=(0,r.useState)(!1),[oe,ae]=(0,r.useState)(null),[ie,se]=(0,r.useState)(X),[le,ce]=(0,r.useState)(!1),[ue,de]=(0,r.useState)(!1),[fe,pe]=(0,r.useState)(null),[he,me]=(0,r.useState)(0),[ve,ge]=(0,r.useState)(!1),[ye,be]=(0,r.useState)("D:/studies/ptPlatform/torrent"),[we,xe]=(0,r.useState)(""),[ke,Se]=(0,r.useState)(""),[Ee,Ce]=(0,r.useState)(""),[Ne,je]=(0,r.useState)(""),De=h||"announcement",Pe=e=>{p("/dashboard/".concat(e),{state:{savedFilters:Xe,activeTab:e}})},Te=async()=>{try{const e=await ir.get("/announcement/latest");U(e.data.data.announcements||[])}catch(c){console.error("\u83b7\u53d6\u516c\u544a\u5931\u8d25:",c)}};(0,r.useEffect)((()=>{"announcement"===De&&(Te(),Oe())}),[De]);const Oe=async()=>{try{const e=await yd();console.log("\u8fd4\u56de\u7684\u6298\u6263\u6570\u636e\uff1a",e);const t=new Date,n=e.filter((e=>Date.parse(e.startTime)<=t.getTime()&&Date.parse(e.endTime)>=t.getTime())),r=e.filter((e=>Date.parse(e.startTime)>t.getTime())).sort(((e,t)=>Date.parse(e.startTime)-Date.parse(t.startTime))),o=[...n.slice(0,3)];for(;o.length<3&&r.length>0;)o.push(r.shift());W(o)}catch(Dy){console.error("\u83b7\u53d6\u6298\u6263\u5931\u8d25:",Dy)}},Me=e=>{xe(e.target.value)},Re=async()=>{try{ne(!0);const e=await lr(ke,1);if(200===e.data.code){J(e.data.data.records);const t=e.data.data.total;F(Math.ceil(t/5)),L(1)}else ae(e.data.message||"\u641c\u7d22\u5931\u8d25")}catch(e){ae(e.message||"\u641c\u7d22\u5931\u8d25")}finally{ne(!1)}},Ae=async()=>{Se(""),Je(Object.keys(Ge).reduce(((e,t)=>(e[t]="all",e)),{})),await Ve(1,!0)},Le=async()=>{try{V(!0);const e=await function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:5;return ir.get("/request/posts/search",{params:{keyword:e,page:t,size:n}})}(Ee,A);if(200===e.data.code){const t=await Promise.all(e.data.data.records.map((async e=>{try{const t=await ur(e.id);return 200===t.data.code?_e(_e({},e),{},{replyCount:t.data.data.post.replyCount||0,isLiked:!1}):e}catch(t){return console.error("\u83b7\u53d6\u5e16\u5b50".concat(e.id,"\u8be6\u60c5\u5931\u8d25:"),t),e}})));G(t),F(Math.ceil(e.data.data.total/5))}else K(e.data.message||"\u641c\u7d22\u5931\u8d25")}catch(e){K(e.message||"\u641c\u7d22\u5931\u8d25")}finally{V(!1)}},Ie=async()=>{Ce(""),await Qe(1)},Fe=async()=>{try{O(!0);const e=await function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:5;return ir.get("/help/posts/search",{params:{keyword:e,page:t,size:n}})}(Ne,A);if(200===e.data.code){const t=await Promise.all(e.data.data.records.map((async e=>{try{const t=await cr(e.id);return 200===t.data.code?_e(_e({},e),{},{replyCount:t.data.data.post.replyCount||0,isLiked:!1}):e}catch(t){return console.error("\u83b7\u53d6\u5e16\u5b50".concat(e.id,"\u8be6\u60c5\u5931\u8d25:"),t),e}})));T(t),F(Math.ceil(e.data.data.total/5))}else R(e.data.message||"\u641c\u7d22\u5931\u8d25")}catch(e){R(e.message||"\u641c\u7d22\u5931\u8d25")}finally{O(!1)}},ze=async()=>{je(""),await $e(1)},Be=e=>{w(_e(_e({},b),{},{file:e.target.files[0]}))},He=async e=>{e.preventDefault();try{y(!0);const e={torrentName:b.name,description:b.description,category:b.type,region:b.region,resolution:b.resolution,subtitle:b.subtitle};await async function(e,t){const n=new FormData;n.append("file",e),n.append("body",new Blob([JSON.stringify(t)],{type:"application/json"}));try{return(await ir.post("/torrent",n,{headers:{}})).data}catch(c){throw console.error("\u4e0a\u4f20\u79cd\u5b50\u5931\u8d25:",c),c}}(b.file,e),v(!1),w({name:"",type:"",region:"",subtitle:"",resolution:"",file:null,description:""}),alert("\u79cd\u5b50\u521b\u5efa\u6210\u529f\uff01"),await Ve(A)}catch(c){var t,n;console.error("\u521b\u5efa\u5931\u8d25:",c),alert("\u521b\u5efa\u5931\u8d25: "+((null===(t=c.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||c.message))}finally{y(!1)}},Ue=async e=>{try{return!0}catch(Dy){return console.error("\u68c0\u67e5\u6587\u4ef6\u5b58\u5728\u6027\u5931\u8d25:",Dy),!1}},Ye=async(e,t)=>{t.stopPropagation();try{if(!window.confirm("\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u79cd\u5b50\u5417\uff1f\u6b64\u64cd\u4f5c\u4e0d\u53ef\u64a4\u9500\uff01"))return;await(e=>ir.delete("/torrent/deleteTorrent/".concat(e)))(e),vd.success("\u79cd\u5b50\u5220\u9664\u6210\u529f"),await Ve(A)}catch(c){var n,r;console.error("\u5220\u9664\u79cd\u5b50\u5931\u8d25:",c),vd.error("\u5220\u9664\u79cd\u5b50\u5931\u8d25: "+((null===(n=c.response)||void 0===n||null===(r=n.data)||void 0===r?void 0:r.message)||c.message))}},We=async e=>{e.preventDefault();try{const e=localStorage.getItem("username"),t=await((e,t,n,r)=>{const o=new FormData;return o.append("title",e),o.append("content",t),o.append("authorId",n),r&&o.append("image",r),ir.post("/request/posts",o)})(S,C,e,j);200===t.data.code?(await Qe(A),k(!1),E(""),N(""),D(null)):R(t.data.message||"\u53d1\u5e16\u5931\u8d25")}catch(t){R(t.message||"\u53d1\u5e16\u5931\u8d25")}},qe=async e=>{e.preventDefault();try{const e=localStorage.getItem("username"),t=await((e,t,n,r)=>{const o=new FormData;return o.append("title",e),o.append("content",t),o.append("authorId",n),r&&o.append("image",r),ir.post("/help/posts",o)})(S,C,e,j);200===t.data.code?(await $e(A),k(!1),E(""),N(""),D(null)):R(t.data.message||"\u53d1\u5e16\u5931\u8d25")}catch(t){R(t.message||"\u53d1\u5e16\u5931\u8d25")}},Ve=async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];ne(!0);try{const n={page:e,size:5};!t&&Object.values(Xe).some((e=>"all"!==e))&&("all"!==Xe.type&&(n.category=Xe.type),"all"!==Xe.subtitle&&(n.subtitle=Xe.subtitle),"all"!==Xe.region&&(n.region=Xe.region),"all"!==Xe.resolution&&(n.resolution=Xe.resolution));const r=ke&&!t?await lr(ke,e):await ir.get("http://localhost:8088/torrent",{params:n});if(200===r.data.code){J(r.data.data.records);const t=r.data.data.total;F(Math.ceil(t/5)),L(e)}else ae(r.data.message)}catch(n){ae(n.message)}finally{ne(!1)}};(0,r.useEffect)((()=>{"share"===De&&Ve()}),[De]);const Qe=async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;V(!0);try{const t=await function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5;return ir.get("/request/posts",{params:{page:e,size:t}})}(e);if(200===t.data.code){const n=await Promise.all(t.data.data.records.map((async e=>{try{const t=await ur(e.id);return 200===t.data.code?_e(_e({},e),{},{replyCount:t.data.data.post.replyCount||0,isLiked:!1}):e}catch(t){return console.error("\u83b7\u53d6\u5e16\u5b50".concat(e.id,"\u8be6\u60c5\u5931\u8d25:"),t),e}})));G(n),F(Math.ceil(t.data.data.total/5)),L(e)}else K(t.data.message||"\u83b7\u53d6\u6c42\u52a9\u5e16\u5931\u8d25")}catch(t){K(t.message||"\u83b7\u53d6\u6c42\u52a9\u5e16\u5931\u8d25")}finally{V(!1)}},Ke=e=>{D(e.target.files[0])},$e=async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;O(!0);try{const t=await function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5;return ir.get("/help/posts",{params:{page:e,size:t}})}(e);if(200===t.data.code){const n=await Promise.all(t.data.data.records.map((async e=>{try{const t=await cr(e.id);return 200===t.data.code?_e(_e({},e),{},{replyCount:t.data.data.post.replyCount||0,isLiked:!1}):e}catch(t){return console.error("\u83b7\u53d6\u5e16\u5b50".concat(e.id,"\u8be6\u60c5\u5931\u8d25:"),t),e}})));T(n),F(Math.ceil(t.data.data.total/5)),L(e)}else R(t.data.message||"\u83b7\u53d6\u6c42\u52a9\u5e16\u5931\u8d25")}catch(t){R(t.message||"\u83b7\u53d6\u6c42\u52a9\u5e16\u5931\u8d25")}finally{O(!1)}};(0,r.useEffect)((()=>{"request"===De&&Qe(A)}),[De,A]);const Ge={type:{label:"\u7c7b\u578b",options:{all:"\u5168\u90e8","\u7535\u5f71":"\u7535\u5f71","\u7535\u89c6\u5267":"\u7535\u89c6\u5267","\u52a8\u6f2b":"\u52a8\u6f2b","\u7efc\u827a":"\u7efc\u827a","\u97f3\u4e50":"\u97f3\u4e50","\u5176\u4ed6":"\u5176\u4ed6"}},subtitle:{label:"\u5b57\u5e55",options:{all:"\u5168\u90e8","\u65e0\u9700\u5b57\u5e55":"\u65e0\u9700\u5b57\u5e55","\u6682\u65e0\u5b57\u5e55":"\u6682\u65e0\u5b57\u5e55","\u81ea\u5e26\u4e2d\u6587\u5b57\u5e55":"\u81ea\u5e26\u4e2d\u6587\u5b57\u5e55","\u81ea\u5e26\u53cc\u8bed\u5b57\u5e55(\u542b\u4e2d\u6587)":"\u81ea\u5e26\u53cc\u8bed\u5b57\u5e55(\u542b\u4e2d\u6587)","\u9644\u4ef6\u4e2d\u6587\u5b57\u5e55":"\u9644\u4ef6\u4e2d\u6587\u5b57\u5e55","\u9644\u4ef6\u53cc\u8bed\u5b57\u5e55":"\u9644\u4ef6\u53cc\u8bed\u5b57\u5e55"}},region:{label:"\u5730\u533a",options:{all:"\u5168\u90e8","\u4e2d\u56fd":"\u4e2d\u56fd","\u82f1\u56fd":"\u82f1\u56fd","\u7f8e\u56fd":"\u7f8e\u56fd","\u65e5\u672c":"\u65e5\u672c","\u97e9\u56fd":"\u97e9\u56fd","\u5176\u4ed6":"\u5176\u4ed6"}},resolution:{label:"\u5206\u8fa8\u7387",options:{all:"\u5168\u90e8","4K":"4K","2K":"2K","1080P":"1080P","720P":"720P",SD:"SD","\u65e0\u635f\u97f3\u6e90":"\u65e0\u635f\u97f3\u6e90","\u675c\u6bd4\u5168\u666f\u58f0":"\u675c\u6bd4\u5168\u666f\u58f0","\u5176\u4ed6":"\u5176\u4ed6"}}},[Xe,Je]=(0,r.useState)((null===(t=o.state)||void 0===t?void 0:t.savedFilters)||Object.keys(Ge).reduce(((e,t)=>(e[t]="all",e)),{})),Ze=async()=>{try{ne(!0);const e={page:1,size:5};"all"!==Xe.type&&(e.category=Xe.type),"all"!==Xe.subtitle&&(e.subtitle=Xe.subtitle),"all"!==Xe.region&&(e.region=Xe.region),"all"!==Xe.resolution&&(e.resolution=Xe.resolution);const t=await ir.get("http://localhost:8088/torrent",{params:e});200===t.data.code?(J(t.data.data.records),F(Math.ceil(t.data.data.total/5)),L(1)):ae(t.data.message||"\u7b5b\u9009\u5931\u8d25")}catch(e){ae(e.message||"\u7b5b\u9009\u5931\u8d25")}finally{ne(!1)}};(0,r.useEffect)((()=>{var e;null!==(e=o.state)&&void 0!==e&&e.scrollPosition&&window.scrollTo(0,o.state.scrollPosition)}),[o.state]),(0,r.useEffect)((()=>{if(!localStorage.getItem("token"))return void p("/login");(async()=>{try{l(!0);const e=await sr();console.log("\u540e\u7aef\u8fd4\u56de\u7684\u7528\u6237\u6570\u636e:",e),i({name:e.username||"\u6f14\u793a\u7528\u6237",avatar:"https://via.placeholder.com/40",isAdmin:"ADMIN"===e.authority})}catch(c){console.error("\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25:",c),u("\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25")}finally{l(!1)}})()}),[p]),(0,r.useEffect)((()=>{if("announcement"===De){const e=setInterval((()=>{f((e=>(e+1)%(Y.length||1)))}),3e3);return()=>clearInterval(e)}}),[De]),(0,r.useEffect)((()=>{"help"===De&&$e()}),[De,A]);return s?(0,bd.jsx)("div",{className:"loading",children:"\u52a0\u8f7d\u4e2d..."}):c?(0,bd.jsx)("div",{className:"error",children:c}):(0,bd.jsxs)("div",{className:"dashboard-container","data-testid":"dashboard-container",children:[(0,bd.jsxs)("div",{className:"top-bar","data-testid":"top-bar",children:[(0,bd.jsx)("div",{className:"platform-name",children:(0,bd.jsx)("h2",{children:"PT\u8d44\u6e90\u7ad9"})}),(0,bd.jsxs)("div",{className:"user-actions",children:[(null===a||void 0===a?void 0:a.isAdmin)&&(0,bd.jsx)("button",{className:"admin-center-button",onClick:()=>p("/administer"),children:"\u7ba1\u7406\u5458\u4e2d\u5fc3"}),(0,bd.jsxs)("div",{className:"user-info","data-testid":"user-info",children:[(0,bd.jsx)("img",{src:(null===a||void 0===a?void 0:a.avatar)||"https://via.placeholder.com/40",alt:"\u7528\u6237\u5934\u50cf",className:"user-avatar",onClick:()=>p("/personal"),style:{cursor:"pointer"}}),(0,bd.jsx)("span",{className:"username",children:(null===a||void 0===a?void 0:a.name)||"\u7528\u6237"}),(0,bd.jsx)("button",{onClick:n,className:"logout-button",children:"\u9000\u51fa"})]})]})]}),(0,bd.jsxs)("div",{className:"nav-tabs",children:[(0,bd.jsx)("button",{className:"tab-button ".concat("announcement"===De?"active":""),onClick:()=>Pe("announcement"),children:"\u516c\u544a\u533a"}),(0,bd.jsx)("button",{className:"tab-button ".concat("share"===De?"active":""),onClick:()=>Pe("share"),children:"\u5206\u4eab\u533a"}),(0,bd.jsx)("button",{className:"tab-button ".concat("request"===De?"active":""),onClick:()=>Pe("request"),children:"\u6c42\u79cd\u533a"}),(0,bd.jsx)("button",{className:"tab-button ".concat("help"===De?"active":""),onClick:()=>Pe("help"),children:"\u6c42\u52a9\u533a"})]}),(()=>{switch(De){case"announcement":return(0,bd.jsxs)("div",{className:"content-area","data-testid":"announcement-section",children:[(0,bd.jsxs)("div",{className:"section-search-container",children:[(0,bd.jsx)("input",{type:"text",placeholder:"\u641c\u7d22\u516c\u544a...",value:we,onChange:e=>xe(e.target.value),className:"section-search-input",onKeyPress:e=>"Enter"===e.key&&Me()}),(0,bd.jsx)("button",{className:"search-button",onClick:Me,children:"\u641c\u7d22"})]}),(0,bd.jsxs)("div",{className:"carousel-container",children:[0===Y.length?(0,bd.jsx)("div",{className:"carousel-slide active",children:(0,bd.jsx)("div",{className:"carousel-image gray-bg",children:"\u6682\u65e0\u6298\u6263\u6d3b\u52a8"})}):Y.map(((e,t)=>(0,bd.jsx)("div",{className:"carousel-slide ".concat(d===t?"active":""),children:(0,bd.jsxs)("div",{className:"carousel-image gray-bg",children:[(0,bd.jsx)("h3",{children:e.type}),(0,bd.jsx)("p",{children:e.name}),(0,bd.jsxs)("p",{children:[new Date(e.startTime).toLocaleDateString()," ~ ",new Date(e.endTime).toLocaleDateString()]})]})},t))),(0,bd.jsx)("div",{className:"carousel-dots",children:Y.map(((e,t)=>(0,bd.jsx)("span",{className:"dot ".concat(d===t?"active":"")},t)))})]}),(0,bd.jsx)("div",{className:"announcement-grid",children:H.map((e=>(0,bd.jsxs)("div",{className:"announcement-card",onClick:t=>((e,t)=>{t.target.closest(".exclude-click")||p("/announcement/".concat(e.id),{state:{announcement:e,returnPath:"/dashboard/".concat(De),scrollPosition:window.scrollY,activeTab:De}})})(e,t),children:[(0,bd.jsx)("h3",{children:e.title}),(0,bd.jsxs)("p",{children:[e.content.substring(0,100),"..."]}),(0,bd.jsx)("div",{className:"announcement-footer exclude-click",children:(0,bd.jsx)("span",{children:e.date})})]},e.id)))})]});case"share":return(0,bd.jsxs)("div",{className:"content-area","data-testid":"share-section",children:[(0,bd.jsxs)("div",{className:"section-search-container",children:[(0,bd.jsx)("input",{type:"text",placeholder:"\u641c\u7d22\u8d44\u6e90...",value:ke,onChange:e=>Se(e.target.value),className:"section-search-input",onKeyPress:e=>"Enter"===e.key&&Re()}),(0,bd.jsx)("button",{className:"search-button",onClick:Re,children:"\u641c\u7d22"}),(0,bd.jsx)("button",{className:"reset-button",onClick:Ae,style:{marginLeft:"10px"},children:"\u91cd\u7f6e"})]}),(0,bd.jsx)("div",{className:"upload-header",children:(0,bd.jsx)("button",{className:"upload-btn",onClick:()=>v(!0),children:"\uff0b \u4e0a\u4f20\u79cd\u5b50"})}),(0,bd.jsxs)("div",{className:"filter-section",children:[Object.entries(Ge).map((e=>{let[t,n]=e;return(0,bd.jsxs)("div",{className:"filter-group",children:[(0,bd.jsxs)("h4",{children:[n.label,"\uff1a"]}),(0,bd.jsx)("div",{className:"filter-options",children:Object.entries(n.options).map((e=>{let[n,r]=e;return(0,bd.jsx)("button",{className:"filter-btn ".concat(Xe[t]===n?"active":""),onClick:()=>((e,t)=>{Je((n=>_e(_e({},n),{},{[e]:n[e]===t?"all":t})))})(t,n),children:r},n)}))})]},t)})),(0,bd.jsx)("button",{className:"confirm-btn",onClick:Ze,children:"\u786e\u8ba4\u7b5b\u9009"})]}),m&&(0,bd.jsx)("div",{className:"modal-overlay",children:(0,bd.jsxs)("div",{className:"upload-modal",children:[(0,bd.jsx)("h3",{children:"\u4e0a\u4f20\u65b0\u79cd\u5b50"}),(0,bd.jsx)("button",{className:"close-btn",onClick:()=>v(!1),children:"\xd7"}),(0,bd.jsxs)("form",{onSubmit:He,children:[(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u79cd\u5b50\u540d\u79f0"}),(0,bd.jsx)("input",{type:"text",value:b.name,onChange:e=>w(_e(_e({},b),{},{name:e.target.value})),required:!0})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u8d44\u6e90\u7c7b\u578b"}),(0,bd.jsxs)("select",{value:b.type,onChange:e=>w(_e(_e({},b),{},{type:e.target.value})),required:!0,children:[(0,bd.jsx)("option",{value:"",children:"\u8bf7\u9009\u62e9"}),(0,bd.jsx)("option",{value:"\u7535\u5f71",children:"\u7535\u5f71"}),(0,bd.jsx)("option",{value:"\u7535\u89c6\u5267",children:"\u7535\u89c6\u5267"}),(0,bd.jsx)("option",{value:"\u52a8\u6f2b",children:"\u52a8\u6f2b"}),(0,bd.jsx)("option",{value:"\u7efc\u827a",children:"\u7efc\u827a"}),(0,bd.jsx)("option",{value:"\u97f3\u4e50",children:"\u97f3\u4e50"}),(0,bd.jsx)("option",{value:"\u5176\u4ed6",children:"\u5176\u4ed6"})]})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5730\u533a"}),(0,bd.jsxs)("select",{value:b.region||"",onChange:e=>w(_e(_e({},b),{},{region:e.target.value})),required:!0,children:[(0,bd.jsx)("option",{value:"",children:"\u8bf7\u9009\u62e9"}),(0,bd.jsx)("option",{value:"\u4e2d\u56fd",children:"\u4e2d\u56fd"}),(0,bd.jsx)("option",{value:"\u82f1\u56fd",children:"\u82f1\u56fd"}),(0,bd.jsx)("option",{value:"\u7f8e\u56fd",children:"\u7f8e\u56fd"}),(0,bd.jsx)("option",{value:"\u65e5\u672c",children:"\u65e5\u672c"}),(0,bd.jsx)("option",{value:"\u97e9\u56fd",children:"\u97e9\u56fd"}),(0,bd.jsx)("option",{value:"\u5176\u4ed6",children:"\u5176\u4ed6"})]})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5206\u8fa8\u7387"}),(0,bd.jsxs)("select",{value:b.resolution||"",onChange:e=>w(_e(_e({},b),{},{resolution:e.target.value})),required:!0,children:[(0,bd.jsx)("option",{value:"",children:"\u8bf7\u9009\u62e9"}),(0,bd.jsx)("option",{value:"4K",children:"4K"}),(0,bd.jsx)("option",{value:"2K",children:"2K"}),(0,bd.jsx)("option",{value:"1080P",children:"1080P"}),(0,bd.jsx)("option",{value:"720P",children:"720P"}),(0,bd.jsx)("option",{value:"SD",children:"SD"}),(0,bd.jsx)("option",{value:"\u65e0\u635f\u97f3\u6e90",children:"\u65e0\u635f\u97f3\u6e90"}),(0,bd.jsx)("option",{value:"\u675c\u6bd4\u5168\u666f\u58f0",children:"\u675c\u6bd4\u5168\u666f\u58f0"}),(0,bd.jsx)("option",{value:"\u5176\u4ed6",children:"\u5176\u4ed6"})]})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5b57\u5e55\u8bed\u8a00"}),(0,bd.jsxs)("select",{value:b.subtitle||"",onChange:e=>w(_e(_e({},b),{},{subtitle:e.target.value})),required:!0,children:[(0,bd.jsx)("option",{value:"",children:"\u8bf7\u9009\u62e9"}),(0,bd.jsx)("option",{value:"\u65e0\u9700\u5b57\u5e55",children:"\u65e0\u9700\u5b57\u5e55"}),(0,bd.jsx)("option",{value:"\u6682\u65e0\u5b57\u5e55",children:"\u6682\u65e0\u5b57\u5e55"}),(0,bd.jsx)("option",{value:"\u81ea\u5e26\u4e2d\u6587\u5b57\u5e55",children:"\u81ea\u5e26\u4e2d\u6587\u5b57\u5e55"}),(0,bd.jsx)("option",{value:"\u81ea\u5e26\u53cc\u8bed\u5b57\u5e55(\u542b\u4e2d\u6587)",children:"\u81ea\u5e26\u53cc\u8bed\u5b57\u5e55(\u542b\u4e2d\u6587)"}),(0,bd.jsx)("option",{value:"\u9644\u4ef6\u4e2d\u6587\u5b57\u5e55",children:"\u9644\u4ef6\u4e2d\u6587\u5b57\u5e55"}),(0,bd.jsx)("option",{value:"\u9644\u4ef6\u53cc\u8bed\u5b57\u5e55",children:"\u9644\u4ef6\u53cc\u8bed\u5b57\u5e55"})]})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u79cd\u5b50\u6587\u4ef6"}),(0,bd.jsx)("input",{type:"file",accept:".torrent",onChange:Be})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u7b80\u4ecb"}),(0,bd.jsx)("textarea",{value:b.description,onChange:e=>w(_e(_e({},b),{},{description:e.target.value}))})]}),(0,bd.jsxs)("div",{className:"form-actions",children:[(0,bd.jsx)("button",{type:"button",className:"cancel-btn",onClick:()=>v(!1),children:"\u53d6\u6d88"}),(0,bd.jsx)("button",{type:"submit",className:"confirm-btn",disabled:g,children:g?"\u4e0a\u4f20\u4e2d...":"\u786e\u8ba4\u4e0a\u4f20"})]})]})]})}),(0,bd.jsx)("div",{className:"resource-list",children:X.map((e=>(0,bd.jsxs)("div",{className:"resource-item",onClick:()=>p("/torrent/".concat(e.id)),children:[(0,bd.jsx)("div",{className:"resource-poster",children:(0,bd.jsx)("div",{className:"poster-image gray-bg",children:e.torrentName.charAt(0)})}),(0,bd.jsxs)("div",{className:"resource-info",children:[(0,bd.jsx)("h3",{className:"resource-title",children:e.torrentName}),(0,bd.jsxs)("p",{className:"resource-meta",children:[e.resolution," | ",e.region," | ",e.category]}),(0,bd.jsxs)("p",{className:"resource-subtitle",children:["\u5b57\u5e55: ",e.subtitle]})]}),(0,bd.jsxs)("div",{className:"resource-stats",children:[(0,bd.jsx)("span",{className:"stat",children:e.size}),(0,bd.jsxs)("span",{className:"stat",children:["\u53d1\u5e03\u8005: ",e.username]})]}),(0,bd.jsx)("button",{className:"download-btn",onClick:t=>((e,t)=>{t.stopPropagation(),pe(e),de(!0)})(e,t),children:"\u7acb\u5373\u4e0b\u8f7d"}),((null===a||void 0===a?void 0:a.isAdmin)||(null===a||void 0===a?void 0:a.name)===e.username)&&(0,bd.jsx)("button",{className:"delete-btn",onClick:t=>Ye(e.id,t),children:"\u5220\u9664"})]},e.id)))}),I>1&&(0,bd.jsxs)("div",{className:"pagination",children:[(0,bd.jsx)("button",{onClick:()=>Ve(A-1),disabled:1===A,children:"\u4e0a\u4e00\u9875"}),Array.from({length:I},((e,t)=>t+1)).map((e=>(0,bd.jsx)("button",{onClick:()=>Ve(e),className:A===e?"active":"",children:e},e))),(0,bd.jsx)("button",{onClick:()=>Ve(A+1),disabled:A===I,children:"\u4e0b\u4e00\u9875"})]})]});case"request":return(0,bd.jsxs)("div",{className:"content-area","data-testid":"request-section",children:[(0,bd.jsxs)("div",{className:"section-search-container",children:[(0,bd.jsx)("input",{type:"text",placeholder:"\u641c\u7d22\u6c42\u52a9...",value:Ee,onChange:e=>Ce(e.target.value),className:"section-search-input",onKeyPress:e=>"Enter"===e.key&&Le()}),(0,bd.jsx)("button",{className:"search-button",onClick:Le,children:"\u641c\u7d22"}),(0,bd.jsx)("button",{className:"reset-button",onClick:Ie,style:{marginLeft:"10px"},children:"\u91cd\u7f6e"})]}),(0,bd.jsx)("div",{className:"post-header",children:(0,bd.jsx)("button",{className:"create-post-btn",onClick:()=>k(!0),children:"\uff0b \u53d1\u5e16\u6c42\u52a9"})}),q&&(0,bd.jsx)("div",{className:"loading",children:"\u52a0\u8f7d\u4e2d..."}),Q&&(0,bd.jsx)("div",{className:"error",children:M}),(0,bd.jsx)("div",{className:"request-list",children:$.map((e=>(0,bd.jsxs)("div",{className:"request-post ".concat(e.isSolved?"solved":""),onClick:()=>p("/request/".concat(e.id)),children:[(0,bd.jsxs)("div",{className:"post-header",children:[(0,bd.jsx)("img",{src:e.authorAvatar||"https://via.placeholder.com/40",alt:e.authorId,className:"post-avatar"}),(0,bd.jsx)("div",{className:"post-author",children:e.authorId}),(0,bd.jsx)("div",{className:"post-date",children:new Date(e.createTime).toLocaleDateString()}),e.isSolved&&(0,bd.jsx)("span",{className:"solved-badge",children:"\u5df2\u89e3\u51b3"})]}),(0,bd.jsx)("h3",{className:"post-title",children:e.title}),(0,bd.jsx)("p",{className:"post-content",children:e.content}),(0,bd.jsxs)("div",{className:"post-stats",children:[(0,bd.jsxs)("span",{className:"post-likes",children:["\ud83d\udc4d ",e.likeCount||0]}),(0,bd.jsxs)("span",{className:"post-comments",children:["\ud83d\udcac ",e.replyCount||0]})]})]},e.id)))}),(0,bd.jsxs)("div",{className:"pagination",children:[(0,bd.jsx)("button",{onClick:()=>Qe(A-1),disabled:1===A,children:"\u4e0a\u4e00\u9875"}),Array.from({length:I},((e,t)=>t+1)).map((e=>(0,bd.jsx)("button",{onClick:()=>Qe(e),className:A===e?"active":"",children:e},e))),(0,bd.jsx)("button",{onClick:()=>Qe(A+1),disabled:A===I,children:"\u4e0b\u4e00\u9875"})]}),x&&(0,bd.jsx)("div",{className:"post-modal-overlay",children:(0,bd.jsxs)("div",{className:"post-modal",children:[(0,bd.jsx)("h3",{children:"\u53d1\u5e03\u6c42\u79cd\u5e16"}),(0,bd.jsx)("button",{className:"modal-close-btn",onClick:()=>k(!1),children:"\xd7"}),(0,bd.jsxs)("form",{onSubmit:We,children:[(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5e16\u5b50\u6807\u9898"}),(0,bd.jsx)("input",{type:"text",value:S,onChange:e=>E(e.target.value),placeholder:"\u8bf7\u8f93\u5165\u6807\u9898",required:!0})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5e16\u5b50\u5185\u5bb9"}),(0,bd.jsx)("textarea",{value:C,onChange:e=>N(e.target.value),placeholder:"\u8be6\u7ec6\u63cf\u8ff0\u4f60\u7684\u95ee\u9898",required:!0})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u4e0a\u4f20\u56fe\u7247"}),(0,bd.jsxs)("div",{className:"upload-image-btn",children:[(0,bd.jsx)("input",{type:"file",id:"image-upload",accept:"image/*",onChange:Ke,style:{display:"none"}}),(0,bd.jsx)("label",{htmlFor:"image-upload",children:j?"\u5df2\u9009\u62e9\u56fe\u7247":"\u9009\u62e9\u56fe\u7247"}),j&&(0,bd.jsx)("span",{className:"image-name",children:j.name})]})]}),(0,bd.jsxs)("div",{className:"form-actions",children:[(0,bd.jsx)("button",{type:"button",className:"cancel-btn",onClick:()=>k(!1),children:"\u53d6\u6d88"}),(0,bd.jsx)("button",{type:"submit",className:"submit-btn",children:"\u786e\u8ba4\u53d1\u5e16"})]})]})]})})]});case"help":return(0,bd.jsxs)("div",{className:"content-area","data-testid":"help-section",children:[(0,bd.jsxs)("div",{className:"section-search-container",children:[(0,bd.jsx)("input",{type:"text",placeholder:"\u641c\u7d22\u6c42\u52a9...",value:Ne,onChange:e=>je(e.target.value),className:"section-search-input",onKeyPress:e=>"Enter"===e.key&&Fe()}),(0,bd.jsx)("button",{className:"search-button",onClick:Fe,children:"\u641c\u7d22"}),(0,bd.jsx)("button",{className:"reset-button",onClick:ze,style:{marginLeft:"10px"},children:"\u91cd\u7f6e"})]}),(0,bd.jsx)("div",{className:"post-header",children:(0,bd.jsx)("button",{className:"create-post-btn",onClick:()=>k(!0),children:"\uff0b \u53d1\u5e16\u6c42\u52a9"})}),_&&(0,bd.jsx)("div",{className:"loading",children:"\u52a0\u8f7d\u4e2d..."}),M&&(0,bd.jsx)("div",{className:"error",children:M}),(0,bd.jsx)("div",{className:"help-list",children:P.map((e=>(0,bd.jsxs)("div",{className:"help-post ".concat(e.isSolved?"solved":""),onClick:()=>p("/help/".concat(e.id)),children:[(0,bd.jsxs)("div",{className:"post-header",children:[(0,bd.jsx)("img",{src:e.authorAvatar||"https://via.placeholder.com/40",alt:e.authorId,className:"post-avatar"}),(0,bd.jsx)("div",{className:"post-author",children:e.authorId}),(0,bd.jsx)("div",{className:"post-date",children:new Date(e.createTime).toLocaleDateString()}),e.isSolved&&(0,bd.jsx)("span",{className:"solved-badge",children:"\u5df2\u89e3\u51b3"})]}),(0,bd.jsx)("h3",{className:"post-title",children:e.title}),(0,bd.jsx)("p",{className:"post-content",children:e.content}),(0,bd.jsxs)("div",{className:"post-stats",children:[(0,bd.jsxs)("span",{className:"post-likes",children:["\ud83d\udc4d ",e.likeCount||0]}),(0,bd.jsxs)("span",{className:"post-comments",children:["\ud83d\udcac ",e.replyCount||0]})]})]},e.id)))}),(0,bd.jsxs)("div",{className:"pagination",children:[(0,bd.jsx)("button",{onClick:()=>$e(A-1),disabled:1===A,children:"\u4e0a\u4e00\u9875"}),Array.from({length:I},((e,t)=>t+1)).map((e=>(0,bd.jsx)("button",{onClick:()=>$e(e),className:A===e?"active":"",children:e},e))),(0,bd.jsx)("button",{onClick:()=>$e(A+1),disabled:A===I,children:"\u4e0b\u4e00\u9875"})]}),x&&(0,bd.jsx)("div",{className:"post-modal-overlay",children:(0,bd.jsxs)("div",{className:"post-modal",children:[(0,bd.jsx)("h3",{children:"\u53d1\u5e03\u6c42\u52a9\u5e16"}),(0,bd.jsx)("button",{className:"modal-close-btn",onClick:()=>k(!1),children:"\xd7"}),(0,bd.jsxs)("form",{onSubmit:qe,children:[(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5e16\u5b50\u6807\u9898"}),(0,bd.jsx)("input",{type:"text",value:S,onChange:e=>E(e.target.value),placeholder:"\u8bf7\u8f93\u5165\u6807\u9898",required:!0})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5e16\u5b50\u5185\u5bb9"}),(0,bd.jsx)("textarea",{value:C,onChange:e=>N(e.target.value),placeholder:"\u8be6\u7ec6\u63cf\u8ff0\u4f60\u7684\u95ee\u9898",required:!0})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u4e0a\u4f20\u56fe\u7247"}),(0,bd.jsxs)("div",{className:"upload-image-btn",children:[(0,bd.jsx)("input",{type:"file",id:"image-upload",accept:"image/*",onChange:Ke,style:{display:"none"}}),(0,bd.jsx)("label",{htmlFor:"image-upload",children:j?"\u5df2\u9009\u62e9\u56fe\u7247":"\u9009\u62e9\u56fe\u7247"}),j&&(0,bd.jsx)("span",{className:"image-name",children:j.name})]})]}),(0,bd.jsxs)("div",{className:"form-actions",children:[(0,bd.jsx)("button",{type:"button",className:"cancel-btn",onClick:()=>k(!1),children:"\u53d6\u6d88"}),(0,bd.jsx)("button",{type:"submit",className:"submit-btn",children:"\u786e\u8ba4\u53d1\u5e16"})]})]})]})})]});default:return(0,bd.jsx)("div",{className:"content-area","data-testid":"default-section",children:"\u516c\u544a\u533a\u5185\u5bb9"})}})(),ue&&fe&&(0,bd.jsx)("div",{className:"modal-overlay",children:(0,bd.jsxs)("div",{className:"download-modal",children:[(0,bd.jsxs)("h3",{children:["\u4e0b\u8f7d ",fe.torrentName]}),(0,bd.jsx)("button",{className:"close-btn",onClick:()=>!ve&&de(!1),disabled:ve,children:"\xd7"}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u4e0b\u8f7d\u8def\u5f84:"}),(0,bd.jsx)("input",{type:"text",value:ye,onChange:e=>{let t=e.target.value.replace(/\t/g,"").replace(/\\/g,"/").replace(/\s+/g," ");be(t)},disabled:ve,placeholder:"\u4f8b\u5982: D:/downloads/"})]}),ve&&(0,bd.jsx)("div",{className:"progress-container",children:(0,bd.jsxs)("div",{className:"progress-bar",style:{width:"".concat(he,"%")},children:[he,"%"]})}),(0,bd.jsxs)("div",{className:"modal-actions",children:[(0,bd.jsx)("button",{onClick:()=>!ve&&de(!1),disabled:ve,children:"\u53d6\u6d88"}),(0,bd.jsx)("button",{onClick:async()=>{if(fe&&ye){ge(!0),me(0);try{const e=ye.replace(/\\/g,"/").replace(/\/+/g,"/").trim(),t=e.endsWith("/")?e:e+"/";await async function(e,t){try{return(await ir.get("/torrent/downloadTorrent",{params:{id:e,downloadPath:t}})).data}catch(c){throw console.error("\u4e0b\u8f7d\u79cd\u5b50\u5931\u8d25:",c),c}}(fe.id,t);const n=setInterval((async()=>{try{const e=await async function(){try{return(await ir.get("/torrent/getProgress")).data}catch(c){throw console.error("\u83b7\u53d6\u4e0b\u8f7d\u8fdb\u5ea6\u5931\u8d25:",c),c}}(),t=e.data.progresses;if(t){fe.filePath.replace(/\\/g,"/"),fe.hash;let e=null;for(const[n,r]of Object.entries(t)){const t=n.replace(/\\/g,"/");if(t.includes(fe.hash)||t.includes(fe.torrentName)){e=r;break}}if(null!==e){const t=Math.round(100*e);me(t),t>=100&&(clearInterval(n),ge(!1),vd.success("\u4e0b\u8f7d\u5b8c\u6210\uff01"),setTimeout((()=>de(!1)),2e3))}else console.log("\u5f53\u524d\u4e0b\u8f7d\u8fdb\u5ea6:",t)}}catch(c){console.error("\u83b7\u53d6\u8fdb\u5ea6\u5931\u8d25:",c);const r="".concat(t).concat(fe.torrentName||"downloaded_file");try{await Ue(r)&&(clearInterval(n),me(100),ge(!1),vd.success("\u4e0b\u8f7d\u5b8c\u6210\uff01"),setTimeout((()=>de(!1)),2e3))}catch(Dy){console.error("\u6587\u4ef6\u68c0\u67e5\u5931\u8d25:",Dy)}}}),2e3);return()=>clearInterval(n)}catch(c){ge(!1),c.response&&409===c.response.status?vd.error("\u5206\u4eab\u7387\u4e0d\u8db3\uff0c\u65e0\u6cd5\u4e0b\u8f7d\u6b64\u8d44\u6e90"):vd.error("\u4e0b\u8f7d\u5931\u8d25: "+(c.message||"\u672a\u77e5\u9519\u8bef"))}}},disabled:ve||!ye,children:ve?"\u4e0b\u8f7d\u4e2d...":"\u5f00\u59cb\u4e0b\u8f7d"})]})]})})]})},xd=async()=>{try{const e=await ir.get("/user/userInfo");if(200===e.data.code){const t=e.data.data;return{username:t.username,level:t.level,registTime:Sd(t.registTime),magicPoints:t.magicPoints,upload:t.upload,download:t.download,shareRate:t.shareRate.toFixed(2)}}throw new Error(e.data.message||"\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25")}catch(e){throw console.error("\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25:",e),e}},kd=async()=>{try{const e=await ir.get("/user/allowDownload");if(200===e.data.code){const t=e.data.data;return{total:t.total,used:t.used,remaining:t.remaining}}throw new Error(e.data.message||"\u83b7\u53d6\u4e0b\u8f7d\u989d\u5ea6\u5931\u8d25")}catch(e){throw console.error("\u83b7\u53d6\u4e0b\u8f7d\u989d\u5ea6\u5931\u8d25:",e),e}},Sd=e=>{const t=new Date(e),n=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),o=String(t.getDate()).padStart(2,"0");return"".concat(n,"-").concat(r,"-").concat(o)},Ed=async()=>{try{const e=await ir.get("/invitecode/userInviteCode");if(200===e.data.code)return e.data.data.inviteCode;throw new Error(e.data.message||"\u83b7\u53d6\u9080\u8bf7\u7801\u5217\u8868\u5931\u8d25")}catch(e){throw console.error("\u83b7\u53d6\u9080\u8bf7\u7801\u5217\u8868\u5931\u8d25:",e),e}},Cd=()=>{const e=te(),t=Z(),[n,o]=(0,r.useState)(null),[a,i]=(0,r.useState)(!0),[s,l]=(0,r.useState)(null),[c,u]=(0,r.useState)({});(0,r.useEffect)((()=>{(async()=>{try{const[e,t]=await Promise.all([xd(),kd()]);o({username:e.username,avatar:"https://via.placeholder.com/150",joinDate:e.registTime,level:e.level,points:e.magicPoints,upload:e.upload,download:e.download,ratio:e.shareRate,downloadQuota:{total:t.total,used:t.used,remaining:t.remaining}})}catch(e){l(e.message)}finally{i(!1)}})()}),[]);const d=async()=>{try{const e=await(async()=>{try{const e=await ir.get("/torrent/getProgress");if(200===e.data.code)return e.data.data.progresses;throw new Error(e.data.message||"\u83b7\u53d6\u4e0b\u8f7d\u8fdb\u5ea6\u5931\u8d25")}catch(s){throw console.error("\u83b7\u53d6\u4e0b\u8f7d\u8fdb\u5ea6\u5931\u8d25:",s),s}})();u(e)}catch(e){console.error("\u83b7\u53d6\u4e0b\u8f7d\u8fdb\u5ea6\u5931\u8d25:",e)}};if((0,r.useEffect)((()=>{d();const e=setInterval(d,1e4);return()=>clearInterval(e)}),[]),a)return(0,bd.jsx)("div",{className:"loading",children:"\u52a0\u8f7d\u4e2d..."});if(s)return(0,bd.jsxs)("div",{className:"error",children:["\u9519\u8bef: ",s]});if(!n)return(0,bd.jsx)("div",{className:"error",children:"\u672a\u83b7\u53d6\u5230\u7528\u6237\u6570\u636e"});const f=e=>{if(e<1024)return"".concat(e," B");const t=e/1024;if(t<1024)return"".concat(t.toFixed(2)," KB");const n=t/1024;if(n<1024)return"".concat(n.toFixed(2)," MB");return"".concat((n/1024).toFixed(2)," GB")};return(0,bd.jsxs)("div",{className:"personal-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:()=>{var n;null!==(n=t.state)&&void 0!==n&&n.fromSubpage?e("/dashboard/".concat(t.state.dashboardTab||""),{replace:!0}):e(-1)},children:"\u2190 \u8fd4\u56de"}),(0,bd.jsxs)("div",{className:"profile-card",children:[(0,bd.jsxs)("div",{className:"profile-header",children:[(0,bd.jsx)("img",{src:n.avatar,alt:n.username,className:"profile-avatar"}),(0,bd.jsxs)("div",{className:"profile-info",children:[(0,bd.jsx)("h2",{className:"username",children:n.username}),(0,bd.jsxs)("div",{className:"user-meta",children:[(0,bd.jsxs)("span",{children:["\u52a0\u5165\u65f6\u95f4: ",n.joinDate]}),(0,bd.jsxs)("span",{children:["\u4f1a\u5458\u7b49\u7ea7: Lv.",n.level]})]})]})]}),(0,bd.jsxs)("div",{className:"stats-grid",children:[(0,bd.jsxs)("div",{className:"stat-item",children:[(0,bd.jsx)("div",{className:"stat-label",children:"\u4fdd\u79cd\u79ef\u5206"}),(0,bd.jsx)("div",{className:"stat-value",children:n.points})]}),(0,bd.jsxs)("div",{className:"stat-item",children:[(0,bd.jsx)("div",{className:"stat-label",children:"\u4e0a\u4f20\u91cf"}),(0,bd.jsx)("div",{className:"stat-value",children:f(n.upload)})]}),(0,bd.jsxs)("div",{className:"stat-item",children:[(0,bd.jsx)("div",{className:"stat-label",children:"\u4e0b\u8f7d\u91cf"}),(0,bd.jsx)("div",{className:"stat-value",children:f(n.download)})]}),(0,bd.jsxs)("div",{className:"stat-item",children:[(0,bd.jsx)("div",{className:"stat-label",children:"\u5206\u4eab\u7387"}),(0,bd.jsx)("div",{className:"stat-value",children:n.ratio})]})]})]}),(0,bd.jsxs)("div",{className:"quota-card",children:[(0,bd.jsx)("h3",{children:"\u4e0b\u8f7d\u989d\u5ea6"}),(0,bd.jsxs)("div",{className:"quota-info",children:[(0,bd.jsxs)("span",{className:"quota-used",children:[f(n.downloadQuota.used)," \u5df2\u4f7f\u7528"]}),(0,bd.jsxs)("span",{className:"quota-remaining",children:[f(n.downloadQuota.remaining)," \u5269\u4f59"]})]}),(0,bd.jsx)("div",{className:"progress-bar",children:(0,bd.jsx)("div",{className:"progress-fill",style:{width:"".concat(n.downloadQuota.used/n.downloadQuota.total*100,"%"),backgroundColor:(p=n.downloadQuota.used/n.downloadQuota.total,p<.3?"#4CAF50":p<.7?"#FFC107":"#F44336")}})}),(0,bd.jsxs)("div",{className:"quota-total",children:["\u603b\u989d\u5ea6: ",f(n.downloadQuota.total)]})]}),Object.keys(c).length>0&&(0,bd.jsxs)("div",{className:"progress-card",children:[(0,bd.jsx)("h3",{children:"\u5f53\u524d\u4e0b\u8f7d\u8fdb\u5ea6"}),Object.entries(c).map((e=>{let[t,n]=e;return(0,bd.jsxs)("div",{className:"download-task",children:[(0,bd.jsxs)("div",{className:"task-info",children:[(0,bd.jsxs)("span",{className:"task-id",children:["\u4efb\u52a1: ",t.substring(0,8),"..."]}),(0,bd.jsxs)("span",{className:"task-progress",children:[Math.round(100*n),"%"]})]}),(0,bd.jsx)("div",{className:"progress-bar",children:(0,bd.jsx)("div",{className:"progress-fill",style:{width:"".concat(100*n,"%")}})})]},t)}))]}),(0,bd.jsx)("div",{className:"action-cards",children:[{title:"\u5151\u6362\u533a",description:"\u4e0b\u8f7d\u91cf/\u9080\u8bf7\u7801",path:"/personal/Exchange"},{title:"\u4e0a\u4f20\u8bb0\u5f55",description:"\u7ba1\u7406\u4e0a\u4f20\u7684\u8d44\u6e90",path:"/personal/Upload"},{title:"\u6d88\u606f\u901a\u77e5",description:"\u67e5\u770b\u7cfb\u7edf\u6d88\u606f",path:"/personal/Notice"},{title:"\u8bbe\u7f6e",description:"\u4fee\u6539\u4e2a\u4eba\u8d44\u6599",path:"/personal/Setting"}].map((t=>(0,bd.jsxs)("div",{className:"action-card",onClick:()=>{return n=t.path,void e(n);var n},children:[(0,bd.jsx)("h3",{children:t.title}),(0,bd.jsx)("p",{children:t.description})]},t.path)))}),(0,bd.jsx)("div",{className:"subpage-container",children:(0,bd.jsx)(ye,{})})]});var p},Nd=e=>{let{onLoginSuccess:t}=e;const[n,o]=(0,r.useState)(!0),[a,i]=(0,r.useState)({username:"",password:"",code:""}),[s,l]=(0,r.useState)(""),[c,u]=(0,r.useState)(!1),d=te(),f=e=>{const{name:t,value:n}=e.target;i((e=>_e(_e({},e),{},{[t]:n})))},p=async e=>{e.preventDefault();try{if(n){const e=await(async(e,t)=>{const n=await ir.post("/user/login",null,{params:{username:e,password:t}});return 200===n.data.code&&n.data.data.token&&localStorage.setItem("token",n.data.data.token),n})(a.username,a.password);200===e.data.code?(localStorage.setItem("token",e.data.data.token),localStorage.setItem("username",a.username),null===t||void 0===t||t(),d("/dashboard")):l(e.data.message||"\u767b\u5f55\u5931\u8d25")}else{const e=await(r=a.username,s=a.password,c=a.code,ir.post("/user/regist",null,{params:{username:r,password:s,code:c}}));200===e.data.code?(l(""),o(!0),i({username:"",password:"",code:""})):l(e.data.message||"\u6ce8\u518c\u5931\u8d25")}}catch(f){l(f.message||(n?"\u767b\u5f55\u5931\u8d25":"\u6ce8\u518c\u5931\u8d25"))}finally{u(!1)}var r,s,c};return(0,bd.jsxs)("div",{className:"auth-container",children:[(0,bd.jsx)("h1",{className:"auth-title",children:"PT\u5f71\u89c6\u8d44\u6e90\u7ad9"}),(0,bd.jsx)("div",{className:"auth-form-wrapper",children:n?(0,bd.jsxs)("form",{className:"auth-form",onSubmit:p,children:[(0,bd.jsx)("h2",{children:"\u7528\u6237\u767b\u5f55"}),s&&(0,bd.jsx)("div",{className:"error-message",children:s}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("input",{type:"text",name:"username",placeholder:"\u8d26\u53f7",value:a.username,onChange:f,required:!0})}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("input",{type:"password",name:"password",placeholder:"\u5bc6\u7801",value:a.password,onChange:f,required:!0})}),(0,bd.jsx)("button",{type:"submit",className:"auth-button",disabled:c,children:c?"\u767b\u5f55\u4e2d...":"\u767b\u5f55"}),(0,bd.jsxs)("div",{className:"auth-switch",children:[(0,bd.jsx)("span",{children:"\u672a\u6709\u8d26\u6237\uff1f"}),(0,bd.jsx)("button",{type:"button",onClick:()=>o(!1),className:"switch-button",children:"\u53bb\u6ce8\u518c"})]})]}):(0,bd.jsxs)("form",{className:"auth-form",onSubmit:p,children:[(0,bd.jsx)("h2",{children:"\u7528\u6237\u6ce8\u518c"}),s&&(0,bd.jsx)("div",{className:"error-message",children:s}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("input",{type:"text",name:"username",placeholder:"\u8d26\u53f7",value:a.username,onChange:f,required:!0})}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("input",{type:"password",name:"password",placeholder:"\u5bc6\u7801",value:a.password,onChange:f,required:!0})}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("input",{type:"text",name:"code",placeholder:"\u9080\u8bf7\u7801",value:a.code,onChange:f,required:!0})}),(0,bd.jsx)("button",{type:"submit",className:"auth-button",disabled:c,children:c?"\u6ce8\u518c\u4e2d...":"\u6ce8\u518c"}),(0,bd.jsxs)("div",{className:"auth-switch",children:[(0,bd.jsx)("span",{children:"\u5df2\u6709\u8d26\u6237\uff1f"}),(0,bd.jsx)("button",{type:"button",onClick:()=>o(!0),className:"switch-button",children:"\u53bb\u767b\u5f55"})]})]})})]})},jd=()=>{const e=te(),{id:t}=re(),[n,o]=(0,r.useState)(null),[a,i]=(0,r.useState)(!0),[s,l]=(0,r.useState)(""),c=Z(),{state:u}=Z(),d=()=>{var t;const n=null===(t=c.state)||void 0===t?void 0:t.fromTab;e(n?"/dashboard/".concat(n):-1)};return(0,r.useEffect)((()=>{(async()=>{try{i(!0);const e=await(e=>ir.get("/announcement/".concat(e)))(t);200===e.data.code?o(e.data.data.announcement):l(e.data.message||"\u83b7\u53d6\u516c\u544a\u8be6\u60c5\u5931\u8d25")}catch(e){l("\u83b7\u53d6\u516c\u544a\u8be6\u60c5\u5931\u8d25"),vd.error("\u83b7\u53d6\u516c\u544a\u8be6\u60c5\u5931\u8d25")}finally{i(!1)}})()}),[t]),s||!n?(0,bd.jsxs)("div",{className:"announcement-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:d,children:"\u2190 \u8fd4\u56de"}),(0,bd.jsx)("div",{className:"error-message",children:s||"\u516c\u544a\u4e0d\u5b58\u5728"})]}):(0,bd.jsxs)("div",{className:"announcement-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:d,children:"\u2190 \u8fd4\u56de"}),(0,bd.jsxs)("div",{className:"announcement-detail",children:[(0,bd.jsxs)("div",{className:"announcement-header",children:[(0,bd.jsx)("h1",{children:n.title}),(0,bd.jsx)("div",{className:"announcement-meta",children:(0,bd.jsxs)("span",{children:["\u53d1\u5e03\u65e5\u671f\uff1a",n.createTime]})})]}),(0,bd.jsx)("div",{className:"announcement-content",children:n.content.split("\n").map(((e,t)=>(0,bd.jsx)("p",{children:e},t)))})]})]})},Dd=e=>{let{onLogout:t}=e;const{id:n}=re(),o=te(),a=Z(),[i,s]=(0,r.useState)(null),[l,c]=(0,r.useState)([]),[u,d]=(0,r.useState)(""),[f]=(0,r.useState)(null),[p,h]=(0,r.useState)(""),[m,v]=(0,r.useState)(!0),[g,y]=(0,r.useState)(""),[b,w]=(0,r.useState)(null),[x,k]=(0,r.useState)({visible:!1,replyingTo:null,replyingToUsername:"",isReply:!1}),S=(e,t)=>{k({visible:!0,replyingTo:e,replyingToUsername:t,isReply:!1})},E=()=>{k({visible:!1,replyingTo:null,replyingToUsername:"",isReply:!1}),h("")},C=e=>{let{comment:t,onLike:n,onReply:r,isReply:o=!1}=e;return(0,bd.jsx)("div",{className:"comment-container ".concat(o?"is-reply":""),children:(0,bd.jsxs)("div",{className:"comment-item",children:[(0,bd.jsxs)("div",{className:"comment-avatar",children:[(t.authorId||"?").charAt(0)," "]}),(0,bd.jsxs)("div",{className:"comment-content",children:[(0,bd.jsxs)("div",{className:"comment-header",children:[(0,bd.jsx)("span",{className:"comment-user",children:t.authorId||"\u533f\u540d\u7528\u6237"}),t.replyTo&&(0,bd.jsxs)("span",{className:"reply-to",children:["\u56de\u590d @",t.replyTo]}),(0,bd.jsx)("span",{className:"comment-time",children:new Date(t.createTime).toLocaleString()})]}),(0,bd.jsx)("p",{className:"comment-text",children:t.content}),(0,bd.jsxs)("div",{className:"comment-actions",children:[(0,bd.jsxs)("button",{onClick:()=>n(t.id),children:["\ud83d\udc4d (",t.likeCount||0,")"]}),(0,bd.jsx)("button",{onClick:()=>r(t.id,t.authorId),children:"\u56de\u590d"})]})]})]})})},N=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(0,bd.jsxs)("div",{style:{marginLeft:"".concat(30*t,"px")},children:[(0,bd.jsx)(C,{comment:e,onLike:D,onReply:S,isReply:t>0}),e.replies&&e.replies.map((e=>N(e,t+1)))]},e.id)},j=async()=>{try{v(!0);const e=await(r=n,ir.get("/torrent/".concat(r)).then((e=>e.data&&e.data.data?_e(_e({},e),{},{data:_e(_e({},e.data),{},{data:{torrent:e.data.data.torrent,comments:e.data.data.comments||[]}})}):e)));console.log("API Response:",JSON.parse(JSON.stringify(e.data.data.comments))),s(e.data.data.torrent),c(e.data.data.comments)}catch(o){var e,t;y((null===(e=o.response)||void 0===e||null===(t=e.data)||void 0===t?void 0:t.message)||"\u83b7\u53d6\u79cd\u5b50\u8be6\u60c5\u5931\u8d25")}finally{v(!1)}var r};(0,r.useEffect)((()=>{j()}),[n]);const D=async e=>{try{await(e=>ir.post("/torrent/comments/".concat(e,"/like")))(e);const t=n=>n.map((n=>n.id===e?_e(_e({},n),{},{likeCount:n.likeCount+1}):n.replies&&n.replies.length>0?_e(_e({},n),{},{replies:t(n.replies)}):n));c((e=>t(e)))}catch(r){var t,n;y("\u70b9\u8d5e\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}};return m?(0,bd.jsx)("div",{className:"loading",children:"\u52a0\u8f7d\u4e2d..."}):g?(0,bd.jsx)("div",{className:"error",children:g}):i?(0,bd.jsxs)("div",{className:"torrent-detail-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:()=>{var e;const t=(null===(e=a.state)||void 0===e?void 0:e.fromTab)||"share";o("/dashboard/".concat(t))},children:"\u2190 \u8fd4\u56de\u8d44\u6e90\u533a"}),(0,bd.jsxs)("div",{className:"torrent-main",children:[(0,bd.jsx)("div",{className:"torrent-cover",children:(0,bd.jsx)("div",{className:"cover-placeholder",children:i.torrentName.charAt(0)})}),(0,bd.jsxs)("div",{className:"torrent-info",children:[(0,bd.jsx)("h1",{className:"torrent-title",children:i.torrentName}),(0,bd.jsxs)("div",{className:"uploader-info",children:[(0,bd.jsx)("div",{className:"uploader-avatar",children:i.username.charAt(0)}),(0,bd.jsxs)("div",{className:"uploader-details",children:[(0,bd.jsx)("span",{className:"uploader-name",children:i.username}),(0,bd.jsx)("span",{className:"upload-time",children:new Date(i.createTime).toLocaleString()})]})]}),(0,bd.jsxs)("div",{className:"torrent-meta",children:[(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u7c7b\u578b:"})," ",i.category]}),(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u5730\u533a:"})," ",i.region]}),(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u5206\u8fa8\u7387:"})," ",i.resolution]}),(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u5b57\u5e55:"})," ",i.subtitle]}),i.size&&(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u5927\u5c0f:"})," ",i.size]})]}),(0,bd.jsxs)("div",{className:"torrent-description",children:[(0,bd.jsx)("h3",{children:"\u8d44\u6e90\u63cf\u8ff0"}),(0,bd.jsx)("p",{children:i.description})]}),(0,bd.jsxs)("div",{className:"interaction-buttons",children:[(0,bd.jsx)("button",{className:"like-button",onClick:async()=>{try{await(r=n,ir.post("/torrent/".concat(r,"/like"))),s((e=>_e(_e({},e),{},{likeCount:e.likeCount+1})))}catch(o){var e,t;y("\u70b9\u8d5e\u5931\u8d25: "+((null===(e=o.response)||void 0===e||null===(t=e.data)||void 0===t?void 0:t.message)||o.message))}var r},children:(0,bd.jsxs)("span",{children:["\ud83d\udc4d \u70b9\u8d5e (",i.likeCount,")"]})}),(0,bd.jsx)("button",{className:"download-button",children:(0,bd.jsx)("span",{children:"\u2b07\ufe0f \u7acb\u5373\u4e0b\u8f7d"})})]})]})]}),(0,bd.jsxs)("div",{className:"comments-section",children:[(0,bd.jsxs)("h2",{children:["\u8bc4\u8bba (",i.replyCount,")"]}),(0,bd.jsxs)("form",{onSubmit:async e=>{var t,r;if(e.preventDefault(),u.trim())try{const e=localStorage.getItem("username"),o=await(t=n,r={content:u,authorId:e},ir.post("/torrent/".concat(t,"/comments"),r));o.data&&200===o.data.code?(await j(),d("")):y(o.data.message||"\u8bc4\u8bba\u5931\u8d25")}catch(i){var o,a;y("\u8bc4\u8bba\u5931\u8d25: "+((null===(o=i.response)||void 0===o||null===(a=o.data)||void 0===a?void 0:a.message)||i.message))}},className:"comment-form",children:[(0,bd.jsx)("textarea",{value:u,onChange:e=>d(e.target.value),placeholder:"\u5199\u4e0b\u4f60\u7684\u8bc4\u8bba...",rows:"3",required:!0}),(0,bd.jsx)("button",{type:"submit",children:"\u53d1\u8868\u8bc4\u8bba"})]}),(0,bd.jsx)("div",{className:"comment-list",children:l.map((e=>N(e)))}),x.visible&&(0,bd.jsx)("div",{className:"reply-modal-overlay",children:(0,bd.jsxs)("div",{className:"reply-modal",children:[(0,bd.jsxs)("div",{className:"modal-header",children:[(0,bd.jsxs)("h3",{children:["\u56de\u590d @",x.replyingToUsername]}),(0,bd.jsx)("button",{onClick:E,className:"close-modal",children:"\xd7"})]}),(0,bd.jsxs)("form",{onSubmit:async e=>{var t,n;if(e.preventDefault(),p.trim())try{const e=localStorage.getItem("username"),r=await(t=x.replyingTo,n={content:p,authorId:e},ir.post("/torrent/comments/".concat(t,"/replies"),n));console.log("\u56de\u590d\u54cd\u5e94:",r.data),r.data&&200===r.data.code&&(await j(),E())}catch(a){var r,o;console.error("\u56de\u590d\u9519\u8bef:",a),y("\u56de\u590d\u5931\u8d25: "+((null===(r=a.response)||void 0===r||null===(o=r.data)||void 0===o?void 0:o.message)||a.message))}},children:[(0,bd.jsx)("textarea",{value:p,onChange:e=>h(e.target.value),placeholder:"\u56de\u590d @".concat(x.replyingToUsername,"..."),rows:"5",autoFocus:!0,required:!0}),(0,bd.jsxs)("div",{className:"modal-actions",children:[(0,bd.jsx)("button",{type:"button",onClick:E,className:"cancel-btn",children:"\u53d6\u6d88"}),(0,bd.jsx)("button",{type:"submit",className:"submit-btn",children:"\u53d1\u9001\u56de\u590d"})]})]})]})})]})]}):(0,bd.jsx)("div",{className:"error",children:"\u79cd\u5b50\u4e0d\u5b58\u5728"})},Pd=()=>{const{id:e}=re(),t=te(),n=Z(),[o,a]=((0,r.useRef)(null),(0,r.useState)(null)),[i,s]=(0,r.useState)([]),[l,c]=(0,r.useState)(!0),[u,d]=(0,r.useState)(null),[f,p]=(0,r.useState)(""),[h,m]=(0,r.useState)(""),[v,g]=(0,r.useState)([]),[y,b]=(0,r.useState)([]),[w,x]=(0,r.useState)({}),[k,S]=(0,r.useState)({}),[E]=(0,r.useState)(null),[C,N]=(0,r.useState)(null),[j,D]=(0,r.useState)({visible:!1,replyingTo:null,replyingToUsername:"",isReply:!1}),P=(e,t)=>{D({visible:!0,replyingTo:e,replyingToUsername:t,isReply:!1})},T=()=>{D({visible:!1,replyingTo:null,replyingToUsername:"",isReply:!1}),m("")},_=e=>{let{comment:t,onLike:n,onReply:r,onDelete:o,isReply:a=!1}=e;return(0,bd.jsx)("div",{className:"comment-container ".concat(a?"is-reply":""),children:(0,bd.jsxs)("div",{className:"comment-item",children:[(0,bd.jsxs)("div",{className:"comment-avatar",children:[(t.authorId||"?").charAt(0)," "]}),(0,bd.jsxs)("div",{className:"comment-content",children:[(0,bd.jsxs)("div",{className:"comment-header",children:[(0,bd.jsx)("span",{className:"comment-user",children:t.authorId||"\u533f\u540d\u7528\u6237"}),t.replyTo&&(0,bd.jsxs)("span",{className:"reply-to",children:["\u56de\u590d @",t.replyTo]}),(0,bd.jsx)("span",{className:"comment-time",children:new Date(t.createTime).toLocaleString()})]}),(0,bd.jsx)("p",{className:"comment-text",children:t.content}),t.imageUrl&&(0,bd.jsx)("div",{className:"comment-image-container",children:(0,bd.jsx)("img",{src:"http://localhost:8088".concat(t.imageUrl),alt:"\u8bc4\u8bba\u56fe\u7247",className:"comment-image",onClick:()=>window.open(t.imageUrl,"_blank")})}),(0,bd.jsxs)("div",{className:"comment-actions",children:[(0,bd.jsxs)("button",{onClick:()=>n(t.id),children:["\ud83d\udc4d (",t.likeCount||0,")"]}),(0,bd.jsx)("button",{onClick:()=>r(t.id,t.authorId),children:"\u56de\u590d"}),t.authorId===localStorage.getItem("username")&&(0,bd.jsx)("button",{className:"delete-comment-btn",onClick:()=>o(t.id),children:"\u5220\u9664"})]})]})]})})},O=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(0,bd.jsxs)("div",{style:{marginLeft:"".concat(30*t,"px")},children:[(0,bd.jsx)(_,{comment:e,onLike:A,onReply:P,isReply:t>0,onDelete:L}),e.replies&&e.replies.map((e=>O(e,t+1)))]},e.id)},M=async()=>{try{c(!0);const t=await ur(e);console.log("API Response:",JSON.parse(JSON.stringify(t.data.data.comments))),a(t.data.data.post),s(t.data.data.comments)}catch(r){var t,n;d((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||"\u83b7\u53d6\u5e16\u5b50\u8be6\u60c5\u5931\u8d25")}finally{c(!1)}};(0,r.useEffect)((()=>{M()}),[e]);const R=async e=>{if(window.confirm("\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u5e16\u5b50\u5417\uff1f\u6240\u6709\u8bc4\u8bba\u4e5f\u5c06\u88ab\u5220\u9664\uff01"))try{const n=localStorage.getItem("username");await((e,t)=>ir.delete("/request/posts/".concat(e),{params:{authorId:t}}))(e,n),t("/dashboard/request")}catch(o){var n,r;d("\u5220\u9664\u5931\u8d25: "+((null===(n=o.response)||void 0===n||null===(r=n.data)||void 0===r?void 0:r.message)||o.message))}},A=async e=>{try{await(e=>ir.post("/request/comments/".concat(e,"/like")))(e);const t=n=>n.map((n=>n.id===e?_e(_e({},n),{},{likeCount:n.likeCount+1}):n.replies&&n.replies.length>0?_e(_e({},n),{},{replies:t(n.replies)}):n));s((e=>t(e)))}catch(r){var t,n;d("\u70b9\u8d5e\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}},L=async e=>{if(window.confirm("\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u6761\u8bc4\u8bba\u5417\uff1f"))try{const t=localStorage.getItem("username");await((e,t)=>ir.delete("/request/comments/".concat(e),{params:{authorId:t}}))(e,t),await M()}catch(r){var t,n;d("\u5220\u9664\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}};return l?(0,bd.jsx)("div",{className:"loading",children:"\u52a0\u8f7d\u4e2d..."}):u?(0,bd.jsx)("div",{className:"error",children:u}):o?(0,bd.jsxs)("div",{className:"request-detail-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:()=>{var e;null===(e=n.state)||void 0===e||e.fromTab;t("/dashboard/request")},children:"\u2190 \u8fd4\u56de\u6c42\u52a9\u533a"}),(0,bd.jsxs)("div",{className:"request-post ".concat(o.isSolved?"solved":""),children:[(0,bd.jsxs)("div",{className:"post-header",children:[(0,bd.jsx)("img",{src:o.authorAvatar||"https://via.placeholder.com/40",alt:o.authorId,className:"post-avatar"}),(0,bd.jsxs)("div",{className:"post-meta",children:[(0,bd.jsx)("div",{className:"post-author",children:o.authorId}),(0,bd.jsx)("div",{className:"post-date",children:new Date(o.createTime).toLocaleString()})]}),o.isSolved&&(0,bd.jsx)("span",{ClassName:"solved-badge",children:"\u5df2\u89e3\u51b3"}),(0,bd.jsx)("div",{classname:"delete-post",children:o.authorId===localStorage.getItem("username")&&(0,bd.jsx)("button",{className:"delete-button",onClick:()=>R(o.id),children:"\u5220\u9664\u5e16\u5b50"})})]}),(0,bd.jsx)("h1",{className:"post-title",children:o.title}),(0,bd.jsxs)("div",{className:"post-content",children:[o.content.split("\n").map(((e,t)=>(0,bd.jsx)("p",{children:e},t))),o.imageUrl&&(0,bd.jsx)("div",{className:"post-image-container",children:(0,bd.jsx)("img",{src:"http://localhost:8088".concat(o.imageUrl),alt:"\u5e16\u5b50\u56fe\u7247",className:"post-image"})})]}),(0,bd.jsxs)("div",{className:"post-actions",children:[(0,bd.jsxs)("button",{className:"like-button ".concat(o.isLiked?"liked":""),onClick:async()=>{try{await((e,t)=>ir.post("/request/posts/".concat(e,"/like"),null,{params:t}))(e),a((e=>_e(_e({},e),{},{likeCount:e.likeCount+1})))}catch(r){var t,n;d("\u70b9\u8d5e\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}},children:["\ud83d\udc4d \u70b9\u8d5e (",o.likeCount,")"]}),(0,bd.jsx)("button",{className:"solve-button ".concat(o.isSolved?"solved":""),onClick:()=>{a((e=>_e(_e({},e),{},{isSolved:!e.isSolved})))},children:o.isSolved?"\u2713 \u5df2\u89e3\u51b3":"\u6807\u8bb0\u4e3a\u5df2\u89e3\u51b3"})]})]}),(0,bd.jsxs)("div",{className:"comments-section",children:[(0,bd.jsxs)("h2",{children:["\u8bc4\u8bba (",o.replyCount,")"]}),(0,bd.jsxs)("form",{onSubmit:async t=>{var n,r;if(t.preventDefault(),f.trim())try{const t=localStorage.getItem("username"),o=new FormData;o.append("content",f),o.append("authorId",t),y&&o.append("image",y);const a=await(n=e,r=o,ir.post("/request/posts/".concat(n,"/comments"),r));a.data&&200===a.data.code?(await M(),p(""),b(null)):d(a.data.message||"\u8bc4\u8bba\u5931\u8d25")}catch(i){var o,a;d("\u8bc4\u8bba\u5931\u8d25: "+((null===(o=i.response)||void 0===o||null===(a=o.data)||void 0===a?void 0:a.message)||i.message))}},className:"comment-form",children:[(0,bd.jsx)("textarea",{value:f,onChange:e=>p(e.target.value),placeholder:"\u5199\u4e0b\u4f60\u7684\u8bc4\u8bba...",rows:"3",required:!0}),(0,bd.jsx)("button",{type:"submit",children:"\u53d1\u8868\u8bc4\u8bba"}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("div",{className:"upload-image-btn",children:(0,bd.jsx)("input",{type:"file",accept:"image/*",onChange:e=>b(e.target.files[0]),"data-testid":"comment-image-input"})})})]}),(0,bd.jsx)("div",{className:"comment-list",children:i.map((e=>O(e)))}),j.visible&&(0,bd.jsx)("div",{className:"reply-modal-overlay",children:(0,bd.jsxs)("div",{className:"reply-modal",children:[(0,bd.jsxs)("div",{className:"modal-header",children:[(0,bd.jsxs)("h3",{children:["\u56de\u590d @",j.replyingToUsername]}),(0,bd.jsx)("button",{onClick:T,className:"close-modal",children:"\xd7"})]}),(0,bd.jsxs)("form",{onSubmit:async e=>{if(e.preventDefault(),h.trim())try{const e=localStorage.getItem("username"),t=await((e,t)=>{const n=new FormData;return n.append("authorId",t.authorId),n.append("content",t.content),t.image&&n.append("image",t.image),ir.post("/request/comments/".concat(e,"/replies"),n)})(j.replyingTo,{authorId:e,content:h,image:v});console.log("\u56de\u590d\u54cd\u5e94:",t.data),t.data&&200===t.data.code&&(await M(),m(""),T())}catch(r){var t,n;console.error("\u56de\u590d\u9519\u8bef:",r),d("\u56de\u590d\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}},children:[(0,bd.jsx)("textarea",{value:h,onChange:e=>m(e.target.value),placeholder:"\u56de\u590d @".concat(j.replyingToUsername,"..."),rows:"5",autoFocus:!0,required:!0}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("div",{className:"upload-image-btn",children:(0,bd.jsx)("input",{type:"file",accept:"image/*",onChange:e=>g(e.target.files[0])})})}),(0,bd.jsxs)("div",{className:"modal-actions",children:[(0,bd.jsx)("button",{type:"button",onClick:T,className:"cancel-btn",children:"\u53d6\u6d88"}),(0,bd.jsx)("button",{type:"submit",className:"submit-btn",children:"\u53d1\u9001\u56de\u590d"})]})]})]})})]})]}):(0,bd.jsx)("div",{className:"error",children:"\u5e16\u5b50\u4e0d\u5b58\u5728"})},Td=()=>{const{id:e}=re(),t=te(),n=Z(),[o,a]=((0,r.useRef)(null),(0,r.useState)(null)),[i,s]=(0,r.useState)([]),[l,c]=(0,r.useState)(!0),[u,d]=(0,r.useState)(null),[f,p]=(0,r.useState)(""),[h,m]=(0,r.useState)(""),[v,g]=(0,r.useState)([]),[y,b]=(0,r.useState)([]),[w,x]=(0,r.useState)({}),[k,S]=(0,r.useState)({}),[E]=(0,r.useState)(null),[C,N]=(0,r.useState)(null),[j,D]=(0,r.useState)({visible:!1,replyingTo:null,replyingToUsername:"",isReply:!1}),P=(e,t)=>{D({visible:!0,replyingTo:e,replyingToUsername:t,isReply:!1})},T=()=>{D({visible:!1,replyingTo:null,replyingToUsername:"",isReply:!1}),m("")},_=e=>{let{comment:t,onLike:n,onReply:r,onDelete:o,isReply:a=!1}=e;return(0,bd.jsx)("div",{className:"comment-container ".concat(a?"is-reply":""),children:(0,bd.jsxs)("div",{className:"comment-item",children:[(0,bd.jsxs)("div",{className:"comment-avatar",children:[(t.authorId||"?").charAt(0)," "]}),(0,bd.jsxs)("div",{className:"comment-content",children:[(0,bd.jsxs)("div",{className:"comment-header",children:[(0,bd.jsx)("span",{className:"comment-user",children:t.authorId||"\u533f\u540d\u7528\u6237"}),t.replyTo&&(0,bd.jsxs)("span",{className:"reply-to",children:["\u56de\u590d @",t.replyTo]}),(0,bd.jsx)("span",{className:"comment-time",children:new Date(t.createTime).toLocaleString()})]}),(0,bd.jsx)("p",{className:"comment-text",children:t.content}),t.imageUrl&&(0,bd.jsx)("div",{className:"comment-image-container",children:(0,bd.jsx)("img",{src:"http://localhost:8088".concat(t.imageUrl),alt:"\u8bc4\u8bba\u56fe\u7247",className:"comment-image",onClick:()=>window.open(t.imageUrl,"_blank")})}),(0,bd.jsxs)("div",{className:"comment-actions",children:[(0,bd.jsxs)("button",{onClick:()=>n(t.id),children:["\ud83d\udc4d (",t.likeCount||0,")"]}),(0,bd.jsx)("button",{onClick:()=>r(t.id,t.authorId),children:"\u56de\u590d"}),t.authorId===localStorage.getItem("username")&&(0,bd.jsx)("button",{className:"delete-comment-btn",onClick:()=>o(t.id),children:"\u5220\u9664"})]})]})]})})},O=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(0,bd.jsxs)("div",{style:{marginLeft:"".concat(30*t,"px")},children:[(0,bd.jsx)(_,{comment:e,onLike:A,onReply:P,isReply:t>0,onDelete:L}),e.replies&&e.replies.map((e=>O(e,t+1)))]},e.id)},M=async()=>{try{c(!0);const t=await cr(e);console.log("API Response:",JSON.parse(JSON.stringify(t.data.data.comments))),a(t.data.data.post),s(t.data.data.comments)}catch(r){var t,n;d((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||"\u83b7\u53d6\u5e16\u5b50\u8be6\u60c5\u5931\u8d25")}finally{c(!1)}};(0,r.useEffect)((()=>{M()}),[e]);const R=async e=>{if(window.confirm("\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u5e16\u5b50\u5417\uff1f\u6240\u6709\u8bc4\u8bba\u4e5f\u5c06\u88ab\u5220\u9664\uff01"))try{const n=localStorage.getItem("username");await((e,t)=>ir.delete("/help/posts/".concat(e),{params:{authorId:t}}))(e,n),t("/dashboard/help")}catch(o){var n,r;d("\u5220\u9664\u5931\u8d25: "+((null===(n=o.response)||void 0===n||null===(r=n.data)||void 0===r?void 0:r.message)||o.message))}},A=async e=>{try{await(e=>ir.post("/help/comments/".concat(e,"/like")))(e);const t=n=>n.map((n=>n.id===e?_e(_e({},n),{},{likeCount:n.likeCount+1}):n.replies&&n.replies.length>0?_e(_e({},n),{},{replies:t(n.replies)}):n));s((e=>t(e)))}catch(r){var t,n;d("\u70b9\u8d5e\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}},L=async e=>{if(window.confirm("\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u6761\u8bc4\u8bba\u5417\uff1f"))try{const t=localStorage.getItem("username");await((e,t)=>ir.delete("/help/comments/".concat(e),{params:{authorId:t}}))(e,t),await M()}catch(r){var t,n;d("\u5220\u9664\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}};return l?(0,bd.jsx)("div",{className:"loading",children:"\u52a0\u8f7d\u4e2d..."}):u?(0,bd.jsx)("div",{className:"error",children:u}):o?(0,bd.jsxs)("div",{className:"help-detail-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:()=>{var e;null===(e=n.state)||void 0===e||e.fromTab;t("/dashboard/help")},children:"\u2190 \u8fd4\u56de\u6c42\u52a9\u533a"}),(0,bd.jsxs)("div",{className:"help-post ".concat(o.isSolved?"solved":""),children:[(0,bd.jsxs)("div",{className:"post-header",children:[(0,bd.jsx)("img",{src:o.authorAvatar||"https://via.placeholder.com/40",alt:o.authorId,className:"post-avatar"}),(0,bd.jsxs)("div",{className:"post-meta",children:[(0,bd.jsx)("div",{className:"post-author",children:o.authorId}),(0,bd.jsx)("div",{className:"post-date",children:new Date(o.createTime).toLocaleString()})]}),o.isSolved&&(0,bd.jsx)("span",{ClassName:"solved-badge",children:"\u5df2\u89e3\u51b3"}),(0,bd.jsx)("div",{classname:"delete-post",children:o.authorId===localStorage.getItem("username")&&(0,bd.jsx)("button",{className:"delete-button",onClick:()=>R(o.id),children:"\u5220\u9664\u5e16\u5b50"})})]}),(0,bd.jsx)("h1",{className:"post-title",children:o.title}),(0,bd.jsxs)("div",{className:"post-content",children:[o.content.split("\n").map(((e,t)=>(0,bd.jsx)("p",{children:e},t))),o.imageUrl&&(0,bd.jsx)("div",{className:"post-image-container",children:(0,bd.jsx)("img",{src:"http://localhost:8088".concat(o.imageUrl),alt:"\u5e16\u5b50\u56fe\u7247",className:"post-image"})})]}),(0,bd.jsxs)("div",{className:"post-actions",children:[(0,bd.jsxs)("button",{className:"like-button ".concat(o.isLiked?"liked":""),onClick:async()=>{try{await((e,t)=>ir.post("/help/posts/".concat(e,"/like"),null,{params:t}))(e),a((e=>_e(_e({},e),{},{likeCount:e.likeCount+1})))}catch(r){var t,n;d("\u70b9\u8d5e\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}},children:["\ud83d\udc4d \u70b9\u8d5e (",o.likeCount,")"]}),(0,bd.jsx)("button",{className:"solve-button ".concat(o.isSolved?"solved":""),onClick:()=>{a((e=>_e(_e({},e),{},{isSolved:!e.isSolved})))},children:o.isSolved?"\u2713 \u5df2\u89e3\u51b3":"\u6807\u8bb0\u4e3a\u5df2\u89e3\u51b3"})]})]}),(0,bd.jsxs)("div",{className:"comments-section",children:[(0,bd.jsxs)("h2",{children:["\u8bc4\u8bba (",o.replyCount,")"]}),(0,bd.jsxs)("form",{onSubmit:async t=>{var n,r;if(t.preventDefault(),f.trim())try{const t=localStorage.getItem("username"),o=new FormData;o.append("content",f),o.append("authorId",t),y&&o.append("image",y);const a=await(n=e,r=o,ir.post("/help/posts/".concat(n,"/comments"),r));a.data&&200===a.data.code?(await M(),p(""),b(null)):d(a.data.message||"\u8bc4\u8bba\u5931\u8d25")}catch(i){var o,a;d("\u8bc4\u8bba\u5931\u8d25: "+((null===(o=i.response)||void 0===o||null===(a=o.data)||void 0===a?void 0:a.message)||i.message))}},className:"comment-form",children:[(0,bd.jsx)("textarea",{value:f,onChange:e=>p(e.target.value),placeholder:"\u5199\u4e0b\u4f60\u7684\u8bc4\u8bba...",rows:"3",required:!0}),(0,bd.jsx)("button",{type:"submit",children:"\u53d1\u8868\u8bc4\u8bba"}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("div",{className:"upload-image-btn",children:(0,bd.jsx)("input",{type:"file",accept:"image/*",onChange:e=>b(e.target.files[0]),"data-testid":"comment-image-input"})})})]}),(0,bd.jsx)("div",{className:"comment-list",children:i.map((e=>O(e)))}),j.visible&&(0,bd.jsx)("div",{className:"reply-modal-overlay",children:(0,bd.jsxs)("div",{className:"reply-modal",children:[(0,bd.jsxs)("div",{className:"modal-header",children:[(0,bd.jsxs)("h3",{children:["\u56de\u590d @",j.replyingToUsername]}),(0,bd.jsx)("button",{onClick:T,className:"close-modal",children:"\xd7"})]}),(0,bd.jsxs)("form",{onSubmit:async e=>{if(e.preventDefault(),h.trim())try{const e=localStorage.getItem("username"),t=await((e,t)=>{const n=new FormData;return n.append("authorId",t.authorId),n.append("content",t.content),t.image&&n.append("image",t.image),ir.post("/help/comments/".concat(e,"/replies"),n)})(j.replyingTo,{authorId:e,content:h,image:v});console.log("\u56de\u590d\u54cd\u5e94:",t.data),t.data&&200===t.data.code&&(await M(),m(""),T())}catch(r){var t,n;console.error("\u56de\u590d\u9519\u8bef:",r),d("\u56de\u590d\u5931\u8d25: "+((null===(t=r.response)||void 0===t||null===(n=t.data)||void 0===n?void 0:n.message)||r.message))}},children:[(0,bd.jsx)("textarea",{value:h,onChange:e=>m(e.target.value),placeholder:"\u56de\u590d @".concat(j.replyingToUsername,"..."),rows:"5",autoFocus:!0,required:!0}),(0,bd.jsx)("div",{className:"form-group",children:(0,bd.jsx)("div",{className:"upload-image-btn",children:(0,bd.jsx)("input",{type:"file",accept:"image/*",onChange:e=>g(e.target.files[0])})})}),(0,bd.jsxs)("div",{className:"modal-actions",children:[(0,bd.jsx)("button",{type:"button",onClick:T,className:"cancel-btn",children:"\u53d6\u6d88"}),(0,bd.jsx)("button",{type:"submit",className:"submit-btn",children:"\u53d1\u9001\u56de\u590d"})]})]})]})})]})]}):(0,bd.jsx)("div",{className:"error",children:"\u5e16\u5b50\u4e0d\u5b58\u5728"})},_d=()=>{const e=te(),t=Z(),[n,o]=(0,r.useState)([]),[a,i]=(0,r.useState)(null),[s,l]=(0,r.useState)("0"),[c,u]=(0,r.useState)(!1),[d,f]=(0,r.useState)(null);(0,r.useEffect)((()=>{(async()=>{try{u(!0);const[e,t]=await Promise.all([xd(),Ed()]);i(e),o(t)}catch(e){f(e.message)}finally{u(!1)}})()}),[]);const p=()=>{var n;e("/personal",{state:{fromSubpage:!0,dashboardTab:null===(n=t.state)||void 0===n?void 0:n.dashboardTab},replace:!0})};return c?(0,bd.jsx)("div",{className:"subpage-container",children:"\u52a0\u8f7d\u4e2d..."}):d?(0,bd.jsxs)("div",{className:"subpage-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:p,children:"\u2190 \u8fd4\u56de\u4e2a\u4eba\u4e2d\u5fc3"}),(0,bd.jsxs)("div",{className:"error",children:["\u9519\u8bef: ",d]})]}):(0,bd.jsxs)("div",{className:"subpage-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:p,children:"\u2190 \u8fd4\u56de\u4e2a\u4eba\u4e2d\u5fc3"}),(0,bd.jsx)("h2",{className:"page-title",children:"\u5151\u6362\u533a"}),(0,bd.jsxs)("div",{className:"exchange-section",children:[(0,bd.jsxs)("h3",{children:["\u5f53\u524d\u9b54\u529b\u503c: ",(null===a||void 0===a?void 0:a.magicPoints)||0]}),(0,bd.jsxs)("div",{className:"exchange-card",children:[(0,bd.jsx)("h4",{children:"\u5151\u6362\u9080\u8bf7\u7801"}),(0,bd.jsx)("p",{children:"\u6d88\u801710\u9b54\u529b\u503c\u5151\u6362\u4e00\u4e2a\u9080\u8bf7\u7801"}),(0,bd.jsx)("button",{className:"exchange-btn",onClick:async()=>{try{u(!0);const e=await(async()=>{try{const e=await ir.post("/invitecode/generate");if(200===e.data.code)return e.data.data.inviteCode;throw new Error(e.data.message||"\u751f\u6210\u9080\u8bf7\u7801\u5931\u8d25")}catch(d){throw console.error("\u751f\u6210\u9080\u8bf7\u7801\u5931\u8d25:",d),d}})();o([...n,e]);const t=await xd();i(t)}catch(e){f(e.message)}finally{u(!1)}},disabled:!a||a.magicPoints<10,children:"\u5151\u6362\u9080\u8bf7\u7801"})]}),(0,bd.jsxs)("div",{className:"exchange-card",children:[(0,bd.jsx)("h4",{children:"\u5151\u6362\u4e0a\u4f20\u91cf"}),(0,bd.jsx)("p",{children:"1\u9b54\u529b\u503c = 1GB\u4e0a\u4f20\u91cf"}),(0,bd.jsxs)("div",{className:"exchange-input-group",children:[(0,bd.jsx)("input",{type:"number",value:s,onChange:e=>{const t=e.target.value;""!==t&&isNaN(t)||l(t)},min:"1",max:(null===a||void 0===a?void 0:a.magicPoints)||0,placeholder:"\u8f93\u5165\u8981\u5151\u6362\u7684\u9b54\u529b\u503c"}),(0,bd.jsx)("button",{className:"exchange-btn",onClick:async()=>{const e=Number(s);if(!e||e<=0)f("\u8bf7\u8f93\u5165\u6709\u6548\u7684\u9b54\u529b\u503c");else try{u(!0),await(async e=>{try{const t=await ir.post("/user/exchangeUpload",{magicPoint:e});if(200===t.data.code)return t.data;throw new Error(t.data.message||"\u5151\u6362\u4e0a\u4f20\u91cf\u5931\u8d25")}catch(d){throw console.error("\u5151\u6362\u4e0a\u4f20\u91cf\u5931\u8d25:",d),d}})(e);const t=await xd();i(t),l("0"),f(null)}catch(t){f(t.message)}finally{u(!1)}},disabled:!s||Number(s)<=0||!a||Number(s)>a.magicPoints,children:"\u5151\u6362\u4e0a\u4f20\u91cf"})]})]}),n.length>0&&(0,bd.jsxs)("div",{className:"invite-code-list",children:[(0,bd.jsx)("h4",{children:"\u6211\u7684\u9080\u8bf7\u7801"}),(0,bd.jsx)("ul",{children:n.map(((e,t)=>(0,bd.jsxs)("li",{children:[(0,bd.jsx)("span",{className:"code",children:e.code}),(0,bd.jsx)("span",{className:"status ".concat(e.isUsed?"used":"available"),children:e.isUsed?"\u5df2\u4f7f\u7528":"\u53ef\u7528"})]},t)))})]})]})]})},Od=e=>{let{onLogout:t}=e;const n=te(),o=Z(),[a,i]=(0,r.useState)([]),[s,l]=(0,r.useState)(!0),[c,u]=(0,r.useState)(null),[d,f]=(0,r.useState)({page:1,size:5,total:0}),p=async()=>{try{l(!0);const{records:e,total:t}=await async function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5;try{const n=await ir.get("/torrent/get/torrentMyself",{params:{page:e,size:t}});if(200===n.data.code)return{records:n.data.data.records.map((e=>_e(_e({},e.torrent),{},{downloadCount:e.downloadCount,formattedSize:e.formattedSize}))),total:n.data.data.total};throw new Error(n.data.message||"\u83b7\u53d6\u4e0a\u4f20\u8bb0\u5f55\u5931\u8d25")}catch(c){throw console.error("\u83b7\u53d6\u4e0a\u4f20\u8bb0\u5f55\u5931\u8d25:",c),c}}(d.page,d.size);i(e),f((e=>_e(_e({},e),{},{total:t})))}catch(e){u(e.message)}finally{l(!1)}},h=async e=>{if(window.confirm("\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u79cd\u5b50\u5417\uff1f\u6b64\u64cd\u4f5c\u4e0d\u53ef\u64a4\u9500\uff01"))try{await(async e=>{try{const t=await ir.delete("/torrent/deleteTorrent/".concat(e));if(200===t.data.code)return t.data;throw new Error(t.data.message||"\u5220\u9664\u79cd\u5b50\u5931\u8d25")}catch(c){throw console.error("\u5220\u9664\u79cd\u5b50\u5931\u8d25:",c),c}})(e),p()}catch(t){alert("\u5220\u9664\u5931\u8d25: "+t.message)}},m=Math.ceil(d.total/d.size),v=()=>{const e=[];let t=Math.max(1,d.page-Math.floor(2.5)),n=Math.min(m,t+5-1);n-t+1<5&&(t=Math.max(1,n-5+1));for(let r=t;r<=n;r++)e.push(r);return e},g=e=>{e>=1&&e<=m&&e!==d.page&&f((t=>_e(_e({},t),{},{page:e})))};(0,r.useEffect)((()=>{p()}),[d.page]);return s?(0,bd.jsx)("div",{className:"subpage-container",children:"\u52a0\u8f7d\u4e2d..."}):c?(0,bd.jsxs)("div",{className:"subpage-container",children:["\u9519\u8bef: ",c]}):(0,bd.jsxs)("div",{className:"subpage-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:()=>{var e;n("/personal",{state:{fromSubpage:!0,dashboardTab:null===(e=o.state)||void 0===e?void 0:e.dashboardTab},replace:!0})},children:"\u2190 \u8fd4\u56de\u4e2a\u4eba\u4e2d\u5fc3"}),(0,bd.jsx)("h2",{className:"page-title",children:"\u4e0a\u4f20\u8bb0\u5f55"}),(0,bd.jsxs)("table",{className:"uploads-table",children:[(0,bd.jsx)("thead",{children:(0,bd.jsxs)("tr",{children:[(0,bd.jsx)("th",{children:"\u8d44\u6e90\u540d\u79f0"}),(0,bd.jsx)("th",{children:"\u5927\u5c0f"}),(0,bd.jsx)("th",{children:"\u4e0a\u4f20\u65f6\u95f4"}),(0,bd.jsx)("th",{children:"\u4e0b\u8f7d\u6b21\u6570"}),(0,bd.jsx)("th",{children:"\u64cd\u4f5c"})]})}),(0,bd.jsx)("tbody",{children:a.map((e=>{return(0,bd.jsxs)("tr",{className:"list-item",children:[(0,bd.jsx)("td",{children:e.torrentName}),(0,bd.jsx)("td",{children:e.formattedSize}),(0,bd.jsx)("td",{children:(t=e.createTime,new Date(t).toLocaleString())}),(0,bd.jsx)("td",{children:e.downloadCount||0}),(0,bd.jsx)("td",{children:(0,bd.jsx)("button",{className:"action-btn delete-btn",onClick:()=>h(e.id),children:"\u5220\u9664"})})]},e.id);var t}))})]}),(0,bd.jsxs)("div",{className:"pagination",children:[(0,bd.jsx)("button",{disabled:d.page<=1,onClick:()=>g(1),className:"page-nav",children:"\u9996\u9875"}),(0,bd.jsx)("button",{disabled:d.page<=1,onClick:()=>g(d.page-1),className:"page-nav",children:"\u4e0a\u4e00\u9875"}),v().map((e=>(0,bd.jsx)("button",{onClick:()=>g(e),className:"page-number ".concat(d.page===e?"active":""),children:e},e))),m>v()[v().length-1]&&(0,bd.jsx)("span",{className:"ellipsis",children:"..."}),(0,bd.jsx)("button",{disabled:d.page>=m,onClick:()=>g(d.page+1),className:"page-nav",children:"\u4e0b\u4e00\u9875"}),(0,bd.jsx)("button",{disabled:d.page>=m,onClick:()=>g(m),className:"page-nav",children:"\u672b\u9875"}),(0,bd.jsxs)("div",{className:"page-info",children:[(0,bd.jsxs)("span",{children:["\u5171 ",m," \u9875"]}),(0,bd.jsx)("span",{children:"\u8df3\u81f3"}),(0,bd.jsx)("input",{type:"number",min:"1",max:m,onKeyDown:e=>{if("Enter"===e.key){const t=parseInt(e.target.value);isNaN(t)||(g(Math.max(1,Math.min(t,m))),e.target.value="")}}}),(0,bd.jsx)("span",{children:"\u9875"})]})]})]})},Md=e=>{let{onLogout:t}=e;const n=te(),o=Z(),[a]=r.useState([{id:1,title:"\u79ef\u5206\u5956\u52b1\u5230\u8d26",content:"\u60a8\u4e0a\u4f20\u7684\u8d44\u6e90\u300a\u76d7\u68a6\u7a7a\u95f4\u300b\u83b7\u5f97100\u79ef\u5206\u5956\u52b1",date:"2023-10-20",read:!1},{id:2,title:"\u7cfb\u7edf\u901a\u77e5",content:"\u670d\u52a1\u5668\u5c06\u4e8e\u4eca\u665a2:00-4:00\u8fdb\u884c\u7ef4\u62a4",date:"2023-10-18",read:!0}]);return(0,bd.jsxs)("div",{className:"subpage-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:()=>{var e;n("/personal",{state:{fromSubpage:!0,dashboardTab:null===(e=o.state)||void 0===e?void 0:e.dashboardTab},replace:!0})},children:"\u2190 \u8fd4\u56de\u4e2a\u4eba\u4e2d\u5fc3"}),(0,bd.jsx)("h2",{className:"page-title",children:"\u6d88\u606f\u901a\u77e5"}),(0,bd.jsx)("div",{className:"notice-list",children:a.map((e=>(0,bd.jsxs)("div",{className:"list-item ".concat(e.read?"":"unread"),children:[(0,bd.jsxs)("div",{className:"notice-header",children:[(0,bd.jsx)("h3",{children:e.title}),(0,bd.jsx)("span",{className:"notice-date",children:e.date})]}),(0,bd.jsx)("p",{className:"notice-content",children:e.content})]},e.id)))})]})},Rd=e=>{let{onLogout:t}=e;const n=te(),o=Z(),[a,i]=(0,r.useState)(null),[s,l]=(0,r.useState)(!1),[c,u]=(0,r.useState)(null),[d,f]=(0,r.useState)(null),[p,h]=(0,r.useState)({oldPassword:"",newPassword:"",confirmPassword:""});(0,r.useEffect)((()=>{(async()=>{try{const e=await xd();i(e)}catch(e){console.error("\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25:",e)}})()}),[]);const m=e=>{const{name:t,value:n}=e.target;h((e=>_e(_e({},e),{},{[t]:n})))};return(0,bd.jsxs)("div",{className:"subpage-container",children:[(0,bd.jsx)("button",{className:"back-button",onClick:()=>{var e;n("/personal",{state:{fromSubpage:!0,dashboardTab:null===(e=o.state)||void 0===e?void 0:e.dashboardTab},replace:!0})},children:"\u2190 \u8fd4\u56de\u4e2a\u4eba\u4e2d\u5fc3"}),(0,bd.jsx)("h2",{className:"page-title",children:"\u4e2a\u4eba\u8bbe\u7f6e"}),(0,bd.jsxs)("div",{className:"setting-section",children:[(0,bd.jsxs)("div",{className:"user-info-card",children:[(0,bd.jsx)("h3",{children:"\u8d26\u6237\u4fe1\u606f"}),(0,bd.jsxs)("div",{className:"info-item",children:[(0,bd.jsx)("label",{children:"\u7528\u6237\u540d:"}),(0,bd.jsx)("span",{children:(null===a||void 0===a?void 0:a.username)||"\u52a0\u8f7d\u4e2d..."})]}),(0,bd.jsx)("p",{className:"info-note",children:"\u7528\u6237\u540d\u4e0d\u53ef\u66f4\u6539"})]}),(0,bd.jsxs)("div",{className:"password-form-card",children:[(0,bd.jsx)("h3",{children:"\u4fee\u6539\u5bc6\u7801"}),(0,bd.jsxs)("form",{onSubmit:async e=>{if(e.preventDefault(),u(null),f(null),p.oldPassword&&p.newPassword&&p.confirmPassword)if(p.newPassword===p.confirmPassword)if(p.newPassword.length<6)u("\u65b0\u5bc6\u7801\u957f\u5ea6\u81f3\u5c11\u4e3a6\u4f4d");else try{l(!0),await(async(e,t)=>{try{const n=await ir.put("/user/password",{oldPassword:e,newPassword:t});if(200===n.data.code)return n.data;throw new Error(n.data.message||"\u4fee\u6539\u5bc6\u7801\u5931\u8d25")}catch(c){throw console.error("\u4fee\u6539\u5bc6\u7801\u5931\u8d25:",c),c}})(p.oldPassword,p.newPassword),f("\u5bc6\u7801\u4fee\u6539\u6210\u529f"),h({oldPassword:"",newPassword:"",confirmPassword:""})}catch(t){u(t.message||"\u4fee\u6539\u5bc6\u7801\u5931\u8d25")}finally{l(!1)}else u("\u65b0\u5bc6\u7801\u4e0e\u786e\u8ba4\u5bc6\u7801\u4e0d\u4e00\u81f4");else u("\u8bf7\u586b\u5199\u6240\u6709\u5bc6\u7801\u5b57\u6bb5")},children:[(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{htmlFor:"oldPassword",children:"\u539f\u5bc6\u7801:"}),(0,bd.jsx)("input",{type:"password",id:"oldPassword",name:"oldPassword",value:p.oldPassword,onChange:m,required:!0})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{htmlFor:"newPassword",children:"\u65b0\u5bc6\u7801:"}),(0,bd.jsx)("input",{type:"password",id:"newPassword",name:"newPassword",value:p.newPassword,onChange:m,required:!0,minLength:"6"})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{htmlFor:"confirmPassword",children:"\u786e\u8ba4\u65b0\u5bc6\u7801:"}),(0,bd.jsx)("input",{type:"password",id:"confirmPassword",name:"confirmPassword",value:p.confirmPassword,onChange:m,required:!0,minLength:"6"})]}),c&&(0,bd.jsx)("div",{className:"error-message",children:c}),d&&(0,bd.jsx)("div",{className:"success-message",children:d}),(0,bd.jsx)("button",{type:"submit",className:"submit-button",disabled:s,children:s?"\u5904\u7406\u4e2d...":"\u4fee\u6539\u5bc6\u7801"})]})]})]})]})};function Ad(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(n=Ad(e[t]))&&(r&&(r+=" "),r+=n)}else for(n in e)e[n]&&(r&&(r+=" "),r+=n);return r}function Ld(){for(var e,t,n=0,r="",o=arguments.length;n<o;n++)(e=arguments[n])&&(t=Ad(e))&&(r&&(r+=" "),r+=t);return r}Math.pow(10,8);const Id=6048e5,Fd=6e4,zd=36e5,Bd=Symbol.for("constructDateFrom");function Hd(e,t){return"function"===typeof e?e(t):e&&"object"===typeof e&&Bd in e?e[Bd](t):e instanceof Date?new e.constructor(t):new Date(t)}function Ud(e,t){return Hd(t||e,e)}function Yd(e,t){var n;const r=()=>Hd(null===t||void 0===t?void 0:t.in,NaN),o=null!==(n=null===t||void 0===t?void 0:t.additionalDigits)&&void 0!==n?n:2,a=function(e){const t={},n=e.split(Wd.dateTimeDelimiter);let r;if(n.length>2)return t;/:/.test(n[0])?r=n[0]:(t.date=n[0],r=n[1],Wd.timeZoneDelimiter.test(t.date)&&(t.date=e.split(Wd.timeZoneDelimiter)[0],r=e.substr(t.date.length,e.length)));if(r){const e=Wd.timezone.exec(r);e?(t.time=r.replace(e[1],""),t.timezone=e[1]):t.time=r}return t}(e);let i;if(a.date){const e=function(e,t){const n=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+t)+"})|(\\d{2}|[+-]\\d{"+(2+t)+"})$)"),r=e.match(n);if(!r)return{year:NaN,restDateString:""};const o=r[1]?parseInt(r[1]):null,a=r[2]?parseInt(r[2]):null;return{year:null===a?o:100*a,restDateString:e.slice((r[1]||r[2]).length)}}(a.date,o);i=function(e,t){if(null===t)return new Date(NaN);const n=e.match(qd);if(!n)return new Date(NaN);const r=!!n[4],o=Kd(n[1]),a=Kd(n[2])-1,i=Kd(n[3]),s=Kd(n[4]),l=Kd(n[5])-1;if(r)return function(e,t,n){return t>=1&&t<=53&&n>=0&&n<=6}(0,s,l)?function(e,t,n){const r=new Date(0);r.setUTCFullYear(e,0,4);const o=r.getUTCDay()||7,a=7*(t-1)+n+1-o;return r.setUTCDate(r.getUTCDate()+a),r}(t,s,l):new Date(NaN);{const e=new Date(0);return function(e,t,n){return t>=0&&t<=11&&n>=1&&n<=(Gd[t]||(Xd(e)?29:28))}(t,a,i)&&function(e,t){return t>=1&&t<=(Xd(e)?366:365)}(t,o)?(e.setUTCFullYear(t,a,Math.max(o,i)),e):new Date(NaN)}}(e.restDateString,e.year)}if(!i||isNaN(+i))return r();const s=+i;let l,c=0;if(a.time&&(c=function(e){const t=e.match(Vd);if(!t)return NaN;const n=$d(t[1]),r=$d(t[2]),o=$d(t[3]);if(!function(e,t,n){if(24===e)return 0===t&&0===n;return n>=0&&n<60&&t>=0&&t<60&&e>=0&&e<25}(n,r,o))return NaN;return n*zd+r*Fd+1e3*o}(a.time),isNaN(c)))return r();if(!a.timezone){const e=new Date(s+c),n=Ud(0,null===t||void 0===t?void 0:t.in);return n.setFullYear(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()),n.setHours(e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()),n}return l=function(e){if("Z"===e)return 0;const t=e.match(Qd);if(!t)return 0;const n="+"===t[1]?-1:1,r=parseInt(t[2]),o=t[3]&&parseInt(t[3])||0;if(!function(e,t){return t>=0&&t<=59}(0,o))return NaN;return n*(r*zd+o*Fd)}(a.timezone),isNaN(l)?r():Ud(s+c+l,null===t||void 0===t?void 0:t.in)}const Wd={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},qd=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,Vd=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,Qd=/^([+-])(\d{2})(?::?(\d{2}))?$/;function Kd(e){return e?parseInt(e):1}function $d(e){return e&&parseFloat(e.replace(",","."))||0}const Gd=[31,null,31,30,31,30,31,31,30,31,30,31];function Xd(e){return e%400===0||e%4===0&&e%100!==0}const Jd={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function Zd(e){return function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const n=t.width?String(t.width):e.defaultWidth;return e.formats[n]||e.formats[e.defaultWidth]}}const ef={date:Zd({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:Zd({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:Zd({formats:{full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})},tf={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function nf(e){return(t,n)=>{let r;if("formatting"===(null!==n&&void 0!==n&&n.context?String(n.context):"standalone")&&e.formattingValues){const t=e.defaultFormattingWidth||e.defaultWidth,o=null!==n&&void 0!==n&&n.width?String(n.width):t;r=e.formattingValues[o]||e.formattingValues[t]}else{const t=e.defaultWidth,o=null!==n&&void 0!==n&&n.width?String(n.width):e.defaultWidth;r=e.values[o]||e.values[t]}return r[e.argumentCallback?e.argumentCallback(t):t]}}const rf={ordinalNumber:(e,t)=>{const n=Number(e),r=n%100;if(r>20||r<10)switch(r%10){case 1:return n+"st";case 2:return n+"nd";case 3:return n+"rd"}return n+"th"},era:nf({values:{narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},defaultWidth:"wide"}),quarter:nf({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},defaultWidth:"wide",argumentCallback:e=>e-1}),month:nf({values:{narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},defaultWidth:"wide"}),day:nf({values:{narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},defaultWidth:"wide"}),dayPeriod:nf({values:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},defaultFormattingWidth:"wide"})};function of(e){return function(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r=n.width,o=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],a=t.match(o);if(!a)return null;const i=a[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],l=Array.isArray(s)?function(e,t){for(let n=0;n<e.length;n++)if(t(e[n]))return n;return}(s,(e=>e.test(i))):function(e,t){for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)&&t(e[n]))return n;return}(s,(e=>e.test(i)));let c;c=e.valueCallback?e.valueCallback(l):l,c=n.valueCallback?n.valueCallback(c):c;return{value:c,rest:t.slice(i.length)}}}const af={ordinalNumber:(sf={matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:e=>parseInt(e,10)},function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const n=e.match(sf.matchPattern);if(!n)return null;const r=n[0],o=e.match(sf.parsePattern);if(!o)return null;let a=sf.valueCallback?sf.valueCallback(o[0]):o[0];return a=t.valueCallback?t.valueCallback(a):a,{value:a,rest:e.slice(r.length)}}),era:of({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:of({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:e=>e+1}),month:of({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:of({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:of({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})};var sf;const lf={code:"en-US",formatDistance:(e,t,n)=>{let r;const o=Jd[e];return r="string"===typeof o?o:1===t?o.one:o.other.replace("{{count}}",t.toString()),null!==n&&void 0!==n&&n.addSuffix?n.comparison&&n.comparison>0?"in "+r:r+" ago":r},formatLong:ef,formatRelative:(e,t,n,r)=>tf[e],localize:rf,match:af,options:{weekStartsOn:0,firstWeekContainsDate:1}},cf=(e,t)=>{switch(e){case"P":return t.date({width:"short"});case"PP":return t.date({width:"medium"});case"PPP":return t.date({width:"long"});default:return t.date({width:"full"})}},uf=(e,t)=>{switch(e){case"p":return t.time({width:"short"});case"pp":return t.time({width:"medium"});case"ppp":return t.time({width:"long"});default:return t.time({width:"full"})}},df={p:uf,P:(e,t)=>{const n=e.match(/(P+)(p+)?/)||[],r=n[1],o=n[2];if(!o)return cf(e,t);let a;switch(r){case"P":a=t.dateTime({width:"short"});break;case"PP":a=t.dateTime({width:"medium"});break;case"PPP":a=t.dateTime({width:"long"});break;default:a=t.dateTime({width:"full"})}return a.replace("{{date}}",cf(r,t)).replace("{{time}}",uf(o,t))}},ff=/^D+$/,pf=/^Y+$/,hf=["D","DD","YY","YYYY"];function mf(e){return ff.test(e)}function vf(e){return pf.test(e)}function gf(e,t,n){const r=function(e,t,n){const r="Y"===e[0]?"years":"days of the month";return"Use `".concat(e.toLowerCase(),"` instead of `").concat(e,"` (in `").concat(t,"`) for formatting ").concat(r," to the input `").concat(n,"`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md")}(e,t,n);if(console.warn(r),hf.includes(e))throw new RangeError(r)}let yf={};function bf(){return yf}function wf(){return Object.assign({},bf())}function xf(e,t){const n=function(e){var t;return"function"===typeof e&&(null===(t=e.prototype)||void 0===t?void 0:t.constructor)===e}(t)?new t(0):Hd(t,0);return n.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),n.setHours(e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()),n}class kf{constructor(){Pe(this,"subPriority",0)}validate(e,t){return!0}}class Sf extends kf{constructor(e,t,n,r,o){super(),this.value=e,this.validateValue=t,this.setValue=n,this.priority=r,o&&(this.subPriority=o)}validate(e,t){return this.validateValue(e,this.value,t)}set(e,t,n){return this.setValue(e,t,this.value,n)}}class Ef extends kf{constructor(e,t){super(),Pe(this,"priority",10),Pe(this,"subPriority",-1),this.context=e||(e=>Hd(t,e))}set(e,t){return t.timestampIsSet?e:Hd(e,xf(e,this.context))}}class Cf{run(e,t,n,r){const o=this.parse(e,t,n,r);return o?{setter:new Sf(o.value,this.validate,this.set,this.priority,this.subPriority),rest:o.rest}:null}validate(e,t,n){return!0}}const Nf=/^(1[0-2]|0?\d)/,jf=/^(3[0-1]|[0-2]?\d)/,Df=/^(36[0-6]|3[0-5]\d|[0-2]?\d?\d)/,Pf=/^(5[0-3]|[0-4]?\d)/,Tf=/^(2[0-3]|[0-1]?\d)/,_f=/^(2[0-4]|[0-1]?\d)/,Of=/^(1[0-1]|0?\d)/,Mf=/^(1[0-2]|0?\d)/,Rf=/^[0-5]?\d/,Af=/^[0-5]?\d/,Lf=/^\d/,If=/^\d{1,2}/,Ff=/^\d{1,3}/,zf=/^\d{1,4}/,Bf=/^-?\d+/,Hf=/^-?\d/,Uf=/^-?\d{1,2}/,Yf=/^-?\d{1,3}/,Wf=/^-?\d{1,4}/,qf=/^([+-])(\d{2})(\d{2})?|Z/,Vf=/^([+-])(\d{2})(\d{2})|Z/,Qf=/^([+-])(\d{2})(\d{2})((\d{2}))?|Z/,Kf=/^([+-])(\d{2}):(\d{2})|Z/,$f=/^([+-])(\d{2}):(\d{2})(:(\d{2}))?|Z/;function Gf(e,t){return e?{value:t(e.value),rest:e.rest}:e}function Xf(e,t){const n=t.match(e);return n?{value:parseInt(n[0],10),rest:t.slice(n[0].length)}:null}function Jf(e,t){const n=t.match(e);if(!n)return null;if("Z"===n[0])return{value:0,rest:t.slice(1)};const r="+"===n[1]?1:-1,o=n[2]?parseInt(n[2],10):0,a=n[3]?parseInt(n[3],10):0,i=n[5]?parseInt(n[5],10):0;return{value:r*(o*zd+a*Fd+1e3*i),rest:t.slice(n[0].length)}}function Zf(e){return Xf(Bf,e)}function ep(e,t){switch(e){case 1:return Xf(Lf,t);case 2:return Xf(If,t);case 3:return Xf(Ff,t);case 4:return Xf(zf,t);default:return Xf(new RegExp("^\\d{1,"+e+"}"),t)}}function tp(e,t){switch(e){case 1:return Xf(Hf,t);case 2:return Xf(Uf,t);case 3:return Xf(Yf,t);case 4:return Xf(Wf,t);default:return Xf(new RegExp("^-?\\d{1,"+e+"}"),t)}}function np(e){switch(e){case"morning":return 4;case"evening":return 17;case"pm":case"noon":case"afternoon":return 12;default:return 0}}function rp(e,t){const n=t>0,r=n?t:1-t;let o;if(r<=50)o=e||100;else{const t=r+50;o=e+100*Math.trunc(t/100)-(e>=t%100?100:0)}return n?o:1-o}function op(e){return e%400===0||e%4===0&&e%100!==0}function ap(e,t){var n,r,o,a,i,s;const l=bf(),c=null!==(n=null!==(r=null!==(o=null!==(a=null===t||void 0===t?void 0:t.weekStartsOn)&&void 0!==a?a:null===t||void 0===t||null===(i=t.locale)||void 0===i||null===(i=i.options)||void 0===i?void 0:i.weekStartsOn)&&void 0!==o?o:l.weekStartsOn)&&void 0!==r?r:null===(s=l.locale)||void 0===s||null===(s=s.options)||void 0===s?void 0:s.weekStartsOn)&&void 0!==n?n:0,u=Ud(e,null===t||void 0===t?void 0:t.in),d=u.getDay(),f=(d<c?7:0)+d-c;return u.setDate(u.getDate()-f),u.setHours(0,0,0,0),u}function ip(e,t){var n,r,o,a,i,s;const l=Ud(e,null===t||void 0===t?void 0:t.in),c=l.getFullYear(),u=bf(),d=null!==(n=null!==(r=null!==(o=null!==(a=null===t||void 0===t?void 0:t.firstWeekContainsDate)&&void 0!==a?a:null===t||void 0===t||null===(i=t.locale)||void 0===i||null===(i=i.options)||void 0===i?void 0:i.firstWeekContainsDate)&&void 0!==o?o:u.firstWeekContainsDate)&&void 0!==r?r:null===(s=u.locale)||void 0===s||null===(s=s.options)||void 0===s?void 0:s.firstWeekContainsDate)&&void 0!==n?n:1,f=Hd((null===t||void 0===t?void 0:t.in)||e,0);f.setFullYear(c+1,0,d),f.setHours(0,0,0,0);const p=ap(f,t),h=Hd((null===t||void 0===t?void 0:t.in)||e,0);h.setFullYear(c,0,d),h.setHours(0,0,0,0);const m=ap(h,t);return+l>=+p?c+1:+l>=+m?c:c-1}function sp(e,t){return ap(e,_e(_e({},t),{},{weekStartsOn:1}))}function lp(e,t){var n,r,o,a,i,s;const l=bf(),c=null!==(n=null!==(r=null!==(o=null!==(a=null===t||void 0===t?void 0:t.firstWeekContainsDate)&&void 0!==a?a:null===t||void 0===t||null===(i=t.locale)||void 0===i||null===(i=i.options)||void 0===i?void 0:i.firstWeekContainsDate)&&void 0!==o?o:l.firstWeekContainsDate)&&void 0!==r?r:null===(s=l.locale)||void 0===s||null===(s=s.options)||void 0===s?void 0:s.firstWeekContainsDate)&&void 0!==n?n:1,u=ip(e,t),d=Hd((null===t||void 0===t?void 0:t.in)||e,0);d.setFullYear(u,0,c),d.setHours(0,0,0,0);return ap(d,t)}function cp(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in),r=+ap(n,t)-+lp(n,t);return Math.round(r/Id)+1}function up(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in),o=cp(r,n)-t;return r.setDate(r.getDate()-7*o),Ud(r,null===n||void 0===n?void 0:n.in)}function dp(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in),r=n.getFullYear(),o=Hd(n,0);o.setFullYear(r+1,0,4),o.setHours(0,0,0,0);const a=sp(o),i=Hd(n,0);i.setFullYear(r,0,4),i.setHours(0,0,0,0);const s=sp(i);return n.getTime()>=a.getTime()?r+1:n.getTime()>=s.getTime()?r:r-1}function fp(e,t){const n=dp(e,t),r=Hd((null===t||void 0===t?void 0:t.in)||e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),sp(r)}function pp(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in),r=+sp(n)-+fp(n);return Math.round(r/Id)+1}function hp(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in),o=pp(r,n)-t;return r.setDate(r.getDate()-7*o),r}const mp=[31,28,31,30,31,30,31,31,30,31,30,31],vp=[31,29,31,30,31,30,31,31,30,31,30,31];function gp(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);return isNaN(t)?Hd((null===n||void 0===n?void 0:n.in)||e,NaN):t?(r.setDate(r.getDate()+t),r):r}function yp(e,t,n){var r,o,a,i,s,l;const c=bf(),u=null!==(r=null!==(o=null!==(a=null!==(i=null===n||void 0===n?void 0:n.weekStartsOn)&&void 0!==i?i:null===n||void 0===n||null===(s=n.locale)||void 0===s||null===(s=s.options)||void 0===s?void 0:s.weekStartsOn)&&void 0!==a?a:c.weekStartsOn)&&void 0!==o?o:null===(l=c.locale)||void 0===l||null===(l=l.options)||void 0===l?void 0:l.weekStartsOn)&&void 0!==r?r:0,d=Ud(e,null===n||void 0===n?void 0:n.in),f=d.getDay(),p=7-u;return gp(d,t<0||t>6?t-(f+p)%7:((t%7+7)%7+p)%7-(f+p)%7,n)}function bp(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in).getDay();return 0===n?7:n}function wp(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);return gp(r,t-bp(r,n),n)}function xp(e){const t=Ud(e),n=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()));return n.setUTCFullYear(t.getFullYear()),+e-+n}const kp={G:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",140),Pe(this,"incompatibleTokens",["R","u","t","T"])}parse(e,t,n){switch(t){case"G":case"GG":case"GGG":return n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"});case"GGGGG":return n.era(e,{width:"narrow"});default:return n.era(e,{width:"wide"})||n.era(e,{width:"abbreviated"})||n.era(e,{width:"narrow"})}}set(e,t,n){return t.era=n,e.setFullYear(n,0,1),e.setHours(0,0,0,0),e}},y:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",130),Pe(this,"incompatibleTokens",["Y","R","u","w","I","i","e","c","t","T"])}parse(e,t,n){const r=e=>({year:e,isTwoDigitYear:"yy"===t});switch(t){case"y":return Gf(ep(4,e),r);case"yo":return Gf(n.ordinalNumber(e,{unit:"year"}),r);default:return Gf(ep(t.length,e),r)}}validate(e,t){return t.isTwoDigitYear||t.year>0}set(e,t,n){const r=e.getFullYear();if(n.isTwoDigitYear){const t=rp(n.year,r);return e.setFullYear(t,0,1),e.setHours(0,0,0,0),e}const o="era"in t&&1!==t.era?1-n.year:n.year;return e.setFullYear(o,0,1),e.setHours(0,0,0,0),e}},Y:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",130),Pe(this,"incompatibleTokens",["y","R","u","Q","q","M","L","I","d","D","i","t","T"])}parse(e,t,n){const r=e=>({year:e,isTwoDigitYear:"YY"===t});switch(t){case"Y":return Gf(ep(4,e),r);case"Yo":return Gf(n.ordinalNumber(e,{unit:"year"}),r);default:return Gf(ep(t.length,e),r)}}validate(e,t){return t.isTwoDigitYear||t.year>0}set(e,t,n,r){const o=ip(e,r);if(n.isTwoDigitYear){const t=rp(n.year,o);return e.setFullYear(t,0,r.firstWeekContainsDate),e.setHours(0,0,0,0),ap(e,r)}const a="era"in t&&1!==t.era?1-n.year:n.year;return e.setFullYear(a,0,r.firstWeekContainsDate),e.setHours(0,0,0,0),ap(e,r)}},R:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",130),Pe(this,"incompatibleTokens",["G","y","Y","u","Q","q","M","L","w","d","D","e","c","t","T"])}parse(e,t){return tp("R"===t?4:t.length,e)}set(e,t,n){const r=Hd(e,0);return r.setFullYear(n,0,4),r.setHours(0,0,0,0),sp(r)}},u:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",130),Pe(this,"incompatibleTokens",["G","y","Y","R","w","I","i","e","c","t","T"])}parse(e,t){return tp("u"===t?4:t.length,e)}set(e,t,n){return e.setFullYear(n,0,1),e.setHours(0,0,0,0),e}},Q:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",120),Pe(this,"incompatibleTokens",["Y","R","q","M","L","w","I","d","D","i","e","c","t","T"])}parse(e,t,n){switch(t){case"Q":case"QQ":return ep(t.length,e);case"Qo":return n.ordinalNumber(e,{unit:"quarter"});case"QQQ":return n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"});case"QQQQQ":return n.quarter(e,{width:"narrow",context:"formatting"});default:return n.quarter(e,{width:"wide",context:"formatting"})||n.quarter(e,{width:"abbreviated",context:"formatting"})||n.quarter(e,{width:"narrow",context:"formatting"})}}validate(e,t){return t>=1&&t<=4}set(e,t,n){return e.setMonth(3*(n-1),1),e.setHours(0,0,0,0),e}},q:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",120),Pe(this,"incompatibleTokens",["Y","R","Q","M","L","w","I","d","D","i","e","c","t","T"])}parse(e,t,n){switch(t){case"q":case"qq":return ep(t.length,e);case"qo":return n.ordinalNumber(e,{unit:"quarter"});case"qqq":return n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"});case"qqqqq":return n.quarter(e,{width:"narrow",context:"standalone"});default:return n.quarter(e,{width:"wide",context:"standalone"})||n.quarter(e,{width:"abbreviated",context:"standalone"})||n.quarter(e,{width:"narrow",context:"standalone"})}}validate(e,t){return t>=1&&t<=4}set(e,t,n){return e.setMonth(3*(n-1),1),e.setHours(0,0,0,0),e}},M:new class extends Cf{constructor(){super(...arguments),Pe(this,"incompatibleTokens",["Y","R","q","Q","L","w","I","D","i","e","c","t","T"]),Pe(this,"priority",110)}parse(e,t,n){const r=e=>e-1;switch(t){case"M":return Gf(Xf(Nf,e),r);case"MM":return Gf(ep(2,e),r);case"Mo":return Gf(n.ordinalNumber(e,{unit:"month"}),r);case"MMM":return n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"});case"MMMMM":return n.month(e,{width:"narrow",context:"formatting"});default:return n.month(e,{width:"wide",context:"formatting"})||n.month(e,{width:"abbreviated",context:"formatting"})||n.month(e,{width:"narrow",context:"formatting"})}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.setMonth(n,1),e.setHours(0,0,0,0),e}},L:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",110),Pe(this,"incompatibleTokens",["Y","R","q","Q","M","w","I","D","i","e","c","t","T"])}parse(e,t,n){const r=e=>e-1;switch(t){case"L":return Gf(Xf(Nf,e),r);case"LL":return Gf(ep(2,e),r);case"Lo":return Gf(n.ordinalNumber(e,{unit:"month"}),r);case"LLL":return n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"});case"LLLLL":return n.month(e,{width:"narrow",context:"standalone"});default:return n.month(e,{width:"wide",context:"standalone"})||n.month(e,{width:"abbreviated",context:"standalone"})||n.month(e,{width:"narrow",context:"standalone"})}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.setMonth(n,1),e.setHours(0,0,0,0),e}},w:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",100),Pe(this,"incompatibleTokens",["y","R","u","q","Q","M","L","I","d","D","i","t","T"])}parse(e,t,n){switch(t){case"w":return Xf(Pf,e);case"wo":return n.ordinalNumber(e,{unit:"week"});default:return ep(t.length,e)}}validate(e,t){return t>=1&&t<=53}set(e,t,n,r){return ap(up(e,n,r),r)}},I:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",100),Pe(this,"incompatibleTokens",["y","Y","u","q","Q","M","L","w","d","D","e","c","t","T"])}parse(e,t,n){switch(t){case"I":return Xf(Pf,e);case"Io":return n.ordinalNumber(e,{unit:"week"});default:return ep(t.length,e)}}validate(e,t){return t>=1&&t<=53}set(e,t,n){return sp(hp(e,n))}},d:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",90),Pe(this,"subPriority",1),Pe(this,"incompatibleTokens",["Y","R","q","Q","w","I","D","i","e","c","t","T"])}parse(e,t,n){switch(t){case"d":return Xf(jf,e);case"do":return n.ordinalNumber(e,{unit:"date"});default:return ep(t.length,e)}}validate(e,t){const n=op(e.getFullYear()),r=e.getMonth();return n?t>=1&&t<=vp[r]:t>=1&&t<=mp[r]}set(e,t,n){return e.setDate(n),e.setHours(0,0,0,0),e}},D:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",90),Pe(this,"subpriority",1),Pe(this,"incompatibleTokens",["Y","R","q","Q","M","L","w","I","d","E","i","e","c","t","T"])}parse(e,t,n){switch(t){case"D":case"DD":return Xf(Df,e);case"Do":return n.ordinalNumber(e,{unit:"date"});default:return ep(t.length,e)}}validate(e,t){return op(e.getFullYear())?t>=1&&t<=366:t>=1&&t<=365}set(e,t,n){return e.setMonth(0,n),e.setHours(0,0,0,0),e}},E:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",90),Pe(this,"incompatibleTokens",["D","i","e","c","t","T"])}parse(e,t,n){switch(t){case"E":case"EE":case"EEE":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"EEEEE":return n.day(e,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return(e=yp(e,n,r)).setHours(0,0,0,0),e}},e:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",90),Pe(this,"incompatibleTokens",["y","R","u","q","Q","M","L","I","d","D","E","i","c","t","T"])}parse(e,t,n,r){const o=e=>{const t=7*Math.floor((e-1)/7);return(e+r.weekStartsOn+6)%7+t};switch(t){case"e":case"ee":return Gf(ep(t.length,e),o);case"eo":return Gf(n.ordinalNumber(e,{unit:"day"}),o);case"eee":return n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});case"eeeee":return n.day(e,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"});default:return n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return(e=yp(e,n,r)).setHours(0,0,0,0),e}},c:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",90),Pe(this,"incompatibleTokens",["y","R","u","q","Q","M","L","I","d","D","E","i","e","t","T"])}parse(e,t,n,r){const o=e=>{const t=7*Math.floor((e-1)/7);return(e+r.weekStartsOn+6)%7+t};switch(t){case"c":case"cc":return Gf(ep(t.length,e),o);case"co":return Gf(n.ordinalNumber(e,{unit:"day"}),o);case"ccc":return n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});case"ccccc":return n.day(e,{width:"narrow",context:"standalone"});case"cccccc":return n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"});default:return n.day(e,{width:"wide",context:"standalone"})||n.day(e,{width:"abbreviated",context:"standalone"})||n.day(e,{width:"short",context:"standalone"})||n.day(e,{width:"narrow",context:"standalone"})}}validate(e,t){return t>=0&&t<=6}set(e,t,n,r){return(e=yp(e,n,r)).setHours(0,0,0,0),e}},i:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",90),Pe(this,"incompatibleTokens",["y","Y","u","q","Q","M","L","w","d","D","E","e","c","t","T"])}parse(e,t,n){const r=e=>0===e?7:e;switch(t){case"i":case"ii":return ep(t.length,e);case"io":return n.ordinalNumber(e,{unit:"day"});case"iii":return Gf(n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"}),r);case"iiiii":return Gf(n.day(e,{width:"narrow",context:"formatting"}),r);case"iiiiii":return Gf(n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"}),r);default:return Gf(n.day(e,{width:"wide",context:"formatting"})||n.day(e,{width:"abbreviated",context:"formatting"})||n.day(e,{width:"short",context:"formatting"})||n.day(e,{width:"narrow",context:"formatting"}),r)}}validate(e,t){return t>=1&&t<=7}set(e,t,n){return(e=wp(e,n)).setHours(0,0,0,0),e}},a:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",80),Pe(this,"incompatibleTokens",["b","B","H","k","t","T"])}parse(e,t,n){switch(t){case"a":case"aa":case"aaa":return n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"});case"aaaaa":return n.dayPeriod(e,{width:"narrow",context:"formatting"});default:return n.dayPeriod(e,{width:"wide",context:"formatting"})||n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"})}}set(e,t,n){return e.setHours(np(n),0,0,0),e}},b:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",80),Pe(this,"incompatibleTokens",["a","B","H","k","t","T"])}parse(e,t,n){switch(t){case"b":case"bb":case"bbb":return n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"});case"bbbbb":return n.dayPeriod(e,{width:"narrow",context:"formatting"});default:return n.dayPeriod(e,{width:"wide",context:"formatting"})||n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"})}}set(e,t,n){return e.setHours(np(n),0,0,0),e}},B:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",80),Pe(this,"incompatibleTokens",["a","b","t","T"])}parse(e,t,n){switch(t){case"B":case"BB":case"BBB":return n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"});case"BBBBB":return n.dayPeriod(e,{width:"narrow",context:"formatting"});default:return n.dayPeriod(e,{width:"wide",context:"formatting"})||n.dayPeriod(e,{width:"abbreviated",context:"formatting"})||n.dayPeriod(e,{width:"narrow",context:"formatting"})}}set(e,t,n){return e.setHours(np(n),0,0,0),e}},h:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",70),Pe(this,"incompatibleTokens",["H","K","k","t","T"])}parse(e,t,n){switch(t){case"h":return Xf(Mf,e);case"ho":return n.ordinalNumber(e,{unit:"hour"});default:return ep(t.length,e)}}validate(e,t){return t>=1&&t<=12}set(e,t,n){const r=e.getHours()>=12;return r&&n<12?e.setHours(n+12,0,0,0):r||12!==n?e.setHours(n,0,0,0):e.setHours(0,0,0,0),e}},H:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",70),Pe(this,"incompatibleTokens",["a","b","h","K","k","t","T"])}parse(e,t,n){switch(t){case"H":return Xf(Tf,e);case"Ho":return n.ordinalNumber(e,{unit:"hour"});default:return ep(t.length,e)}}validate(e,t){return t>=0&&t<=23}set(e,t,n){return e.setHours(n,0,0,0),e}},K:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",70),Pe(this,"incompatibleTokens",["h","H","k","t","T"])}parse(e,t,n){switch(t){case"K":return Xf(Of,e);case"Ko":return n.ordinalNumber(e,{unit:"hour"});default:return ep(t.length,e)}}validate(e,t){return t>=0&&t<=11}set(e,t,n){return e.getHours()>=12&&n<12?e.setHours(n+12,0,0,0):e.setHours(n,0,0,0),e}},k:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",70),Pe(this,"incompatibleTokens",["a","b","h","H","K","t","T"])}parse(e,t,n){switch(t){case"k":return Xf(_f,e);case"ko":return n.ordinalNumber(e,{unit:"hour"});default:return ep(t.length,e)}}validate(e,t){return t>=1&&t<=24}set(e,t,n){const r=n<=24?n%24:n;return e.setHours(r,0,0,0),e}},m:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",60),Pe(this,"incompatibleTokens",["t","T"])}parse(e,t,n){switch(t){case"m":return Xf(Rf,e);case"mo":return n.ordinalNumber(e,{unit:"minute"});default:return ep(t.length,e)}}validate(e,t){return t>=0&&t<=59}set(e,t,n){return e.setMinutes(n,0,0),e}},s:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",50),Pe(this,"incompatibleTokens",["t","T"])}parse(e,t,n){switch(t){case"s":return Xf(Af,e);case"so":return n.ordinalNumber(e,{unit:"second"});default:return ep(t.length,e)}}validate(e,t){return t>=0&&t<=59}set(e,t,n){return e.setSeconds(n,0),e}},S:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",30),Pe(this,"incompatibleTokens",["t","T"])}parse(e,t){return Gf(ep(t.length,e),(e=>Math.trunc(e*Math.pow(10,3-t.length))))}set(e,t,n){return e.setMilliseconds(n),e}},X:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",10),Pe(this,"incompatibleTokens",["t","T","x"])}parse(e,t){switch(t){case"X":return Jf(qf,e);case"XX":return Jf(Vf,e);case"XXXX":return Jf(Qf,e);case"XXXXX":return Jf($f,e);default:return Jf(Kf,e)}}set(e,t,n){return t.timestampIsSet?e:Hd(e,e.getTime()-xp(e)-n)}},x:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",10),Pe(this,"incompatibleTokens",["t","T","X"])}parse(e,t){switch(t){case"x":return Jf(qf,e);case"xx":return Jf(Vf,e);case"xxxx":return Jf(Qf,e);case"xxxxx":return Jf($f,e);default:return Jf(Kf,e)}}set(e,t,n){return t.timestampIsSet?e:Hd(e,e.getTime()-xp(e)-n)}},t:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",40),Pe(this,"incompatibleTokens","*")}parse(e){return Zf(e)}set(e,t,n){return[Hd(e,1e3*n),{timestampIsSet:!0}]}},T:new class extends Cf{constructor(){super(...arguments),Pe(this,"priority",20),Pe(this,"incompatibleTokens","*")}parse(e){return Zf(e)}set(e,t,n){return[Hd(e,n),{timestampIsSet:!0}]}}},Sp=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Ep=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,Cp=/^'([^]*?)'?$/,Np=/''/g,jp=/\S/,Dp=/[a-zA-Z]/;function Pp(e,t,n,r){var o,a,i,s,l,c,u,d,f,p,h,m,v,g;const y=()=>Hd((null===r||void 0===r?void 0:r.in)||n,NaN),b=wf(),w=null!==(o=null!==(a=null===r||void 0===r?void 0:r.locale)&&void 0!==a?a:b.locale)&&void 0!==o?o:lf,x=null!==(i=null!==(s=null!==(l=null!==(c=null===r||void 0===r?void 0:r.firstWeekContainsDate)&&void 0!==c?c:null===r||void 0===r||null===(u=r.locale)||void 0===u||null===(u=u.options)||void 0===u?void 0:u.firstWeekContainsDate)&&void 0!==l?l:b.firstWeekContainsDate)&&void 0!==s?s:null===(d=b.locale)||void 0===d||null===(d=d.options)||void 0===d?void 0:d.firstWeekContainsDate)&&void 0!==i?i:1,k=null!==(f=null!==(p=null!==(h=null!==(m=null===r||void 0===r?void 0:r.weekStartsOn)&&void 0!==m?m:null===r||void 0===r||null===(v=r.locale)||void 0===v||null===(v=v.options)||void 0===v?void 0:v.weekStartsOn)&&void 0!==h?h:b.weekStartsOn)&&void 0!==p?p:null===(g=b.locale)||void 0===g||null===(g=g.options)||void 0===g?void 0:g.weekStartsOn)&&void 0!==f?f:0;if(!t)return e?y():Ud(n,null===r||void 0===r?void 0:r.in);const S={firstWeekContainsDate:x,weekStartsOn:k,locale:w},E=[new Ef(null===r||void 0===r?void 0:r.in,n)],C=t.match(Ep).map((e=>{const t=e[0];if(t in df){return(0,df[t])(e,w.formatLong)}return e})).join("").match(Sp),N=[];for(let T of C){null!==r&&void 0!==r&&r.useAdditionalWeekYearTokens||!vf(T)||gf(T,t,e),null!==r&&void 0!==r&&r.useAdditionalDayOfYearTokens||!mf(T)||gf(T,t,e);const n=T[0],o=kp[n];if(o){const{incompatibleTokens:t}=o;if(Array.isArray(t)){const e=N.find((e=>t.includes(e.token)||e.token===n));if(e)throw new RangeError("The format string mustn't contain `".concat(e.fullToken,"` and `").concat(T,"` at the same time"))}else if("*"===o.incompatibleTokens&&N.length>0)throw new RangeError("The format string mustn't contain `".concat(T,"` and any other token at the same time"));N.push({token:n,fullToken:T});const r=o.run(e,T,w.match,S);if(!r)return y();E.push(r.setter),e=r.rest}else{if(n.match(Dp))throw new RangeError("Format string contains an unescaped latin alphabet character `"+n+"`");if("''"===T?T="'":"'"===n&&(T=T.match(Cp)[1].replace(Np,"'")),0!==e.indexOf(T))return y();e=e.slice(T.length)}}if(e.length>0&&jp.test(e))return y();const j=E.map((e=>e.priority)).sort(((e,t)=>t-e)).filter(((e,t,n)=>n.indexOf(e)===t)).map((e=>E.filter((t=>t.priority===e)).sort(((e,t)=>t.subPriority-e.subPriority)))).map((e=>e[0]));let D=Ud(n,null===r||void 0===r?void 0:r.in);if(isNaN(+D))return y();const P={};for(const T of j){if(!T.validate(D,S))return y();const e=T.set(D,P,S);Array.isArray(e)?(D=e[0],Object.assign(P,e[1])):D=e}return D}function Tp(e){return e instanceof Date||"object"===typeof e&&"[object Date]"===Object.prototype.toString.call(e)}function _p(e){return!(!Tp(e)&&"number"!==typeof e||isNaN(+Ud(e)))}function Op(e,t){return+Ud(e)<+Ud(t)}function Mp(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];const o=Hd.bind(null,e||n.find((e=>"object"===typeof e)));return n.map(o)}function Rp(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in);return n.setHours(0,0,0,0),n}function Ap(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t),a=Rp(r),i=Rp(o),s=+a-xp(a),l=+i-xp(i);return Math.round((s-l)/864e5)}function Lp(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}function Ip(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in);return Ap(n,Lp(n))+1}function Fp(e,t){return(e<0?"-":"")+Math.abs(e).toString().padStart(t,"0")}const zp={y(e,t){const n=e.getFullYear(),r=n>0?n:1-n;return Fp("yy"===t?r%100:r,t.length)},M(e,t){const n=e.getMonth();return"M"===t?String(n+1):Fp(n+1,2)},d:(e,t)=>Fp(e.getDate(),t.length),a(e,t){const n=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.toUpperCase();case"aaa":return n;case"aaaaa":return n[0];default:return"am"===n?"a.m.":"p.m."}},h:(e,t)=>Fp(e.getHours()%12||12,t.length),H:(e,t)=>Fp(e.getHours(),t.length),m:(e,t)=>Fp(e.getMinutes(),t.length),s:(e,t)=>Fp(e.getSeconds(),t.length),S(e,t){const n=t.length,r=e.getMilliseconds();return Fp(Math.trunc(r*Math.pow(10,n-3)),t.length)}},Bp="midnight",Hp="noon",Up="morning",Yp="afternoon",Wp="evening",qp="night",Vp={G:function(e,t,n){const r=e.getFullYear()>0?1:0;switch(t){case"G":case"GG":case"GGG":return n.era(r,{width:"abbreviated"});case"GGGGG":return n.era(r,{width:"narrow"});default:return n.era(r,{width:"wide"})}},y:function(e,t,n){if("yo"===t){const t=e.getFullYear(),r=t>0?t:1-t;return n.ordinalNumber(r,{unit:"year"})}return zp.y(e,t)},Y:function(e,t,n,r){const o=ip(e,r),a=o>0?o:1-o;if("YY"===t){return Fp(a%100,2)}return"Yo"===t?n.ordinalNumber(a,{unit:"year"}):Fp(a,t.length)},R:function(e,t){return Fp(dp(e),t.length)},u:function(e,t){return Fp(e.getFullYear(),t.length)},Q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"Q":return String(r);case"QQ":return Fp(r,2);case"Qo":return n.ordinalNumber(r,{unit:"quarter"});case"QQQ":return n.quarter(r,{width:"abbreviated",context:"formatting"});case"QQQQQ":return n.quarter(r,{width:"narrow",context:"formatting"});default:return n.quarter(r,{width:"wide",context:"formatting"})}},q:function(e,t,n){const r=Math.ceil((e.getMonth()+1)/3);switch(t){case"q":return String(r);case"qq":return Fp(r,2);case"qo":return n.ordinalNumber(r,{unit:"quarter"});case"qqq":return n.quarter(r,{width:"abbreviated",context:"standalone"});case"qqqqq":return n.quarter(r,{width:"narrow",context:"standalone"});default:return n.quarter(r,{width:"wide",context:"standalone"})}},M:function(e,t,n){const r=e.getMonth();switch(t){case"M":case"MM":return zp.M(e,t);case"Mo":return n.ordinalNumber(r+1,{unit:"month"});case"MMM":return n.month(r,{width:"abbreviated",context:"formatting"});case"MMMMM":return n.month(r,{width:"narrow",context:"formatting"});default:return n.month(r,{width:"wide",context:"formatting"})}},L:function(e,t,n){const r=e.getMonth();switch(t){case"L":return String(r+1);case"LL":return Fp(r+1,2);case"Lo":return n.ordinalNumber(r+1,{unit:"month"});case"LLL":return n.month(r,{width:"abbreviated",context:"standalone"});case"LLLLL":return n.month(r,{width:"narrow",context:"standalone"});default:return n.month(r,{width:"wide",context:"standalone"})}},w:function(e,t,n,r){const o=cp(e,r);return"wo"===t?n.ordinalNumber(o,{unit:"week"}):Fp(o,t.length)},I:function(e,t,n){const r=pp(e);return"Io"===t?n.ordinalNumber(r,{unit:"week"}):Fp(r,t.length)},d:function(e,t,n){return"do"===t?n.ordinalNumber(e.getDate(),{unit:"date"}):zp.d(e,t)},D:function(e,t,n){const r=Ip(e);return"Do"===t?n.ordinalNumber(r,{unit:"dayOfYear"}):Fp(r,t.length)},E:function(e,t,n){const r=e.getDay();switch(t){case"E":case"EE":case"EEE":return n.day(r,{width:"abbreviated",context:"formatting"});case"EEEEE":return n.day(r,{width:"narrow",context:"formatting"});case"EEEEEE":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},e:function(e,t,n,r){const o=e.getDay(),a=(o-r.weekStartsOn+8)%7||7;switch(t){case"e":return String(a);case"ee":return Fp(a,2);case"eo":return n.ordinalNumber(a,{unit:"day"});case"eee":return n.day(o,{width:"abbreviated",context:"formatting"});case"eeeee":return n.day(o,{width:"narrow",context:"formatting"});case"eeeeee":return n.day(o,{width:"short",context:"formatting"});default:return n.day(o,{width:"wide",context:"formatting"})}},c:function(e,t,n,r){const o=e.getDay(),a=(o-r.weekStartsOn+8)%7||7;switch(t){case"c":return String(a);case"cc":return Fp(a,t.length);case"co":return n.ordinalNumber(a,{unit:"day"});case"ccc":return n.day(o,{width:"abbreviated",context:"standalone"});case"ccccc":return n.day(o,{width:"narrow",context:"standalone"});case"cccccc":return n.day(o,{width:"short",context:"standalone"});default:return n.day(o,{width:"wide",context:"standalone"})}},i:function(e,t,n){const r=e.getDay(),o=0===r?7:r;switch(t){case"i":return String(o);case"ii":return Fp(o,t.length);case"io":return n.ordinalNumber(o,{unit:"day"});case"iii":return n.day(r,{width:"abbreviated",context:"formatting"});case"iiiii":return n.day(r,{width:"narrow",context:"formatting"});case"iiiiii":return n.day(r,{width:"short",context:"formatting"});default:return n.day(r,{width:"wide",context:"formatting"})}},a:function(e,t,n){const r=e.getHours()/12>=1?"pm":"am";switch(t){case"a":case"aa":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"});case"aaa":return n.dayPeriod(r,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return n.dayPeriod(r,{width:"narrow",context:"formatting"});default:return n.dayPeriod(r,{width:"wide",context:"formatting"})}},b:function(e,t,n){const r=e.getHours();let o;switch(o=12===r?Hp:0===r?Bp:r/12>=1?"pm":"am",t){case"b":case"bb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"bbb":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return n.dayPeriod(o,{width:"narrow",context:"formatting"});default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},B:function(e,t,n){const r=e.getHours();let o;switch(o=r>=17?Wp:r>=12?Yp:r>=4?Up:qp,t){case"B":case"BB":case"BBB":return n.dayPeriod(o,{width:"abbreviated",context:"formatting"});case"BBBBB":return n.dayPeriod(o,{width:"narrow",context:"formatting"});default:return n.dayPeriod(o,{width:"wide",context:"formatting"})}},h:function(e,t,n){if("ho"===t){let t=e.getHours()%12;return 0===t&&(t=12),n.ordinalNumber(t,{unit:"hour"})}return zp.h(e,t)},H:function(e,t,n){return"Ho"===t?n.ordinalNumber(e.getHours(),{unit:"hour"}):zp.H(e,t)},K:function(e,t,n){const r=e.getHours()%12;return"Ko"===t?n.ordinalNumber(r,{unit:"hour"}):Fp(r,t.length)},k:function(e,t,n){let r=e.getHours();return 0===r&&(r=24),"ko"===t?n.ordinalNumber(r,{unit:"hour"}):Fp(r,t.length)},m:function(e,t,n){return"mo"===t?n.ordinalNumber(e.getMinutes(),{unit:"minute"}):zp.m(e,t)},s:function(e,t,n){return"so"===t?n.ordinalNumber(e.getSeconds(),{unit:"second"}):zp.s(e,t)},S:function(e,t){return zp.S(e,t)},X:function(e,t,n){const r=e.getTimezoneOffset();if(0===r)return"Z";switch(t){case"X":return Kp(r);case"XXXX":case"XX":return $p(r);default:return $p(r,":")}},x:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"x":return Kp(r);case"xxxx":case"xx":return $p(r);default:return $p(r,":")}},O:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"O":case"OO":case"OOO":return"GMT"+Qp(r,":");default:return"GMT"+$p(r,":")}},z:function(e,t,n){const r=e.getTimezoneOffset();switch(t){case"z":case"zz":case"zzz":return"GMT"+Qp(r,":");default:return"GMT"+$p(r,":")}},t:function(e,t,n){return Fp(Math.trunc(+e/1e3),t.length)},T:function(e,t,n){return Fp(+e,t.length)}};function Qp(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const n=e>0?"-":"+",r=Math.abs(e),o=Math.trunc(r/60),a=r%60;return 0===a?n+String(o):n+String(o)+t+Fp(a,2)}function Kp(e,t){if(e%60===0){return(e>0?"-":"+")+Fp(Math.abs(e)/60,2)}return $p(e,t)}function $p(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const n=e>0?"-":"+",r=Math.abs(e);return n+Fp(Math.trunc(r/60),2)+t+Fp(r%60,2)}const Gp=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,Xp=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,Jp=/^'([^]*?)'?$/,Zp=/''/g,eh=/[a-zA-Z]/;function th(e,t,n){var r,o,a,i,s,l,c,u,d,f,p,h,m,v;const g=bf(),y=null!==(r=null!==(o=null===n||void 0===n?void 0:n.locale)&&void 0!==o?o:g.locale)&&void 0!==r?r:lf,b=null!==(a=null!==(i=null!==(s=null!==(l=null===n||void 0===n?void 0:n.firstWeekContainsDate)&&void 0!==l?l:null===n||void 0===n||null===(c=n.locale)||void 0===c||null===(c=c.options)||void 0===c?void 0:c.firstWeekContainsDate)&&void 0!==s?s:g.firstWeekContainsDate)&&void 0!==i?i:null===(u=g.locale)||void 0===u||null===(u=u.options)||void 0===u?void 0:u.firstWeekContainsDate)&&void 0!==a?a:1,w=null!==(d=null!==(f=null!==(p=null!==(h=null===n||void 0===n?void 0:n.weekStartsOn)&&void 0!==h?h:null===n||void 0===n||null===(m=n.locale)||void 0===m||null===(m=m.options)||void 0===m?void 0:m.weekStartsOn)&&void 0!==p?p:g.weekStartsOn)&&void 0!==f?f:null===(v=g.locale)||void 0===v||null===(v=v.options)||void 0===v?void 0:v.weekStartsOn)&&void 0!==d?d:0,x=Ud(e,null===n||void 0===n?void 0:n.in);if(!_p(x))throw new RangeError("Invalid time value");let k=t.match(Xp).map((e=>{const t=e[0];if("p"===t||"P"===t){return(0,df[t])(e,y.formatLong)}return e})).join("").match(Gp).map((e=>{if("''"===e)return{isToken:!1,value:"'"};const t=e[0];if("'"===t)return{isToken:!1,value:nh(e)};if(Vp[t])return{isToken:!0,value:e};if(t.match(eh))throw new RangeError("Format string contains an unescaped latin alphabet character `"+t+"`");return{isToken:!1,value:e}}));y.localize.preprocessor&&(k=y.localize.preprocessor(x,k));const S={firstWeekContainsDate:b,weekStartsOn:w,locale:y};return k.map((r=>{if(!r.isToken)return r.value;const o=r.value;(null!==n&&void 0!==n&&n.useAdditionalWeekYearTokens||!vf(o))&&(null!==n&&void 0!==n&&n.useAdditionalDayOfYearTokens||!mf(o))||gf(o,t,String(e));return(0,Vp[o[0]])(x,o,y.localize,S)})).join("")}function nh(e){const t=e.match(Jp);return t?t[1].replace(Zp,"'"):e}function rh(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);return r.setHours(t),r}function oh(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);return r.setMinutes(t),r}function ah(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);return r.setSeconds(t),r}function ih(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in);return n.setDate(1),n.setHours(0,0,0,0),n}function sh(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in),r=n.getMonth(),o=r-r%3;return n.setMonth(o,1),n.setHours(0,0,0,0),n}function lh(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in);return n.setHours(23,59,59,999),n}function ch(e,t){var n,r,o,a,i,s;const l=bf(),c=null!==(n=null!==(r=null!==(o=null!==(a=null===t||void 0===t?void 0:t.weekStartsOn)&&void 0!==a?a:null===t||void 0===t||null===(i=t.locale)||void 0===i||null===(i=i.options)||void 0===i?void 0:i.weekStartsOn)&&void 0!==o?o:l.weekStartsOn)&&void 0!==r?r:null===(s=l.locale)||void 0===s||null===(s=s.options)||void 0===s?void 0:s.weekStartsOn)&&void 0!==n?n:0,u=Ud(e,null===t||void 0===t?void 0:t.in),d=u.getDay(),f=6+(d<c?-7:0)-(d-c);return u.setDate(u.getDate()+f),u.setHours(23,59,59,999),u}function uh(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function dh(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t);return r.getFullYear()===o.getFullYear()}function fh(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t);return r.getFullYear()===o.getFullYear()&&r.getMonth()===o.getMonth()}function ph(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t);return+sh(r)===+sh(o)}function hh(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t);return+Rp(r)===+Rp(o)}function mh(e,t){return+Ud(e)===+Ud(t)}function vh(e,t,n){const r=+Ud(e,null===n||void 0===n?void 0:n.in),[o,a]=[+Ud(t.start,null===n||void 0===n?void 0:n.in),+Ud(t.end,null===n||void 0===n?void 0:n.in)].sort(((e,t)=>e-t));return r>=o&&r<=a}function gh(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in),r=n.getFullYear(),o=n.getMonth(),a=Hd(n,0);return a.setFullYear(r,o+1,0),a.setHours(0,0,0,0),a.getDate()}function yh(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in),o=r.getFullYear(),a=r.getDate(),i=Hd((null===n||void 0===n?void 0:n.in)||e,0);i.setFullYear(o,t,15),i.setHours(0,0,0,0);const s=gh(i);return r.setMonth(t,Math.min(a,s)),r}function bh(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in),o=t-(Math.trunc(r.getMonth()/3)+1);return yh(r,r.getMonth()+3*o)}function wh(e,t){return Ud(e,null===t||void 0===t?void 0:t.in).getFullYear()}function xh(e,t){return Ud(e,null===t||void 0===t?void 0:t.in).getMonth()}function kh(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in),r=n.getFullYear();return n.setFullYear(r+1,0,0),n.setHours(23,59,59,999),n}function Sh(e,t){const n=Ud(e,null===t||void 0===t?void 0:t.in);return Math.trunc(n.getMonth()/3)+1}function Eh(e,t){return Ud(e,null===t||void 0===t?void 0:t.in).getHours()}function Ch(e,t){return Ud(e,null===t||void 0===t?void 0:t.in).getMinutes()}function Nh(e){return Ud(e).getSeconds()}function jh(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);if(isNaN(t))return Hd((null===n||void 0===n?void 0:n.in)||e,NaN);if(!t)return r;const o=r.getDate(),a=Hd((null===n||void 0===n?void 0:n.in)||e,r.getTime());a.setMonth(r.getMonth()+t+1,0);return o>=a.getDate()?a:(r.setFullYear(a.getFullYear(),a.getMonth(),o),r)}function Dh(e,t,n){return jh(e,-t,n)}function Ph(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t);return 12*(r.getFullYear()-o.getFullYear())+(r.getMonth()-o.getMonth())}function Th(e,t,n){return jh(e,3*t,n)}function _h(e,t,n){return Th(e,-t,n)}function Oh(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t);return 4*(r.getFullYear()-o.getFullYear())+(Sh(r)-Sh(o))}function Mh(e,t,n){return jh(e,12*t,n)}function Rh(e,t,n){return Mh(e,-t,n)}function Ah(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t);return r.getFullYear()-o.getFullYear()}function Lh(e,t){let n,r=null===t||void 0===t?void 0:t.in;return e.forEach((e=>{r||"object"!==typeof e||(r=Hd.bind(null,e));const t=Ud(e,r);(!n||n>t||isNaN(+t))&&(n=t)})),Hd(r,n||NaN)}function Ih(e,t){let n,r=null===t||void 0===t?void 0:t.in;return e.forEach((e=>{r||"object"!==typeof e||(r=Hd.bind(null,e));const t=Ud(e,r);(!n||n<t||isNaN(+t))&&(n=t)})),Hd(r,n||NaN)}function Fh(e,t,n){return Hd((null===n||void 0===n?void 0:n.in)||e,+Ud(e)+t)}function zh(e,t,n){return Fh(e,t*zd,n)}function Bh(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);return r.setTime(r.getTime()+t*Fd),r}function Hh(e,t,n){return Fh(e,1e3*t,n)}function Uh(e,t){return+Ud(e)>+Ud(t)}function Yh(e,t){return Ud(e,null===t||void 0===t?void 0:t.in).getDay()}function Wh(e,t){return Ud(e,null===t||void 0===t?void 0:t.in).getDate()}function qh(e,t,n){return gp(e,7*t,n)}function Vh(e){return+Ud(e)}function Qh(e,t,n){const r=Ud(e,null===n||void 0===n?void 0:n.in);return isNaN(+r)?Hd((null===n||void 0===n?void 0:n.in)||e,NaN):(r.setFullYear(t),r)}function Kh(e,t,n){const[r,o]=Mp(null===n||void 0===n?void 0:n.in,e,t),a=$h(r,o),i=Math.abs(Ap(r,o));r.setDate(r.getDate()-a*i);const s=a*(i-Number($h(r,o)===-a));return 0===s?0:s}function $h(e,t){const n=e.getFullYear()-t.getFullYear()||e.getMonth()-t.getMonth()||e.getDate()-t.getDate()||e.getHours()-t.getHours()||e.getMinutes()-t.getMinutes()||e.getSeconds()-t.getSeconds()||e.getMilliseconds()-t.getMilliseconds();return n<0?-1:n>0?1:n}function Gh(e,t,n){return qh(e,-t,n)}function Xh(e,t,n){return gp(e,-t,n)}var Jh="undefined"!==typeof document?r.useLayoutEffect:r.useEffect;const Zh=_e({},o).useInsertionEffect||(e=>e());function em(){return"undefined"!==typeof window}function tm(e){return om(e)?(e.nodeName||"").toLowerCase():"#document"}function nm(e){var t;return(null==e||null==(t=e.ownerDocument)?void 0:t.defaultView)||window}function rm(e){var t;return null==(t=(om(e)?e.ownerDocument:e.document)||window.document)?void 0:t.documentElement}function om(e){return!!em()&&(e instanceof Node||e instanceof nm(e).Node)}function am(e){return!!em()&&(e instanceof Element||e instanceof nm(e).Element)}function im(e){return!!em()&&(e instanceof HTMLElement||e instanceof nm(e).HTMLElement)}function sm(e){return!(!em()||"undefined"===typeof ShadowRoot)&&(e instanceof ShadowRoot||e instanceof nm(e).ShadowRoot)}function lm(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=hm(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(o)}function cm(e){return["table","td","th"].includes(tm(e))}function um(e){return[":popover-open",":modal"].some((t=>{try{return e.matches(t)}catch(Dy){return!1}}))}function dm(e){const t=fm(),n=am(e)?hm(e):e;return["transform","translate","scale","rotate","perspective"].some((e=>!!n[e]&&"none"!==n[e]))||!!n.containerType&&"normal"!==n.containerType||!t&&!!n.backdropFilter&&"none"!==n.backdropFilter||!t&&!!n.filter&&"none"!==n.filter||["transform","translate","scale","rotate","perspective","filter"].some((e=>(n.willChange||"").includes(e)))||["paint","layout","strict","content"].some((e=>(n.contain||"").includes(e)))}function fm(){return!("undefined"===typeof CSS||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function pm(e){return["html","body","#document"].includes(tm(e))}function hm(e){return nm(e).getComputedStyle(e)}function mm(e){return am(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function vm(e){if("html"===tm(e))return e;const t=e.assignedSlot||e.parentNode||sm(e)&&e.host||rm(e);return sm(t)?t.host:t}function gm(e){const t=vm(e);return pm(t)?e.ownerDocument?e.ownerDocument.body:e.body:im(t)&&lm(t)?t:gm(t)}function ym(e,t,n){var r;void 0===t&&(t=[]),void 0===n&&(n=!0);const o=gm(e),a=o===(null==(r=e.ownerDocument)?void 0:r.body),i=nm(o);if(a){const e=bm(i);return t.concat(i,i.visualViewport||[],lm(o)?o:[],e&&n?ym(e):[])}return t.concat(o,ym(o,[],n))}function bm(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}const wm=Math.min,xm=Math.max,km=Math.round,Sm=Math.floor,Em=e=>({x:e,y:e}),Cm={left:"right",right:"left",bottom:"top",top:"bottom"},Nm={start:"end",end:"start"};function jm(e,t){return"function"===typeof e?e(t):e}function Dm(e){return e.split("-")[0]}function Pm(e){return e.split("-")[1]}function Tm(e){return"y"===e?"height":"width"}function _m(e){return["top","bottom"].includes(Dm(e))?"y":"x"}function Om(e){return"x"===_m(e)?"y":"x"}function Mm(e){return e.replace(/start|end/g,(e=>Nm[e]))}function Rm(e){return e.replace(/left|right|bottom|top/g,(e=>Cm[e]))}function Am(e){return"number"!==typeof e?function(e){return _e({top:0,right:0,bottom:0,left:0},e)}(e):{top:e,right:e,bottom:e,left:e}}function Lm(e){const{x:t,y:n,width:r,height:o}=e;return{width:r,height:o,top:n,left:t,right:t+r,bottom:n+o,x:t,y:n}}const Im=["mainAxis","crossAxis","fallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment"];function Fm(e,t,n){let{reference:r,floating:o}=e;const a=_m(t),i=Om(t),s=Tm(i),l=Dm(t),c="y"===a,u=r.x+r.width/2-o.width/2,d=r.y+r.height/2-o.height/2,f=r[s]/2-o[s]/2;let p;switch(l){case"top":p={x:u,y:r.y-o.height};break;case"bottom":p={x:u,y:r.y+r.height};break;case"right":p={x:r.x+r.width,y:d};break;case"left":p={x:r.x-o.width,y:d};break;default:p={x:r.x,y:r.y}}switch(Pm(t)){case"start":p[i]-=f*(n&&c?-1:1);break;case"end":p[i]+=f*(n&&c?-1:1)}return p}async function zm(e,t){var n;void 0===t&&(t={});const{x:r,y:o,platform:a,rects:i,elements:s,strategy:l}=e,{boundary:c="clippingAncestors",rootBoundary:u="viewport",elementContext:d="floating",altBoundary:f=!1,padding:p=0}=jm(t,e),h=Am(p),m=s[f?"floating"===d?"reference":"floating":d],v=Lm(await a.getClippingRect({element:null==(n=await(null==a.isElement?void 0:a.isElement(m)))||n?m:m.contextElement||await(null==a.getDocumentElement?void 0:a.getDocumentElement(s.floating)),boundary:c,rootBoundary:u,strategy:l})),g="floating"===d?{x:r,y:o,width:i.floating.width,height:i.floating.height}:i.reference,y=await(null==a.getOffsetParent?void 0:a.getOffsetParent(s.floating)),b=await(null==a.isElement?void 0:a.isElement(y))&&await(null==a.getScale?void 0:a.getScale(y))||{x:1,y:1},w=Lm(a.convertOffsetParentRelativeRectToViewportRelativeRect?await a.convertOffsetParentRelativeRectToViewportRelativeRect({elements:s,rect:g,offsetParent:y,strategy:l}):g);return{top:(v.top-w.top+h.top)/b.y,bottom:(w.bottom-v.bottom+h.bottom)/b.y,left:(v.left-w.left+h.left)/b.x,right:(w.right-v.right+h.right)/b.x}}function Bm(e){const t=hm(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const o=im(e),a=o?e.offsetWidth:n,i=o?e.offsetHeight:r,s=km(n)!==a||km(r)!==i;return s&&(n=a,r=i),{width:n,height:r,$:s}}function Hm(e){return am(e)?e:e.contextElement}function Um(e){const t=Hm(e);if(!im(t))return Em(1);const n=t.getBoundingClientRect(),{width:r,height:o,$:a}=Bm(t);let i=(a?km(n.width):n.width)/r,s=(a?km(n.height):n.height)/o;return i&&Number.isFinite(i)||(i=1),s&&Number.isFinite(s)||(s=1),{x:i,y:s}}const Ym=Em(0);function Wm(e){const t=nm(e);return fm()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:Ym}function qm(e,t,n,r){void 0===t&&(t=!1),void 0===n&&(n=!1);const o=e.getBoundingClientRect(),a=Hm(e);let i=Em(1);t&&(r?am(r)&&(i=Um(r)):i=Um(e));const s=function(e,t,n){return void 0===t&&(t=!1),!(!n||t&&n!==nm(e))&&t}(a,n,r)?Wm(a):Em(0);let l=(o.left+s.x)/i.x,c=(o.top+s.y)/i.y,u=o.width/i.x,d=o.height/i.y;if(a){const e=nm(a),t=r&&am(r)?nm(r):r;let n=e,o=bm(n);for(;o&&r&&t!==n;){const e=Um(o),t=o.getBoundingClientRect(),r=hm(o),a=t.left+(o.clientLeft+parseFloat(r.paddingLeft))*e.x,i=t.top+(o.clientTop+parseFloat(r.paddingTop))*e.y;l*=e.x,c*=e.y,u*=e.x,d*=e.y,l+=a,c+=i,n=nm(o),o=bm(n)}}return Lm({width:u,height:d,x:l,y:c})}function Vm(e,t){const n=mm(e).scrollLeft;return t?t.left+n:qm(rm(e)).left+n}function Qm(e,t,n){void 0===n&&(n=!1);const r=e.getBoundingClientRect();return{x:r.left+t.scrollLeft-(n?0:Vm(e,r)),y:r.top+t.scrollTop}}function Km(e,t,n){let r;if("viewport"===t)r=function(e,t){const n=nm(e),r=rm(e),o=n.visualViewport;let a=r.clientWidth,i=r.clientHeight,s=0,l=0;if(o){a=o.width,i=o.height;const e=fm();(!e||e&&"fixed"===t)&&(s=o.offsetLeft,l=o.offsetTop)}return{width:a,height:i,x:s,y:l}}(e,n);else if("document"===t)r=function(e){const t=rm(e),n=mm(e),r=e.ownerDocument.body,o=xm(t.scrollWidth,t.clientWidth,r.scrollWidth,r.clientWidth),a=xm(t.scrollHeight,t.clientHeight,r.scrollHeight,r.clientHeight);let i=-n.scrollLeft+Vm(e);const s=-n.scrollTop;return"rtl"===hm(r).direction&&(i+=xm(t.clientWidth,r.clientWidth)-o),{width:o,height:a,x:i,y:s}}(rm(e));else if(am(t))r=function(e,t){const n=qm(e,!0,"fixed"===t),r=n.top+e.clientTop,o=n.left+e.clientLeft,a=im(e)?Um(e):Em(1);return{width:e.clientWidth*a.x,height:e.clientHeight*a.y,x:o*a.x,y:r*a.y}}(t,n);else{const n=Wm(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return Lm(r)}function $m(e,t){const n=vm(e);return!(n===t||!am(n)||pm(n))&&("fixed"===hm(n).position||$m(n,t))}function Gm(e,t,n){const r=im(t),o=rm(t),a="fixed"===n,i=qm(e,!0,a,t);let s={scrollLeft:0,scrollTop:0};const l=Em(0);function c(){l.x=Vm(o)}if(r||!r&&!a)if(("body"!==tm(t)||lm(o))&&(s=mm(t)),r){const e=qm(t,!0,a,t);l.x=e.x+t.clientLeft,l.y=e.y+t.clientTop}else o&&c();a&&!r&&o&&c();const u=!o||r||a?Em(0):Qm(o,s);return{x:i.left+s.scrollLeft-l.x-u.x,y:i.top+s.scrollTop-l.y-u.y,width:i.width,height:i.height}}function Xm(e){return"static"===hm(e).position}function Jm(e,t){if(!im(e)||"fixed"===hm(e).position)return null;if(t)return t(e);let n=e.offsetParent;return rm(e)===n&&(n=n.ownerDocument.body),n}function Zm(e,t){const n=nm(e);if(um(e))return n;if(!im(e)){let t=vm(e);for(;t&&!pm(t);){if(am(t)&&!Xm(t))return t;t=vm(t)}return n}let r=Jm(e,t);for(;r&&cm(r)&&Xm(r);)r=Jm(r,t);return r&&pm(r)&&Xm(r)&&!dm(r)?n:r||function(e){let t=vm(e);for(;im(t)&&!pm(t);){if(dm(t))return t;if(um(t))return null;t=vm(t)}return null}(e)||n}const ev={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{elements:t,rect:n,offsetParent:r,strategy:o}=e;const a="fixed"===o,i=rm(r),s=!!t&&um(t.floating);if(r===i||s&&a)return n;let l={scrollLeft:0,scrollTop:0},c=Em(1);const u=Em(0),d=im(r);if((d||!d&&!a)&&(("body"!==tm(r)||lm(i))&&(l=mm(r)),im(r))){const e=qm(r);c=Um(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}const f=!i||d||a?Em(0):Qm(i,l,!0);return{width:n.width*c.x,height:n.height*c.y,x:n.x*c.x-l.scrollLeft*c.x+u.x+f.x,y:n.y*c.y-l.scrollTop*c.y+u.y+f.y}},getDocumentElement:rm,getClippingRect:function(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;const a="clippingAncestors"===n?um(t)?[]:function(e,t){const n=t.get(e);if(n)return n;let r=ym(e,[],!1).filter((e=>am(e)&&"body"!==tm(e))),o=null;const a="fixed"===hm(e).position;let i=a?vm(e):e;for(;am(i)&&!pm(i);){const t=hm(i),n=dm(i);n||"fixed"!==t.position||(o=null),(a?!n&&!o:!n&&"static"===t.position&&o&&["absolute","fixed"].includes(o.position)||lm(i)&&!n&&$m(e,i))?r=r.filter((e=>e!==i)):o=t,i=vm(i)}return t.set(e,r),r}(t,this._c):[].concat(n),i=[...a,r],s=i[0],l=i.reduce(((e,n)=>{const r=Km(t,n,o);return e.top=xm(r.top,e.top),e.right=wm(r.right,e.right),e.bottom=wm(r.bottom,e.bottom),e.left=xm(r.left,e.left),e}),Km(t,s,o));return{width:l.right-l.left,height:l.bottom-l.top,x:l.left,y:l.top}},getOffsetParent:Zm,getElementRects:async function(e){const t=this.getOffsetParent||Zm,n=this.getDimensions,r=await n(e.floating);return{reference:Gm(e.reference,await t(e.floating),e.strategy),floating:{x:0,y:0,width:r.width,height:r.height}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){const{width:t,height:n}=Bm(e);return{width:t,height:n}},getScale:Um,isElement:am,isRTL:function(e){return"rtl"===hm(e).direction}};function tv(e,t){return e.x===t.x&&e.y===t.y&&e.width===t.width&&e.height===t.height}function nv(e,t,n,r){void 0===r&&(r={});const{ancestorScroll:o=!0,ancestorResize:a=!0,elementResize:i="function"===typeof ResizeObserver,layoutShift:s="function"===typeof IntersectionObserver,animationFrame:l=!1}=r,c=Hm(e),u=o||a?[...c?ym(c):[],...ym(t)]:[];u.forEach((e=>{o&&e.addEventListener("scroll",n,{passive:!0}),a&&e.addEventListener("resize",n)}));const d=c&&s?function(e,t){let n,r=null;const o=rm(e);function a(){var e;clearTimeout(n),null==(e=r)||e.disconnect(),r=null}return function i(s,l){void 0===s&&(s=!1),void 0===l&&(l=1),a();const c=e.getBoundingClientRect(),{left:u,top:d,width:f,height:p}=c;if(s||t(),!f||!p)return;const h={rootMargin:-Sm(d)+"px "+-Sm(o.clientWidth-(u+f))+"px "+-Sm(o.clientHeight-(d+p))+"px "+-Sm(u)+"px",threshold:xm(0,wm(1,l))||1};let m=!0;function v(t){const r=t[0].intersectionRatio;if(r!==l){if(!m)return i();r?i(!1,r):n=setTimeout((()=>{i(!1,1e-7)}),1e3)}1!==r||tv(c,e.getBoundingClientRect())||i(),m=!1}try{r=new IntersectionObserver(v,_e(_e({},h),{},{root:o.ownerDocument}))}catch(g){r=new IntersectionObserver(v,h)}r.observe(e)}(!0),a}(c,n):null;let f,p=-1,h=null;i&&(h=new ResizeObserver((e=>{let[r]=e;r&&r.target===c&&h&&(h.unobserve(t),cancelAnimationFrame(p),p=requestAnimationFrame((()=>{var e;null==(e=h)||e.observe(t)}))),n()})),c&&!l&&h.observe(c),h.observe(t));let m=l?qm(e):null;return l&&function t(){const r=qm(e);m&&!tv(m,r)&&n();m=r,f=requestAnimationFrame(t)}(),n(),()=>{var e;u.forEach((e=>{o&&e.removeEventListener("scroll",n),a&&e.removeEventListener("resize",n)})),null==d||d(),null==(e=h)||e.disconnect(),h=null,l&&cancelAnimationFrame(f)}}const rv=function(e){return void 0===e&&(e=0),{name:"offset",options:e,async fn(t){var n,r;const{x:o,y:a,placement:i,middlewareData:s}=t,l=await async function(e,t){const{placement:n,platform:r,elements:o}=e,a=await(null==r.isRTL?void 0:r.isRTL(o.floating)),i=Dm(n),s=Pm(n),l="y"===_m(n),c=["left","top"].includes(i)?-1:1,u=a&&l?-1:1,d=jm(t,e);let{mainAxis:f,crossAxis:p,alignmentAxis:h}="number"===typeof d?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&"number"===typeof h&&(p="end"===s?-1*h:h),l?{x:p*u,y:f*c}:{x:f*c,y:p*u}}(t,e);return i===(null==(n=s.offset)?void 0:n.placement)&&null!=(r=s.arrow)&&r.alignmentOffset?{}:{x:o+l.x,y:a+l.y,data:_e(_e({},l),{},{placement:i})}}}},ov=function(e){return void 0===e&&(e={}),{name:"flip",options:e,async fn(t){var n,r;const{placement:o,middlewareData:a,rects:i,initialPlacement:s,platform:l,elements:c}=t,u=jm(e,t),{mainAxis:d=!0,crossAxis:f=!0,fallbackPlacements:p,fallbackStrategy:h="bestFit",fallbackAxisSideDirection:m="none",flipAlignment:v=!0}=u,g=Ps(u,Im);if(null!=(n=a.arrow)&&n.alignmentOffset)return{};const y=Dm(o),b=_m(s),w=Dm(s)===s,x=await(null==l.isRTL?void 0:l.isRTL(c.floating)),k=p||(w||!v?[Rm(s)]:function(e){const t=Rm(e);return[Mm(e),t,Mm(t)]}(s)),S="none"!==m;!p&&S&&k.push(...function(e,t,n,r){const o=Pm(e);let a=function(e,t,n){const r=["left","right"],o=["right","left"],a=["top","bottom"],i=["bottom","top"];switch(e){case"top":case"bottom":return n?t?o:r:t?r:o;case"left":case"right":return t?a:i;default:return[]}}(Dm(e),"start"===n,r);return o&&(a=a.map((e=>e+"-"+o)),t&&(a=a.concat(a.map(Mm)))),a}(s,v,m,x));const E=[s,...k],C=await zm(t,g),N=[];let j=(null==(r=a.flip)?void 0:r.overflows)||[];if(d&&N.push(C[y]),f){const e=function(e,t,n){void 0===n&&(n=!1);const r=Pm(e),o=Om(e),a=Tm(o);let i="x"===o?r===(n?"end":"start")?"right":"left":"start"===r?"bottom":"top";return t.reference[a]>t.floating[a]&&(i=Rm(i)),[i,Rm(i)]}(o,i,x);N.push(C[e[0]],C[e[1]])}if(j=[...j,{placement:o,overflows:N}],!N.every((e=>e<=0))){var D,P;const e=((null==(D=a.flip)?void 0:D.index)||0)+1,t=E[e];if(t){var T;const n="alignment"===f&&b!==_m(t),r=(null==(T=j[0])?void 0:T.overflows[0])>0;if(!n||r)return{data:{index:e,overflows:j},reset:{placement:t}}}let n=null==(P=j.filter((e=>e.overflows[0]<=0)).sort(((e,t)=>e.overflows[1]-t.overflows[1]))[0])?void 0:P.placement;if(!n)switch(h){case"bestFit":{var _;const e=null==(_=j.filter((e=>{if(S){const t=_m(e.placement);return t===b||"y"===t}return!0})).map((e=>[e.placement,e.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)])).sort(((e,t)=>e[1]-t[1]))[0])?void 0:_[0];e&&(n=e);break}case"initialPlacement":n=s}if(o!==n)return{reset:{placement:n}}}return{}}}},av=e=>({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:o,rects:a,platform:i,elements:s,middlewareData:l}=t,{element:c,padding:u=0}=jm(e,t)||{};if(null==c)return{};const d=Am(u),f={x:n,y:r},p=Om(o),h=Tm(p),m=await i.getDimensions(c),v="y"===p,g=v?"top":"left",y=v?"bottom":"right",b=v?"clientHeight":"clientWidth",w=a.reference[h]+a.reference[p]-f[p]-a.floating[h],x=f[p]-a.reference[p],k=await(null==i.getOffsetParent?void 0:i.getOffsetParent(c));let S=k?k[b]:0;S&&await(null==i.isElement?void 0:i.isElement(k))||(S=s.floating[b]||a.floating[h]);const E=w/2-x/2,C=S/2-m[h]/2-1,N=wm(d[g],C),j=wm(d[y],C),D=N,P=S-m[h]-j,T=S/2-m[h]/2+E,_=xm(D,wm(T,P));const O=!l.arrow&&null!=Pm(o)&&T!==_&&a.reference[h]/2-(T<D?N:j)-m[h]/2<0,M=O?T<D?T-D:T-P:0;return{[p]:f[p]+M,data:_e({[p]:_,centerOffset:T-_-M},O&&{alignmentOffset:M}),reset:O}}}),iv=(e,t,n)=>{const r=new Map,o=_e({platform:ev},n),a=_e(_e({},o.platform),{},{_c:r});return(async(e,t,n)=>{const{placement:r="bottom",strategy:o="absolute",middleware:a=[],platform:i}=n,s=a.filter(Boolean),l=await(null==i.isRTL?void 0:i.isRTL(t));let c=await i.getElementRects({reference:e,floating:t,strategy:o}),{x:u,y:d}=Fm(c,r,l),f=r,p={},h=0;for(let m=0;m<s.length;m++){const{name:n,fn:a}=s[m],{x:v,y:g,data:y,reset:b}=await a({x:u,y:d,initialPlacement:r,placement:f,strategy:o,middlewareData:p,rects:c,platform:i,elements:{reference:e,floating:t}});u=null!=v?v:u,d=null!=g?g:d,p=_e(_e({},p),{},{[n]:_e(_e({},p[n]),y)}),b&&h<=50&&(h++,"object"===typeof b&&(b.placement&&(f=b.placement),b.rects&&(c=!0===b.rects?await i.getElementRects({reference:e,floating:t,strategy:o}):b.rects),({x:u,y:d}=Fm(c,f,l))),m=-1)}return{x:u,y:d,placement:f,strategy:o,middlewareData:p}})(e,t,_e(_e({},o),{},{platform:a}))};var sv="undefined"!==typeof document?r.useLayoutEffect:r.useEffect;function lv(e,t){if(e===t)return!0;if(typeof e!==typeof t)return!1;if("function"===typeof e&&e.toString()===t.toString())return!0;let n,r,o;if(e&&t&&"object"===typeof e){if(Array.isArray(e)){if(n=e.length,n!==t.length)return!1;for(r=n;0!==r--;)if(!lv(e[r],t[r]))return!1;return!0}if(o=Object.keys(e),n=o.length,n!==Object.keys(t).length)return!1;for(r=n;0!==r--;)if(!{}.hasOwnProperty.call(t,o[r]))return!1;for(r=n;0!==r--;){const n=o[r];if(("_owner"!==n||!e.$$typeof)&&!lv(e[n],t[n]))return!1}return!0}return e!==e&&t!==t}function cv(e){if("undefined"===typeof window)return 1;return(e.ownerDocument.defaultView||window).devicePixelRatio||1}function uv(e,t){const n=cv(e);return Math.round(t*n)/n}function dv(e){const t=r.useRef(e);return sv((()=>{t.current=e})),t}const fv=(e,t)=>_e(_e({},rv(e)),{},{options:[e,t]}),pv=(e,t)=>_e(_e({},(e=>({name:"arrow",options:e,fn(t){const{element:n,padding:r}="function"===typeof e?e(t):e;return n&&(o=n,{}.hasOwnProperty.call(o,"current"))?null!=n.current?av({element:n.current,padding:r}).fn(t):{}:n?av({element:n,padding:r}).fn(t):{};var o}}))(e)),{},{options:[e,t]}),hv=["transform"],mv=["context","width","height","tipRadius","strokeWidth","staticOffset","stroke","d","style"];const vv="ArrowLeft",gv="ArrowRight",yv="ArrowUp",bv="ArrowDown";const wv=[vv,gv],xv=[yv,bv],kv=_e({},o);let Sv=!1,Ev=0;const Cv=()=>"floating-ui-"+Math.random().toString(36).slice(2,6)+Ev++;const Nv=kv.useId||function(){const[e,t]=r.useState((()=>Sv?Cv():void 0));return Jh((()=>{null==e&&t(Cv())}),[]),r.useEffect((()=>{Sv=!0}),[]),e};const jv=r.forwardRef((function(e,t){const{context:{placement:n,elements:{floating:o},middlewareData:{arrow:a,shift:i}},width:s=14,height:l=7,tipRadius:c=0,strokeWidth:u=0,staticOffset:d,stroke:f,d:p,style:{transform:h}={}}=e,m=Ps(e.style,hv),v=Ps(e,mv);const g=Nv(),[y,b]=r.useState(!1);if(Jh((()=>{if(!o)return;"rtl"===hm(o).direction&&b(!0)}),[o]),!o)return null;const[w,x]=n.split("-"),k="top"===w||"bottom"===w;let S=d;(k&&null!=i&&i.x||!k&&null!=i&&i.y)&&(S=null);const E=2*u,C=E/2,N=s/2*(c/-8+1),j=l/2*c/4,D=!!p,P=S&&"end"===x?"bottom":"top";let T=S&&"end"===x?"right":"left";S&&y&&(T="end"===x?"left":"right");const _=null!=(null==a?void 0:a.x)?S||a.x:"",O=null!=(null==a?void 0:a.y)?S||a.y:"",M=p||"M0,0 H"+s+" L"+(s-N)+","+(l-j)+" Q"+s/2+","+l+" "+N+","+(l-j)+" Z",R={top:D?"rotate(180deg)":"",left:D?"rotate(90deg)":"rotate(-90deg)",bottom:D?"":"rotate(180deg)",right:D?"rotate(-90deg)":"rotate(90deg)"}[w];return(0,bd.jsxs)("svg",_e(_e({},v),{},{"aria-hidden":!0,ref:t,width:D?s:s+E,height:s,viewBox:"0 0 "+s+" "+(l>s?l:s),style:_e({position:"absolute",pointerEvents:"none",[T]:_,[P]:O,[w]:k||D?"100%":"calc(100% - "+E/2+"px)",transform:[R,h].filter((e=>!!e)).join(" ")},m),children:[E>0&&(0,bd.jsx)("path",{clipPath:"url(#"+g+")",fill:"none",stroke:f,strokeWidth:E+(p?0:1),d:M}),(0,bd.jsx)("path",{stroke:E&&!p?v.fill:"none",d:M}),(0,bd.jsx)("clipPath",{id:g,children:(0,bd.jsx)("rect",{x:-C,y:C*(D?-1:1),width:s+E,height:s})})]}))}));function Dv(){const e=new Map;return{emit(t,n){var r;null==(r=e.get(t))||r.forEach((e=>e(n)))},on(t,n){e.has(t)||e.set(t,new Set),e.get(t).add(n)},off(t,n){var r;null==(r=e.get(t))||r.delete(n)}}}const Pv=r.createContext(null),Tv=r.createContext(null),_v=()=>{var e;return(null==(e=r.useContext(Pv))?void 0:e.id)||null},Ov=()=>r.useContext(Tv);function Mv(e){const{open:t=!1,onOpenChange:n,elements:o}=e,a=Nv(),i=r.useRef({}),[s]=r.useState((()=>Dv())),l=null!=_v();const[c,u]=r.useState(o.reference),d=function(e){const t=r.useRef((()=>{}));return Zh((()=>{t.current=e})),r.useCallback((function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];return null==t.current?void 0:t.current(...n)}),[])}(((e,t,r)=>{i.current.openEvent=e?t:void 0,s.emit("openchange",{open:e,event:t,reason:r,nested:l}),null==n||n(e,t,r)})),f=r.useMemo((()=>({setPositionReference:u})),[]),p=r.useMemo((()=>({reference:c||o.reference||null,floating:o.floating||null,domReference:o.reference})),[c,o.reference,o.floating]);return r.useMemo((()=>({dataRef:i,open:t,onOpenChange:d,elements:p,events:s,floatingId:a,refs:f})),[t,d,p,s,a,f])}function Rv(e){void 0===e&&(e={});const{nodeId:t}=e,n=Mv(_e(_e({},e),{},{elements:_e({reference:null,floating:null},e.elements)})),o=e.rootContext||n,a=o.elements,[s,l]=r.useState(null),[c,u]=r.useState(null),d=(null==a?void 0:a.domReference)||s,f=r.useRef(null),p=Ov();Jh((()=>{d&&(f.current=d)}),[d]);const h=function(e){void 0===e&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:o=[],platform:a,elements:{reference:s,floating:l}={},transform:c=!0,whileElementsMounted:u,open:d}=e,[f,p]=r.useState({x:0,y:0,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[h,m]=r.useState(o);lv(h,o)||m(o);const[v,g]=r.useState(null),[y,b]=r.useState(null),w=r.useCallback((e=>{e!==E.current&&(E.current=e,g(e))}),[]),x=r.useCallback((e=>{e!==C.current&&(C.current=e,b(e))}),[]),k=s||v,S=l||y,E=r.useRef(null),C=r.useRef(null),N=r.useRef(f),j=null!=u,D=dv(u),P=dv(a),T=dv(d),_=r.useCallback((()=>{if(!E.current||!C.current)return;const e={placement:t,strategy:n,middleware:h};P.current&&(e.platform=P.current),iv(E.current,C.current,e).then((e=>{const t=_e(_e({},e),{},{isPositioned:!1!==T.current});O.current&&!lv(N.current,t)&&(N.current=t,i.flushSync((()=>{p(t)})))}))}),[h,t,n,P,T]);sv((()=>{!1===d&&N.current.isPositioned&&(N.current.isPositioned=!1,p((e=>_e(_e({},e),{},{isPositioned:!1}))))}),[d]);const O=r.useRef(!1);sv((()=>(O.current=!0,()=>{O.current=!1})),[]),sv((()=>{if(k&&(E.current=k),S&&(C.current=S),k&&S){if(D.current)return D.current(k,S,_);_()}}),[k,S,_,D,j]);const M=r.useMemo((()=>({reference:E,floating:C,setReference:w,setFloating:x})),[w,x]),R=r.useMemo((()=>({reference:k,floating:S})),[k,S]),A=r.useMemo((()=>{const e={position:n,left:0,top:0};if(!R.floating)return e;const t=uv(R.floating,f.x),r=uv(R.floating,f.y);return c?_e(_e({},e),{},{transform:"translate("+t+"px, "+r+"px)"},cv(R.floating)>=1.5&&{willChange:"transform"}):{position:n,left:t,top:r}}),[n,c,R.floating,f.x,f.y]);return r.useMemo((()=>_e(_e({},f),{},{update:_,refs:M,elements:R,floatingStyles:A})),[f,_,M,R,A])}(_e(_e({},e),{},{elements:_e(_e({},a),c&&{reference:c})})),m=r.useCallback((e=>{const t=am(e)?{getBoundingClientRect:()=>e.getBoundingClientRect(),getClientRects:()=>e.getClientRects(),contextElement:e}:e;u(t),h.refs.setReference(t)}),[h.refs]),v=r.useCallback((e=>{(am(e)||null===e)&&(f.current=e,l(e)),(am(h.refs.reference.current)||null===h.refs.reference.current||null!==e&&!am(e))&&h.refs.setReference(e)}),[h.refs]),g=r.useMemo((()=>_e(_e({},h.refs),{},{setReference:v,setPositionReference:m,domReference:f})),[h.refs,v,m]),y=r.useMemo((()=>_e(_e({},h.elements),{},{domReference:d})),[h.elements,d]),b=r.useMemo((()=>_e(_e(_e({},h),o),{},{refs:g,elements:y,nodeId:t})),[h,g,y,t,o]);return Jh((()=>{o.dataRef.current.floatingContext=b;const e=null==p?void 0:p.nodesRef.current.find((e=>e.id===t));e&&(e.context=b)})),r.useMemo((()=>_e(_e({},h),{},{context:b,refs:g,elements:y})),[h,g,y,b])}var Av=function(e,t){return Av=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Av(e,t)};function Lv(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Av(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Iv=function(){return Iv=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},Iv.apply(this,arguments)};function Fv(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o<a;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}"function"===typeof SuppressedError&&SuppressedError;var zv,Bv=function(e){var t=e.showTimeSelectOnly,n=void 0!==t&&t,o=e.showTime,a=void 0!==o&&o,i=e.className,s=e.children,l=n?"Choose Time":"Choose Date".concat(a?" and Time":"");return r.createElement("div",{className:i,role:"dialog","aria-label":l,"aria-modal":"true"},s)},Hv=function(e){var t=e.children,n=e.onClickOutside,o=e.className,a=e.containerRef,i=e.style,s=function(e,t){var n=(0,r.useRef)(null),o=(0,r.useRef)(e);o.current=e;var a=(0,r.useCallback)((function(e){var r,a=e.composed&&e.composedPath&&e.composedPath().find((function(e){return e instanceof Node}))||e.target;n.current&&!n.current.contains(a)&&(t&&a instanceof HTMLElement&&a.classList.contains(t)||null===(r=o.current)||void 0===r||r.call(o,e))}),[t]);return(0,r.useEffect)((function(){return document.addEventListener("mousedown",a),function(){document.removeEventListener("mousedown",a)}}),[a]),n}(n,e.ignoreClass);return r.createElement("div",{className:o,style:i,ref:function(e){s.current=e,a&&(a.current=e)}},t)};function Uv(){return"undefined"!==typeof window?window:globalThis}!function(e){e.ArrowUp="ArrowUp",e.ArrowDown="ArrowDown",e.ArrowLeft="ArrowLeft",e.ArrowRight="ArrowRight",e.PageUp="PageUp",e.PageDown="PageDown",e.Home="Home",e.End="End",e.Enter="Enter",e.Space=" ",e.Tab="Tab",e.Escape="Escape",e.Backspace="Backspace",e.X="x"}(zv||(zv={}));function Yv(e){if(null==e)return new Date;var t="string"===typeof e?Yd(e):Ud(e);return qv(t)?t:new Date}function Wv(e,t,n,r,o){void 0===o&&(o=Yv());for(var a=ug(n)||ug(cg()),i=0,s=Array.isArray(t)?t:[t];i<s.length;i++){var l=s[i],c=Pp(e,l,o,{locale:a,useAdditionalWeekYearTokens:!0,useAdditionalDayOfYearTokens:!0});if(qv(c)&&(!r||e===Vv(c,l,n)))return c}return null}function qv(e,t){return _p(e)&&!Op(e,new Date("1/1/1800"))}function Vv(e,t,n){if("en"===n)return th(e,t,{useAdditionalWeekYearTokens:!0,useAdditionalDayOfYearTokens:!0});var r=n?ug(n):void 0;return n&&!r&&console.warn('A locale object was not found for the provided string ["'.concat(n,'"].')),th(e,t,{locale:r=r||ug(cg()),useAdditionalWeekYearTokens:!0,useAdditionalDayOfYearTokens:!0})}function Qv(e,t){var n=t.dateFormat,r=t.locale,o=Array.isArray(n)&&n.length>0?n[0]:n;return e&&Vv(e,o,r)||""}function Kv(e,t){var n=t.hour,r=void 0===n?0:n,o=t.minute,a=void 0===o?0:o,i=t.second;return rh(oh(ah(e,void 0===i?0:i),a),r)}function $v(e){return Rp(e)}function Gv(e,t,n){return ap(e,{locale:ug(t||cg()),weekStartsOn:n})}function Xv(e){return ih(e)}function Jv(e){return Lp(e)}function Zv(e){return sh(e)}function eg(){return Rp(Yv())}function tg(e){return lh(e)}function ng(e){return uh(e)}function rg(e,t){return e&&t?dh(e,t):!e&&!t}function og(e,t){return e&&t?fh(e,t):!e&&!t}function ag(e,t){return e&&t?ph(e,t):!e&&!t}function ig(e,t){return e&&t?hh(e,t):!e&&!t}function sg(e,t){return e&&t?mh(e,t):!e&&!t}function lg(e,t,n){var r,o=Rp(t),a=lh(n);try{r=vh(e,{start:o,end:a})}catch(i){r=!1}return r}function cg(){return Uv().__localeId__}function ug(e){if("string"===typeof e){var t=Uv();return t.__localeData__?t.__localeData__[e]:void 0}return e}function dg(e,t){return Vv(yh(Yv(),e),"LLLL",t)}function fg(e,t){return Vv(yh(Yv(),e),"LLL",t)}function pg(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.maxDate,a=n.excludeDates,i=n.excludeDateIntervals,s=n.includeDates,l=n.includeDateIntervals,c=n.filterDate;return kg(e,{minDate:r,maxDate:o})||a&&a.some((function(t){return t instanceof Date?ig(e,t):ig(e,t.date)}))||i&&i.some((function(t){var n=t.start,r=t.end;return vh(e,{start:n,end:r})}))||s&&!s.some((function(t){return ig(e,t)}))||l&&!l.some((function(t){var n=t.start,r=t.end;return vh(e,{start:n,end:r})}))||c&&!c(Yv(e))||!1}function hg(e,t){var n=void 0===t?{}:t,r=n.excludeDates,o=n.excludeDateIntervals;return o&&o.length>0?o.some((function(t){var n=t.start,r=t.end;return vh(e,{start:n,end:r})})):r&&r.some((function(t){var n;return t instanceof Date?ig(e,t):ig(e,null!==(n=t.date)&&void 0!==n?n:new Date)}))||!1}function mg(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.maxDate,a=n.excludeDates,i=n.includeDates,s=n.filterDate;return kg(e,{minDate:r?ih(r):void 0,maxDate:o?uh(o):void 0})||(null===a||void 0===a?void 0:a.some((function(t){return og(e,t instanceof Date?t:t.date)})))||i&&!i.some((function(t){return og(e,t)}))||s&&!s(Yv(e))||!1}function vg(e,t,n,r){var o=wh(e),a=xh(e),i=wh(t),s=xh(t),l=wh(r);return o===i&&o===l?a<=n&&n<=s:o<i&&(l===o&&a<=n||l===i&&s>=n||l<i&&l>o)}function gg(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.maxDate,a=n.excludeDates,i=n.includeDates;return kg(e,{minDate:r,maxDate:o})||a&&a.some((function(t){return og(t instanceof Date?t:t.date,e)}))||i&&!i.some((function(t){return og(t,e)}))||!1}function yg(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.maxDate,a=n.excludeDates,i=n.includeDates,s=n.filterDate;return kg(e,{minDate:r,maxDate:o})||(null===a||void 0===a?void 0:a.some((function(t){return ag(e,t instanceof Date?t:t.date)})))||i&&!i.some((function(t){return ag(e,t)}))||s&&!s(Yv(e))||!1}function bg(e,t,n){if(!t||!n)return!1;if(!_p(t)||!_p(n))return!1;var r=wh(t),o=wh(n);return r<=e&&o>=e}function wg(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.maxDate,a=n.excludeDates,i=n.includeDates,s=n.filterDate,l=new Date(e,0,1);return kg(l,{minDate:r?Lp(r):void 0,maxDate:o?kh(o):void 0})||(null===a||void 0===a?void 0:a.some((function(e){return rg(l,e instanceof Date?e:e.date)})))||i&&!i.some((function(e){return rg(l,e)}))||s&&!s(Yv(l))||!1}function xg(e,t,n,r){var o=wh(e),a=Sh(e),i=wh(t),s=Sh(t),l=wh(r);return o===i&&o===l?a<=n&&n<=s:o<i&&(l===o&&a<=n||l===i&&s>=n||l<i&&l>o)}function kg(e,t){var n,r=void 0===t?{}:t,o=r.minDate,a=r.maxDate;return null!==(n=o&&Ap(e,o)<0||a&&Ap(e,a)>0)&&void 0!==n&&n}function Sg(e,t){return t.some((function(t){return Eh(t)===Eh(e)&&Ch(t)===Ch(e)&&Nh(t)===Nh(e)}))}function Eg(e,t){var n=void 0===t?{}:t,r=n.excludeTimes,o=n.includeTimes,a=n.filterTime;return r&&Sg(e,r)||o&&!Sg(e,o)||a&&!a(e)||!1}function Cg(e,t){var n=t.minTime,r=t.maxTime;if(!n||!r)throw new Error("Both minTime and maxTime props required");var o=Yv();o=ah(o=oh(o=rh(o,Eh(e)),Ch(e)),Nh(e));var a=Yv();a=ah(a=oh(a=rh(a,Eh(n)),Ch(n)),Nh(n));var i,s=Yv();s=ah(s=oh(s=rh(s,Eh(r)),Ch(r)),Nh(r));try{i=!vh(o,{start:a,end:s})}catch(l){i=!1}return i}function Ng(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.includeDates,a=Dh(e,1);return r&&Ph(r,a)>0||o&&o.every((function(e){return Ph(e,a)>0}))||!1}function jg(e,t){var n=void 0===t?{}:t,r=n.maxDate,o=n.includeDates,a=jh(e,1);return r&&Ph(a,r)>0||o&&o.every((function(e){return Ph(a,e)>0}))||!1}function Dg(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.includeDates,a=Rh(e,1);return r&&Ah(r,a)>0||o&&o.every((function(e){return Ah(e,a)>0}))||!1}function Pg(e,t){var n=void 0===t?{}:t,r=n.maxDate,o=n.includeDates,a=Mh(e,1);return r&&Ah(a,r)>0||o&&o.every((function(e){return Ah(a,e)>0}))||!1}function Tg(e){var t=e.minDate,n=e.includeDates;return n&&t?Lh(n.filter((function(e){return Ap(e,t)>=0}))):n?Lh(n):t}function _g(e){var t=e.maxDate,n=e.includeDates;return n&&t?Ih(n.filter((function(e){return Ap(e,t)<=0}))):n?Ih(n):t}function Og(e,t){var n;void 0===e&&(e=[]),void 0===t&&(t="react-datepicker__day--highlighted");for(var r=new Map,o=0,a=e.length;o<a;o++){var i=e[o];if(Tp(i)){var s=Vv(i,"MM.dd.yyyy");(p=r.get(s)||[]).includes(t)||(p.push(t),r.set(s,p))}else if("object"===typeof i){var l=null!==(n=Object.keys(i)[0])&&void 0!==n?n:"",c=i[l];if("string"===typeof l&&Array.isArray(c))for(var u=0,d=c.length;u<d;u++){var f=c[u];if(f){var p;s=Vv(f,"MM.dd.yyyy");(p=r.get(s)||[]).includes(l)||(p.push(l),r.set(s,p))}}}}return r}function Mg(e,t){void 0===e&&(e=[]),void 0===t&&(t="react-datepicker__day--holidays");var n=new Map;return e.forEach((function(e){var r=e.date,o=e.holidayName;if(Tp(r)){var a=Vv(r,"MM.dd.yyyy"),i=n.get(a)||{className:"",holidayNames:[]};if(!("className"in i)||i.className!==t||(s=i.holidayNames,l=[o],s.length!==l.length||!s.every((function(e,t){return e===l[t]})))){var s,l;i.className=t;var c=i.holidayNames;i.holidayNames=c?Fv(Fv([],c,!0),[o],!1):[o],n.set(a,i)}}})),n}function Rg(e,t,n,r,o){for(var a=o.length,i=[],s=0;s<a;s++){var l=e,c=o[s];c&&(l=Hh(l=Bh(l=zh(l,Eh(c)),Ch(c)),Nh(c)));var u=Bh(e,(n+1)*r);Uh(l,t)&&Op(l,u)&&void 0!=c&&i.push(c)}return i}function Ag(e){return e<10?"0".concat(e):"".concat(e)}function Lg(e,t){void 0===t&&(t=12);var n=Math.ceil(wh(e)/t)*t;return{startPeriod:n-(t-1),endPeriod:n}}function Ig(e){var t=e.getSeconds(),n=e.getMilliseconds();return Ud(e.getTime()-1e3*t-n)}function Fg(e){if(!Tp(e))throw new Error("Invalid date");var t=new Date(e);return t.setHours(0,0,0,0),t}function zg(e,t){if(!Tp(e)||!Tp(t))throw new Error("Invalid date received");return Op(Fg(e),Fg(t))}function Bg(e){return e.key===zv.Space}var Hg,Ug=function(e){function t(t){var n=e.call(this,t)||this;return n.inputRef=r.createRef(),n.onTimeChange=function(e){var t,r;n.setState({time:e});var o=n.props.date,a=o instanceof Date&&!isNaN(+o)?o:new Date;if(null===e||void 0===e?void 0:e.includes(":")){var i=e.split(":"),s=i[0],l=i[1];a.setHours(Number(s)),a.setMinutes(Number(l))}null===(r=(t=n.props).onChange)||void 0===r||r.call(t,a)},n.renderTimeInput=function(){var e=n.state.time,t=n.props,o=t.date,a=t.timeString,i=t.customTimeInput;return i?(0,r.cloneElement)(i,{date:o,value:e,onChange:n.onTimeChange}):r.createElement("input",{type:"time",className:"react-datepicker-time__input",placeholder:"Time",name:"time-input",ref:n.inputRef,onClick:function(){var e;null===(e=n.inputRef.current)||void 0===e||e.focus()},required:!0,value:e,onChange:function(e){n.onTimeChange(e.target.value||a)}})},n.state={time:n.props.timeString},n}return Lv(t,e),t.getDerivedStateFromProps=function(e,t){return e.timeString!==t.time?{time:e.timeString}:null},t.prototype.render=function(){return r.createElement("div",{className:"react-datepicker__input-time-container"},r.createElement("div",{className:"react-datepicker-time__caption"},this.props.timeInputLabel),r.createElement("div",{className:"react-datepicker-time__input-container"},r.createElement("div",{className:"react-datepicker-time__input"},this.renderTimeInput())))},t}(r.Component),Yg=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.dayEl=(0,r.createRef)(),t.handleClick=function(e){!t.isDisabled()&&t.props.onClick&&t.props.onClick(e)},t.handleMouseEnter=function(e){!t.isDisabled()&&t.props.onMouseEnter&&t.props.onMouseEnter(e)},t.handleOnKeyDown=function(e){var n,r;e.key===zv.Space&&(e.preventDefault(),e.key=zv.Enter),null===(r=(n=t.props).handleOnKeyDown)||void 0===r||r.call(n,e)},t.isSameDay=function(e){return ig(t.props.day,e)},t.isKeyboardSelected=function(){var e;if(t.props.disabledKeyboardNavigation)return!1;var n=t.props.selectsMultiple?null===(e=t.props.selectedDates)||void 0===e?void 0:e.some((function(e){return t.isSameDayOrWeek(e)})):t.isSameDayOrWeek(t.props.selected),r=t.props.preSelection&&t.isDisabled(t.props.preSelection);return!n&&t.isSameDayOrWeek(t.props.preSelection)&&!r},t.isDisabled=function(e){return void 0===e&&(e=t.props.day),pg(e,{minDate:t.props.minDate,maxDate:t.props.maxDate,excludeDates:t.props.excludeDates,excludeDateIntervals:t.props.excludeDateIntervals,includeDateIntervals:t.props.includeDateIntervals,includeDates:t.props.includeDates,filterDate:t.props.filterDate})},t.isExcluded=function(){return hg(t.props.day,{excludeDates:t.props.excludeDates,excludeDateIntervals:t.props.excludeDateIntervals})},t.isStartOfWeek=function(){return ig(t.props.day,Gv(t.props.day,t.props.locale,t.props.calendarStartDay))},t.isSameWeek=function(e){return t.props.showWeekPicker&&ig(e,Gv(t.props.day,t.props.locale,t.props.calendarStartDay))},t.isSameDayOrWeek=function(e){return t.isSameDay(e)||t.isSameWeek(e)},t.getHighLightedClass=function(){var e=t.props,n=e.day,r=e.highlightDates;if(!r)return!1;var o=Vv(n,"MM.dd.yyyy");return r.get(o)},t.getHolidaysClass=function(){var e,n=t.props,r=n.day,o=n.holidays;if(!o)return[void 0];var a=Vv(r,"MM.dd.yyyy");return o.has(a)?[null===(e=o.get(a))||void 0===e?void 0:e.className]:[void 0]},t.isInRange=function(){var e=t.props,n=e.day,r=e.startDate,o=e.endDate;return!(!r||!o)&&lg(n,r,o)},t.isInSelectingRange=function(){var e,n=t.props,r=n.day,o=n.selectsStart,a=n.selectsEnd,i=n.selectsRange,s=n.selectsDisabledDaysInRange,l=n.startDate,c=n.endDate,u=null!==(e=t.props.selectingDate)&&void 0!==e?e:t.props.preSelection;return!(!(o||a||i)||!u||!s&&t.isDisabled())&&(o&&c&&(Op(u,c)||sg(u,c))?lg(r,u,c):(a&&l&&!c&&(Uh(u,l)||sg(u,l))||!(!i||!l||c||!Uh(u,l)&&!sg(u,l)))&&lg(r,l,u))},t.isSelectingRangeStart=function(){var e;if(!t.isInSelectingRange())return!1;var n=t.props,r=n.day,o=n.startDate,a=n.selectsStart,i=null!==(e=t.props.selectingDate)&&void 0!==e?e:t.props.preSelection;return ig(r,a?i:o)},t.isSelectingRangeEnd=function(){var e;if(!t.isInSelectingRange())return!1;var n=t.props,r=n.day,o=n.endDate,a=n.selectsEnd,i=n.selectsRange,s=null!==(e=t.props.selectingDate)&&void 0!==e?e:t.props.preSelection;return ig(r,a||i?s:o)},t.isRangeStart=function(){var e=t.props,n=e.day,r=e.startDate,o=e.endDate;return!(!r||!o)&&ig(r,n)},t.isRangeEnd=function(){var e=t.props,n=e.day,r=e.startDate,o=e.endDate;return!(!r||!o)&&ig(o,n)},t.isWeekend=function(){var e=Yh(t.props.day);return 0===e||6===e},t.isAfterMonth=function(){return void 0!==t.props.month&&(t.props.month+1)%12===xh(t.props.day)},t.isBeforeMonth=function(){return void 0!==t.props.month&&(xh(t.props.day)+1)%12===t.props.month},t.isCurrentDay=function(){return t.isSameDay(Yv())},t.isSelected=function(){var e;return t.props.selectsMultiple?null===(e=t.props.selectedDates)||void 0===e?void 0:e.some((function(e){return t.isSameDayOrWeek(e)})):t.isSameDayOrWeek(t.props.selected)},t.getClassNames=function(e){return Ld("react-datepicker__day",t.props.dayClassName?t.props.dayClassName(e):void 0,"react-datepicker__day--"+function(e,t){return Vv(e,"ddd",t)}(t.props.day),{"react-datepicker__day--disabled":t.isDisabled(),"react-datepicker__day--excluded":t.isExcluded(),"react-datepicker__day--selected":t.isSelected(),"react-datepicker__day--keyboard-selected":t.isKeyboardSelected(),"react-datepicker__day--range-start":t.isRangeStart(),"react-datepicker__day--range-end":t.isRangeEnd(),"react-datepicker__day--in-range":t.isInRange(),"react-datepicker__day--in-selecting-range":t.isInSelectingRange(),"react-datepicker__day--selecting-range-start":t.isSelectingRangeStart(),"react-datepicker__day--selecting-range-end":t.isSelectingRangeEnd(),"react-datepicker__day--today":t.isCurrentDay(),"react-datepicker__day--weekend":t.isWeekend(),"react-datepicker__day--outside-month":t.isAfterMonth()||t.isBeforeMonth()},t.getHighLightedClass(),t.getHolidaysClass())},t.getAriaLabel=function(){var e=t.props,n=e.day,r=e.ariaLabelPrefixWhenEnabled,o=void 0===r?"Choose":r,a=e.ariaLabelPrefixWhenDisabled,i=void 0===a?"Not available":a,s=t.isDisabled()||t.isExcluded()?i:o;return"".concat(s," ").concat(Vv(n,"PPPP",t.props.locale))},t.getTitle=function(){var e=t.props,n=e.day,r=e.holidays,o=void 0===r?new Map:r,a=e.excludeDates,i=Vv(n,"MM.dd.yyyy"),s=[];return o.has(i)&&s.push.apply(s,o.get(i).holidayNames),t.isExcluded()&&s.push(null===a||void 0===a?void 0:a.filter((function(e){return e instanceof Date?ig(e,n):ig(null===e||void 0===e?void 0:e.date,n)})).map((function(e){if(!(e instanceof Date))return null===e||void 0===e?void 0:e.message}))),s.join(", ")},t.getTabIndex=function(){var e=t.props.selected,n=t.props.preSelection;return(!t.props.showWeekPicker||!t.props.showWeekNumber&&t.isStartOfWeek())&&(t.isKeyboardSelected()||t.isSameDay(e)&&ig(n,e))?0:-1},t.handleFocusDay=function(){var e;t.shouldFocusDay()&&(null===(e=t.dayEl.current)||void 0===e||e.focus({preventScroll:!0}))},t.renderDayContents=function(){return t.props.monthShowsDuplicateDaysEnd&&t.isAfterMonth()||t.props.monthShowsDuplicateDaysStart&&t.isBeforeMonth()?null:t.props.renderDayContents?t.props.renderDayContents(Wh(t.props.day),t.props.day):Wh(t.props.day)},t.render=function(){return r.createElement("div",{ref:t.dayEl,className:t.getClassNames(t.props.day),onKeyDown:t.handleOnKeyDown,onClick:t.handleClick,onMouseEnter:t.props.usePointerEvent?void 0:t.handleMouseEnter,onPointerEnter:t.props.usePointerEvent?t.handleMouseEnter:void 0,tabIndex:t.getTabIndex(),"aria-label":t.getAriaLabel(),role:"option",title:t.getTitle(),"aria-disabled":t.isDisabled(),"aria-current":t.isCurrentDay()?"date":void 0,"aria-selected":t.isSelected()||t.isInRange()},t.renderDayContents(),""!==t.getTitle()&&r.createElement("span",{className:"overlay"},t.getTitle()))},t}return Lv(t,e),t.prototype.componentDidMount=function(){this.handleFocusDay()},t.prototype.componentDidUpdate=function(){this.handleFocusDay()},t.prototype.shouldFocusDay=function(){var e=!1;return 0===this.getTabIndex()&&this.isSameDay(this.props.preSelection)&&(document.activeElement&&document.activeElement!==document.body||(e=!0),this.props.inline&&!this.props.shouldFocusDayInline&&(e=!1),this.isDayActiveElement()&&(e=!0),this.isDuplicateDay()&&(e=!1)),e},t.prototype.isDayActiveElement=function(){var e,t,n;return(null===(t=null===(e=this.props.containerRef)||void 0===e?void 0:e.current)||void 0===t?void 0:t.contains(document.activeElement))&&(null===(n=document.activeElement)||void 0===n?void 0:n.classList.contains("react-datepicker__day"))},t.prototype.isDuplicateDay=function(){return this.props.monthShowsDuplicateDaysEnd&&this.isAfterMonth()||this.props.monthShowsDuplicateDaysStart&&this.isBeforeMonth()},t}(r.Component),Wg=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.weekNumberEl=(0,r.createRef)(),t.handleClick=function(e){t.props.onClick&&t.props.onClick(e)},t.handleOnKeyDown=function(e){var n,r;e.key===zv.Space&&(e.preventDefault(),e.key=zv.Enter),null===(r=(n=t.props).handleOnKeyDown)||void 0===r||r.call(n,e)},t.isKeyboardSelected=function(){return!t.props.disabledKeyboardNavigation&&!ig(t.props.date,t.props.selected)&&ig(t.props.date,t.props.preSelection)},t.getTabIndex=function(){return t.props.showWeekPicker&&t.props.showWeekNumber&&(t.isKeyboardSelected()||ig(t.props.date,t.props.selected)&&ig(t.props.preSelection,t.props.selected))?0:-1},t.handleFocusWeekNumber=function(e){var n=!1;0===t.getTabIndex()&&!(null===e||void 0===e?void 0:e.isInputFocused)&&ig(t.props.date,t.props.preSelection)&&(document.activeElement&&document.activeElement!==document.body||(n=!0),t.props.inline&&!t.props.shouldFocusDayInline&&(n=!1),t.props.containerRef&&t.props.containerRef.current&&t.props.containerRef.current.contains(document.activeElement)&&document.activeElement&&document.activeElement.classList.contains("react-datepicker__week-number")&&(n=!0)),n&&t.weekNumberEl.current&&t.weekNumberEl.current.focus({preventScroll:!0})},t}return Lv(t,e),Object.defineProperty(t,"defaultProps",{get:function(){return{ariaLabelPrefix:"week "}},enumerable:!1,configurable:!0}),t.prototype.componentDidMount=function(){this.handleFocusWeekNumber()},t.prototype.componentDidUpdate=function(e){this.handleFocusWeekNumber(e)},t.prototype.render=function(){var e=this.props,n=e.weekNumber,o=e.isWeekDisabled,a=e.ariaLabelPrefix,i=void 0===a?t.defaultProps.ariaLabelPrefix:a,s=e.onClick,l={"react-datepicker__week-number":!0,"react-datepicker__week-number--clickable":!!s&&!o,"react-datepicker__week-number--selected":!!s&&ig(this.props.date,this.props.selected)};return r.createElement("div",{ref:this.weekNumberEl,className:Ld(l),"aria-label":"".concat(i," ").concat(this.props.weekNumber),onClick:this.handleClick,onKeyDown:this.handleOnKeyDown,tabIndex:this.getTabIndex()},n)},t}(r.Component),qg=function(e){function t(){var n=null!==e&&e.apply(this,arguments)||this;return n.isDisabled=function(e){return pg(e,{minDate:n.props.minDate,maxDate:n.props.maxDate,excludeDates:n.props.excludeDates,excludeDateIntervals:n.props.excludeDateIntervals,includeDateIntervals:n.props.includeDateIntervals,includeDates:n.props.includeDates,filterDate:n.props.filterDate})},n.handleDayClick=function(e,t){n.props.onDayClick&&n.props.onDayClick(e,t)},n.handleDayMouseEnter=function(e){n.props.onDayMouseEnter&&n.props.onDayMouseEnter(e)},n.handleWeekClick=function(e,r,o){for(var a,i,s,l=new Date(e),c=0;c<7;c++){var u=new Date(e);if(u.setDate(u.getDate()+c),!n.isDisabled(u)){l=u;break}}"function"===typeof n.props.onWeekSelect&&n.props.onWeekSelect(l,r,o),n.props.showWeekPicker&&n.handleDayClick(l,o),(null!==(a=n.props.shouldCloseOnSelect)&&void 0!==a?a:t.defaultProps.shouldCloseOnSelect)&&(null===(s=(i=n.props).setOpen)||void 0===s||s.call(i,!1))},n.formatWeekNumber=function(e){return n.props.formatWeekNumber?n.props.formatWeekNumber(e):function(e){return pp(e)}(e)},n.isWeekDisabled=function(){for(var e=n.startOfWeek(),t=gp(e,6),r=new Date(e);r<=t;){if(!n.isDisabled(r))return!1;r=gp(r,1)}return!0},n.renderDays=function(){var e=n.startOfWeek(),o=[],a=n.formatWeekNumber(e);if(n.props.showWeekNumber){var i=n.props.onWeekSelect||n.props.showWeekPicker?n.handleWeekClick.bind(n,e,a):void 0;o.push(r.createElement(Wg,Iv({key:"W"},t.defaultProps,n.props,{weekNumber:a,isWeekDisabled:n.isWeekDisabled(),date:e,onClick:i})))}return o.concat([0,1,2,3,4,5,6].map((function(o){var a=gp(e,o);return r.createElement(Yg,Iv({},t.defaultProps,n.props,{ariaLabelPrefixWhenEnabled:n.props.chooseDayAriaLabelPrefix,ariaLabelPrefixWhenDisabled:n.props.disabledDayAriaLabelPrefix,key:a.valueOf(),day:a,onClick:n.handleDayClick.bind(n,a),onMouseEnter:n.handleDayMouseEnter.bind(n,a)}))})))},n.startOfWeek=function(){return Gv(n.props.day,n.props.locale,n.props.calendarStartDay)},n.isKeyboardSelected=function(){return!n.props.disabledKeyboardNavigation&&!ig(n.startOfWeek(),n.props.selected)&&ig(n.startOfWeek(),n.props.preSelection)},n}return Lv(t,e),Object.defineProperty(t,"defaultProps",{get:function(){return{shouldCloseOnSelect:!0}},enumerable:!1,configurable:!0}),t.prototype.render=function(){var e={"react-datepicker__week":!0,"react-datepicker__week--selected":ig(this.startOfWeek(),this.props.selected),"react-datepicker__week--keyboard-selected":this.isKeyboardSelected()};return r.createElement("div",{className:Ld(e)},this.renderDays())},t}(r.Component),Vg="two_columns",Qg="three_columns",Kg="four_columns",$g=((Hg={})[Vg]={grid:[[0,1],[2,3],[4,5],[6,7],[8,9],[10,11]],verticalNavigationOffset:2},Hg[Qg]={grid:[[0,1,2],[3,4,5],[6,7,8],[9,10,11]],verticalNavigationOffset:3},Hg[Kg]={grid:[[0,1,2,3],[4,5,6,7],[8,9,10,11]],verticalNavigationOffset:4},Hg);function Gg(e,t){return e?Kg:t?Vg:Qg}var Xg=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.MONTH_REFS=Fv([],Array(12),!0).map((function(){return(0,r.createRef)()})),t.QUARTER_REFS=Fv([],Array(4),!0).map((function(){return(0,r.createRef)()})),t.isDisabled=function(e){return pg(e,{minDate:t.props.minDate,maxDate:t.props.maxDate,excludeDates:t.props.excludeDates,excludeDateIntervals:t.props.excludeDateIntervals,includeDateIntervals:t.props.includeDateIntervals,includeDates:t.props.includeDates,filterDate:t.props.filterDate})},t.isExcluded=function(e){return hg(e,{excludeDates:t.props.excludeDates,excludeDateIntervals:t.props.excludeDateIntervals})},t.handleDayClick=function(e,n){var r,o;null===(o=(r=t.props).onDayClick)||void 0===o||o.call(r,e,n,t.props.orderInDisplay)},t.handleDayMouseEnter=function(e){var n,r;null===(r=(n=t.props).onDayMouseEnter)||void 0===r||r.call(n,e)},t.handleMouseLeave=function(){var e,n;null===(n=(e=t.props).onMouseLeave)||void 0===n||n.call(e)},t.isRangeStartMonth=function(e){var n=t.props,r=n.day,o=n.startDate,a=n.endDate;return!(!o||!a)&&og(yh(r,e),o)},t.isRangeStartQuarter=function(e){var n=t.props,r=n.day,o=n.startDate,a=n.endDate;return!(!o||!a)&&ag(bh(r,e),o)},t.isRangeEndMonth=function(e){var n=t.props,r=n.day,o=n.startDate,a=n.endDate;return!(!o||!a)&&og(yh(r,e),a)},t.isRangeEndQuarter=function(e){var n=t.props,r=n.day,o=n.startDate,a=n.endDate;return!(!o||!a)&&ag(bh(r,e),a)},t.isInSelectingRangeMonth=function(e){var n,r=t.props,o=r.day,a=r.selectsStart,i=r.selectsEnd,s=r.selectsRange,l=r.startDate,c=r.endDate,u=null!==(n=t.props.selectingDate)&&void 0!==n?n:t.props.preSelection;return!(!(a||i||s)||!u)&&(a&&c?vg(u,c,e,o):(i&&l||!(!s||!l||c))&&vg(l,u,e,o))},t.isSelectingMonthRangeStart=function(e){var n;if(!t.isInSelectingRangeMonth(e))return!1;var r=t.props,o=r.day,a=r.startDate,i=r.selectsStart,s=yh(o,e),l=null!==(n=t.props.selectingDate)&&void 0!==n?n:t.props.preSelection;return og(s,i?l:a)},t.isSelectingMonthRangeEnd=function(e){var n;if(!t.isInSelectingRangeMonth(e))return!1;var r=t.props,o=r.day,a=r.endDate,i=r.selectsEnd,s=r.selectsRange,l=yh(o,e),c=null!==(n=t.props.selectingDate)&&void 0!==n?n:t.props.preSelection;return og(l,i||s?c:a)},t.isInSelectingRangeQuarter=function(e){var n,r=t.props,o=r.day,a=r.selectsStart,i=r.selectsEnd,s=r.selectsRange,l=r.startDate,c=r.endDate,u=null!==(n=t.props.selectingDate)&&void 0!==n?n:t.props.preSelection;return!(!(a||i||s)||!u)&&(a&&c?xg(u,c,e,o):(i&&l||!(!s||!l||c))&&xg(l,u,e,o))},t.isWeekInMonth=function(e){var n=t.props.day,r=gp(e,6);return og(e,n)||og(r,n)},t.isCurrentMonth=function(e,t){return wh(e)===wh(Yv())&&t===xh(Yv())},t.isCurrentQuarter=function(e,t){return wh(e)===wh(Yv())&&t===Sh(Yv())},t.isSelectedMonth=function(e,t,n){return xh(n)===t&&wh(e)===wh(n)},t.isSelectMonthInList=function(e,n,r){return r.some((function(r){return t.isSelectedMonth(e,n,r)}))},t.isSelectedQuarter=function(e,t,n){return Sh(e)===t&&wh(e)===wh(n)},t.renderWeeks=function(){for(var e=[],n=t.props.fixedHeight,o=0,a=!1,i=Gv(Xv(t.props.day),t.props.locale,t.props.calendarStartDay),s=t.props.selected?function(e){return t.props.showWeekPicker?Gv(e,t.props.locale,t.props.calendarStartDay):t.props.selected}(t.props.selected):void 0,l=t.props.preSelection?function(e){return t.props.showWeekPicker?Gv(e,t.props.locale,t.props.calendarStartDay):t.props.preSelection}(t.props.preSelection):void 0;e.push(r.createElement(qg,Iv({},t.props,{ariaLabelPrefix:t.props.weekAriaLabelPrefix,key:o,day:i,month:xh(t.props.day),onDayClick:t.handleDayClick,onDayMouseEnter:t.handleDayMouseEnter,selected:s,preSelection:l,showWeekNumber:t.props.showWeekNumbers}))),!a;){o++,i=qh(i,1);var c=n&&o>=6,u=!n&&!t.isWeekInMonth(i);if(c||u){if(!t.props.peekNextMonth)break;a=!0}}return e},t.onMonthClick=function(e,n){var r=t.isMonthDisabledForLabelDate(n),o=r.isDisabled,a=r.labelDate;o||t.handleDayClick(Xv(a),e)},t.onMonthMouseEnter=function(e){var n=t.isMonthDisabledForLabelDate(e),r=n.isDisabled,o=n.labelDate;r||t.handleDayMouseEnter(Xv(o))},t.handleMonthNavigation=function(e,n){var r,o,a,i;null===(o=(r=t.props).setPreSelection)||void 0===o||o.call(r,n),null===(i=null===(a=t.MONTH_REFS[e])||void 0===a?void 0:a.current)||void 0===i||i.focus()},t.handleKeyboardNavigation=function(e,n,r){var o,a=t.props,i=a.selected,s=a.preSelection,l=a.setPreSelection,c=a.minDate,u=a.maxDate,d=a.showFourColumnMonthYearPicker,f=a.showTwoColumnMonthYearPicker;if(s){var p=Gg(d,f),h=t.getVerticalOffset(p),m=null===(o=$g[p])||void 0===o?void 0:o.grid,v=function(e,t,n){var r,o,a=t,i=n;switch(e){case zv.ArrowRight:a=jh(t,1),i=11===n?0:n+1;break;case zv.ArrowLeft:a=Dh(t,1),i=0===n?11:n-1;break;case zv.ArrowUp:a=Dh(t,h),i=(null===(r=null===m||void 0===m?void 0:m[0])||void 0===r?void 0:r.includes(n))?n+12-h:n-h;break;case zv.ArrowDown:a=jh(t,h),i=(null===(o=null===m||void 0===m?void 0:m[m.length-1])||void 0===o?void 0:o.includes(n))?n-12+h:n+h}return{newCalculatedDate:a,newCalculatedMonth:i}};if(n!==zv.Enter){var g=function(e,n,r){for(var o=e,a=!1,i=0,s=v(o,n,r),l=s.newCalculatedDate,d=s.newCalculatedMonth;!a;){if(i>=40){l=n,d=r;break}var f;if(c&&l<c)o=zv.ArrowRight,l=(f=v(o,l,d)).newCalculatedDate,d=f.newCalculatedMonth;if(u&&l>u)o=zv.ArrowLeft,l=(f=v(o,l,d)).newCalculatedDate,d=f.newCalculatedMonth;if(gg(l,t.props))l=(f=v(o,l,d)).newCalculatedDate,d=f.newCalculatedMonth;else a=!0;i++}return{newCalculatedDate:l,newCalculatedMonth:d}}(n,s,r),y=g.newCalculatedDate,b=g.newCalculatedMonth;switch(n){case zv.ArrowRight:case zv.ArrowLeft:case zv.ArrowUp:case zv.ArrowDown:t.handleMonthNavigation(b,y)}}else t.isMonthDisabled(r)||(t.onMonthClick(e,r),null===l||void 0===l||l(i))}},t.getVerticalOffset=function(e){var t,n;return null!==(n=null===(t=$g[e])||void 0===t?void 0:t.verticalNavigationOffset)&&void 0!==n?n:0},t.onMonthKeyDown=function(e,n){var r=t.props,o=r.disabledKeyboardNavigation,a=r.handleOnMonthKeyDown,i=e.key;i!==zv.Tab&&e.preventDefault(),o||t.handleKeyboardNavigation(e,i,n),a&&a(e)},t.onQuarterClick=function(e,n){var r=bh(t.props.day,n);yg(r,t.props)||t.handleDayClick(Zv(r),e)},t.onQuarterMouseEnter=function(e){var n=bh(t.props.day,e);yg(n,t.props)||t.handleDayMouseEnter(Zv(n))},t.handleQuarterNavigation=function(e,n){var r,o,a,i;t.isDisabled(n)||t.isExcluded(n)||(null===(o=(r=t.props).setPreSelection)||void 0===o||o.call(r,n),null===(i=null===(a=t.QUARTER_REFS[e-1])||void 0===a?void 0:a.current)||void 0===i||i.focus())},t.onQuarterKeyDown=function(e,n){var r,o,a=e.key;if(!t.props.disabledKeyboardNavigation)switch(a){case zv.Enter:t.onQuarterClick(e,n),null===(o=(r=t.props).setPreSelection)||void 0===o||o.call(r,t.props.selected);break;case zv.ArrowRight:if(!t.props.preSelection)break;t.handleQuarterNavigation(4===n?1:n+1,Th(t.props.preSelection,1));break;case zv.ArrowLeft:if(!t.props.preSelection)break;t.handleQuarterNavigation(1===n?4:n-1,_h(t.props.preSelection,1))}},t.isMonthDisabledForLabelDate=function(e){var n,r=t.props,o=r.day,a=r.minDate,i=r.maxDate,s=r.excludeDates,l=r.includeDates,c=yh(o,e);return{isDisabled:null!==(n=(a||i||s||l)&&mg(c,t.props))&&void 0!==n&&n,labelDate:c}},t.isMonthDisabled=function(e){return t.isMonthDisabledForLabelDate(e).isDisabled},t.getMonthClassNames=function(e){var n=t.props,r=n.day,o=n.startDate,a=n.endDate,i=n.preSelection,s=n.monthClassName,l=s?s(yh(r,e)):void 0,c=t.getSelection();return Ld("react-datepicker__month-text","react-datepicker__month-".concat(e),l,{"react-datepicker__month-text--disabled":t.isMonthDisabled(e),"react-datepicker__month-text--selected":c?t.isSelectMonthInList(r,e,c):void 0,"react-datepicker__month-text--keyboard-selected":!t.props.disabledKeyboardNavigation&&i&&t.isSelectedMonth(r,e,i)&&!t.isMonthDisabled(e),"react-datepicker__month-text--in-selecting-range":t.isInSelectingRangeMonth(e),"react-datepicker__month-text--in-range":o&&a?vg(o,a,e,r):void 0,"react-datepicker__month-text--range-start":t.isRangeStartMonth(e),"react-datepicker__month-text--range-end":t.isRangeEndMonth(e),"react-datepicker__month-text--selecting-range-start":t.isSelectingMonthRangeStart(e),"react-datepicker__month-text--selecting-range-end":t.isSelectingMonthRangeEnd(e),"react-datepicker__month-text--today":t.isCurrentMonth(r,e)})},t.getTabIndex=function(e){if(null==t.props.preSelection)return"-1";var n=xh(t.props.preSelection),r=t.isMonthDisabledForLabelDate(n).isDisabled;return e!==n||r||t.props.disabledKeyboardNavigation?"-1":"0"},t.getQuarterTabIndex=function(e){if(null==t.props.preSelection)return"-1";var n=Sh(t.props.preSelection),r=yg(t.props.day,t.props);return e!==n||r||t.props.disabledKeyboardNavigation?"-1":"0"},t.getAriaLabel=function(e){var n=t.props,r=n.chooseDayAriaLabelPrefix,o=void 0===r?"Choose":r,a=n.disabledDayAriaLabelPrefix,i=void 0===a?"Not available":a,s=n.day,l=n.locale,c=yh(s,e),u=t.isDisabled(c)||t.isExcluded(c)?i:o;return"".concat(u," ").concat(Vv(c,"MMMM yyyy",l))},t.getQuarterClassNames=function(e){var n=t.props,r=n.day,o=n.startDate,a=n.endDate,i=n.selected,s=n.minDate,l=n.maxDate,c=n.excludeDates,u=n.includeDates,d=n.filterDate,f=n.preSelection,p=n.disabledKeyboardNavigation,h=(s||l||c||u||d)&&yg(bh(r,e),t.props);return Ld("react-datepicker__quarter-text","react-datepicker__quarter-".concat(e),{"react-datepicker__quarter-text--disabled":h,"react-datepicker__quarter-text--selected":i?t.isSelectedQuarter(r,e,i):void 0,"react-datepicker__quarter-text--keyboard-selected":!p&&f&&t.isSelectedQuarter(r,e,f)&&!h,"react-datepicker__quarter-text--in-selecting-range":t.isInSelectingRangeQuarter(e),"react-datepicker__quarter-text--in-range":o&&a?xg(o,a,e,r):void 0,"react-datepicker__quarter-text--range-start":t.isRangeStartQuarter(e),"react-datepicker__quarter-text--range-end":t.isRangeEndQuarter(e),"react-datepicker__quarter-text--today":t.isCurrentQuarter(r,e)})},t.getMonthContent=function(e){var n=t.props,r=n.showFullMonthYearPicker,o=n.renderMonthContent,a=n.locale,i=n.day,s=fg(e,a),l=dg(e,a);return o?o(e,s,l,i):r?l:s},t.getQuarterContent=function(e){var n,r=t.props,o=r.renderQuarterContent,a=function(e,t){return Vv(bh(Yv(),e),"QQQ",t)}(e,r.locale);return null!==(n=null===o||void 0===o?void 0:o(e,a))&&void 0!==n?n:a},t.renderMonths=function(){var e,n=t.props,o=n.showTwoColumnMonthYearPicker,a=n.showFourColumnMonthYearPicker,i=n.day,s=n.selected,l=null===(e=$g[Gg(a,o)])||void 0===e?void 0:e.grid;return null===l||void 0===l?void 0:l.map((function(e,n){return r.createElement("div",{className:"react-datepicker__month-wrapper",key:n},e.map((function(e,n){return r.createElement("div",{ref:t.MONTH_REFS[e],key:n,onClick:function(n){t.onMonthClick(n,e)},onKeyDown:function(n){Bg(n)&&(n.preventDefault(),n.key=zv.Enter),t.onMonthKeyDown(n,e)},onMouseEnter:t.props.usePointerEvent?void 0:function(){return t.onMonthMouseEnter(e)},onPointerEnter:t.props.usePointerEvent?function(){return t.onMonthMouseEnter(e)}:void 0,tabIndex:Number(t.getTabIndex(e)),className:t.getMonthClassNames(e),"aria-disabled":t.isMonthDisabled(e),role:"option","aria-label":t.getAriaLabel(e),"aria-current":t.isCurrentMonth(i,e)?"date":void 0,"aria-selected":s?t.isSelectedMonth(i,e,s):void 0},t.getMonthContent(e))})))}))},t.renderQuarters=function(){var e=t.props,n=e.day,o=e.selected;return r.createElement("div",{className:"react-datepicker__quarter-wrapper"},[1,2,3,4].map((function(e,a){return r.createElement("div",{key:a,ref:t.QUARTER_REFS[a],role:"option",onClick:function(n){t.onQuarterClick(n,e)},onKeyDown:function(n){t.onQuarterKeyDown(n,e)},onMouseEnter:t.props.usePointerEvent?void 0:function(){return t.onQuarterMouseEnter(e)},onPointerEnter:t.props.usePointerEvent?function(){return t.onQuarterMouseEnter(e)}:void 0,className:t.getQuarterClassNames(e),"aria-selected":o?t.isSelectedQuarter(n,e,o):void 0,tabIndex:Number(t.getQuarterTabIndex(e)),"aria-current":t.isCurrentQuarter(n,e)?"date":void 0},t.getQuarterContent(e))})))},t.getClassNames=function(){var e=t.props,n=e.selectingDate,r=e.selectsStart,o=e.selectsEnd;return Ld("react-datepicker__month",{"react-datepicker__month--selecting-range":n&&(r||o)},{"react-datepicker__monthPicker":e.showMonthYearPicker},{"react-datepicker__quarterPicker":e.showQuarterYearPicker},{"react-datepicker__weekPicker":e.showWeekPicker})},t}return Lv(t,e),t.prototype.getSelection=function(){var e=this.props,t=e.selected,n=e.selectedDates;return e.selectsMultiple?n:t?[t]:void 0},t.prototype.render=function(){var e=this.props,t=e.showMonthYearPicker,n=e.showQuarterYearPicker,o=e.day,a=e.ariaLabelPrefix,i=void 0===a?"Month ":a,s=i?i.trim()+" ":"";return r.createElement("div",{className:this.getClassNames(),onMouseLeave:this.props.usePointerEvent?void 0:this.handleMouseLeave,onPointerLeave:this.props.usePointerEvent?this.handleMouseLeave:void 0,"aria-label":"".concat(s).concat(Vv(o,"MMMM, yyyy",this.props.locale)),role:"listbox"},t?this.renderMonths():n?this.renderQuarters():this.renderWeeks())},t}(r.Component),Jg=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.isSelectedMonth=function(e){return t.props.month===e},t.renderOptions=function(){return t.props.monthNames.map((function(e,n){return r.createElement("div",{className:t.isSelectedMonth(n)?"react-datepicker__month-option react-datepicker__month-option--selected_month":"react-datepicker__month-option",key:e,onClick:t.onChange.bind(t,n),"aria-selected":t.isSelectedMonth(n)?"true":void 0},t.isSelectedMonth(n)?r.createElement("span",{className:"react-datepicker__month-option--selected"},"\u2713"):"",e)}))},t.onChange=function(e){return t.props.onChange(e)},t.handleClickOutside=function(){return t.props.onCancel()},t}return Lv(t,e),t.prototype.render=function(){return r.createElement(Hv,{className:"react-datepicker__month-dropdown",onClickOutside:this.handleClickOutside},this.renderOptions())},t}(r.Component),Zg=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={dropdownVisible:!1},t.renderSelectOptions=function(e){return e.map((function(e,t){return r.createElement("option",{key:e,value:t},e)}))},t.renderSelectMode=function(e){return r.createElement("select",{value:t.props.month,className:"react-datepicker__month-select",onChange:function(e){return t.onChange(parseInt(e.target.value))}},t.renderSelectOptions(e))},t.renderReadView=function(e,n){return r.createElement("div",{key:"read",style:{visibility:e?"visible":"hidden"},className:"react-datepicker__month-read-view",onClick:t.toggleDropdown},r.createElement("span",{className:"react-datepicker__month-read-view--down-arrow"}),r.createElement("span",{className:"react-datepicker__month-read-view--selected-month"},n[t.props.month]))},t.renderDropdown=function(e){return r.createElement(Jg,Iv({key:"dropdown"},t.props,{monthNames:e,onChange:t.onChange,onCancel:t.toggleDropdown}))},t.renderScrollMode=function(e){var n=t.state.dropdownVisible,r=[t.renderReadView(!n,e)];return n&&r.unshift(t.renderDropdown(e)),r},t.onChange=function(e){t.toggleDropdown(),e!==t.props.month&&t.props.onChange(e)},t.toggleDropdown=function(){return t.setState({dropdownVisible:!t.state.dropdownVisible})},t}return Lv(t,e),t.prototype.render=function(){var e,t=this,n=[0,1,2,3,4,5,6,7,8,9,10,11].map(this.props.useShortMonthInDropdown?function(e){return fg(e,t.props.locale)}:function(e){return dg(e,t.props.locale)});switch(this.props.dropdownMode){case"scroll":e=this.renderScrollMode(n);break;case"select":e=this.renderSelectMode(n)}return r.createElement("div",{className:"react-datepicker__month-dropdown-container react-datepicker__month-dropdown-container--".concat(this.props.dropdownMode)},e)},t}(r.Component);function ey(e,t){for(var n=[],r=Xv(e),o=Xv(t);!Uh(r,o);)n.push(Yv(r)),r=jh(r,1);return n}var ty=function(e){function t(t){var n=e.call(this,t)||this;return n.renderOptions=function(){return n.state.monthYearsList.map((function(e){var t=Vh(e),o=rg(n.props.date,e)&&og(n.props.date,e);return r.createElement("div",{className:o?"react-datepicker__month-year-option--selected_month-year":"react-datepicker__month-year-option",key:t,onClick:n.onChange.bind(n,t),"aria-selected":o?"true":void 0},o?r.createElement("span",{className:"react-datepicker__month-year-option--selected"},"\u2713"):"",Vv(e,n.props.dateFormat,n.props.locale))}))},n.onChange=function(e){return n.props.onChange(e)},n.handleClickOutside=function(){n.props.onCancel()},n.state={monthYearsList:ey(n.props.minDate,n.props.maxDate)},n}return Lv(t,e),t.prototype.render=function(){var e=Ld({"react-datepicker__month-year-dropdown":!0,"react-datepicker__month-year-dropdown--scrollable":this.props.scrollableMonthYearDropdown});return r.createElement(Hv,{className:e,onClickOutside:this.handleClickOutside},this.renderOptions())},t}(r.Component),ny=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={dropdownVisible:!1},t.renderSelectOptions=function(){for(var e=Xv(t.props.minDate),n=Xv(t.props.maxDate),o=[];!Uh(e,n);){var a=Vh(e);o.push(r.createElement("option",{key:a,value:a},Vv(e,t.props.dateFormat,t.props.locale))),e=jh(e,1)}return o},t.onSelectChange=function(e){t.onChange(parseInt(e.target.value))},t.renderSelectMode=function(){return r.createElement("select",{value:Vh(Xv(t.props.date)),className:"react-datepicker__month-year-select",onChange:t.onSelectChange},t.renderSelectOptions())},t.renderReadView=function(e){var n=Vv(t.props.date,t.props.dateFormat,t.props.locale);return r.createElement("div",{key:"read",style:{visibility:e?"visible":"hidden"},className:"react-datepicker__month-year-read-view",onClick:t.toggleDropdown},r.createElement("span",{className:"react-datepicker__month-year-read-view--down-arrow"}),r.createElement("span",{className:"react-datepicker__month-year-read-view--selected-month-year"},n))},t.renderDropdown=function(){return r.createElement(ty,Iv({key:"dropdown"},t.props,{onChange:t.onChange,onCancel:t.toggleDropdown}))},t.renderScrollMode=function(){var e=t.state.dropdownVisible,n=[t.renderReadView(!e)];return e&&n.unshift(t.renderDropdown()),n},t.onChange=function(e){t.toggleDropdown();var n=Yv(e);rg(t.props.date,n)&&og(t.props.date,n)||t.props.onChange(n)},t.toggleDropdown=function(){return t.setState({dropdownVisible:!t.state.dropdownVisible})},t}return Lv(t,e),t.prototype.render=function(){var e;switch(this.props.dropdownMode){case"scroll":e=this.renderScrollMode();break;case"select":e=this.renderSelectMode()}return r.createElement("div",{className:"react-datepicker__month-year-dropdown-container react-datepicker__month-year-dropdown-container--".concat(this.props.dropdownMode)},e)},t}(r.Component),ry=function(e){function t(){var n=null!==e&&e.apply(this,arguments)||this;return n.state={height:null},n.scrollToTheSelectedTime=function(){requestAnimationFrame((function(){var e,r,o;n.list&&(n.list.scrollTop=null!==(o=n.centerLi&&t.calcCenterPosition(n.props.monthRef?n.props.monthRef.clientHeight-(null!==(r=null===(e=n.header)||void 0===e?void 0:e.clientHeight)&&void 0!==r?r:0):n.list.clientHeight,n.centerLi))&&void 0!==o?o:0)}))},n.handleClick=function(e){var t,r;(n.props.minTime||n.props.maxTime)&&Cg(e,n.props)||(n.props.excludeTimes||n.props.includeTimes||n.props.filterTime)&&Eg(e,n.props)||null===(r=(t=n.props).onChange)||void 0===r||r.call(t,e)},n.isSelectedTime=function(e){return n.props.selected&&(t=n.props.selected,r=e,Ig(t).getTime()===Ig(r).getTime());var t,r},n.isDisabledTime=function(e){return(n.props.minTime||n.props.maxTime)&&Cg(e,n.props)||(n.props.excludeTimes||n.props.includeTimes||n.props.filterTime)&&Eg(e,n.props)},n.liClasses=function(e){var r,o=["react-datepicker__time-list-item",n.props.timeClassName?n.props.timeClassName(e):void 0];return n.isSelectedTime(e)&&o.push("react-datepicker__time-list-item--selected"),n.isDisabledTime(e)&&o.push("react-datepicker__time-list-item--disabled"),n.props.injectTimes&&(3600*Eh(e)+60*Ch(e)+Nh(e))%(60*(null!==(r=n.props.intervals)&&void 0!==r?r:t.defaultProps.intervals))!==0&&o.push("react-datepicker__time-list-item--injected"),o.join(" ")},n.handleOnKeyDown=function(e,t){var r,o;e.key===zv.Space&&(e.preventDefault(),e.key=zv.Enter),(e.key===zv.ArrowUp||e.key===zv.ArrowLeft)&&e.target instanceof HTMLElement&&e.target.previousSibling&&(e.preventDefault(),e.target.previousSibling instanceof HTMLElement&&e.target.previousSibling.focus()),(e.key===zv.ArrowDown||e.key===zv.ArrowRight)&&e.target instanceof HTMLElement&&e.target.nextSibling&&(e.preventDefault(),e.target.nextSibling instanceof HTMLElement&&e.target.nextSibling.focus()),e.key===zv.Enter&&n.handleClick(t),null===(o=(r=n.props).handleOnKeyDown)||void 0===o||o.call(r,e)},n.renderTimes=function(){for(var e,o=[],a="string"===typeof n.props.format?n.props.format:"p",i=null!==(e=n.props.intervals)&&void 0!==e?e:t.defaultProps.intervals,s=n.props.selected||n.props.openToDate||Yv(),l=$v(s),c=n.props.injectTimes&&n.props.injectTimes.sort((function(e,t){return e.getTime()-t.getTime()})),u=60*function(e){var t=new Date(e.getFullYear(),e.getMonth(),e.getDate()),n=new Date(e.getFullYear(),e.getMonth(),e.getDate(),24);return Math.round((+n-+t)/36e5)}(s),d=u/i,f=0;f<d;f++){var p=Bh(l,f*i);if(o.push(p),c){var h=Rg(l,p,f,i,c);o=o.concat(h)}}var m=o.reduce((function(e,t){return t.getTime()<=s.getTime()?t:e}),o[0]);return o.map((function(e){return r.createElement("li",{key:e.valueOf(),onClick:n.handleClick.bind(n,e),className:n.liClasses(e),ref:function(t){e===m&&(n.centerLi=t)},onKeyDown:function(t){n.handleOnKeyDown(t,e)},tabIndex:e===m?0:-1,role:"option","aria-selected":n.isSelectedTime(e)?"true":void 0,"aria-disabled":n.isDisabledTime(e)?"true":void 0},Vv(e,a,n.props.locale))}))},n.renderTimeCaption=function(){return!1===n.props.showTimeCaption?r.createElement(r.Fragment,null):r.createElement("div",{className:"react-datepicker__header react-datepicker__header--time ".concat(n.props.showTimeSelectOnly?"react-datepicker__header--time--only":""),ref:function(e){n.header=e}},r.createElement("div",{className:"react-datepicker-time__header"},n.props.timeCaption))},n}return Lv(t,e),Object.defineProperty(t,"defaultProps",{get:function(){return{intervals:30,todayButton:null,timeCaption:"Time",showTimeCaption:!0}},enumerable:!1,configurable:!0}),t.prototype.componentDidMount=function(){this.scrollToTheSelectedTime(),this.observeDatePickerHeightChanges()},t.prototype.componentWillUnmount=function(){var e;null===(e=this.resizeObserver)||void 0===e||e.disconnect()},t.prototype.observeDatePickerHeightChanges=function(){var e=this,t=this.props.monthRef;this.updateContainerHeight(),t&&(this.resizeObserver=new ResizeObserver((function(){e.updateContainerHeight()})),this.resizeObserver.observe(t))},t.prototype.updateContainerHeight=function(){this.props.monthRef&&this.header&&this.setState({height:this.props.monthRef.clientHeight-this.header.clientHeight})},t.prototype.render=function(){var e,n=this,o=this.state.height;return r.createElement("div",{className:"react-datepicker__time-container ".concat((null!==(e=this.props.todayButton)&&void 0!==e?e:t.defaultProps.todayButton)?"react-datepicker__time-container--with-today-button":"")},this.renderTimeCaption(),r.createElement("div",{className:"react-datepicker__time"},r.createElement("div",{className:"react-datepicker__time-box"},r.createElement("ul",{className:"react-datepicker__time-list",ref:function(e){n.list=e},style:o?{height:o}:{},role:"listbox","aria-label":this.props.timeCaption},this.renderTimes()))))},t.calcCenterPosition=function(e,t){return t.offsetTop-(e/2-t.clientHeight/2)},t}(r.Component),oy=function(e){function t(t){var n=e.call(this,t)||this;return n.YEAR_REFS=Fv([],Array(n.props.yearItemNumber),!0).map((function(){return(0,r.createRef)()})),n.isDisabled=function(e){return pg(e,{minDate:n.props.minDate,maxDate:n.props.maxDate,excludeDates:n.props.excludeDates,includeDates:n.props.includeDates,filterDate:n.props.filterDate})},n.isExcluded=function(e){return hg(e,{excludeDates:n.props.excludeDates})},n.selectingDate=function(){var e;return null!==(e=n.props.selectingDate)&&void 0!==e?e:n.props.preSelection},n.updateFocusOnPaginate=function(e){window.requestAnimationFrame((function(){var t,r;null===(r=null===(t=n.YEAR_REFS[e])||void 0===t?void 0:t.current)||void 0===r||r.focus()}))},n.handleYearClick=function(e,t){n.props.onDayClick&&n.props.onDayClick(e,t)},n.handleYearNavigation=function(e,t){var r,o,a,i,s=n.props,l=s.date,c=s.yearItemNumber;if(void 0!==l&&void 0!==c){var u=Lg(l,c).startPeriod;n.isDisabled(t)||n.isExcluded(t)||(null===(o=(r=n.props).setPreSelection)||void 0===o||o.call(r,t),e-u<0?n.updateFocusOnPaginate(c-(u-e)):e-u>=c?n.updateFocusOnPaginate(Math.abs(c-(e-u))):null===(i=null===(a=n.YEAR_REFS[e-u])||void 0===a?void 0:a.current)||void 0===i||i.focus())}},n.isSameDay=function(e,t){return ig(e,t)},n.isCurrentYear=function(e){return e===wh(Yv())},n.isRangeStart=function(e){return n.props.startDate&&n.props.endDate&&rg(Qh(Yv(),e),n.props.startDate)},n.isRangeEnd=function(e){return n.props.startDate&&n.props.endDate&&rg(Qh(Yv(),e),n.props.endDate)},n.isInRange=function(e){return bg(e,n.props.startDate,n.props.endDate)},n.isInSelectingRange=function(e){var t=n.props,r=t.selectsStart,o=t.selectsEnd,a=t.selectsRange,i=t.startDate,s=t.endDate;return!(!(r||o||a)||!n.selectingDate())&&(r&&s?bg(e,n.selectingDate(),s):(o&&i||!(!a||!i||s))&&bg(e,i,n.selectingDate()))},n.isSelectingRangeStart=function(e){var t;if(!n.isInSelectingRange(e))return!1;var r=n.props,o=r.startDate,a=r.selectsStart,i=Qh(Yv(),e);return rg(i,a?null!==(t=n.selectingDate())&&void 0!==t?t:null:null!==o&&void 0!==o?o:null)},n.isSelectingRangeEnd=function(e){var t;if(!n.isInSelectingRange(e))return!1;var r=n.props,o=r.endDate,a=r.selectsEnd,i=r.selectsRange,s=Qh(Yv(),e);return rg(s,a||i?null!==(t=n.selectingDate())&&void 0!==t?t:null:null!==o&&void 0!==o?o:null)},n.isKeyboardSelected=function(e){if(void 0!==n.props.date&&null!=n.props.selected&&null!=n.props.preSelection){var t=n.props,r=t.minDate,o=t.maxDate,a=t.excludeDates,i=t.includeDates,s=t.filterDate,l=Jv(Qh(n.props.date,e)),c=(r||o||a||i||s)&&wg(e,n.props);return!n.props.disabledKeyboardNavigation&&!n.props.inline&&!ig(l,Jv(n.props.selected))&&ig(l,Jv(n.props.preSelection))&&!c}},n.isSelectedYear=function(e){var t=n.props,r=t.selectsMultiple,o=t.selected,a=t.selectedDates;return r?null===a||void 0===a?void 0:a.some((function(t){return e===wh(t)})):!o||e===wh(o)},n.onYearClick=function(e,t){var r=n.props.date;void 0!==r&&n.handleYearClick(Jv(Qh(r,t)),e)},n.onYearKeyDown=function(e,t){var r,o,a=e.key,i=n.props,s=i.date,l=i.yearItemNumber,c=i.handleOnKeyDown;if(a!==zv.Tab&&e.preventDefault(),!n.props.disabledKeyboardNavigation)switch(a){case zv.Enter:if(null==n.props.selected)break;n.onYearClick(e,t),null===(o=(r=n.props).setPreSelection)||void 0===o||o.call(r,n.props.selected);break;case zv.ArrowRight:if(null==n.props.preSelection)break;n.handleYearNavigation(t+1,Mh(n.props.preSelection,1));break;case zv.ArrowLeft:if(null==n.props.preSelection)break;n.handleYearNavigation(t-1,Rh(n.props.preSelection,1));break;case zv.ArrowUp:if(void 0===s||void 0===l||null==n.props.preSelection)break;var u=Lg(s,l).startPeriod;if((p=t-(f=3))<u){var d=l%f;t>=u&&t<u+d?f=d:f+=d,p=t-f}n.handleYearNavigation(p,Rh(n.props.preSelection,f));break;case zv.ArrowDown:if(void 0===s||void 0===l||null==n.props.preSelection)break;var f,p,h=Lg(s,l).endPeriod;if((p=t+(f=3))>h){d=l%f;t<=h&&t>h-d?f=d:f+=d,p=t+f}n.handleYearNavigation(p,Mh(n.props.preSelection,f))}c&&c(e)},n.getYearClassNames=function(e){var t=n.props,r=t.date,o=t.minDate,a=t.maxDate,i=t.excludeDates,s=t.includeDates,l=t.filterDate,c=t.yearClassName;return Ld("react-datepicker__year-text","react-datepicker__year-".concat(e),r?null===c||void 0===c?void 0:c(Qh(r,e)):void 0,{"react-datepicker__year-text--selected":n.isSelectedYear(e),"react-datepicker__year-text--disabled":(o||a||i||s||l)&&wg(e,n.props),"react-datepicker__year-text--keyboard-selected":n.isKeyboardSelected(e),"react-datepicker__year-text--range-start":n.isRangeStart(e),"react-datepicker__year-text--range-end":n.isRangeEnd(e),"react-datepicker__year-text--in-range":n.isInRange(e),"react-datepicker__year-text--in-selecting-range":n.isInSelectingRange(e),"react-datepicker__year-text--selecting-range-start":n.isSelectingRangeStart(e),"react-datepicker__year-text--selecting-range-end":n.isSelectingRangeEnd(e),"react-datepicker__year-text--today":n.isCurrentYear(e)})},n.getYearTabIndex=function(e){if(n.props.disabledKeyboardNavigation||null==n.props.preSelection)return"-1";var t=wh(n.props.preSelection),r=wg(e,n.props);return e!==t||r?"-1":"0"},n.getYearContent=function(e){return n.props.renderYearContent?n.props.renderYearContent(e):e},n}return Lv(t,e),t.prototype.render=function(){var e=this,t=[],n=this.props,o=n.date,a=n.yearItemNumber,i=n.onYearMouseEnter,s=n.onYearMouseLeave;if(void 0===o)return null;for(var l=Lg(o,a),c=l.startPeriod,u=l.endPeriod,d=function(n){t.push(r.createElement("div",{ref:f.YEAR_REFS[n-c],onClick:function(t){e.onYearClick(t,n)},onKeyDown:function(t){Bg(t)&&(t.preventDefault(),t.key=zv.Enter),e.onYearKeyDown(t,n)},tabIndex:Number(f.getYearTabIndex(n)),className:f.getYearClassNames(n),onMouseEnter:f.props.usePointerEvent?void 0:function(e){return i(e,n)},onPointerEnter:f.props.usePointerEvent?function(e){return i(e,n)}:void 0,onMouseLeave:f.props.usePointerEvent?void 0:function(e){return s(e,n)},onPointerLeave:f.props.usePointerEvent?function(e){return s(e,n)}:void 0,key:n,"aria-current":f.isCurrentYear(n)?"date":void 0},f.getYearContent(n)))},f=this,p=c;p<=u;p++)d(p);return r.createElement("div",{className:"react-datepicker__year"},r.createElement("div",{className:"react-datepicker__year-wrapper",onMouseLeave:this.props.usePointerEvent?void 0:this.props.clearSelectingDate,onPointerLeave:this.props.usePointerEvent?this.props.clearSelectingDate:void 0},t))},t}(r.Component);function ay(e,t,n,r){for(var o=[],a=0;a<2*t+1;a++){var i=e+t-a,s=!0;n&&(s=wh(n)<=i),r&&s&&(s=wh(r)>=i),s&&o.push(i)}return o}var iy=function(e){function t(t){var n=e.call(this,t)||this;n.renderOptions=function(){var e=n.props.year,t=n.state.yearsList.map((function(t){return r.createElement("div",{className:e===t?"react-datepicker__year-option react-datepicker__year-option--selected_year":"react-datepicker__year-option",key:t,onClick:n.onChange.bind(n,t),"aria-selected":e===t?"true":void 0},e===t?r.createElement("span",{className:"react-datepicker__year-option--selected"},"\u2713"):"",t)})),o=n.props.minDate?wh(n.props.minDate):null,a=n.props.maxDate?wh(n.props.maxDate):null;return a&&n.state.yearsList.find((function(e){return e===a}))||t.unshift(r.createElement("div",{className:"react-datepicker__year-option",key:"upcoming",onClick:n.incrementYears},r.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-upcoming"}))),o&&n.state.yearsList.find((function(e){return e===o}))||t.push(r.createElement("div",{className:"react-datepicker__year-option",key:"previous",onClick:n.decrementYears},r.createElement("a",{className:"react-datepicker__navigation react-datepicker__navigation--years react-datepicker__navigation--years-previous"}))),t},n.onChange=function(e){n.props.onChange(e)},n.handleClickOutside=function(){n.props.onCancel()},n.shiftYears=function(e){var t=n.state.yearsList.map((function(t){return t+e}));n.setState({yearsList:t})},n.incrementYears=function(){return n.shiftYears(1)},n.decrementYears=function(){return n.shiftYears(-1)};var o=t.yearDropdownItemNumber,a=t.scrollableYearDropdown,i=o||(a?10:5);return n.state={yearsList:ay(n.props.year,i,n.props.minDate,n.props.maxDate)},n.dropdownRef=(0,r.createRef)(),n}return Lv(t,e),t.prototype.componentDidMount=function(){var e=this.dropdownRef.current;if(e){var t=e.children?Array.from(e.children):null,n=t?t.find((function(e){return e.ariaSelected})):null;e.scrollTop=n&&n instanceof HTMLElement?n.offsetTop+(n.clientHeight-e.clientHeight)/2:(e.scrollHeight-e.clientHeight)/2}},t.prototype.render=function(){var e=Ld({"react-datepicker__year-dropdown":!0,"react-datepicker__year-dropdown--scrollable":this.props.scrollableYearDropdown});return r.createElement(Hv,{className:e,containerRef:this.dropdownRef,onClickOutside:this.handleClickOutside},this.renderOptions())},t}(r.Component),sy=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={dropdownVisible:!1},t.renderSelectOptions=function(){for(var e=t.props.minDate?wh(t.props.minDate):1900,n=t.props.maxDate?wh(t.props.maxDate):2100,o=[],a=e;a<=n;a++)o.push(r.createElement("option",{key:a,value:a},a));return o},t.onSelectChange=function(e){t.onChange(parseInt(e.target.value))},t.renderSelectMode=function(){return r.createElement("select",{value:t.props.year,className:"react-datepicker__year-select",onChange:t.onSelectChange},t.renderSelectOptions())},t.renderReadView=function(e){return r.createElement("div",{key:"read",style:{visibility:e?"visible":"hidden"},className:"react-datepicker__year-read-view",onClick:function(e){return t.toggleDropdown(e)}},r.createElement("span",{className:"react-datepicker__year-read-view--down-arrow"}),r.createElement("span",{className:"react-datepicker__year-read-view--selected-year"},t.props.year))},t.renderDropdown=function(){return r.createElement(iy,Iv({key:"dropdown"},t.props,{onChange:t.onChange,onCancel:t.toggleDropdown}))},t.renderScrollMode=function(){var e=t.state.dropdownVisible,n=[t.renderReadView(!e)];return e&&n.unshift(t.renderDropdown()),n},t.onChange=function(e){t.toggleDropdown(),e!==t.props.year&&t.props.onChange(e)},t.toggleDropdown=function(e){t.setState({dropdownVisible:!t.state.dropdownVisible},(function(){t.props.adjustDateOnChange&&t.handleYearChange(t.props.date,e)}))},t.handleYearChange=function(e,n){var r;null===(r=t.onSelect)||void 0===r||r.call(t,e,n),t.setOpen()},t.onSelect=function(e,n){var r,o;null===(o=(r=t.props).onSelect)||void 0===o||o.call(r,e,n)},t.setOpen=function(){var e,n;null===(n=(e=t.props).setOpen)||void 0===n||n.call(e,!0)},t}return Lv(t,e),t.prototype.render=function(){var e;switch(this.props.dropdownMode){case"scroll":e=this.renderScrollMode();break;case"select":e=this.renderSelectMode()}return r.createElement("div",{className:"react-datepicker__year-dropdown-container react-datepicker__year-dropdown-container--".concat(this.props.dropdownMode)},e)},t}(r.Component),ly=["react-datepicker__year-select","react-datepicker__month-select","react-datepicker__month-year-select"],cy=function(e){function t(n){var o=e.call(this,n)||this;return o.monthContainer=void 0,o.handleClickOutside=function(e){o.props.onClickOutside(e)},o.setClickOutsideRef=function(){return o.containerRef.current},o.handleDropdownFocus=function(e){var t,n;(function(e){var t=(e.className||"").split(/\s+/);return ly.some((function(e){return t.indexOf(e)>=0}))})(e.target)&&(null===(n=(t=o.props).onDropdownFocus)||void 0===n||n.call(t,e))},o.getDateInView=function(){var e=o.props,t=e.preSelection,n=e.selected,r=e.openToDate,a=Tg(o.props),i=_g(o.props),s=Yv(),l=r||n||t;return l||(a&&Op(s,a)?a:i&&Uh(s,i)?i:s)},o.increaseMonth=function(){o.setState((function(e){return{date:jh(e.date,1)}}),(function(){return o.handleMonthChange(o.state.date)}))},o.decreaseMonth=function(){o.setState((function(e){return{date:Dh(e.date,1)}}),(function(){return o.handleMonthChange(o.state.date)}))},o.handleDayClick=function(e,t,n){o.props.onSelect(e,t,n),o.props.setPreSelection&&o.props.setPreSelection(e)},o.handleDayMouseEnter=function(e){o.setState({selectingDate:e}),o.props.onDayMouseEnter&&o.props.onDayMouseEnter(e)},o.handleMonthMouseLeave=function(){o.setState({selectingDate:void 0}),o.props.onMonthMouseLeave&&o.props.onMonthMouseLeave()},o.handleYearMouseEnter=function(e,t){o.setState({selectingDate:Qh(Yv(),t)}),o.props.onYearMouseEnter&&o.props.onYearMouseEnter(e,t)},o.handleYearMouseLeave=function(e,t){o.props.onYearMouseLeave&&o.props.onYearMouseLeave(e,t)},o.handleYearChange=function(e){var t,n,r,a;null===(n=(t=o.props).onYearChange)||void 0===n||n.call(t,e),o.setState({isRenderAriaLiveMessage:!0}),o.props.adjustDateOnChange&&(o.props.onSelect(e),null===(a=(r=o.props).setOpen)||void 0===a||a.call(r,!0)),o.props.setPreSelection&&o.props.setPreSelection(e)},o.getEnabledPreSelectionDateForMonth=function(e){if(!pg(e,o.props))return e;for(var t=Xv(e),n=Kh(ng(e),t),r=null,a=0;a<=n;a++){var i=gp(t,a);if(!pg(i,o.props)){r=i;break}}return r},o.handleMonthChange=function(e){var t,n,r,a=null!==(t=o.getEnabledPreSelectionDateForMonth(e))&&void 0!==t?t:e;o.handleCustomMonthChange(a),o.props.adjustDateOnChange&&(o.props.onSelect(a),null===(r=(n=o.props).setOpen)||void 0===r||r.call(n,!0)),o.props.setPreSelection&&o.props.setPreSelection(a)},o.handleCustomMonthChange=function(e){var t,n;null===(n=(t=o.props).onMonthChange)||void 0===n||n.call(t,e),o.setState({isRenderAriaLiveMessage:!0})},o.handleMonthYearChange=function(e){o.handleYearChange(e),o.handleMonthChange(e)},o.changeYear=function(e){o.setState((function(t){return{date:Qh(t.date,Number(e))}}),(function(){return o.handleYearChange(o.state.date)}))},o.changeMonth=function(e){o.setState((function(t){return{date:yh(t.date,Number(e))}}),(function(){return o.handleMonthChange(o.state.date)}))},o.changeMonthYear=function(e){o.setState((function(t){return{date:Qh(yh(t.date,xh(e)),wh(e))}}),(function(){return o.handleMonthYearChange(o.state.date)}))},o.header=function(e){void 0===e&&(e=o.state.date);var t=Gv(e,o.props.locale,o.props.calendarStartDay),n=[];return o.props.showWeekNumbers&&n.push(r.createElement("div",{key:"W",className:"react-datepicker__day-name"},o.props.weekLabel||"#")),n.concat([0,1,2,3,4,5,6].map((function(e){var n=gp(t,e),a=o.formatWeekday(n,o.props.locale),i=o.props.weekDayClassName?o.props.weekDayClassName(n):void 0;return r.createElement("div",{key:e,"aria-label":Vv(n,"EEEE",o.props.locale),className:Ld("react-datepicker__day-name",i)},a)})))},o.formatWeekday=function(e,t){return o.props.formatWeekDay?function(e,t,n){return t(Vv(e,"EEEE",n))}(e,o.props.formatWeekDay,t):o.props.useWeekdaysShort?function(e,t){return Vv(e,"EEE",t)}(e,t):function(e,t){return Vv(e,"EEEEEE",t)}(e,t)},o.decreaseYear=function(){o.setState((function(e){var n;return{date:Rh(e.date,o.props.showYearPicker?null!==(n=o.props.yearItemNumber)&&void 0!==n?n:t.defaultProps.yearItemNumber:1)}}),(function(){return o.handleYearChange(o.state.date)}))},o.clearSelectingDate=function(){o.setState({selectingDate:void 0})},o.renderPreviousButton=function(){var e,n,a;if(!o.props.renderCustomHeader){var i,s=null!==(e=o.props.monthsShown)&&void 0!==e?e:t.defaultProps.monthsShown,l=o.props.showPreviousMonths?s-1:0,c=null!==(n=o.props.monthSelectedIn)&&void 0!==n?n:l,u=Dh(o.state.date,c);switch(!0){case o.props.showMonthYearPicker:i=Dg(o.state.date,o.props);break;case o.props.showYearPicker:i=function(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.yearItemNumber,a=void 0===o?12:o,i=Lg(Jv(Rh(e,a)),a).endPeriod,s=r&&wh(r);return s&&s>i||!1}(o.state.date,o.props);break;case o.props.showQuarterYearPicker:i=function(e,t){var n=void 0===t?{}:t,r=n.minDate,o=n.includeDates,a=_h(Lp(e),1);return r&&Oh(r,a)>0||o&&o.every((function(e){return Oh(e,a)>0}))||!1}(o.state.date,o.props);break;default:i=Ng(u,o.props)}if(((null!==(a=o.props.forceShowMonthNavigation)&&void 0!==a?a:t.defaultProps.forceShowMonthNavigation)||o.props.showDisabledMonthNavigation||!i)&&!o.props.showTimeSelectOnly){var d=["react-datepicker__navigation","react-datepicker__navigation--previous"],f=o.decreaseMonth;(o.props.showMonthYearPicker||o.props.showQuarterYearPicker||o.props.showYearPicker)&&(f=o.decreaseYear),i&&o.props.showDisabledMonthNavigation&&(d.push("react-datepicker__navigation--previous--disabled"),f=void 0);var p=o.props.showMonthYearPicker||o.props.showQuarterYearPicker||o.props.showYearPicker,h=o.props,m=h.previousMonthButtonLabel,v=void 0===m?t.defaultProps.previousMonthButtonLabel:m,g=h.previousYearButtonLabel,y=void 0===g?t.defaultProps.previousYearButtonLabel:g,b=o.props,w=b.previousMonthAriaLabel,x=void 0===w?"string"===typeof v?v:"Previous Month":w,k=b.previousYearAriaLabel,S=void 0===k?"string"===typeof y?y:"Previous Year":k;return r.createElement("button",{type:"button",className:d.join(" "),onClick:f,onKeyDown:o.props.handleOnKeyDown,"aria-label":p?S:x},r.createElement("span",{className:["react-datepicker__navigation-icon","react-datepicker__navigation-icon--previous"].join(" ")},p?y:v))}}},o.increaseYear=function(){o.setState((function(e){var n;return{date:Mh(e.date,o.props.showYearPicker?null!==(n=o.props.yearItemNumber)&&void 0!==n?n:t.defaultProps.yearItemNumber:1)}}),(function(){return o.handleYearChange(o.state.date)}))},o.renderNextButton=function(){var e;if(!o.props.renderCustomHeader){var n;switch(!0){case o.props.showMonthYearPicker:n=Pg(o.state.date,o.props);break;case o.props.showYearPicker:n=function(e,t){var n=void 0===t?{}:t,r=n.maxDate,o=n.yearItemNumber,a=void 0===o?12:o,i=Lg(Mh(e,a),a).startPeriod,s=r&&wh(r);return s&&s<i||!1}(o.state.date,o.props);break;case o.props.showQuarterYearPicker:n=function(e,t){var n=void 0===t?{}:t,r=n.maxDate,o=n.includeDates,a=Th(kh(e),1);return r&&Oh(a,r)>0||o&&o.every((function(e){return Oh(a,e)>0}))||!1}(o.state.date,o.props);break;default:n=jg(o.state.date,o.props)}if(((null!==(e=o.props.forceShowMonthNavigation)&&void 0!==e?e:t.defaultProps.forceShowMonthNavigation)||o.props.showDisabledMonthNavigation||!n)&&!o.props.showTimeSelectOnly){var a=["react-datepicker__navigation","react-datepicker__navigation--next"];o.props.showTimeSelect&&a.push("react-datepicker__navigation--next--with-time"),o.props.todayButton&&a.push("react-datepicker__navigation--next--with-today-button");var i=o.increaseMonth;(o.props.showMonthYearPicker||o.props.showQuarterYearPicker||o.props.showYearPicker)&&(i=o.increaseYear),n&&o.props.showDisabledMonthNavigation&&(a.push("react-datepicker__navigation--next--disabled"),i=void 0);var s=o.props.showMonthYearPicker||o.props.showQuarterYearPicker||o.props.showYearPicker,l=o.props,c=l.nextMonthButtonLabel,u=void 0===c?t.defaultProps.nextMonthButtonLabel:c,d=l.nextYearButtonLabel,f=void 0===d?t.defaultProps.nextYearButtonLabel:d,p=o.props,h=p.nextMonthAriaLabel,m=void 0===h?"string"===typeof u?u:"Next Month":h,v=p.nextYearAriaLabel,g=void 0===v?"string"===typeof f?f:"Next Year":v;return r.createElement("button",{type:"button",className:a.join(" "),onClick:i,onKeyDown:o.props.handleOnKeyDown,"aria-label":s?g:m},r.createElement("span",{className:["react-datepicker__navigation-icon","react-datepicker__navigation-icon--next"].join(" ")},s?f:u))}}},o.renderCurrentMonth=function(e){void 0===e&&(e=o.state.date);var t=["react-datepicker__current-month"];return o.props.showYearDropdown&&t.push("react-datepicker__current-month--hasYearDropdown"),o.props.showMonthDropdown&&t.push("react-datepicker__current-month--hasMonthDropdown"),o.props.showMonthYearDropdown&&t.push("react-datepicker__current-month--hasMonthYearDropdown"),r.createElement("h2",{className:t.join(" ")},Vv(e,o.props.dateFormat,o.props.locale))},o.renderYearDropdown=function(e){if(void 0===e&&(e=!1),o.props.showYearDropdown&&!e)return r.createElement(sy,Iv({},t.defaultProps,o.props,{date:o.state.date,onChange:o.changeYear,year:wh(o.state.date)}))},o.renderMonthDropdown=function(e){if(void 0===e&&(e=!1),o.props.showMonthDropdown&&!e)return r.createElement(Zg,Iv({},t.defaultProps,o.props,{month:xh(o.state.date),onChange:o.changeMonth}))},o.renderMonthYearDropdown=function(e){if(void 0===e&&(e=!1),o.props.showMonthYearDropdown&&!e)return r.createElement(ny,Iv({},t.defaultProps,o.props,{date:o.state.date,onChange:o.changeMonthYear}))},o.handleTodayButtonClick=function(e){o.props.onSelect(eg(),e),o.props.setPreSelection&&o.props.setPreSelection(eg())},o.renderTodayButton=function(){if(o.props.todayButton&&!o.props.showTimeSelectOnly)return r.createElement("div",{className:"react-datepicker__today-button",onClick:o.handleTodayButtonClick},o.props.todayButton)},o.renderDefaultHeader=function(e){var t=e.monthDate,n=e.i;return r.createElement("div",{className:"react-datepicker__header ".concat(o.props.showTimeSelect?"react-datepicker__header--has-time-select":"")},o.renderCurrentMonth(t),r.createElement("div",{className:"react-datepicker__header__dropdown react-datepicker__header__dropdown--".concat(o.props.dropdownMode),onFocus:o.handleDropdownFocus},o.renderMonthDropdown(0!==n),o.renderMonthYearDropdown(0!==n),o.renderYearDropdown(0!==n)),r.createElement("div",{className:"react-datepicker__day-names"},o.header(t)))},o.renderCustomHeader=function(e){var t,n,a=e.monthDate,i=e.i;if(o.props.showTimeSelect&&!o.state.monthContainer||o.props.showTimeSelectOnly)return null;var s=Ng(o.state.date,o.props),l=jg(o.state.date,o.props),c=Dg(o.state.date,o.props),u=Pg(o.state.date,o.props),d=!o.props.showMonthYearPicker&&!o.props.showQuarterYearPicker&&!o.props.showYearPicker;return r.createElement("div",{className:"react-datepicker__header react-datepicker__header--custom",onFocus:o.props.onDropdownFocus},null===(n=(t=o.props).renderCustomHeader)||void 0===n?void 0:n.call(t,Iv(Iv({},o.state),{customHeaderCount:i,monthDate:a,changeMonth:o.changeMonth,changeYear:o.changeYear,decreaseMonth:o.decreaseMonth,increaseMonth:o.increaseMonth,decreaseYear:o.decreaseYear,increaseYear:o.increaseYear,prevMonthButtonDisabled:s,nextMonthButtonDisabled:l,prevYearButtonDisabled:c,nextYearButtonDisabled:u})),d&&r.createElement("div",{className:"react-datepicker__day-names"},o.header(a)))},o.renderYearHeader=function(e){var n=e.monthDate,a=o.props,i=a.showYearPicker,s=a.yearItemNumber,l=Lg(n,void 0===s?t.defaultProps.yearItemNumber:s),c=l.startPeriod,u=l.endPeriod;return r.createElement("div",{className:"react-datepicker__header react-datepicker-year-header"},i?"".concat(c," - ").concat(u):wh(n))},o.renderHeader=function(e){var t=e.monthDate,n=e.i,r={monthDate:t,i:void 0===n?0:n};switch(!0){case void 0!==o.props.renderCustomHeader:return o.renderCustomHeader(r);case o.props.showMonthYearPicker||o.props.showQuarterYearPicker||o.props.showYearPicker:return o.renderYearHeader(r);default:return o.renderDefaultHeader(r)}},o.renderMonths=function(){var e,n;if(!o.props.showTimeSelectOnly&&!o.props.showYearPicker){for(var a=[],i=null!==(e=o.props.monthsShown)&&void 0!==e?e:t.defaultProps.monthsShown,s=o.props.showPreviousMonths?i-1:0,l=o.props.showMonthYearPicker||o.props.showQuarterYearPicker?Mh(o.state.date,s):Dh(o.state.date,s),c=null!==(n=o.props.monthSelectedIn)&&void 0!==n?n:s,u=0;u<i;++u){var d=u-c+s,f=o.props.showMonthYearPicker||o.props.showQuarterYearPicker?Mh(l,d):jh(l,d),p="month-".concat(u),h=u<i-1,m=u>0;a.push(r.createElement("div",{key:p,ref:function(e){o.monthContainer=null!==e&&void 0!==e?e:void 0},className:"react-datepicker__month-container"},o.renderHeader({monthDate:f,i:u}),r.createElement(Xg,Iv({},t.defaultProps,o.props,{containerRef:o.containerRef,ariaLabelPrefix:o.props.monthAriaLabelPrefix,day:f,onDayClick:o.handleDayClick,handleOnKeyDown:o.props.handleOnDayKeyDown,handleOnMonthKeyDown:o.props.handleOnKeyDown,onDayMouseEnter:o.handleDayMouseEnter,onMouseLeave:o.handleMonthMouseLeave,orderInDisplay:u,selectingDate:o.state.selectingDate,monthShowsDuplicateDaysEnd:h,monthShowsDuplicateDaysStart:m}))))}return a}},o.renderYears=function(){if(!o.props.showTimeSelectOnly)return o.props.showYearPicker?r.createElement("div",{className:"react-datepicker__year--container"},o.renderHeader({monthDate:o.state.date}),r.createElement(oy,Iv({},t.defaultProps,o.props,{selectingDate:o.state.selectingDate,date:o.state.date,onDayClick:o.handleDayClick,clearSelectingDate:o.clearSelectingDate,onYearMouseEnter:o.handleYearMouseEnter,onYearMouseLeave:o.handleYearMouseLeave}))):void 0},o.renderTimeSection=function(){if(o.props.showTimeSelect&&(o.state.monthContainer||o.props.showTimeSelectOnly))return r.createElement(ry,Iv({},t.defaultProps,o.props,{onChange:o.props.onTimeChange,format:o.props.timeFormat,intervals:o.props.timeIntervals,monthRef:o.state.monthContainer}))},o.renderInputTimeSection=function(){var e=o.props.selected?new Date(o.props.selected):void 0,n=e&&qv(e)&&Boolean(o.props.selected)?"".concat(Ag(e.getHours()),":").concat(Ag(e.getMinutes())):"";if(o.props.showTimeInput)return r.createElement(Ug,Iv({},t.defaultProps,o.props,{date:e,timeString:n,onChange:o.props.onTimeChange}))},o.renderAriaLiveRegion=function(){var e,n,a=Lg(o.state.date,null!==(e=o.props.yearItemNumber)&&void 0!==e?e:t.defaultProps.yearItemNumber),i=a.startPeriod,s=a.endPeriod;return n=o.props.showYearPicker?"".concat(i," - ").concat(s):o.props.showMonthYearPicker||o.props.showQuarterYearPicker?wh(o.state.date):"".concat(dg(xh(o.state.date),o.props.locale)," ").concat(wh(o.state.date)),r.createElement("span",{role:"alert","aria-live":"polite",className:"react-datepicker__aria-live"},o.state.isRenderAriaLiveMessage&&n)},o.renderChildren=function(){if(o.props.children)return r.createElement("div",{className:"react-datepicker__children-container"},o.props.children)},o.containerRef=(0,r.createRef)(),o.state={date:o.getDateInView(),selectingDate:void 0,monthContainer:void 0,isRenderAriaLiveMessage:!1},o}return Lv(t,e),Object.defineProperty(t,"defaultProps",{get:function(){return{monthsShown:1,forceShowMonthNavigation:!1,timeCaption:"Time",previousYearButtonLabel:"Previous Year",nextYearButtonLabel:"Next Year",previousMonthButtonLabel:"Previous Month",nextMonthButtonLabel:"Next Month",yearItemNumber:12}},enumerable:!1,configurable:!0}),t.prototype.componentDidMount=function(){var e=this;this.props.showTimeSelect&&(this.assignMonthContainer=void e.setState({monthContainer:e.monthContainer}))},t.prototype.componentDidUpdate=function(e){var t=this;if(!this.props.preSelection||ig(this.props.preSelection,e.preSelection)&&this.props.monthSelectedIn===e.monthSelectedIn)this.props.openToDate&&!ig(this.props.openToDate,e.openToDate)&&this.setState({date:this.props.openToDate});else{var n=!og(this.state.date,this.props.preSelection);this.setState({date:this.props.preSelection},(function(){return n&&t.handleCustomMonthChange(t.state.date)}))}},t.prototype.render=function(){var e=this.props.container||Bv;return r.createElement(Hv,{onClickOutside:this.handleClickOutside,style:{display:"contents"},ignoreClass:this.props.outsideClickIgnoreClass},r.createElement("div",{style:{display:"contents"},ref:this.containerRef},r.createElement(e,{className:Ld("react-datepicker",this.props.className,{"react-datepicker--time-only":this.props.showTimeSelectOnly}),showTime:this.props.showTimeSelect||this.props.showTimeInput,showTimeSelectOnly:this.props.showTimeSelectOnly},this.renderAriaLiveRegion(),this.renderPreviousButton(),this.renderNextButton(),this.renderMonths(),this.renderYears(),this.renderTodayButton(),this.renderTimeSection(),this.renderInputTimeSection(),this.renderChildren())))},t}(r.Component),uy=function(e){var t=e.icon,n=e.className,o=void 0===n?"":n,a=e.onClick,i="react-datepicker__calendar-icon";if("string"===typeof t)return r.createElement("i",{className:"".concat(i," ").concat(t," ").concat(o),"aria-hidden":"true",onClick:a});if(r.isValidElement(t)){var s=t;return r.cloneElement(s,{className:"".concat(s.props.className||""," ").concat(i," ").concat(o),onClick:function(e){"function"===typeof s.props.onClick&&s.props.onClick(e),"function"===typeof a&&a(e)}})}return r.createElement("svg",{className:"".concat(i," ").concat(o),xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",onClick:a},r.createElement("path",{d:"M96 32V64H48C21.5 64 0 85.5 0 112v48H448V112c0-26.5-21.5-48-48-48H352V32c0-17.7-14.3-32-32-32s-32 14.3-32 32V64H160V32c0-17.7-14.3-32-32-32S96 14.3 96 32zM448 192H0V464c0 26.5 21.5 48 48 48H400c26.5 0 48-21.5 48-48V192z"}))},dy=function(e){function t(t){var n=e.call(this,t)||this;return n.portalRoot=null,n.el=document.createElement("div"),n}return Lv(t,e),t.prototype.componentDidMount=function(){this.portalRoot=(this.props.portalHost||document).getElementById(this.props.portalId),this.portalRoot||(this.portalRoot=document.createElement("div"),this.portalRoot.setAttribute("id",this.props.portalId),(this.props.portalHost||document.body).appendChild(this.portalRoot)),this.portalRoot.appendChild(this.el)},t.prototype.componentWillUnmount=function(){this.portalRoot&&this.portalRoot.removeChild(this.el)},t.prototype.render=function(){return i.createPortal(this.props.children,this.el)},t}(r.Component),fy=function(e){return(e instanceof HTMLAnchorElement||!e.disabled)&&-1!==e.tabIndex},py=function(e){function t(t){var n=e.call(this,t)||this;return n.getTabChildren=function(){var e;return Array.prototype.slice.call(null===(e=n.tabLoopRef.current)||void 0===e?void 0:e.querySelectorAll("[tabindex], a, button, input, select, textarea"),1,-1).filter(fy)},n.handleFocusStart=function(){var e=n.getTabChildren();e&&e.length>1&&e[e.length-1].focus()},n.handleFocusEnd=function(){var e=n.getTabChildren();e&&e.length>1&&e[0].focus()},n.tabLoopRef=(0,r.createRef)(),n}return Lv(t,e),t.prototype.render=function(){var e;return(null!==(e=this.props.enableTabLoop)&&void 0!==e?e:t.defaultProps.enableTabLoop)?r.createElement("div",{className:"react-datepicker__tab-loop",ref:this.tabLoopRef},r.createElement("div",{className:"react-datepicker__tab-loop__start",tabIndex:0,onFocus:this.handleFocusStart}),this.props.children,r.createElement("div",{className:"react-datepicker__tab-loop__end",tabIndex:0,onFocus:this.handleFocusEnd})):this.props.children},t.defaultProps={enableTabLoop:!0},t}(r.Component);var hy,my=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Lv(t,e),Object.defineProperty(t,"defaultProps",{get:function(){return{hidePopper:!0}},enumerable:!1,configurable:!0}),t.prototype.render=function(){var e=this.props,n=e.className,o=e.wrapperClassName,a=e.hidePopper,i=void 0===a?t.defaultProps.hidePopper:a,s=e.popperComponent,l=e.targetComponent,c=e.enableTabLoop,u=e.popperOnKeyDown,d=e.portalId,f=e.portalHost,p=e.popperProps,h=e.showArrow,m=void 0;if(!i){var v=Ld("react-datepicker-popper",n);m=r.createElement(py,{enableTabLoop:c},r.createElement("div",{ref:p.refs.setFloating,style:p.floatingStyles,className:v,"data-placement":p.placement,onKeyDown:u},s,h&&r.createElement(jv,{ref:p.arrowRef,context:p.context,fill:"currentColor",strokeWidth:1,height:8,width:16,style:{transform:"translateY(-1px)"},className:"react-datepicker__triangle"})))}this.props.popperContainer&&(m=(0,r.createElement)(this.props.popperContainer,{},m)),d&&!i&&(m=r.createElement(dy,{portalId:d,portalHost:f},m));var g=Ld("react-datepicker-wrapper",o);return r.createElement(r.Fragment,null,r.createElement("div",{ref:p.refs.setReference,className:g},l),m)},t}(r.Component),vy=(hy=my,function(e){var t,n,o,a="boolean"!==typeof e.hidePopper||e.hidePopper,i=(0,r.useRef)(null),s=Rv(Iv({open:!a,whileElementsMounted:nv,placement:e.popperPlacement,middleware:Fv([(n={padding:15},_e(_e({},ov(n)),{},{options:[n,o]})),fv(10),pv({element:i})],null!==(t=e.popperModifiers)&&void 0!==t?t:[],!0)},e.popperProps)),l=Iv(Iv({},e),{hidePopper:a,popperProps:Iv(Iv({},s),{arrowRef:i})});return r.createElement(hy,Iv({},l))}),gy="react-datepicker-ignore-onclickoutside";var yy="Date input not valid.",by=function(e){function t(n){var o=e.call(this,n)||this;return o.calendar=null,o.input=null,o.getPreSelection=function(){return o.props.openToDate?o.props.openToDate:o.props.selectsEnd&&o.props.startDate?o.props.startDate:o.props.selectsStart&&o.props.endDate?o.props.endDate:Yv()},o.modifyHolidays=function(){var e;return null===(e=o.props.holidays)||void 0===e?void 0:e.reduce((function(e,t){var n=new Date(t.date);return qv(n)?Fv(Fv([],e,!0),[Iv(Iv({},t),{date:n})],!1):e}),[])},o.calcInitialState=function(){var e,t=o.getPreSelection(),n=Tg(o.props),r=_g(o.props),a=n&&Op(t,$v(n))?n:r&&Uh(t,tg(r))?r:t;return{open:o.props.startOpen||!1,preventFocus:!1,inputValue:null,preSelection:null!==(e=o.props.selectsRange?o.props.startDate:o.props.selected)&&void 0!==e?e:a,highlightDates:Og(o.props.highlightDates),focused:!1,shouldFocusDayInline:!1,isRenderAriaLiveMessage:!1,wasHidden:!1}},o.resetHiddenStatus=function(){o.setState(Iv(Iv({},o.state),{wasHidden:!1}))},o.setHiddenStatus=function(){o.setState(Iv(Iv({},o.state),{wasHidden:!0}))},o.setHiddenStateOnVisibilityHidden=function(){"hidden"===document.visibilityState&&o.setHiddenStatus()},o.clearPreventFocusTimeout=function(){o.preventFocusTimeout&&clearTimeout(o.preventFocusTimeout)},o.setFocus=function(){var e,t;null===(t=null===(e=o.input)||void 0===e?void 0:e.focus)||void 0===t||t.call(e,{preventScroll:!0})},o.setBlur=function(){var e,t;null===(t=null===(e=o.input)||void 0===e?void 0:e.blur)||void 0===t||t.call(e),o.cancelFocusInput()},o.deferBlur=function(){requestAnimationFrame((function(){o.setBlur()}))},o.setOpen=function(e,t){void 0===t&&(t=!1),o.setState({open:e,preSelection:e&&o.state.open?o.state.preSelection:o.calcInitialState().preSelection,lastPreSelectChange:xy},(function(){e||o.setState((function(e){return{focused:!!t&&e.focused}}),(function(){!t&&o.deferBlur(),o.setState({inputValue:null})}))}))},o.inputOk=function(){return Tp(o.state.preSelection)},o.isCalendarOpen=function(){return void 0===o.props.open?o.state.open&&!o.props.disabled&&!o.props.readOnly:o.props.open},o.handleFocus=function(e){var t,n,r=o.state.wasHidden,a=!r||o.state.open;r&&o.resetHiddenStatus(),o.state.preventFocus||(null===(n=(t=o.props).onFocus)||void 0===n||n.call(t,e),!a||o.props.preventOpenOnFocus||o.props.readOnly||o.setOpen(!0)),o.setState({focused:!0})},o.sendFocusBackToInput=function(){o.preventFocusTimeout&&o.clearPreventFocusTimeout(),o.setState({preventFocus:!0},(function(){o.preventFocusTimeout=setTimeout((function(){o.setFocus(),o.setState({preventFocus:!1})}))}))},o.cancelFocusInput=function(){clearTimeout(o.inputFocusTimeout),o.inputFocusTimeout=void 0},o.deferFocusInput=function(){o.cancelFocusInput(),o.inputFocusTimeout=setTimeout((function(){return o.setFocus()}),1)},o.handleDropdownFocus=function(){o.cancelFocusInput()},o.handleBlur=function(e){var t,n;(!o.state.open||o.props.withPortal||o.props.showTimeInput)&&(null===(n=(t=o.props).onBlur)||void 0===n||n.call(t,e)),o.state.open&&!1===o.props.open&&o.setOpen(!1),o.setState({focused:!1})},o.handleCalendarClickOutside=function(e){var t,n;o.props.inline||o.setOpen(!1),null===(n=(t=o.props).onClickOutside)||void 0===n||n.call(t,e),o.props.withPortal&&e.preventDefault()},o.handleChange=function(){for(var e,n,r,a,i,s=[],l=0;l<arguments.length;l++)s[l]=arguments[l];var c=s[0];if(!o.props.onChangeRaw||(o.props.onChangeRaw.apply(o,s),c&&"function"===typeof c.isDefaultPrevented&&!c.isDefaultPrevented())){o.setState({inputValue:(null===c||void 0===c?void 0:c.target)instanceof HTMLInputElement?c.target.value:null,lastPreSelectChange:wy});var u=o.props,d=u.selectsRange,f=u.startDate,p=u.endDate,h=null!==(e=o.props.dateFormat)&&void 0!==e?e:t.defaultProps.dateFormat,m=null!==(n=o.props.strictParsing)&&void 0!==n?n:t.defaultProps.strictParsing,v=(null===c||void 0===c?void 0:c.target)instanceof HTMLInputElement?c.target.value:"";if(d){var g=v.split("-",2).map((function(e){return e.trim()})),y=g[0],b=g[1],w=Wv(null!==y&&void 0!==y?y:"",h,o.props.locale,m),x=Wv(null!==b&&void 0!==b?b:"",h,o.props.locale,m),k=(null===f||void 0===f?void 0:f.getTime())!==(null===w||void 0===w?void 0:w.getTime()),S=(null===p||void 0===p?void 0:p.getTime())!==(null===x||void 0===x?void 0:x.getTime());if(!k&&!S)return;if(w&&pg(w,o.props))return;if(x&&pg(x,o.props))return;null===(a=(r=o.props).onChange)||void 0===a||a.call(r,[w,x],c)}else{var E=Wv(v,h,o.props.locale,m,null!==(i=o.props.selected)&&void 0!==i?i:void 0);!E&&v||o.setSelected(E,c,!0)}}},o.handleSelect=function(e,t,n){if(o.props.shouldCloseOnSelect&&!o.props.showTimeSelect&&o.sendFocusBackToInput(),o.props.onChangeRaw&&o.props.onChangeRaw(t),o.setSelected(e,t,!1,n),o.props.showDateSelect&&o.setState({isRenderAriaLiveMessage:!0}),!o.props.shouldCloseOnSelect||o.props.showTimeSelect)o.setPreSelection(e);else if(!o.props.inline){o.props.selectsRange||o.setOpen(!1);var r=o.props,a=r.startDate,i=r.endDate;!a||i||!o.props.swapRange&&zg(e,a)||o.setOpen(!1)}},o.setSelected=function(e,t,n,r){var a,i,s=e;if(o.props.showYearPicker){if(null!==s&&wg(wh(s),o.props))return}else if(o.props.showMonthYearPicker){if(null!==s&&mg(s,o.props))return}else if(null!==s&&pg(s,o.props))return;var l=o.props,c=l.onChange,u=l.selectsRange,d=l.startDate,f=l.endDate,p=l.selectsMultiple,h=l.selectedDates,m=l.minTime,v=l.swapRange;if(!sg(o.props.selected,s)||o.props.allowSameDay||u||p)if(null!==s&&(!o.props.selected||n&&(o.props.showTimeSelect||o.props.showTimeSelectOnly||o.props.showTimeInput)||(s=Kv(s,{hour:Eh(o.props.selected),minute:Ch(o.props.selected),second:Nh(o.props.selected)})),n||!o.props.showTimeSelect&&!o.props.showTimeSelectOnly||m&&(s=Kv(s,{hour:m.getHours(),minute:m.getMinutes(),second:m.getSeconds()})),o.props.inline||o.setState({preSelection:s}),o.props.focusSelectedMonth||o.setState({monthSelectedIn:r})),u){var g=d&&!f,y=d&&f;!d&&!f?null===c||void 0===c||c([s,null],t):g&&(null===s?null===c||void 0===c||c([null,null],t):zg(s,d)?v?null===c||void 0===c||c([s,d],t):null===c||void 0===c||c([s,null],t):null===c||void 0===c||c([d,s],t)),y&&(null===c||void 0===c||c([s,null],t))}else if(p){if(null!==s)if(null===h||void 0===h?void 0:h.length)if(h.some((function(e){return ig(e,s)}))){var b=h.filter((function(e){return!ig(e,s)}));null===c||void 0===c||c(b,t)}else null===c||void 0===c||c(Fv(Fv([],h,!0),[s],!1),t);else null===c||void 0===c||c([s],t)}else null===c||void 0===c||c(s,t);n||(null===(i=(a=o.props).onSelect)||void 0===i||i.call(a,s,t),o.setState({inputValue:null}))},o.setPreSelection=function(e){var t=Tp(o.props.minDate),n=Tp(o.props.maxDate),r=!0;if(e){var a=$v(e);if(t&&n)r=lg(e,o.props.minDate,o.props.maxDate);else if(t){var i=$v(o.props.minDate);r=Uh(e,i)||sg(a,i)}else if(n){var s=tg(o.props.maxDate);r=Op(e,s)||sg(a,s)}}r&&o.setState({preSelection:e})},o.toggleCalendar=function(){o.setOpen(!o.state.open)},o.handleTimeChange=function(e){var t,n;if(!o.props.selectsRange&&!o.props.selectsMultiple){var r=o.props.selected?o.props.selected:o.getPreSelection(),a=o.props.selected?e:Kv(r,{hour:Eh(e),minute:Ch(e)});o.setState({preSelection:a}),null===(n=(t=o.props).onChange)||void 0===n||n.call(t,a),o.props.shouldCloseOnSelect&&!o.props.showTimeInput&&(o.sendFocusBackToInput(),o.setOpen(!1)),o.props.showTimeInput&&o.setOpen(!0),(o.props.showTimeSelectOnly||o.props.showTimeSelect)&&o.setState({isRenderAriaLiveMessage:!0}),o.setState({inputValue:null})}},o.onInputClick=function(){var e,t;o.props.disabled||o.props.readOnly||o.setOpen(!0),null===(t=(e=o.props).onInputClick)||void 0===t||t.call(e)},o.onInputKeyDown=function(e){var t,n,r,a,i,s;null===(n=(t=o.props).onKeyDown)||void 0===n||n.call(t,e);var l=e.key;if(o.state.open||o.props.inline||o.props.preventOpenOnFocus){if(o.state.open){if(l===zv.ArrowDown||l===zv.ArrowUp){e.preventDefault();var c=o.props.showTimeSelectOnly?".react-datepicker__time-list-item[tabindex='0']":o.props.showWeekPicker&&o.props.showWeekNumbers?'.react-datepicker__week-number[tabindex="0"]':o.props.showFullMonthYearPicker||o.props.showMonthYearPicker?'.react-datepicker__month-text[tabindex="0"]':'.react-datepicker__day[tabindex="0"]',u=(null===(a=o.calendar)||void 0===a?void 0:a.containerRef.current)instanceof Element&&o.calendar.containerRef.current.querySelector(c);return void(u instanceof HTMLElement&&u.focus({preventScroll:!0}))}var d=Yv(o.state.preSelection);l===zv.Enter?(e.preventDefault(),e.target.blur(),o.inputOk()&&o.state.lastPreSelectChange===xy?(o.handleSelect(d,e),!o.props.shouldCloseOnSelect&&o.setPreSelection(d)):o.setOpen(!1)):l===zv.Escape?(e.preventDefault(),e.target.blur(),o.sendFocusBackToInput(),o.setOpen(!1)):l===zv.Tab&&o.setOpen(!1),o.inputOk()||null===(s=(i=o.props).onInputError)||void 0===s||s.call(i,{code:1,msg:yy})}}else l!==zv.ArrowDown&&l!==zv.ArrowUp&&l!==zv.Enter||null===(r=o.onInputClick)||void 0===r||r.call(o)},o.onPortalKeyDown=function(e){e.key===zv.Escape&&(e.preventDefault(),o.setState({preventFocus:!0},(function(){o.setOpen(!1),setTimeout((function(){o.setFocus(),o.setState({preventFocus:!1})}))})))},o.onDayKeyDown=function(e){var t,n,r,a,i,s,l=o.props,c=l.minDate,u=l.maxDate,d=l.disabledKeyboardNavigation,f=l.showWeekPicker,p=l.shouldCloseOnSelect,h=l.locale,m=l.calendarStartDay,v=l.adjustDateOnChange,g=l.inline;if(null===(n=(t=o.props).onKeyDown)||void 0===n||n.call(t,e),!d){var y=e.key,b=e.shiftKey,w=Yv(o.state.preSelection),x=function(e,t){var n=t;switch(e){case zv.ArrowRight:n=f?qh(t,1):gp(t,1);break;case zv.ArrowLeft:n=f?Gh(t,1):Xh(t,1);break;case zv.ArrowUp:n=Gh(t,1);break;case zv.ArrowDown:n=qh(t,1);break;case zv.PageUp:n=b?Rh(t,1):Dh(t,1);break;case zv.PageDown:n=b?Mh(t,1):jh(t,1);break;case zv.Home:n=Gv(t,h,m);break;case zv.End:n=function(e){return ch(e)}(t)}return n};if(y===zv.Enter)return e.preventDefault(),o.handleSelect(w,e),void(!p&&o.setPreSelection(w));if(y===zv.Escape)return e.preventDefault(),o.setOpen(!1),void(o.inputOk()||null===(a=(r=o.props).onInputError)||void 0===a||a.call(r,{code:1,msg:yy}));var k=null;switch(y){case zv.ArrowLeft:case zv.ArrowRight:case zv.ArrowUp:case zv.ArrowDown:case zv.PageUp:case zv.PageDown:case zv.Home:case zv.End:k=function(e,t){for(var n=e,r=!1,a=0,i=x(e,t);!r;){if(a>=40){i=t;break}c&&i<c&&(n=zv.ArrowRight,i=pg(c,o.props)?x(n,i):c),u&&i>u&&(n=zv.ArrowLeft,i=pg(u,o.props)?x(n,i):u),pg(i,o.props)?(n!==zv.PageUp&&n!==zv.Home||(n=zv.ArrowRight),n!==zv.PageDown&&n!==zv.End||(n=zv.ArrowLeft),i=x(n,i)):r=!0,a++}return i}(y,w)}if(k){if(e.preventDefault(),o.setState({lastPreSelectChange:xy}),v&&o.setSelected(k),o.setPreSelection(k),g){var S=xh(w),E=xh(k),C=wh(w),N=wh(k);S!==E||C!==N?o.setState({shouldFocusDayInline:!0}):o.setState({shouldFocusDayInline:!1})}}else null===(s=(i=o.props).onInputError)||void 0===s||s.call(i,{code:1,msg:yy})}},o.onPopperKeyDown=function(e){e.key===zv.Escape&&(e.preventDefault(),o.sendFocusBackToInput())},o.onClearClick=function(e){e&&e.preventDefault&&e.preventDefault(),o.sendFocusBackToInput();var t=o.props,n=t.selectsRange,r=t.onChange;n?null===r||void 0===r||r([null,null],e):null===r||void 0===r||r(null,e),o.setState({inputValue:null})},o.clear=function(){o.onClearClick()},o.onScroll=function(e){"boolean"===typeof o.props.closeOnScroll&&o.props.closeOnScroll?e.target!==document&&e.target!==document.documentElement&&e.target!==document.body||o.setOpen(!1):"function"===typeof o.props.closeOnScroll&&o.props.closeOnScroll(e)&&o.setOpen(!1)},o.renderCalendar=function(){var e,n;return o.props.inline||o.isCalendarOpen()?r.createElement(cy,Iv({showMonthYearDropdown:void 0,ref:function(e){o.calendar=e}},o.props,o.state,{setOpen:o.setOpen,dateFormat:null!==(e=o.props.dateFormatCalendar)&&void 0!==e?e:t.defaultProps.dateFormatCalendar,onSelect:o.handleSelect,onClickOutside:o.handleCalendarClickOutside,holidays:Mg(o.modifyHolidays()),outsideClickIgnoreClass:gy,onDropdownFocus:o.handleDropdownFocus,onTimeChange:o.handleTimeChange,className:o.props.calendarClassName,container:o.props.calendarContainer,handleOnKeyDown:o.props.onKeyDown,handleOnDayKeyDown:o.onDayKeyDown,setPreSelection:o.setPreSelection,dropdownMode:null!==(n=o.props.dropdownMode)&&void 0!==n?n:t.defaultProps.dropdownMode}),o.props.children):null},o.renderAriaLiveRegion=function(){var e,n=o.props,a=n.dateFormat,i=void 0===a?t.defaultProps.dateFormat:a,s=n.locale,l=o.props.showTimeInput||o.props.showTimeSelect?"PPPPp":"PPPP";return e=o.props.selectsRange?"Selected start date: ".concat(Qv(o.props.startDate,{dateFormat:l,locale:s}),". ").concat(o.props.endDate?"End date: "+Qv(o.props.endDate,{dateFormat:l,locale:s}):""):o.props.showTimeSelectOnly?"Selected time: ".concat(Qv(o.props.selected,{dateFormat:i,locale:s})):o.props.showYearPicker?"Selected year: ".concat(Qv(o.props.selected,{dateFormat:"yyyy",locale:s})):o.props.showMonthYearPicker?"Selected month: ".concat(Qv(o.props.selected,{dateFormat:"MMMM yyyy",locale:s})):o.props.showQuarterYearPicker?"Selected quarter: ".concat(Qv(o.props.selected,{dateFormat:"yyyy, QQQ",locale:s})):"Selected date: ".concat(Qv(o.props.selected,{dateFormat:l,locale:s})),r.createElement("span",{role:"alert","aria-live":"polite",className:"react-datepicker__aria-live"},e)},o.renderDateInput=function(){var e,n,a,i=Ld(o.props.className,((e={})[gy]=o.state.open,e)),s=o.props.customInput||r.createElement("input",{type:"text"}),l=o.props.customInputRef||"ref",c=o.props,u=c.dateFormat,d=void 0===u?t.defaultProps.dateFormat:u,f=c.locale,p="string"===typeof o.props.value?o.props.value:"string"===typeof o.state.inputValue?o.state.inputValue:o.props.selectsRange?function(e,t,n){if(!e)return"";var r=Qv(e,n),o=t?Qv(t,n):"";return"".concat(r," - ").concat(o)}(o.props.startDate,o.props.endDate,{dateFormat:d,locale:f}):o.props.selectsMultiple?function(e,t){if(!(null===e||void 0===e?void 0:e.length))return"";var n=e[0]?Qv(e[0],t):"";if(1===e.length)return n;if(2===e.length&&e[1]){var r=Qv(e[1],t);return"".concat(n,", ").concat(r)}var o=e.length-1;return"".concat(n," (+").concat(o,")")}(null!==(a=o.props.selectedDates)&&void 0!==a?a:[],{dateFormat:d,locale:f}):Qv(o.props.selected,{dateFormat:d,locale:f});return(0,r.cloneElement)(s,((n={})[l]=function(e){o.input=e},n.value=p,n.onBlur=o.handleBlur,n.onChange=o.handleChange,n.onClick=o.onInputClick,n.onFocus=o.handleFocus,n.onKeyDown=o.onInputKeyDown,n.id=o.props.id,n.name=o.props.name,n.form=o.props.form,n.autoFocus=o.props.autoFocus,n.placeholder=o.props.placeholderText,n.disabled=o.props.disabled,n.autoComplete=o.props.autoComplete,n.className=Ld(s.props.className,i),n.title=o.props.title,n.readOnly=o.props.readOnly,n.required=o.props.required,n.tabIndex=o.props.tabIndex,n["aria-describedby"]=o.props.ariaDescribedBy,n["aria-invalid"]=o.props.ariaInvalid,n["aria-labelledby"]=o.props.ariaLabelledBy,n["aria-required"]=o.props.ariaRequired,n))},o.renderClearButton=function(){var e=o.props,t=e.isClearable,n=e.disabled,a=e.selected,i=e.startDate,s=e.endDate,l=e.clearButtonTitle,c=e.clearButtonClassName,u=void 0===c?"":c,d=e.ariaLabelClose,f=void 0===d?"Close":d,p=e.selectedDates;return t&&(null!=a||null!=i||null!=s||(null===p||void 0===p?void 0:p.length))?r.createElement("button",{type:"button",className:Ld("react-datepicker__close-icon",u,{"react-datepicker__close-icon--disabled":n}),disabled:n,"aria-label":f,onClick:o.onClearClick,title:l,tabIndex:-1}):null},o.state=o.calcInitialState(),o.preventFocusTimeout=void 0,o}return Lv(t,e),Object.defineProperty(t,"defaultProps",{get:function(){return{allowSameDay:!1,dateFormat:"MM/dd/yyyy",dateFormatCalendar:"LLLL yyyy",disabled:!1,disabledKeyboardNavigation:!1,dropdownMode:"scroll",preventOpenOnFocus:!1,monthsShown:1,readOnly:!1,withPortal:!1,selectsDisabledDaysInRange:!1,shouldCloseOnSelect:!0,showTimeSelect:!1,showTimeInput:!1,showPreviousMonths:!1,showMonthYearPicker:!1,showFullMonthYearPicker:!1,showTwoColumnMonthYearPicker:!1,showFourColumnMonthYearPicker:!1,showYearPicker:!1,showQuarterYearPicker:!1,showWeekPicker:!1,strictParsing:!1,swapRange:!1,timeIntervals:30,timeCaption:"Time",previousMonthAriaLabel:"Previous Month",previousMonthButtonLabel:"Previous Month",nextMonthAriaLabel:"Next Month",nextMonthButtonLabel:"Next Month",previousYearAriaLabel:"Previous Year",previousYearButtonLabel:"Previous Year",nextYearAriaLabel:"Next Year",nextYearButtonLabel:"Next Year",timeInputLabel:"Time",enableTabLoop:!0,yearItemNumber:12,focusSelectedMonth:!1,showPopperArrow:!0,excludeScrollbar:!0,customTimeInput:null,calendarStartDay:void 0,toggleCalendarOnIconClick:!1,usePointerEvent:!1}},enumerable:!1,configurable:!0}),t.prototype.componentDidMount=function(){window.addEventListener("scroll",this.onScroll,!0),document.addEventListener("visibilitychange",this.setHiddenStateOnVisibilityHidden)},t.prototype.componentDidUpdate=function(e,t){var n,r,o,a,i,s;e.inline&&(i=e.selected,s=this.props.selected,i&&s?xh(i)!==xh(s)||wh(i)!==wh(s):i!==s)&&this.setPreSelection(this.props.selected),void 0!==this.state.monthSelectedIn&&e.monthsShown!==this.props.monthsShown&&this.setState({monthSelectedIn:0}),e.highlightDates!==this.props.highlightDates&&this.setState({highlightDates:Og(this.props.highlightDates)}),t.focused||sg(e.selected,this.props.selected)||this.setState({inputValue:null}),t.open!==this.state.open&&(!1===t.open&&!0===this.state.open&&(null===(r=(n=this.props).onCalendarOpen)||void 0===r||r.call(n)),!0===t.open&&!1===this.state.open&&(null===(a=(o=this.props).onCalendarClose)||void 0===a||a.call(o)))},t.prototype.componentWillUnmount=function(){this.clearPreventFocusTimeout(),window.removeEventListener("scroll",this.onScroll,!0),document.removeEventListener("visibilitychange",this.setHiddenStateOnVisibilityHidden)},t.prototype.renderInputContainer=function(){var e=this.props,t=e.showIcon,n=e.icon,o=e.calendarIconClassname,a=e.calendarIconClassName,i=e.toggleCalendarOnIconClick,s=this.state.open;return o&&console.warn("calendarIconClassname props is deprecated. should use calendarIconClassName props."),r.createElement("div",{className:"react-datepicker__input-container".concat(t?" react-datepicker__view-calendar-icon":"")},t&&r.createElement(uy,Iv({icon:n,className:Ld(a,!a&&o,s&&"react-datepicker-ignore-onclickoutside")},i?{onClick:this.toggleCalendar}:null)),this.state.isRenderAriaLiveMessage&&this.renderAriaLiveRegion(),this.renderDateInput(),this.renderClearButton())},t.prototype.render=function(){var e=this.renderCalendar();if(this.props.inline)return e;if(this.props.withPortal){var t=this.state.open?r.createElement(py,{enableTabLoop:this.props.enableTabLoop},r.createElement("div",{className:"react-datepicker__portal",tabIndex:-1,onKeyDown:this.onPortalKeyDown},e)):null;return this.state.open&&this.props.portalId&&(t=r.createElement(dy,Iv({portalId:this.props.portalId},this.props),t)),r.createElement("div",null,this.renderInputContainer(),t)}return r.createElement(vy,Iv({},this.props,{className:this.props.popperClassName,hidePopper:!this.isCalendarOpen(),targetComponent:this.renderInputContainer(),popperComponent:e,popperOnKeyDown:this.onPopperKeyDown,showArrow:this.props.showPopperArrow}))},t}(r.Component),wy="input",xy="navigate";const ky=()=>{te();const[e,t]=(0,r.useState)([]),[n,o]=(0,r.useState)([]),[a,i]=(0,r.useState)(null),[s,l]=(0,r.useState)(""),[c,u]=(0,r.useState)(!1),[d,f]=(0,r.useState)(null),[p,h]=(0,r.useState)([]),[m,v]=(0,r.useState)({title:"",content:""}),[g,y]=(0,r.useState)({name:"",discountType:"FREE"}),[b,w]=(0,r.useState)(new Date),[x,k]=(0,r.useState)(new Date),[S,E]=(0,r.useState)("users"),C=async()=>{u(!0),f(null);try{const e=await(async()=>{try{const t=await ar.get("".concat(gd,"/user/allUser"),{headers:{Authorization:localStorage.getItem("token")}});if(console.log("API Response:",t.data),t.data&&200===t.data.code){const e=t.data.data.data;return Array.isArray(e)?e:[e]}var e;throw new Error((null===(e=t.data)||void 0===e?void 0:e.message)||"\u672a\u77e5\u9519\u8bef")}catch(d){throw console.error("\u83b7\u53d6\u7528\u6237\u5217\u8868\u5931\u8d25:",d),d}})();console.log("API Data:",e);const n=e.map((e=>({username:e.username||"\u672a\u77e5\u7528\u6237",authority:e.authority||"USER",registTime:e.registTime||null,lastLogin:e.lastLogin||null,upload:Number(e.upload)||0,download:Number(e.download)||0,magicPoints:Number(e.magicPoints)||0,shareRate:Number(e.shareRate)||0})));console.log("Formatted Users:",n),t(n)}catch(e){console.error("Error details:",e),f("\u83b7\u53d6\u7528\u6237\u5217\u8868\u5931\u8d25: ".concat(e.message))}finally{u(!1)}},N=async(n,r)=>{try{await(async(e,t)=>{try{return(await ar.put("".concat(gd,"/user/changeAuthority"),{changeUsername:e,authority:t},{headers:{Authorization:localStorage.getItem("token")}})).data}catch(d){throw console.error("\u4fee\u6539\u7528\u6237\u6743\u9650\u5931\u8d25:",d),d}})(n,r),t(e.map((e=>e.username===n?_e(_e({},e),{},{authority:r}):e)))}catch(o){f("\u4fee\u6539\u6743\u9650\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5"),console.error(o)}},j=async()=>{u(!0),f(null);try{const e=await yd();o(e)}catch(e){f("\u83b7\u53d6\u6298\u6263\u5217\u8868\u5931\u8d25: "+e.message),console.error(e)}finally{u(!1)}},D=async()=>{try{const e=await(async()=>{try{var e;const r=await ar.get("".concat(gd,"/discount/current"),{headers:{Authorization:localStorage.getItem("token")}});var t,n;if(r.data&&200===r.data.code)return(null===(t=r.data.data)||void 0===t?void 0:t.data)||r.data.data||null;if("\u76ee\u524d\u6ca1\u6709\u8fdb\u884c\u4e2d\u7684\u6298\u6263"===(null===(e=r.data)||void 0===e?void 0:e.message))return null;throw new Error((null===(n=r.data)||void 0===n?void 0:n.message)||"\u83b7\u53d6\u5f53\u524d\u6298\u6263\u5931\u8d25")}catch(d){throw console.error("\u83b7\u53d6\u5f53\u524d\u6298\u6263\u5931\u8d25:",d),d}})();i(e)}catch(e){console.error("\u83b7\u53d6\u5f53\u524d\u6298\u6263\u5931\u8d25:",e)}},P=async()=>{if(g.name&&b&&x)try{if(b>=x)return void f("\u7ed3\u675f\u65f6\u95f4\u5fc5\u987b\u665a\u4e8e\u5f00\u59cb\u65f6\u95f4");const e={name:g.name,startTime:T(b),endTime:T(x,!0),discountType:g.discountType};console.log("\u63d0\u4ea4\u6570\u636e:",e),await(async e=>{try{const n=await ar.post("".concat(gd,"/discount/add"),e,{headers:{Authorization:localStorage.getItem("token")}});if(n.data&&200===n.data.code)return n.data.data.data||n.data.data;var t;throw new Error((null===(t=n.data)||void 0===t?void 0:t.message)||"\u6dfb\u52a0\u6298\u6263\u5931\u8d25")}catch(d){throw console.error("\u6dfb\u52a0\u6298\u6263\u5931\u8d25:",d),d}})(e),y({name:"",discountType:"FREE"}),w(new Date),k(new Date),j(),f(null)}catch(e){f("\u6dfb\u52a0\u6298\u6263\u5931\u8d25: "+e.message),console.error(e)}else f("\u8bf7\u586b\u5199\u6240\u6709\u5fc5\u586b\u5b57\u6bb5")},T=function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!e)return"";const n=e=>e.toString().padStart(2,"0"),r=e.getFullYear(),o=n(e.getMonth()+1),a=n(e.getDate()),i=n(e.getHours()),s=n(e.getMinutes());return t?"".concat(r,"-").concat(o,"-").concat(a,"T").concat(i,":").concat(s,":59"):"".concat(r,"-").concat(o,"-").concat(a,"T").concat(i,":").concat(s,":00")},_=async e=>{try{await(async e=>{try{const n=await ar.delete("".concat(gd,"/discount/delete/").concat(e),{headers:{Authorization:localStorage.getItem("token")}});if(n.data&&200===n.data.code)return!0;var t;throw new Error((null===(t=n.data)||void 0===t?void 0:t.message)||"\u5220\u9664\u6298\u6263\u5931\u8d25")}catch(d){throw console.error("\u5220\u9664\u6298\u6263\u5931\u8d25:",d),d}})(e),j()}catch(t){f("\u5220\u9664\u6298\u6263\u5931\u8d25: "+t.message),console.error(t)}},O=e=>e?new Date(e).toLocaleDateString():"-",M=e=>e?new Date(e).toLocaleString():"-",R=e=>{switch(e){case"FREE":return"\u5168\u90e8\u514d\u8d39";case"HALF":return"\u534a\u4ef7\u4e0b\u8f7d";case"DOUBLE":return"\u53cc\u500d\u4e0a\u4f20";default:return e}},A=async()=>{u(!0),f(null);try{const e=await ir.get("/announcement/list");h(Array.isArray(e)?e:[])}catch(e){f("\u83b7\u53d6\u516c\u544a\u5217\u8868\u5931\u8d25: "+e.message),console.error(e)}finally{u(!1)}};return(0,r.useEffect)((()=>{"users"===S?C():"discounts"===S?(j(),D()):"announcements"===S&&A()}),[S]),(0,bd.jsxs)("div",{className:"administer-container",children:[(0,bd.jsx)("h1",{children:"\u7cfb\u7edf\u7ba1\u7406"}),(0,bd.jsxs)("div",{className:"tab-container",children:[(0,bd.jsx)("button",{className:"tab-button ".concat("users"===S?"active":""),onClick:()=>E("users"),children:"\u7528\u6237\u7ba1\u7406"}),(0,bd.jsx)("button",{className:"tab-button ".concat("discounts"===S?"active":""),onClick:()=>E("discounts"),children:"\u6298\u6263\u7ba1\u7406"}),(0,bd.jsx)("button",{className:"tab-button ".concat("announcements"===S?"active":""),onClick:()=>E("announcements"),children:"\u516c\u544a\u7ba1\u7406"})]}),"users"===S?(0,bd.jsxs)(bd.Fragment,{children:[(0,bd.jsxs)("div",{className:"search-container",children:[(0,bd.jsx)("input",{type:"text",value:s,onChange:e=>l(e.target.value),placeholder:"\u8f93\u5165\u7528\u6237\u540d\u641c\u7d22",className:"search-input"}),(0,bd.jsx)("button",{onClick:async()=>{if(s.trim()){u(!0),f(null);try{const e=await(async e=>{try{var t;const r=await ar.get("".concat(gd,"/user/searchUser"),{params:{key:e},headers:{Authorization:localStorage.getItem("token")}});if(200===(null===(t=r.data)||void 0===t?void 0:t.code)){const e=r.data.data.data;return Array.isArray(e)?e:[e]}var n;throw new Error((null===(n=r.data)||void 0===n?void 0:n.message)||"\u641c\u7d22\u5931\u8d25")}catch(d){throw console.error("\u641c\u7d22\u7528\u6237\u5931\u8d25:",d),d}})(s);console.log("Search Results:",e);const n=e.map((e=>({username:e.username||"\u672a\u77e5\u7528\u6237",authority:e.authority||"USER",registTime:e.registTime||null,lastLogin:e.lastLogin||null,upload:Number(e.upload)||0,download:Number(e.download)||0,magicPoints:Number(e.magicPoints)||0,shareRate:Number(e.shareRate)||0})));t(n)}catch(e){f("\u641c\u7d22\u7528\u6237\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5"),console.error(e)}finally{u(!1)}}else C()},className:"search-button",children:"\u641c\u7d22"}),(0,bd.jsx)("button",{onClick:()=>{l(""),C()},className:"reset-button",children:"\u91cd\u7f6e"})]}),d&&(0,bd.jsx)("div",{className:"error-message",children:d}),c&&(0,bd.jsx)("div",{className:"loading-message",children:"\u52a0\u8f7d\u4e2d..."}),(0,bd.jsx)("div",{className:"user-list-container",children:(0,bd.jsxs)("table",{className:"user-table",children:[(0,bd.jsx)("thead",{children:(0,bd.jsxs)("tr",{children:[(0,bd.jsx)("th",{children:"\u7528\u6237\u540d"}),(0,bd.jsx)("th",{children:"\u6ce8\u518c\u65f6\u95f4"}),(0,bd.jsx)("th",{children:"\u6700\u540e\u767b\u5f55"}),(0,bd.jsx)("th",{children:"\u4e0a\u4f20\u91cf"}),(0,bd.jsx)("th",{children:"\u4e0b\u8f7d\u91cf"}),(0,bd.jsx)("th",{children:"\u5206\u4eab\u7387"}),(0,bd.jsx)("th",{children:"\u9b54\u529b\u503c"}),(0,bd.jsx)("th",{children:"\u6743\u9650"}),(0,bd.jsx)("th",{children:"\u64cd\u4f5c"})]})}),(0,bd.jsx)("tbody",{children:Array.isArray(e)&&e.map((e=>{return(0,bd.jsxs)("tr",{children:[(0,bd.jsx)("td",{children:e.username}),(0,bd.jsx)("td",{children:O(e.registTime)}),(0,bd.jsx)("td",{children:O(e.lastLogin)}),(0,bd.jsx)("td",{children:e.upload}),(0,bd.jsx)("td",{children:e.download}),(0,bd.jsx)("td",{children:(t=e.shareRate,(100*t).toFixed(2)+"%")}),(0,bd.jsx)("td",{children:e.magicPoints}),(0,bd.jsx)("td",{children:e.authority}),(0,bd.jsx)("td",{children:(0,bd.jsxs)("select",{value:e.authority,onChange:t=>N(e.username,t.target.value),className:"authority-select",children:[(0,bd.jsx)("option",{value:"USER",children:"\u666e\u901a\u7528\u6237"}),(0,bd.jsx)("option",{value:"ADMIN",children:"\u7ba1\u7406\u5458"}),(0,bd.jsx)("option",{value:"LIMIT",children:"\u53d7\u9650\u7528\u6237"}),(0,bd.jsx)("option",{value:"BAN",children:"\u5c01\u7981\u7528\u6237"})]})})]},e.username);var t}))})]})})]}):"discounts"===S?(0,bd.jsxs)(bd.Fragment,{children:[(0,bd.jsxs)("div",{className:"current-discount-section",children:[(0,bd.jsx)("h3",{children:"\u5f53\u524d\u6d3b\u52a8\u6298\u6263"}),a?(0,bd.jsxs)("div",{className:"current-discount-card",children:[(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u540d\u79f0:"})," ",a.name]}),(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u7c7b\u578b:"})," ",R(a.discountType)]}),(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u65f6\u95f4:"})," ",M(a.startTime)," \u81f3 ",M(a.endTime)]}),(0,bd.jsxs)("p",{children:[(0,bd.jsx)("strong",{children:"\u72b6\u6001:"})," ",a.status]})]}):(0,bd.jsx)("p",{children:"\u5f53\u524d\u6ca1\u6709\u8fdb\u884c\u4e2d\u7684\u6298\u6263"})]}),(0,bd.jsxs)("div",{className:"add-discount-form",children:[(0,bd.jsx)("h3",{children:"\u6dfb\u52a0\u65b0\u6298\u6263"}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u6298\u6263\u540d\u79f0:"}),(0,bd.jsx)("input",{type:"text",value:g.name,onChange:e=>y(_e(_e({},g),{},{name:e.target.value}))})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u5f00\u59cb\u65f6\u95f4:"}),(0,bd.jsx)(by,{selected:b,onChange:e=>w(e),showTimeSelect:!0,timeFormat:"HH:mm",timeIntervals:1,dateFormat:"yyyy-MM-dd HH:mm",minDate:new Date,placeholderText:"\u9009\u62e9\u5f00\u59cb\u65e5\u671f\u548c\u65f6\u95f4"})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u7ed3\u675f\u65f6\u95f4:"}),(0,bd.jsx)(by,{selected:x,onChange:e=>k(e),showTimeSelect:!0,timeFormat:"HH:mm",timeIntervals:1,dateFormat:"yyyy-MM-dd HH:mm",minDate:b,placeholderText:"\u9009\u62e9\u7ed3\u675f\u65e5\u671f\u548c\u65f6\u95f4"})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u6298\u6263\u7c7b\u578b:"}),(0,bd.jsxs)("select",{value:g.discountType,onChange:e=>y(_e(_e({},g),{},{discountType:e.target.value})),children:[(0,bd.jsx)("option",{value:"FREE",children:"\u5168\u90e8\u514d\u8d39"}),(0,bd.jsx)("option",{value:"HALF",children:"\u534a\u4ef7\u4e0b\u8f7d"}),(0,bd.jsx)("option",{value:"DOUBLE",children:"\u53cc\u500d\u4e0a\u4f20"})]})]}),(0,bd.jsx)("button",{onClick:e=>{e.preventDefault(),P()},children:"\u6dfb\u52a0\u6298\u6263"})]}),(0,bd.jsxs)("div",{className:"discount-list-container",children:[(0,bd.jsx)("h3",{children:"\u6240\u6709\u6298\u6263\u8ba1\u5212"}),(0,bd.jsxs)("table",{className:"discount-table",children:[(0,bd.jsx)("thead",{children:(0,bd.jsxs)("tr",{children:[(0,bd.jsx)("th",{children:"ID"}),(0,bd.jsx)("th",{children:"\u540d\u79f0"}),(0,bd.jsx)("th",{children:"\u5f00\u59cb\u65f6\u95f4"}),(0,bd.jsx)("th",{children:"\u7ed3\u675f\u65f6\u95f4"}),(0,bd.jsx)("th",{children:"\u7c7b\u578b"}),(0,bd.jsx)("th",{children:"\u521b\u5efa\u65f6\u95f4"}),(0,bd.jsx)("th",{children:"\u72b6\u6001"}),(0,bd.jsx)("th",{children:"\u64cd\u4f5c"})]})}),(0,bd.jsx)("tbody",{children:n.map((e=>(0,bd.jsxs)("tr",{children:[(0,bd.jsx)("td",{children:e.id}),(0,bd.jsx)("td",{children:e.name}),(0,bd.jsx)("td",{children:M(e.startTime)}),(0,bd.jsx)("td",{children:M(e.endTime)}),(0,bd.jsx)("td",{children:R(e.discountType)}),(0,bd.jsx)("td",{children:M(e.createTime)}),(0,bd.jsx)("td",{children:e.status||"\u672a\u77e5"}),(0,bd.jsx)("td",{children:(0,bd.jsx)("button",{onClick:()=>_(e.id),className:"delete-button",children:"\u5220\u9664"})})]},e.id)))})]})]})]}):(0,bd.jsxs)(bd.Fragment,{children:[(0,bd.jsxs)("div",{className:"announcement-form",children:[(0,bd.jsx)("h3",{children:"\u53d1\u5e03\u65b0\u516c\u544a"}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u516c\u544a\u6807\u9898:"}),(0,bd.jsx)("input",{type:"text",value:m.title,onChange:e=>v(_e(_e({},m),{},{title:e.target.value})),placeholder:"\u8f93\u5165\u516c\u544a\u6807\u9898"})]}),(0,bd.jsxs)("div",{className:"form-group",children:[(0,bd.jsx)("label",{children:"\u516c\u544a\u5185\u5bb9:"}),(0,bd.jsx)("textarea",{value:m.content,onChange:e=>v(_e(_e({},m),{},{content:e.target.value})),rows:"5",placeholder:"\u8f93\u5165\u516c\u544a\u5185\u5bb9"})]}),(0,bd.jsx)("button",{onClick:async()=>{if(m.title&&m.content)try{await(e=>{const t=new FormData;return t.append("title",e.title),t.append("content",e.content),ir.post("/announcement/create",t)})(m),v({title:"",content:""}),A(),f(null)}catch(e){f("\u53d1\u5e03\u516c\u544a\u5931\u8d25: "+e.message),console.error(e)}else f("\u8bf7\u586b\u5199\u516c\u544a\u6807\u9898\u548c\u5185\u5bb9")},children:"\u53d1\u5e03\u516c\u544a"})]}),(0,bd.jsxs)("div",{className:"announcement-list-container",children:[(0,bd.jsx)("h3",{children:"\u6240\u6709\u516c\u544a"}),(0,bd.jsxs)("table",{className:"announcement-table",children:[(0,bd.jsx)("thead",{children:(0,bd.jsxs)("tr",{children:[(0,bd.jsx)("th",{children:"\u6807\u9898"}),(0,bd.jsx)("th",{children:"\u5185\u5bb9"}),(0,bd.jsx)("th",{children:"\u53d1\u5e03\u65f6\u95f4"})]})}),(0,bd.jsx)("tbody",{children:p.map((e=>(0,bd.jsxs)("tr",{children:[(0,bd.jsx)("td",{children:e.title}),(0,bd.jsx)("td",{children:e.content}),(0,bd.jsx)("td",{children:M(e.createTime)})]},e.id)))})]})]})]})]})};const Sy=function(){r.useEffect((()=>{localStorage.removeItem("token"),console.log("Token cleared on app startup"),localStorage.removeItem("username")}),[]);const[e,t]=r.useState(!1),n=()=>{localStorage.removeItem("token"),t(!1)};return(0,bd.jsx)(Ee,{children:(0,bd.jsxs)(xe,{children:[(0,bd.jsx)(be,{path:"/",element:(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/login",element:e?(0,bd.jsx)(ge,{to:"/dashboard",replace:!0}):(0,bd.jsx)(Nd,{onLoginSuccess:e=>{t(!0)}})}),(0,bd.jsx)(be,{path:"/dashboard/:tab?",element:e?(0,bd.jsx)(wd,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/announcement/:id",element:e?(0,bd.jsx)(jd,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/personal",element:e?(0,bd.jsx)(Cd,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/personal/exchange",element:e?(0,bd.jsx)(_d,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/personal/upload",element:e?(0,bd.jsx)(Od,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/personal/notice",element:e?(0,bd.jsx)(Md,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/personal/setting",element:e?(0,bd.jsx)(Rd,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"*",element:e?(0,bd.jsx)(ge,{to:"/dashboard",replace:!0}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/administer",element:e?(0,bd.jsx)(ky,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/request/:id",element:e?(0,bd.jsx)(Pd,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/help/:id",element:e?(0,bd.jsx)(Td,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})}),(0,bd.jsx)(be,{path:"/torrent/:id",element:e?(0,bd.jsx)(Dd,{onLogout:n}):(0,bd.jsx)(ge,{to:"/login",replace:!0})})]})})},Ey=e=>{e&&e instanceof Function&&n.e(845).then(n.bind(n,845)).then((t=>{let{getCLS:n,getFID:r,getFCP:o,getLCP:a,getTTFB:i}=t;n(e),r(e),o(e),a(e),i(e)}))};var Cy=n(365),Ny=n.n(Cy),jy=n(478);"undefined"===typeof window.process&&(window.process=Ny()),"undefined"===typeof window.Buffer&&(window.Buffer=jy.hp);a.createRoot(document.getElementById("root")).render((0,bd.jsx)(r.StrictMode,{children:(0,bd.jsx)(Sy,{})})),Ey()})()})();
+//# sourceMappingURL=main.dd76cdc0.js.map
\ No newline at end of file
diff --git a/build/static/js/main.dd76cdc0.js.LICENSE.txt b/build/static/js/main.dd76cdc0.js.LICENSE.txt
new file mode 100644
index 0000000..a13d5de
--- /dev/null
+++ b/build/static/js/main.dd76cdc0.js.LICENSE.txt
@@ -0,0 +1,116 @@
+/*!
+	Copyright (c) 2018 Jed Watson.
+	Licensed under the MIT License (MIT), see
+	http://jedwatson.github.io/classnames
+*/
+
+/*!
+  react-datepicker v8.3.0
+  https://github.com/Hacker0x01/react-datepicker
+  Released under the MIT License.
+*/
+
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author   Feross Aboukhadijeh <https://feross.org>
+ * @license  MIT
+ */
+
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
+
+/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */
+
+/**
+ * @license React
+ * react-dom-client.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-dom.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-is.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react-jsx-runtime.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * react.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @license React
+ * scheduler.production.js
+ *
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/**
+ * @remix-run/router v1.23.0
+ *
+ * Copyright (c) Remix Software Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.md file in the root directory of this source tree.
+ *
+ * @license MIT
+ */
+
+/**
+ * React Router v6.30.0
+ *
+ * Copyright (c) Remix Software Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE.md file in the root directory of this source tree.
+ *
+ * @license MIT
+ */
+
+/**![check-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0xOTMuNSAzMDEuN2wtMjEwLjYgMjkyYTMxLjggMzEuOCAwIDAxLTUxLjcgMEwzMTguNSA0ODQuOWMtMy44LTUuMyAwLTEyLjcgNi41LTEyLjdoNDYuOWMxMC4yIDAgMTkuOSA0LjkgMjUuOSAxMy4zbDcxLjIgOTguOCAxNTcuMi0yMThjNi04LjMgMTUuNi0xMy4zIDI1LjktMTMuM0g2OTljNi41IDAgMTAuMyA3LjQgNi41IDEyLjd6IiAvPjwvc3ZnPg==) */
+
+/**![close-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNTEyIDY0YzI0Ny40IDAgNDQ4IDIwMC42IDQ0OCA0NDhTNzU5LjQgOTYwIDUxMiA5NjAgNjQgNzU5LjQgNjQgNTEyIDI2NC42IDY0IDUxMiA2NHptMTI3Ljk4IDI3NC44MmgtLjA0bC0uMDguMDZMNTEyIDQ2Ni43NSAzODQuMTQgMzM4Ljg4Yy0uMDQtLjA1LS4wNi0uMDYtLjA4LS4wNmEuMTIuMTIgMCAwMC0uMDcgMGMtLjAzIDAtLjA1LjAxLS4wOS4wNWwtNDUuMDIgNDUuMDJhLjIuMiAwIDAwLS4wNS4wOS4xMi4xMiAwIDAwMCAuMDd2LjAyYS4yNy4yNyAwIDAwLjA2LjA2TDQ2Ni43NSA1MTIgMzM4Ljg4IDYzOS44NmMtLjA1LjA0LS4wNi4wNi0uMDYuMDhhLjEyLjEyIDAgMDAwIC4wN2MwIC4wMy4wMS4wNS4wNS4wOWw0NS4wMiA0NS4wMmEuMi4yIDAgMDAuMDkuMDUuMTIuMTIgMCAwMC4wNyAwYy4wMiAwIC4wNC0uMDEuMDgtLjA1TDUxMiA1NTcuMjVsMTI3Ljg2IDEyNy44N2MuMDQuMDQuMDYuMDUuMDguMDVhLjEyLjEyIDAgMDAuMDcgMGMuMDMgMCAuMDUtLjAxLjA5LS4wNWw0NS4wMi00NS4wMmEuMi4yIDAgMDAuMDUtLjA5LjEyLjEyIDAgMDAwLS4wN3YtLjAyYS4yNy4yNyAwIDAwLS4wNS0uMDZMNTU3LjI1IDUxMmwxMjcuODctMTI3Ljg2Yy4wNC0uMDQuMDUtLjA2LjA1LS4wOGEuMTIuMTIgMCAwMDAtLjA3YzAtLjAzLS4wMS0uMDUtLjA1LS4wOWwtNDUuMDItNDUuMDJhLjIuMiAwIDAwLS4wOS0uMDUuMTIuMTIgMCAwMC0uMDcgMHoiIC8+PC9zdmc+) */
+
+/**![close](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNzk5Ljg2IDE2Ni4zMWMuMDIgMCAuMDQuMDIuMDguMDZsNTcuNjkgNTcuN2MuMDQuMDMuMDUuMDUuMDYuMDhhLjEyLjEyIDAgMDEwIC4wNmMwIC4wMy0uMDIuMDUtLjA2LjA5TDU2OS45MyA1MTJsMjg3LjcgMjg3LjdjLjA0LjA0LjA1LjA2LjA2LjA5YS4xMi4xMiAwIDAxMCAuMDdjMCAuMDItLjAyLjA0LS4wNi4wOGwtNTcuNyA1Ny42OWMtLjAzLjA0LS4wNS4wNS0uMDcuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMyAwLS4wNS0uMDItLjA5LS4wNkw1MTIgNTY5LjkzbC0yODcuNyAyODcuN2MtLjA0LjA0LS4wNi4wNS0uMDkuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMiAwLS4wNC0uMDItLjA4LS4wNmwtNTcuNjktNTcuN2MtLjA0LS4wMy0uMDUtLjA1LS4wNi0uMDdhLjEyLjEyIDAgMDEwLS4wN2MwLS4wMy4wMi0uMDUuMDYtLjA5TDQ1NC4wNyA1MTJsLTI4Ny43LTI4Ny43Yy0uMDQtLjA0LS4wNS0uMDYtLjA2LS4wOWEuMTIuMTIgMCAwMTAtLjA3YzAtLjAyLjAyLS4wNC4wNi0uMDhsNTcuNy01Ny42OWMuMDMtLjA0LjA1LS4wNS4wNy0uMDZhLjEyLjEyIDAgMDEuMDcgMGMuMDMgMCAuMDUuMDIuMDkuMDZMNTEyIDQ1NC4wN2wyODcuNy0yODcuN2MuMDQtLjA0LjA2LS4wNS4wOS0uMDZhLjEyLjEyIDAgMDEuMDcgMHoiIC8+PC9zdmc+) */
+
+/**![exclamation-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0tMzIgMjMyYzAtNC40IDMuNi04IDgtOGg0OGM0LjQgMCA4IDMuNiA4IDh2MjcyYzAgNC40LTMuNiA4LTggOGgtNDhjLTQuNCAwLTgtMy42LTgtOFYyOTZ6bTMyIDQ0MGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */
+
+/**![info-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */
+
+/**![loading](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk4OCA1NDhjLTE5LjkgMC0zNi0xNi4xLTM2LTM2IDAtNTkuNC0xMS42LTExNy0zNC42LTE3MS4zYTQ0MC40NSA0NDAuNDUgMCAwMC05NC4zLTEzOS45IDQzNy43MSA0MzcuNzEgMCAwMC0xMzkuOS05NC4zQzYyOSA4My42IDU3MS40IDcyIDUxMiA3MmMtMTkuOSAwLTM2LTE2LjEtMzYtMzZzMTYuMS0zNiAzNi0zNmM2OS4xIDAgMTM2LjIgMTMuNSAxOTkuMyA0MC4zQzc3Mi4zIDY2IDgyNyAxMDMgODc0IDE1MGM0NyA0NyA4My45IDEwMS44IDEwOS43IDE2Mi43IDI2LjcgNjMuMSA0MC4yIDEzMC4yIDQwLjIgMTk5LjMuMSAxOS45LTE2IDM2LTM1LjkgMzZ6IiAvPjwvc3ZnPg==) */
diff --git a/build/static/js/main.dd76cdc0.js.map b/build/static/js/main.dd76cdc0.js.map
new file mode 100644
index 0000000..165778f
--- /dev/null
+++ b/build/static/js/main.dd76cdc0.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/js/main.dd76cdc0.js","mappings":"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","sources":["../node_modules/classnames/index.js","../node_modules/rc-util/node_modules/react-is/cjs/react-is.production.min.js","../node_modules/base64-js/index.js","../node_modules/process/browser.js","../node_modules/buffer/index.js","../node_modules/react/index.js","../node_modules/react-dom/cjs/react-dom-client.production.js","../node_modules/scheduler/index.js","../node_modules/react/cjs/react.production.js","../node_modules/scheduler/cjs/scheduler.production.js","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/jsx-runtime.js","../node_modules/react-dom/client.js","../node_modules/rc-util/node_modules/react-is/index.js","../node_modules/react-dom/cjs/react-dom.production.js","../node_modules/ieee754/index.js","../node_modules/react-dom/index.js","../webpack/bootstrap","../webpack/runtime/compat get default export","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/load script","../webpack/runtime/make namespace object","../webpack/runtime/publicPath","../webpack/runtime/jsonp chunk loading","../node_modules/@remix-run/router/history.ts","../node_modules/@remix-run/router/utils.ts","../node_modules/@remix-run/router/router.ts","../node_modules/react-router/lib/context.ts","../node_modules/react-router/lib/hooks.tsx","../node_modules/react-router/lib/deprecations.ts","../node_modules/react-router/lib/components.tsx","../node_modules/react-router-dom/dom.ts","../node_modules/react-router-dom/index.tsx","../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/core/AxiosError.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/axios/lib/platform/browser/index.js","../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../node_modules/axios/lib/platform/browser/classes/FormData.js","../node_modules/axios/lib/platform/browser/classes/Blob.js","../node_modules/axios/lib/platform/common/utils.js","../node_modules/axios/lib/platform/index.js","../node_modules/axios/lib/helpers/formDataToJSON.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/helpers/toURLEncodedForm.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/core/AxiosHeaders.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/helpers/speedometer.js","../node_modules/axios/lib/helpers/throttle.js","../node_modules/axios/lib/helpers/progressEventReducer.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/helpers/resolveConfig.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/axios/lib/helpers/composeSignals.js","../node_modules/@babel/runtime/helpers/esm/OverloadYield.js","../node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js","../node_modules/@babel/runtime/helpers/esm/awaitAsyncGenerator.js","../node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js","../node_modules/@babel/runtime/helpers/esm/asyncIterator.js","../node_modules/axios/lib/helpers/trackStream.js","../node_modules/axios/lib/adapters/fetch.js","../node_modules/axios/lib/adapters/adapters.js","../node_modules/axios/lib/helpers/null.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/helpers/HttpStatusCode.js","../node_modules/axios/lib/axios.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","api/auth.js","api/torrent.js","api/helpPost.js","api/requestPost.js","../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../node_modules/antd/es/app/context.js","../node_modules/antd/es/config-provider/context.js","../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../node_modules/@emotion/hash/dist/hash.browser.esm.js","../node_modules/rc-util/es/Dom/canUseDom.js","../node_modules/rc-util/es/Dom/dynamicCSS.js","../node_modules/rc-util/es/Dom/contains.js","../node_modules/rc-util/es/hooks/useMemo.js","../node_modules/rc-util/es/warning.js","../node_modules/rc-util/es/isEqual.js","../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../node_modules/@babel/runtime/helpers/esm/createClass.js","../node_modules/@ant-design/cssinjs/es/Cache.js","../node_modules/@ant-design/cssinjs/es/StyleContext.js","../node_modules/@ant-design/cssinjs/es/theme/calc/CSSCalculator.js","../node_modules/@ant-design/cssinjs/es/theme/ThemeCache.js","../node_modules/@ant-design/cssinjs/es/theme/Theme.js","../node_modules/@ant-design/cssinjs/es/theme/createTheme.js","../node_modules/@ant-design/cssinjs/es/util/index.js","../node_modules/@ant-design/cssinjs/es/util/css-variables.js","../node_modules/rc-util/es/hooks/useLayoutEffect.js","../node_modules/@ant-design/cssinjs/es/hooks/useCompatibleInsertionEffect.js","../node_modules/@ant-design/cssinjs/es/hooks/useEffectCleanupRegister.js","../node_modules/@ant-design/cssinjs/es/hooks/useHMR.js","../node_modules/@ant-design/cssinjs/es/hooks/useGlobalCache.js","../node_modules/@ant-design/cssinjs/es/hooks/useCacheToken.js","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@emotion/unitless/dist/unitless.browser.esm.js","../node_modules/stylis/src/Enum.js","../node_modules/stylis/src/Utility.js","../node_modules/stylis/src/Serializer.js","../node_modules/stylis/src/Tokenizer.js","../node_modules/stylis/src/Parser.js","../node_modules/@ant-design/cssinjs/es/util/cacheMapUtil.js","../node_modules/@ant-design/cssinjs/es/hooks/useStyleRegister.js","../node_modules/@ant-design/cssinjs/es/hooks/useCSSVarRegister.js","../node_modules/@ant-design/cssinjs/es/extractStyle.js","../node_modules/@ant-design/cssinjs/es/Keyframes.js","../node_modules/@ant-design/cssinjs/es/transformers/legacyLogicalProperties.js","../node_modules/@ant-design/icons/es/components/Context.js","../node_modules/rc-util/es/utils/get.js","../node_modules/rc-util/es/utils/set.js","../node_modules/@babel/runtime/helpers/esm/toArray.js","../node_modules/antd/es/_util/warning.js","../node_modules/antd/es/form/validateMessagesContext.js","../node_modules/rc-pagination/es/locale/en_US.js","../node_modules/rc-picker/es/locale/en_US.js","../node_modules/rc-picker/es/locale/common.js","../node_modules/antd/es/time-picker/locale/en_US.js","../node_modules/antd/es/date-picker/locale/en_US.js","../node_modules/antd/es/locale/en_US.js","../node_modules/antd/es/modal/locale.js","../node_modules/antd/es/locale/context.js","../node_modules/antd/es/locale/index.js","../node_modules/@ant-design/fast-color/es/FastColor.js","../node_modules/@ant-design/colors/es/generate.js","../node_modules/@ant-design/colors/es/presets.js","../node_modules/antd/es/theme/themes/seed.js","../node_modules/antd/es/theme/themes/shared/genRadius.js","../node_modules/antd/es/theme/themes/shared/genControlHeight.js","../node_modules/antd/es/theme/themes/shared/genFontMapToken.js","../node_modules/antd/es/theme/themes/shared/genFontSizes.js","../node_modules/antd/es/theme/themes/default/colorAlgorithm.js","../node_modules/antd/es/theme/themes/default/colors.js","../node_modules/antd/es/theme/themes/default/theme.js","../node_modules/antd/es/theme/themes/default/index.js","../node_modules/antd/es/theme/themes/shared/genColorMapToken.js","../node_modules/antd/es/theme/themes/shared/genSizeMapToken.js","../node_modules/antd/es/theme/themes/shared/genCommonMapToken.js","../node_modules/antd/es/theme/context.js","../node_modules/antd/es/config-provider/cssVariables.js","../node_modules/antd/es/config-provider/DisabledContext.js","../node_modules/antd/es/config-provider/SizeContext.js","../node_modules/antd/es/config-provider/hooks/useConfig.js","../node_modules/antd/es/config-provider/hooks/useThemeKey.js","../node_modules/rc-util/es/Dom/findDOMNode.js","../node_modules/rc-util/es/React/isFragment.js","../node_modules/rc-util/es/ref.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/rc-motion/es/context.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inherits.js","../node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/createSuper.js","../node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","../node_modules/rc-motion/es/DomWrapper.js","../node_modules/rc-util/es/hooks/useEvent.js","../node_modules/rc-util/es/hooks/useState.js","../node_modules/rc-motion/es/interface.js","../node_modules/rc-motion/es/util/motion.js","../node_modules/rc-motion/es/hooks/useIsomorphicLayoutEffect.js","../node_modules/rc-util/es/raf.js","../node_modules/rc-motion/es/hooks/useStepQueue.js","../node_modules/rc-motion/es/hooks/useNextFrame.js","../node_modules/rc-motion/es/hooks/useStatus.js","../node_modules/rc-util/es/hooks/useSyncState.js","../node_modules/rc-motion/es/hooks/useDomMotionEvents.js","../node_modules/rc-motion/es/CSSMotion.js","../node_modules/rc-motion/es/util/diff.js","../node_modules/rc-motion/es/CSSMotionList.js","../node_modules/antd/es/theme/util/getAlphaColor.js","../node_modules/antd/es/theme/util/alias.js","../node_modules/antd/es/theme/useToken.js","../node_modules/antd/es/version/version.js","../node_modules/antd/es/config-provider/MotionWrapper.js","../node_modules/antd/es/config-provider/PropWarning.js","../node_modules/antd/es/style/index.js","../node_modules/antd/es/theme/util/useResetIconStyle.js","../node_modules/antd/es/config-provider/index.js","../node_modules/antd/es/config-provider/hooks/useTheme.js","../node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js","../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../node_modules/rc-util/es/React/render.js","../node_modules/antd/es/config-provider/UnstableContext.js","../node_modules/@ant-design/icons-svg/es/asn/CheckCircleFilled.js","../node_modules/rc-util/es/Dom/shadow.js","../node_modules/@ant-design/icons/es/utils.js","../node_modules/@ant-design/icons/es/components/IconBase.js","../node_modules/@ant-design/icons/es/components/twoTonePrimaryColor.js","../node_modules/@ant-design/icons/es/components/AntdIcon.js","../node_modules/@ant-design/icons/es/icons/CheckCircleFilled.js","../node_modules/@ant-design/icons-svg/es/asn/CloseCircleFilled.js","../node_modules/@ant-design/icons/es/icons/CloseCircleFilled.js","../node_modules/@ant-design/icons-svg/es/asn/ExclamationCircleFilled.js","../node_modules/@ant-design/icons/es/icons/ExclamationCircleFilled.js","../node_modules/@ant-design/icons-svg/es/asn/InfoCircleFilled.js","../node_modules/@ant-design/icons/es/icons/InfoCircleFilled.js","../node_modules/@ant-design/icons-svg/es/asn/LoadingOutlined.js","../node_modules/@ant-design/icons/es/icons/LoadingOutlined.js","../node_modules/rc-util/es/KeyCode.js","../node_modules/rc-util/es/pickAttrs.js","../node_modules/rc-notification/es/Notice.js","../node_modules/rc-notification/es/NotificationProvider.js","../node_modules/rc-notification/es/hooks/useStack.js","../node_modules/rc-notification/es/NoticeList.js","../node_modules/rc-notification/es/Notifications.js","../node_modules/rc-notification/es/hooks/useNotification.js","../node_modules/antd/es/config-provider/hooks/useCSSVarCls.js","../node_modules/@ant-design/cssinjs-utils/es/util/calc/calculator.js","../node_modules/@ant-design/cssinjs-utils/es/util/calc/CSSCalculator.js","../node_modules/@ant-design/cssinjs-utils/es/util/calc/NumCalculator.js","../node_modules/@ant-design/cssinjs-utils/es/util/calc/index.js","../node_modules/@ant-design/cssinjs-utils/es/util/getCompVarPrefix.js","../node_modules/@ant-design/cssinjs-utils/es/util/getComponentToken.js","../node_modules/@ant-design/cssinjs-utils/es/util/statistic.js","../node_modules/@ant-design/cssinjs-utils/es/util/getDefaultComponentToken.js","../node_modules/@ant-design/cssinjs-utils/es/util/maxmin.js","../node_modules/@ant-design/cssinjs-utils/es/_util/hooks/useUniqueMemo.js","../node_modules/@ant-design/cssinjs-utils/es/hooks/useCSP.js","../node_modules/@ant-design/cssinjs-utils/es/util/genStyleUtils.js","../node_modules/antd/es/theme/util/genStyleUtils.js","../node_modules/antd/es/message/style/index.js","../node_modules/antd/es/_util/hooks/useZIndex.js","../node_modules/antd/es/message/PurePanel.js","../node_modules/@ant-design/icons-svg/es/asn/CloseOutlined.js","../node_modules/@ant-design/icons/es/icons/CloseOutlined.js","../node_modules/antd/es/message/util.js","../node_modules/antd/es/message/useMessage.js","../node_modules/antd/es/message/index.js","api/administer.js","components/Dashboard.jsx","api/announcement.js","api/personal.js","components/Personal/Personal.jsx","components/AuthForm.jsx","components/AnnouncementDetail.jsx","components/TorrentDetail.jsx","api/torrentComment.js","components/RequestDetail.jsx","api/requestComment.js","components/HelpDetail.jsx","api/helpComment.js","components/Personal/Exchange.jsx","components/Personal/Upload.jsx","components/Personal/Notice.jsx","components/Personal/Setting.jsx","../node_modules/clsx/dist/clsx.mjs","../node_modules/date-fns/constants.js","../node_modules/date-fns/constructFrom.js","../node_modules/date-fns/toDate.js","../node_modules/date-fns/parseISO.js","../node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../node_modules/date-fns/locale/en-US/_lib/formatLong.js","../node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../node_modules/date-fns/locale/en-US/_lib/localize.js","../node_modules/date-fns/locale/_lib/buildMatchFn.js","../node_modules/date-fns/locale/en-US/_lib/match.js","../node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../node_modules/date-fns/locale/en-US.js","../node_modules/date-fns/_lib/format/longFormatters.js","../node_modules/date-fns/_lib/protectedTokens.js","../node_modules/date-fns/_lib/defaultOptions.js","../node_modules/date-fns/getDefaultOptions.js","../node_modules/date-fns/transpose.js","../node_modules/date-fns/parse/_lib/Setter.js","../node_modules/date-fns/parse/_lib/Parser.js","../node_modules/date-fns/parse/_lib/constants.js","../node_modules/date-fns/parse/_lib/utils.js","../node_modules/date-fns/startOfWeek.js","../node_modules/date-fns/getWeekYear.js","../node_modules/date-fns/startOfISOWeek.js","../node_modules/date-fns/startOfWeekYear.js","../node_modules/date-fns/getWeek.js","../node_modules/date-fns/setWeek.js","../node_modules/date-fns/getISOWeekYear.js","../node_modules/date-fns/startOfISOWeekYear.js","../node_modules/date-fns/getISOWeek.js","../node_modules/date-fns/setISOWeek.js","../node_modules/date-fns/parse/_lib/parsers/DateParser.js","../node_modules/date-fns/addDays.js","../node_modules/date-fns/setDay.js","../node_modules/date-fns/getISODay.js","../node_modules/date-fns/setISODay.js","../node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../node_modules/date-fns/parse/_lib/parsers.js","../node_modules/date-fns/parse/_lib/parsers/EraParser.js","../node_modules/date-fns/parse/_lib/parsers/YearParser.js","../node_modules/date-fns/parse/_lib/parsers/LocalWeekYearParser.js","../node_modules/date-fns/parse/_lib/parsers/ISOWeekYearParser.js","../node_modules/date-fns/parse/_lib/parsers/ExtendedYearParser.js","../node_modules/date-fns/parse/_lib/parsers/QuarterParser.js","../node_modules/date-fns/parse/_lib/parsers/StandAloneQuarterParser.js","../node_modules/date-fns/parse/_lib/parsers/MonthParser.js","../node_modules/date-fns/parse/_lib/parsers/StandAloneMonthParser.js","../node_modules/date-fns/parse/_lib/parsers/LocalWeekParser.js","../node_modules/date-fns/parse/_lib/parsers/ISOWeekParser.js","../node_modules/date-fns/parse/_lib/parsers/DayOfYearParser.js","../node_modules/date-fns/parse/_lib/parsers/DayParser.js","../node_modules/date-fns/parse/_lib/parsers/LocalDayParser.js","../node_modules/date-fns/parse/_lib/parsers/StandAloneLocalDayParser.js","../node_modules/date-fns/parse/_lib/parsers/ISODayParser.js","../node_modules/date-fns/parse/_lib/parsers/AMPMParser.js","../node_modules/date-fns/parse/_lib/parsers/AMPMMidnightParser.js","../node_modules/date-fns/parse/_lib/parsers/DayPeriodParser.js","../node_modules/date-fns/parse/_lib/parsers/Hour1to12Parser.js","../node_modules/date-fns/parse/_lib/parsers/Hour0to23Parser.js","../node_modules/date-fns/parse/_lib/parsers/Hour0To11Parser.js","../node_modules/date-fns/parse/_lib/parsers/Hour1To24Parser.js","../node_modules/date-fns/parse/_lib/parsers/MinuteParser.js","../node_modules/date-fns/parse/_lib/parsers/SecondParser.js","../node_modules/date-fns/parse/_lib/parsers/FractionOfSecondParser.js","../node_modules/date-fns/parse/_lib/parsers/ISOTimezoneWithZParser.js","../node_modules/date-fns/parse/_lib/parsers/ISOTimezoneParser.js","../node_modules/date-fns/parse/_lib/parsers/TimestampSecondsParser.js","../node_modules/date-fns/parse/_lib/parsers/TimestampMillisecondsParser.js","../node_modules/date-fns/parse.js","../node_modules/date-fns/isDate.js","../node_modules/date-fns/isValid.js","../node_modules/date-fns/isBefore.js","../node_modules/date-fns/_lib/normalizeDates.js","../node_modules/date-fns/startOfDay.js","../node_modules/date-fns/differenceInCalendarDays.js","../node_modules/date-fns/startOfYear.js","../node_modules/date-fns/getDayOfYear.js","../node_modules/date-fns/_lib/addLeadingZeros.js","../node_modules/date-fns/_lib/format/lightFormatters.js","../node_modules/date-fns/_lib/format/formatters.js","../node_modules/date-fns/format.js","../node_modules/date-fns/setHours.js","../node_modules/date-fns/setMinutes.js","../node_modules/date-fns/setSeconds.js","../node_modules/date-fns/startOfMonth.js","../node_modules/date-fns/startOfQuarter.js","../node_modules/date-fns/endOfDay.js","../node_modules/date-fns/endOfWeek.js","../node_modules/date-fns/endOfMonth.js","../node_modules/date-fns/isSameYear.js","../node_modules/date-fns/isSameMonth.js","../node_modules/date-fns/isSameQuarter.js","../node_modules/date-fns/isSameDay.js","../node_modules/date-fns/isEqual.js","../node_modules/date-fns/isWithinInterval.js","../node_modules/date-fns/getDaysInMonth.js","../node_modules/date-fns/setMonth.js","../node_modules/date-fns/setQuarter.js","../node_modules/date-fns/getYear.js","../node_modules/date-fns/getMonth.js","../node_modules/date-fns/endOfYear.js","../node_modules/date-fns/getQuarter.js","../node_modules/date-fns/getHours.js","../node_modules/date-fns/getMinutes.js","../node_modules/date-fns/getSeconds.js","../node_modules/date-fns/addMonths.js","../node_modules/date-fns/subMonths.js","../node_modules/date-fns/differenceInCalendarMonths.js","../node_modules/date-fns/addQuarters.js","../node_modules/date-fns/subQuarters.js","../node_modules/date-fns/differenceInCalendarQuarters.js","../node_modules/date-fns/addYears.js","../node_modules/date-fns/subYears.js","../node_modules/date-fns/differenceInCalendarYears.js","../node_modules/date-fns/min.js","../node_modules/date-fns/max.js","../node_modules/date-fns/addMilliseconds.js","../node_modules/date-fns/addHours.js","../node_modules/date-fns/addMinutes.js","../node_modules/date-fns/addSeconds.js","../node_modules/date-fns/isAfter.js","../node_modules/date-fns/getDay.js","../node_modules/date-fns/getDate.js","../node_modules/date-fns/addWeeks.js","../node_modules/date-fns/getTime.js","../node_modules/date-fns/setYear.js","../node_modules/date-fns/differenceInDays.js","../node_modules/date-fns/subWeeks.js","../node_modules/date-fns/subDays.js","../node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../node_modules/@floating-ui/react/dist/floating-ui.react.mjs","../node_modules/react-datepicker/node_modules/tslib/tslib.es6.js","../../src/calendar_container.tsx","../../src/date_utils.ts","../../src/click_outside_wrapper.tsx","../../src/input_time.tsx","../../src/day.tsx","../../src/week_number.tsx","../../src/week.tsx","../../src/month.tsx","../../src/month_dropdown_options.tsx","../../src/month_dropdown.tsx","../../src/month_year_dropdown_options.tsx","../../src/month_year_dropdown.tsx","../../src/time.tsx","../../src/year.tsx","../../src/year_dropdown_options.tsx","../../src/year_dropdown.tsx","../../src/calendar.tsx","../../src/calendar_icon.tsx","../../src/portal.tsx","../../src/tab_loop.tsx","../../src/popper_component.tsx","../../src/with_floating.tsx","../../src/index.tsx","components/Administer.jsx","App.jsx","reportWebVitals.js","index.js"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","/**\n * @license React\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var b=Symbol.for(\"react.element\"),c=Symbol.for(\"react.portal\"),d=Symbol.for(\"react.fragment\"),e=Symbol.for(\"react.strict_mode\"),f=Symbol.for(\"react.profiler\"),g=Symbol.for(\"react.provider\"),h=Symbol.for(\"react.context\"),k=Symbol.for(\"react.server_context\"),l=Symbol.for(\"react.forward_ref\"),m=Symbol.for(\"react.suspense\"),n=Symbol.for(\"react.suspense_list\"),p=Symbol.for(\"react.memo\"),q=Symbol.for(\"react.lazy\"),t=Symbol.for(\"react.offscreen\"),u;u=Symbol.for(\"react.module.reference\");\nfunction v(a){if(\"object\"===typeof a&&null!==a){var r=a.$$typeof;switch(r){case b:switch(a=a.type,a){case d:case f:case e:case m:case n:return a;default:switch(a=a&&a.$$typeof,a){case k:case h:case l:case q:case p:case g:return a;default:return r}}case c:return r}}}exports.ContextConsumer=h;exports.ContextProvider=g;exports.Element=b;exports.ForwardRef=l;exports.Fragment=d;exports.Lazy=q;exports.Memo=p;exports.Portal=c;exports.Profiler=f;exports.StrictMode=e;exports.Suspense=m;\nexports.SuspenseList=n;exports.isAsyncMode=function(){return!1};exports.isConcurrentMode=function(){return!1};exports.isContextConsumer=function(a){return v(a)===h};exports.isContextProvider=function(a){return v(a)===g};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===b};exports.isForwardRef=function(a){return v(a)===l};exports.isFragment=function(a){return v(a)===d};exports.isLazy=function(a){return v(a)===q};exports.isMemo=function(a){return v(a)===p};\nexports.isPortal=function(a){return v(a)===c};exports.isProfiler=function(a){return v(a)===f};exports.isStrictMode=function(a){return v(a)===e};exports.isSuspense=function(a){return v(a)===m};exports.isSuspenseList=function(a){return v(a)===n};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===d||a===f||a===e||a===m||a===n||a===t||\"object\"===typeof a&&null!==a&&(a.$$typeof===q||a.$$typeof===p||a.$$typeof===g||a.$$typeof===h||a.$$typeof===l||a.$$typeof===u||void 0!==a.getModuleId)?!0:!1};exports.typeOf=v;\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nconst base64 = require('base64-js')\nconst ieee754 = require('ieee754')\nconst customInspectSymbol =\n  (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n    ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n    : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n    typeof console.error === 'function') {\n  console.error(\n    'This browser lacks typed array (Uint8Array) support which is required by ' +\n    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n  )\n}\n\nfunction typedArraySupport () {\n  // Can typed array instances can be augmented?\n  try {\n    const arr = new Uint8Array(1)\n    const proto = { foo: function () { return 42 } }\n    Object.setPrototypeOf(proto, Uint8Array.prototype)\n    Object.setPrototypeOf(arr, proto)\n    return arr.foo() === 42\n  } catch (e) {\n    return false\n  }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.buffer\n  }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.byteOffset\n  }\n})\n\nfunction createBuffer (length) {\n  if (length > K_MAX_LENGTH) {\n    throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n  }\n  // Return an augmented `Uint8Array` instance\n  const buf = new Uint8Array(length)\n  Object.setPrototypeOf(buf, Buffer.prototype)\n  return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new TypeError(\n        'The \"string\" argument must be of type string. Received type number'\n      )\n    }\n    return allocUnsafe(arg)\n  }\n  return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  if (ArrayBuffer.isView(value)) {\n    return fromArrayView(value)\n  }\n\n  if (value == null) {\n    throw new TypeError(\n      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n      'or Array-like Object. Received type ' + (typeof value)\n    )\n  }\n\n  if (isInstance(value, ArrayBuffer) ||\n      (value && isInstance(value.buffer, ArrayBuffer))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof SharedArrayBuffer !== 'undefined' &&\n      (isInstance(value, SharedArrayBuffer) ||\n      (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'number') {\n    throw new TypeError(\n      'The \"value\" argument must not be of type number. Received type number'\n    )\n  }\n\n  const valueOf = value.valueOf && value.valueOf()\n  if (valueOf != null && valueOf !== value) {\n    return Buffer.from(valueOf, encodingOrOffset, length)\n  }\n\n  const b = fromObject(value)\n  if (b) return b\n\n  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n      typeof value[Symbol.toPrimitive] === 'function') {\n    return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n  }\n\n  throw new TypeError(\n    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n    'or Array-like Object. Received type ' + (typeof value)\n  )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be of type number')\n  } else if (size < 0) {\n    throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n  }\n}\n\nfunction alloc (size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpreted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(size).fill(fill, encoding)\n      : createBuffer(size).fill(fill)\n  }\n  return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n  assertSize(size)\n  return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('Unknown encoding: ' + encoding)\n  }\n\n  const length = byteLength(string, encoding) | 0\n  let buf = createBuffer(length)\n\n  const actual = buf.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual)\n  }\n\n  return buf\n}\n\nfunction fromArrayLike (array) {\n  const length = array.length < 0 ? 0 : checked(array.length) | 0\n  const buf = createBuffer(length)\n  for (let i = 0; i < length; i += 1) {\n    buf[i] = array[i] & 255\n  }\n  return buf\n}\n\nfunction fromArrayView (arrayView) {\n  if (isInstance(arrayView, Uint8Array)) {\n    const copy = new Uint8Array(arrayView)\n    return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n  }\n  return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\"offset\" is outside of buffer bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\"length\" is outside of buffer bounds')\n  }\n\n  let buf\n  if (byteOffset === undefined && length === undefined) {\n    buf = new Uint8Array(array)\n  } else if (length === undefined) {\n    buf = new Uint8Array(array, byteOffset)\n  } else {\n    buf = new Uint8Array(array, byteOffset, length)\n  }\n\n  // Return an augmented `Uint8Array` instance\n  Object.setPrototypeOf(buf, Buffer.prototype)\n\n  return buf\n}\n\nfunction fromObject (obj) {\n  if (Buffer.isBuffer(obj)) {\n    const len = checked(obj.length) | 0\n    const buf = createBuffer(len)\n\n    if (buf.length === 0) {\n      return buf\n    }\n\n    obj.copy(buf, 0, 0, len)\n    return buf\n  }\n\n  if (obj.length !== undefined) {\n    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n      return createBuffer(0)\n    }\n    return fromArrayLike(obj)\n  }\n\n  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n    return fromArrayLike(obj.data)\n  }\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= K_MAX_LENGTH) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return b != null && b._isBuffer === true &&\n    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError(\n      'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n    )\n  }\n\n  if (a === b) return 0\n\n  let x = a.length\n  let y = b.length\n\n  for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!Array.isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  let i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  const buffer = Buffer.allocUnsafe(length)\n  let pos = 0\n  for (i = 0; i < list.length; ++i) {\n    let buf = list[i]\n    if (isInstance(buf, Uint8Array)) {\n      if (pos + buf.length > buffer.length) {\n        if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n        buf.copy(buffer, pos)\n      } else {\n        Uint8Array.prototype.set.call(\n          buffer,\n          buf,\n          pos\n        )\n      }\n    } else if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    } else {\n      buf.copy(buffer, pos)\n    }\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    throw new TypeError(\n      'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n      'Received type ' + typeof string\n    )\n  }\n\n  const len = string.length\n  const mustMatch = (arguments.length > 2 && arguments[2] === true)\n  if (!mustMatch && len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  let loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) {\n          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n        }\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  let loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  const i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  const len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (let i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  const len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (let i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  const len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (let i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  const length = this.length\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  let str = ''\n  const max = exports.INSPECT_MAX_BYTES\n  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n  if (this.length > max) str += ' ... '\n  return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n  Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (isInstance(target, Uint8Array)) {\n    target = Buffer.from(target, target.offset, target.byteLength)\n  }\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError(\n      'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n      'Received type ' + (typeof target)\n    )\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  let x = thisEnd - thisStart\n  let y = end - start\n  const len = Math.min(x, y)\n\n  const thisCopy = this.slice(thisStart, thisEnd)\n  const targetCopy = target.slice(start, end)\n\n  for (let i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset // Coerce to Number.\n  if (numberIsNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  let indexSize = 1\n  let arrLength = arr.length\n  let valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  let i\n  if (dir) {\n    let foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      let found = true\n      for (let j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  const remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  const strLen = string.length\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  let i\n  for (i = 0; i < length; ++i) {\n    const parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (numberIsNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset >>> 0\n    if (isFinite(length)) {\n      length = length >>> 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  const remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  let loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return asciiWrite(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  const res = []\n\n  let i = start\n  while (i < end) {\n    const firstByte = buf[i]\n    let codePoint = null\n    let bytesPerSequence = (firstByte > 0xEF)\n      ? 4\n      : (firstByte > 0xDF)\n          ? 3\n          : (firstByte > 0xBF)\n              ? 2\n              : 1\n\n    if (i + bytesPerSequence <= end) {\n      let secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  const len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  let res = ''\n  let i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  let ret = ''\n  end = Math.min(buf.length, end)\n\n  for (let i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  let ret = ''\n  end = Math.min(buf.length, end)\n\n  for (let i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  const len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  let out = ''\n  for (let i = start; i < end; ++i) {\n    out += hexSliceLookupTable[buf[i]]\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  const bytes = buf.slice(start, end)\n  let res = ''\n  // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n  for (let i = 0; i < bytes.length - 1; i += 2) {\n    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  const len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  const newBuf = this.subarray(start, end)\n  // Return an augmented `Uint8Array` instance\n  Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  let val = this[offset]\n  let mul = 1\n  let i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  let val = this[offset + --byteLength]\n  let mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const lo = first +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 24\n\n  const hi = this[++offset] +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    last * 2 ** 24\n\n  return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const hi = first * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    this[++offset]\n\n  const lo = this[++offset] * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    last\n\n  return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  let val = this[offset]\n  let mul = 1\n  let i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  let i = byteLength\n  let mul = 1\n  let val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  const val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  const val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const val = this[offset + 4] +\n    this[offset + 5] * 2 ** 8 +\n    this[offset + 6] * 2 ** 16 +\n    (last << 24) // Overflow\n\n  return (BigInt(val) << BigInt(32)) +\n    BigInt(first +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const val = (first << 24) + // Overflow\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    this[++offset]\n\n  return (BigInt(val) << BigInt(32)) +\n    BigInt(this[++offset] * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    const maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  let mul = 1\n  let i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    const maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  let i = byteLength - 1\n  let mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset + 3] = (value >>> 24)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 1] = (value >>> 8)\n  this[offset] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n  checkIntBI(value, min, max, buf, offset, 7)\n\n  let lo = Number(value & BigInt(0xffffffff))\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n  checkIntBI(value, min, max, buf, offset, 7)\n\n  let lo = Number(value & BigInt(0xffffffff))\n  buf[offset + 7] = lo\n  lo = lo >> 8\n  buf[offset + 6] = lo\n  lo = lo >> 8\n  buf[offset + 5] = lo\n  lo = lo >> 8\n  buf[offset + 4] = lo\n  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n  buf[offset + 3] = hi\n  hi = hi >> 8\n  buf[offset + 2] = hi\n  hi = hi >> 8\n  buf[offset + 1] = hi\n  hi = hi >> 8\n  buf[offset] = hi\n  return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n  return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n  return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    const limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  let i = 0\n  let mul = 1\n  let sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    const limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  let i = byteLength - 1\n  let mul = 1\n  let sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 3] = (value >>> 24)\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n  return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n  return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  const len = end - start\n\n  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n    // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end)\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, end),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n    if (val.length === 1) {\n      const code = val.charCodeAt(0)\n      if ((encoding === 'utf8' && code < 128) ||\n          encoding === 'latin1') {\n        // Fast path: If `val` fits into a single byte, use that numeric value.\n        val = code\n      }\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  } else if (typeof val === 'boolean') {\n    val = Number(val)\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  let i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    const bytes = Buffer.isBuffer(val)\n      ? val\n      : Buffer.from(val, encoding)\n    const len = bytes.length\n    if (len === 0) {\n      throw new TypeError('The value \"' + val +\n        '\" is invalid for argument \"value\"')\n    }\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n  errors[sym] = class NodeError extends Base {\n    constructor () {\n      super()\n\n      Object.defineProperty(this, 'message', {\n        value: getMessage.apply(this, arguments),\n        writable: true,\n        configurable: true\n      })\n\n      // Add the error code to the name to include it in the stack trace.\n      this.name = `${this.name} [${sym}]`\n      // Access the stack to generate the error message including the error code\n      // from the name.\n      this.stack // eslint-disable-line no-unused-expressions\n      // Reset the name to the actual name.\n      delete this.name\n    }\n\n    get code () {\n      return sym\n    }\n\n    set code (value) {\n      Object.defineProperty(this, 'code', {\n        configurable: true,\n        enumerable: true,\n        value,\n        writable: true\n      })\n    }\n\n    toString () {\n      return `${this.name} [${sym}]: ${this.message}`\n    }\n  }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n  function (name) {\n    if (name) {\n      return `${name} is outside of buffer bounds`\n    }\n\n    return 'Attempt to access memory outside buffer bounds'\n  }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n  function (name, actual) {\n    return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n  }, TypeError)\nE('ERR_OUT_OF_RANGE',\n  function (str, range, input) {\n    let msg = `The value of \"${str}\" is out of range.`\n    let received = input\n    if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n      received = addNumericalSeparator(String(input))\n    } else if (typeof input === 'bigint') {\n      received = String(input)\n      if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n        received = addNumericalSeparator(received)\n      }\n      received += 'n'\n    }\n    msg += ` It must be ${range}. Received ${received}`\n    return msg\n  }, RangeError)\n\nfunction addNumericalSeparator (val) {\n  let res = ''\n  let i = val.length\n  const start = val[0] === '-' ? 1 : 0\n  for (; i >= start + 4; i -= 3) {\n    res = `_${val.slice(i - 3, i)}${res}`\n  }\n  return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n  validateNumber(offset, 'offset')\n  if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n    boundsError(offset, buf.length - (byteLength + 1))\n  }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n  if (value > max || value < min) {\n    const n = typeof min === 'bigint' ? 'n' : ''\n    let range\n    if (byteLength > 3) {\n      if (min === 0 || min === BigInt(0)) {\n        range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n      } else {\n        range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n                `${(byteLength + 1) * 8 - 1}${n}`\n      }\n    } else {\n      range = `>= ${min}${n} and <= ${max}${n}`\n    }\n    throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n  }\n  checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n  if (typeof value !== 'number') {\n    throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n  }\n}\n\nfunction boundsError (value, length, type) {\n  if (Math.floor(value) !== value) {\n    validateNumber(value, type)\n    throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n  }\n\n  if (length < 0) {\n    throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n  }\n\n  throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n                                    `>= ${type ? 1 : 0} and <= ${length}`,\n                                    value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node takes equal signs as end of the Base64 encoding\n  str = str.split('=')[0]\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = str.trim().replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  let codePoint\n  const length = string.length\n  let leadSurrogate = null\n  const bytes = []\n\n  for (let i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  const byteArray = []\n  for (let i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  let c, hi, lo\n  const byteArray = []\n  for (let i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  let i\n  for (i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n  return obj instanceof type ||\n    (obj != null && obj.constructor != null && obj.constructor.name != null &&\n      obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n  // For IE11 support\n  return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n  const alphabet = '0123456789abcdef'\n  const table = new Array(256)\n  for (let i = 0; i < 16; ++i) {\n    const i16 = i * 16\n    for (let j = 0; j < 16; ++j) {\n      table[i16 + j] = alphabet[i] + alphabet[j]\n    }\n  }\n  return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n  return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n  throw new Error('BigInt not supported')\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react.production.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n","/**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n\"use strict\";\nvar Scheduler = require(\"scheduler\"),\n  React = require(\"react\"),\n  ReactDOM = require(\"react-dom\");\nfunction formatProdErrorMessage(code) {\n  var url = \"https://react.dev/errors/\" + code;\n  if (1 < arguments.length) {\n    url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n    for (var i = 2; i < arguments.length; i++)\n      url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n  }\n  return (\n    \"Minified React error #\" +\n    code +\n    \"; visit \" +\n    url +\n    \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n  );\n}\nfunction isValidContainer(node) {\n  return !(\n    !node ||\n    (1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType)\n  );\n}\nfunction getNearestMountedFiber(fiber) {\n  var node = fiber,\n    nearestMounted = fiber;\n  if (fiber.alternate) for (; node.return; ) node = node.return;\n  else {\n    fiber = node;\n    do\n      (node = fiber),\n        0 !== (node.flags & 4098) && (nearestMounted = node.return),\n        (fiber = node.return);\n    while (fiber);\n  }\n  return 3 === node.tag ? nearestMounted : null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n  if (13 === fiber.tag) {\n    var suspenseState = fiber.memoizedState;\n    null === suspenseState &&\n      ((fiber = fiber.alternate),\n      null !== fiber && (suspenseState = fiber.memoizedState));\n    if (null !== suspenseState) return suspenseState.dehydrated;\n  }\n  return null;\n}\nfunction assertIsMounted(fiber) {\n  if (getNearestMountedFiber(fiber) !== fiber)\n    throw Error(formatProdErrorMessage(188));\n}\nfunction findCurrentFiberUsingSlowPath(fiber) {\n  var alternate = fiber.alternate;\n  if (!alternate) {\n    alternate = getNearestMountedFiber(fiber);\n    if (null === alternate) throw Error(formatProdErrorMessage(188));\n    return alternate !== fiber ? null : fiber;\n  }\n  for (var a = fiber, b = alternate; ; ) {\n    var parentA = a.return;\n    if (null === parentA) break;\n    var parentB = parentA.alternate;\n    if (null === parentB) {\n      b = parentA.return;\n      if (null !== b) {\n        a = b;\n        continue;\n      }\n      break;\n    }\n    if (parentA.child === parentB.child) {\n      for (parentB = parentA.child; parentB; ) {\n        if (parentB === a) return assertIsMounted(parentA), fiber;\n        if (parentB === b) return assertIsMounted(parentA), alternate;\n        parentB = parentB.sibling;\n      }\n      throw Error(formatProdErrorMessage(188));\n    }\n    if (a.return !== b.return) (a = parentA), (b = parentB);\n    else {\n      for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {\n        if (child$0 === a) {\n          didFindChild = !0;\n          a = parentA;\n          b = parentB;\n          break;\n        }\n        if (child$0 === b) {\n          didFindChild = !0;\n          b = parentA;\n          a = parentB;\n          break;\n        }\n        child$0 = child$0.sibling;\n      }\n      if (!didFindChild) {\n        for (child$0 = parentB.child; child$0; ) {\n          if (child$0 === a) {\n            didFindChild = !0;\n            a = parentB;\n            b = parentA;\n            break;\n          }\n          if (child$0 === b) {\n            didFindChild = !0;\n            b = parentB;\n            a = parentA;\n            break;\n          }\n          child$0 = child$0.sibling;\n        }\n        if (!didFindChild) throw Error(formatProdErrorMessage(189));\n      }\n    }\n    if (a.alternate !== b) throw Error(formatProdErrorMessage(190));\n  }\n  if (3 !== a.tag) throw Error(formatProdErrorMessage(188));\n  return a.stateNode.current === a ? fiber : alternate;\n}\nfunction findCurrentHostFiberImpl(node) {\n  var tag = node.tag;\n  if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;\n  for (node = node.child; null !== node; ) {\n    tag = findCurrentHostFiberImpl(node);\n    if (null !== tag) return tag;\n    node = node.sibling;\n  }\n  return null;\n}\nvar assign = Object.assign,\n  REACT_LEGACY_ELEMENT_TYPE = Symbol.for(\"react.element\"),\n  REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n  REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n  REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n  REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n  REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n  REACT_PROVIDER_TYPE = Symbol.for(\"react.provider\"),\n  REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n  REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n  REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n  REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n  REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n  REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n  REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nSymbol.for(\"react.scope\");\nvar REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\");\nSymbol.for(\"react.legacy_hidden\");\nSymbol.for(\"react.tracing_marker\");\nvar REACT_MEMO_CACHE_SENTINEL = Symbol.for(\"react.memo_cache_sentinel\");\nSymbol.for(\"react.view_transition\");\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n  if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n  maybeIterable =\n    (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n    maybeIterable[\"@@iterator\"];\n  return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\");\nfunction getComponentNameFromType(type) {\n  if (null == type) return null;\n  if (\"function\" === typeof type)\n    return type.$$typeof === REACT_CLIENT_REFERENCE\n      ? null\n      : type.displayName || type.name || null;\n  if (\"string\" === typeof type) return type;\n  switch (type) {\n    case REACT_FRAGMENT_TYPE:\n      return \"Fragment\";\n    case REACT_PROFILER_TYPE:\n      return \"Profiler\";\n    case REACT_STRICT_MODE_TYPE:\n      return \"StrictMode\";\n    case REACT_SUSPENSE_TYPE:\n      return \"Suspense\";\n    case REACT_SUSPENSE_LIST_TYPE:\n      return \"SuspenseList\";\n    case REACT_ACTIVITY_TYPE:\n      return \"Activity\";\n  }\n  if (\"object\" === typeof type)\n    switch (type.$$typeof) {\n      case REACT_PORTAL_TYPE:\n        return \"Portal\";\n      case REACT_CONTEXT_TYPE:\n        return (type.displayName || \"Context\") + \".Provider\";\n      case REACT_CONSUMER_TYPE:\n        return (type._context.displayName || \"Context\") + \".Consumer\";\n      case REACT_FORWARD_REF_TYPE:\n        var innerType = type.render;\n        type = type.displayName;\n        type ||\n          ((type = innerType.displayName || innerType.name || \"\"),\n          (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n        return type;\n      case REACT_MEMO_TYPE:\n        return (\n          (innerType = type.displayName || null),\n          null !== innerType\n            ? innerType\n            : getComponentNameFromType(type.type) || \"Memo\"\n        );\n      case REACT_LAZY_TYPE:\n        innerType = type._payload;\n        type = type._init;\n        try {\n          return getComponentNameFromType(type(innerType));\n        } catch (x) {}\n    }\n  return null;\n}\nvar isArrayImpl = Array.isArray,\n  ReactSharedInternals =\n    React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n  ReactDOMSharedInternals =\n    ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n  sharedNotPendingObject = {\n    pending: !1,\n    data: null,\n    method: null,\n    action: null\n  },\n  valueStack = [],\n  index = -1;\nfunction createCursor(defaultValue) {\n  return { current: defaultValue };\n}\nfunction pop(cursor) {\n  0 > index ||\n    ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);\n}\nfunction push(cursor, value) {\n  index++;\n  valueStack[index] = cursor.current;\n  cursor.current = value;\n}\nvar contextStackCursor = createCursor(null),\n  contextFiberStackCursor = createCursor(null),\n  rootInstanceStackCursor = createCursor(null),\n  hostTransitionProviderCursor = createCursor(null);\nfunction pushHostContainer(fiber, nextRootInstance) {\n  push(rootInstanceStackCursor, nextRootInstance);\n  push(contextFiberStackCursor, fiber);\n  push(contextStackCursor, null);\n  switch (nextRootInstance.nodeType) {\n    case 9:\n    case 11:\n      fiber = (fiber = nextRootInstance.documentElement)\n        ? (fiber = fiber.namespaceURI)\n          ? getOwnHostContext(fiber)\n          : 0\n        : 0;\n      break;\n    default:\n      if (\n        ((fiber = nextRootInstance.tagName),\n        (nextRootInstance = nextRootInstance.namespaceURI))\n      )\n        (nextRootInstance = getOwnHostContext(nextRootInstance)),\n          (fiber = getChildHostContextProd(nextRootInstance, fiber));\n      else\n        switch (fiber) {\n          case \"svg\":\n            fiber = 1;\n            break;\n          case \"math\":\n            fiber = 2;\n            break;\n          default:\n            fiber = 0;\n        }\n  }\n  pop(contextStackCursor);\n  push(contextStackCursor, fiber);\n}\nfunction popHostContainer() {\n  pop(contextStackCursor);\n  pop(contextFiberStackCursor);\n  pop(rootInstanceStackCursor);\n}\nfunction pushHostContext(fiber) {\n  null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);\n  var context = contextStackCursor.current;\n  var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);\n  context !== JSCompiler_inline_result &&\n    (push(contextFiberStackCursor, fiber),\n    push(contextStackCursor, JSCompiler_inline_result));\n}\nfunction popHostContext(fiber) {\n  contextFiberStackCursor.current === fiber &&\n    (pop(contextStackCursor), pop(contextFiberStackCursor));\n  hostTransitionProviderCursor.current === fiber &&\n    (pop(hostTransitionProviderCursor),\n    (HostTransitionContext._currentValue = sharedNotPendingObject));\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n  scheduleCallback$3 = Scheduler.unstable_scheduleCallback,\n  cancelCallback$1 = Scheduler.unstable_cancelCallback,\n  shouldYield = Scheduler.unstable_shouldYield,\n  requestPaint = Scheduler.unstable_requestPaint,\n  now = Scheduler.unstable_now,\n  getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n  ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n  UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n  NormalPriority$1 = Scheduler.unstable_NormalPriority,\n  LowPriority = Scheduler.unstable_LowPriority,\n  IdlePriority = Scheduler.unstable_IdlePriority,\n  log$1 = Scheduler.log,\n  unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,\n  rendererID = null,\n  injectedHook = null;\nfunction setIsStrictModeForDevtools(newIsStrictMode) {\n  \"function\" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);\n  if (injectedHook && \"function\" === typeof injectedHook.setStrictMode)\n    try {\n      injectedHook.setStrictMode(rendererID, newIsStrictMode);\n    } catch (err) {}\n}\nvar clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,\n  log = Math.log,\n  LN2 = Math.LN2;\nfunction clz32Fallback(x) {\n  x >>>= 0;\n  return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;\n}\nvar nextTransitionLane = 256,\n  nextRetryLane = 4194304;\nfunction getHighestPriorityLanes(lanes) {\n  var pendingSyncLanes = lanes & 42;\n  if (0 !== pendingSyncLanes) return pendingSyncLanes;\n  switch (lanes & -lanes) {\n    case 1:\n      return 1;\n    case 2:\n      return 2;\n    case 4:\n      return 4;\n    case 8:\n      return 8;\n    case 16:\n      return 16;\n    case 32:\n      return 32;\n    case 64:\n      return 64;\n    case 128:\n      return 128;\n    case 256:\n    case 512:\n    case 1024:\n    case 2048:\n    case 4096:\n    case 8192:\n    case 16384:\n    case 32768:\n    case 65536:\n    case 131072:\n    case 262144:\n    case 524288:\n    case 1048576:\n    case 2097152:\n      return lanes & 4194048;\n    case 4194304:\n    case 8388608:\n    case 16777216:\n    case 33554432:\n      return lanes & 62914560;\n    case 67108864:\n      return 67108864;\n    case 134217728:\n      return 134217728;\n    case 268435456:\n      return 268435456;\n    case 536870912:\n      return 536870912;\n    case 1073741824:\n      return 0;\n    default:\n      return lanes;\n  }\n}\nfunction getNextLanes(root, wipLanes, rootHasPendingCommit) {\n  var pendingLanes = root.pendingLanes;\n  if (0 === pendingLanes) return 0;\n  var nextLanes = 0,\n    suspendedLanes = root.suspendedLanes,\n    pingedLanes = root.pingedLanes;\n  root = root.warmLanes;\n  var nonIdlePendingLanes = pendingLanes & 134217727;\n  0 !== nonIdlePendingLanes\n    ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),\n      0 !== pendingLanes\n        ? (nextLanes = getHighestPriorityLanes(pendingLanes))\n        : ((pingedLanes &= nonIdlePendingLanes),\n          0 !== pingedLanes\n            ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n            : rootHasPendingCommit ||\n              ((rootHasPendingCommit = nonIdlePendingLanes & ~root),\n              0 !== rootHasPendingCommit &&\n                (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))\n    : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),\n      0 !== nonIdlePendingLanes\n        ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))\n        : 0 !== pingedLanes\n          ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n          : rootHasPendingCommit ||\n            ((rootHasPendingCommit = pendingLanes & ~root),\n            0 !== rootHasPendingCommit &&\n              (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));\n  return 0 === nextLanes\n    ? 0\n    : 0 !== wipLanes &&\n        wipLanes !== nextLanes &&\n        0 === (wipLanes & suspendedLanes) &&\n        ((suspendedLanes = nextLanes & -nextLanes),\n        (rootHasPendingCommit = wipLanes & -wipLanes),\n        suspendedLanes >= rootHasPendingCommit ||\n          (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))\n      ? wipLanes\n      : nextLanes;\n}\nfunction checkIfRootIsPrerendering(root, renderLanes) {\n  return (\n    0 ===\n    (root.pendingLanes &\n      ~(root.suspendedLanes & ~root.pingedLanes) &\n      renderLanes)\n  );\n}\nfunction computeExpirationTime(lane, currentTime) {\n  switch (lane) {\n    case 1:\n    case 2:\n    case 4:\n    case 8:\n    case 64:\n      return currentTime + 250;\n    case 16:\n    case 32:\n    case 128:\n    case 256:\n    case 512:\n    case 1024:\n    case 2048:\n    case 4096:\n    case 8192:\n    case 16384:\n    case 32768:\n    case 65536:\n    case 131072:\n    case 262144:\n    case 524288:\n    case 1048576:\n    case 2097152:\n      return currentTime + 5e3;\n    case 4194304:\n    case 8388608:\n    case 16777216:\n    case 33554432:\n      return -1;\n    case 67108864:\n    case 134217728:\n    case 268435456:\n    case 536870912:\n    case 1073741824:\n      return -1;\n    default:\n      return -1;\n  }\n}\nfunction claimNextTransitionLane() {\n  var lane = nextTransitionLane;\n  nextTransitionLane <<= 1;\n  0 === (nextTransitionLane & 4194048) && (nextTransitionLane = 256);\n  return lane;\n}\nfunction claimNextRetryLane() {\n  var lane = nextRetryLane;\n  nextRetryLane <<= 1;\n  0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);\n  return lane;\n}\nfunction createLaneMap(initial) {\n  for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);\n  return laneMap;\n}\nfunction markRootUpdated$1(root, updateLane) {\n  root.pendingLanes |= updateLane;\n  268435456 !== updateLane &&\n    ((root.suspendedLanes = 0), (root.pingedLanes = 0), (root.warmLanes = 0));\n}\nfunction markRootFinished(\n  root,\n  finishedLanes,\n  remainingLanes,\n  spawnedLane,\n  updatedLanes,\n  suspendedRetryLanes\n) {\n  var previouslyPendingLanes = root.pendingLanes;\n  root.pendingLanes = remainingLanes;\n  root.suspendedLanes = 0;\n  root.pingedLanes = 0;\n  root.warmLanes = 0;\n  root.expiredLanes &= remainingLanes;\n  root.entangledLanes &= remainingLanes;\n  root.errorRecoveryDisabledLanes &= remainingLanes;\n  root.shellSuspendCounter = 0;\n  var entanglements = root.entanglements,\n    expirationTimes = root.expirationTimes,\n    hiddenUpdates = root.hiddenUpdates;\n  for (\n    remainingLanes = previouslyPendingLanes & ~remainingLanes;\n    0 < remainingLanes;\n\n  ) {\n    var index$5 = 31 - clz32(remainingLanes),\n      lane = 1 << index$5;\n    entanglements[index$5] = 0;\n    expirationTimes[index$5] = -1;\n    var hiddenUpdatesForLane = hiddenUpdates[index$5];\n    if (null !== hiddenUpdatesForLane)\n      for (\n        hiddenUpdates[index$5] = null, index$5 = 0;\n        index$5 < hiddenUpdatesForLane.length;\n        index$5++\n      ) {\n        var update = hiddenUpdatesForLane[index$5];\n        null !== update && (update.lane &= -536870913);\n      }\n    remainingLanes &= ~lane;\n  }\n  0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);\n  0 !== suspendedRetryLanes &&\n    0 === updatedLanes &&\n    0 !== root.tag &&\n    (root.suspendedLanes |=\n      suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));\n}\nfunction markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {\n  root.pendingLanes |= spawnedLane;\n  root.suspendedLanes &= ~spawnedLane;\n  var spawnedLaneIndex = 31 - clz32(spawnedLane);\n  root.entangledLanes |= spawnedLane;\n  root.entanglements[spawnedLaneIndex] =\n    root.entanglements[spawnedLaneIndex] |\n    1073741824 |\n    (entangledLanes & 4194090);\n}\nfunction markRootEntangled(root, entangledLanes) {\n  var rootEntangledLanes = (root.entangledLanes |= entangledLanes);\n  for (root = root.entanglements; rootEntangledLanes; ) {\n    var index$6 = 31 - clz32(rootEntangledLanes),\n      lane = 1 << index$6;\n    (lane & entangledLanes) | (root[index$6] & entangledLanes) &&\n      (root[index$6] |= entangledLanes);\n    rootEntangledLanes &= ~lane;\n  }\n}\nfunction getBumpedLaneForHydrationByLane(lane) {\n  switch (lane) {\n    case 2:\n      lane = 1;\n      break;\n    case 8:\n      lane = 4;\n      break;\n    case 32:\n      lane = 16;\n      break;\n    case 256:\n    case 512:\n    case 1024:\n    case 2048:\n    case 4096:\n    case 8192:\n    case 16384:\n    case 32768:\n    case 65536:\n    case 131072:\n    case 262144:\n    case 524288:\n    case 1048576:\n    case 2097152:\n    case 4194304:\n    case 8388608:\n    case 16777216:\n    case 33554432:\n      lane = 128;\n      break;\n    case 268435456:\n      lane = 134217728;\n      break;\n    default:\n      lane = 0;\n  }\n  return lane;\n}\nfunction lanesToEventPriority(lanes) {\n  lanes &= -lanes;\n  return 2 < lanes\n    ? 8 < lanes\n      ? 0 !== (lanes & 134217727)\n        ? 32\n        : 268435456\n      : 8\n    : 2;\n}\nfunction resolveUpdatePriority() {\n  var updatePriority = ReactDOMSharedInternals.p;\n  if (0 !== updatePriority) return updatePriority;\n  updatePriority = window.event;\n  return void 0 === updatePriority ? 32 : getEventPriority(updatePriority.type);\n}\nfunction runWithPriority(priority, fn) {\n  var previousPriority = ReactDOMSharedInternals.p;\n  try {\n    return (ReactDOMSharedInternals.p = priority), fn();\n  } finally {\n    ReactDOMSharedInternals.p = previousPriority;\n  }\n}\nvar randomKey = Math.random().toString(36).slice(2),\n  internalInstanceKey = \"__reactFiber$\" + randomKey,\n  internalPropsKey = \"__reactProps$\" + randomKey,\n  internalContainerInstanceKey = \"__reactContainer$\" + randomKey,\n  internalEventHandlersKey = \"__reactEvents$\" + randomKey,\n  internalEventHandlerListenersKey = \"__reactListeners$\" + randomKey,\n  internalEventHandlesSetKey = \"__reactHandles$\" + randomKey,\n  internalRootNodeResourcesKey = \"__reactResources$\" + randomKey,\n  internalHoistableMarker = \"__reactMarker$\" + randomKey;\nfunction detachDeletedInstance(node) {\n  delete node[internalInstanceKey];\n  delete node[internalPropsKey];\n  delete node[internalEventHandlersKey];\n  delete node[internalEventHandlerListenersKey];\n  delete node[internalEventHandlesSetKey];\n}\nfunction getClosestInstanceFromNode(targetNode) {\n  var targetInst = targetNode[internalInstanceKey];\n  if (targetInst) return targetInst;\n  for (var parentNode = targetNode.parentNode; parentNode; ) {\n    if (\n      (targetInst =\n        parentNode[internalContainerInstanceKey] ||\n        parentNode[internalInstanceKey])\n    ) {\n      parentNode = targetInst.alternate;\n      if (\n        null !== targetInst.child ||\n        (null !== parentNode && null !== parentNode.child)\n      )\n        for (\n          targetNode = getParentSuspenseInstance(targetNode);\n          null !== targetNode;\n\n        ) {\n          if ((parentNode = targetNode[internalInstanceKey])) return parentNode;\n          targetNode = getParentSuspenseInstance(targetNode);\n        }\n      return targetInst;\n    }\n    targetNode = parentNode;\n    parentNode = targetNode.parentNode;\n  }\n  return null;\n}\nfunction getInstanceFromNode(node) {\n  if (\n    (node = node[internalInstanceKey] || node[internalContainerInstanceKey])\n  ) {\n    var tag = node.tag;\n    if (\n      5 === tag ||\n      6 === tag ||\n      13 === tag ||\n      26 === tag ||\n      27 === tag ||\n      3 === tag\n    )\n      return node;\n  }\n  return null;\n}\nfunction getNodeFromInstance(inst) {\n  var tag = inst.tag;\n  if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode;\n  throw Error(formatProdErrorMessage(33));\n}\nfunction getResourcesFromRoot(root) {\n  var resources = root[internalRootNodeResourcesKey];\n  resources ||\n    (resources = root[internalRootNodeResourcesKey] =\n      { hoistableStyles: new Map(), hoistableScripts: new Map() });\n  return resources;\n}\nfunction markNodeAsHoistable(node) {\n  node[internalHoistableMarker] = !0;\n}\nvar allNativeEvents = new Set(),\n  registrationNameDependencies = {};\nfunction registerTwoPhaseEvent(registrationName, dependencies) {\n  registerDirectEvent(registrationName, dependencies);\n  registerDirectEvent(registrationName + \"Capture\", dependencies);\n}\nfunction registerDirectEvent(registrationName, dependencies) {\n  registrationNameDependencies[registrationName] = dependencies;\n  for (\n    registrationName = 0;\n    registrationName < dependencies.length;\n    registrationName++\n  )\n    allNativeEvents.add(dependencies[registrationName]);\n}\nvar VALID_ATTRIBUTE_NAME_REGEX = RegExp(\n    \"^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\"\n  ),\n  illegalAttributeNameCache = {},\n  validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n  if (hasOwnProperty.call(validatedAttributeNameCache, attributeName))\n    return !0;\n  if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1;\n  if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName))\n    return (validatedAttributeNameCache[attributeName] = !0);\n  illegalAttributeNameCache[attributeName] = !0;\n  return !1;\n}\nfunction setValueForAttribute(node, name, value) {\n  if (isAttributeNameSafe(name))\n    if (null === value) node.removeAttribute(name);\n    else {\n      switch (typeof value) {\n        case \"undefined\":\n        case \"function\":\n        case \"symbol\":\n          node.removeAttribute(name);\n          return;\n        case \"boolean\":\n          var prefix$8 = name.toLowerCase().slice(0, 5);\n          if (\"data-\" !== prefix$8 && \"aria-\" !== prefix$8) {\n            node.removeAttribute(name);\n            return;\n          }\n      }\n      node.setAttribute(name, \"\" + value);\n    }\n}\nfunction setValueForKnownAttribute(node, name, value) {\n  if (null === value) node.removeAttribute(name);\n  else {\n    switch (typeof value) {\n      case \"undefined\":\n      case \"function\":\n      case \"symbol\":\n      case \"boolean\":\n        node.removeAttribute(name);\n        return;\n    }\n    node.setAttribute(name, \"\" + value);\n  }\n}\nfunction setValueForNamespacedAttribute(node, namespace, name, value) {\n  if (null === value) node.removeAttribute(name);\n  else {\n    switch (typeof value) {\n      case \"undefined\":\n      case \"function\":\n      case \"symbol\":\n      case \"boolean\":\n        node.removeAttribute(name);\n        return;\n    }\n    node.setAttributeNS(namespace, name, \"\" + value);\n  }\n}\nvar prefix, suffix;\nfunction describeBuiltInComponentFrame(name) {\n  if (void 0 === prefix)\n    try {\n      throw Error();\n    } catch (x) {\n      var match = x.stack.trim().match(/\\n( *(at )?)/);\n      prefix = (match && match[1]) || \"\";\n      suffix =\n        -1 < x.stack.indexOf(\"\\n    at\")\n          ? \" (<anonymous>)\"\n          : -1 < x.stack.indexOf(\"@\")\n            ? \"@unknown:0:0\"\n            : \"\";\n    }\n  return \"\\n\" + prefix + name + suffix;\n}\nvar reentry = !1;\nfunction describeNativeComponentFrame(fn, construct) {\n  if (!fn || reentry) return \"\";\n  reentry = !0;\n  var previousPrepareStackTrace = Error.prepareStackTrace;\n  Error.prepareStackTrace = void 0;\n  try {\n    var RunInRootFrame = {\n      DetermineComponentFrameRoot: function () {\n        try {\n          if (construct) {\n            var Fake = function () {\n              throw Error();\n            };\n            Object.defineProperty(Fake.prototype, \"props\", {\n              set: function () {\n                throw Error();\n              }\n            });\n            if (\"object\" === typeof Reflect && Reflect.construct) {\n              try {\n                Reflect.construct(Fake, []);\n              } catch (x) {\n                var control = x;\n              }\n              Reflect.construct(fn, [], Fake);\n            } else {\n              try {\n                Fake.call();\n              } catch (x$9) {\n                control = x$9;\n              }\n              fn.call(Fake.prototype);\n            }\n          } else {\n            try {\n              throw Error();\n            } catch (x$10) {\n              control = x$10;\n            }\n            (Fake = fn()) &&\n              \"function\" === typeof Fake.catch &&\n              Fake.catch(function () {});\n          }\n        } catch (sample) {\n          if (sample && control && \"string\" === typeof sample.stack)\n            return [sample.stack, control.stack];\n        }\n        return [null, null];\n      }\n    };\n    RunInRootFrame.DetermineComponentFrameRoot.displayName =\n      \"DetermineComponentFrameRoot\";\n    var namePropDescriptor = Object.getOwnPropertyDescriptor(\n      RunInRootFrame.DetermineComponentFrameRoot,\n      \"name\"\n    );\n    namePropDescriptor &&\n      namePropDescriptor.configurable &&\n      Object.defineProperty(\n        RunInRootFrame.DetermineComponentFrameRoot,\n        \"name\",\n        { value: \"DetermineComponentFrameRoot\" }\n      );\n    var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n      sampleStack = _RunInRootFrame$Deter[0],\n      controlStack = _RunInRootFrame$Deter[1];\n    if (sampleStack && controlStack) {\n      var sampleLines = sampleStack.split(\"\\n\"),\n        controlLines = controlStack.split(\"\\n\");\n      for (\n        namePropDescriptor = RunInRootFrame = 0;\n        RunInRootFrame < sampleLines.length &&\n        !sampleLines[RunInRootFrame].includes(\"DetermineComponentFrameRoot\");\n\n      )\n        RunInRootFrame++;\n      for (\n        ;\n        namePropDescriptor < controlLines.length &&\n        !controlLines[namePropDescriptor].includes(\n          \"DetermineComponentFrameRoot\"\n        );\n\n      )\n        namePropDescriptor++;\n      if (\n        RunInRootFrame === sampleLines.length ||\n        namePropDescriptor === controlLines.length\n      )\n        for (\n          RunInRootFrame = sampleLines.length - 1,\n            namePropDescriptor = controlLines.length - 1;\n          1 <= RunInRootFrame &&\n          0 <= namePropDescriptor &&\n          sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor];\n\n        )\n          namePropDescriptor--;\n      for (\n        ;\n        1 <= RunInRootFrame && 0 <= namePropDescriptor;\n        RunInRootFrame--, namePropDescriptor--\n      )\n        if (sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) {\n          if (1 !== RunInRootFrame || 1 !== namePropDescriptor) {\n            do\n              if (\n                (RunInRootFrame--,\n                namePropDescriptor--,\n                0 > namePropDescriptor ||\n                  sampleLines[RunInRootFrame] !==\n                    controlLines[namePropDescriptor])\n              ) {\n                var frame =\n                  \"\\n\" +\n                  sampleLines[RunInRootFrame].replace(\" at new \", \" at \");\n                fn.displayName &&\n                  frame.includes(\"<anonymous>\") &&\n                  (frame = frame.replace(\"<anonymous>\", fn.displayName));\n                return frame;\n              }\n            while (1 <= RunInRootFrame && 0 <= namePropDescriptor);\n          }\n          break;\n        }\n    }\n  } finally {\n    (reentry = !1), (Error.prepareStackTrace = previousPrepareStackTrace);\n  }\n  return (previousPrepareStackTrace = fn ? fn.displayName || fn.name : \"\")\n    ? describeBuiltInComponentFrame(previousPrepareStackTrace)\n    : \"\";\n}\nfunction describeFiber(fiber) {\n  switch (fiber.tag) {\n    case 26:\n    case 27:\n    case 5:\n      return describeBuiltInComponentFrame(fiber.type);\n    case 16:\n      return describeBuiltInComponentFrame(\"Lazy\");\n    case 13:\n      return describeBuiltInComponentFrame(\"Suspense\");\n    case 19:\n      return describeBuiltInComponentFrame(\"SuspenseList\");\n    case 0:\n    case 15:\n      return describeNativeComponentFrame(fiber.type, !1);\n    case 11:\n      return describeNativeComponentFrame(fiber.type.render, !1);\n    case 1:\n      return describeNativeComponentFrame(fiber.type, !0);\n    case 31:\n      return describeBuiltInComponentFrame(\"Activity\");\n    default:\n      return \"\";\n  }\n}\nfunction getStackByFiberInDevAndProd(workInProgress) {\n  try {\n    var info = \"\";\n    do\n      (info += describeFiber(workInProgress)),\n        (workInProgress = workInProgress.return);\n    while (workInProgress);\n    return info;\n  } catch (x) {\n    return \"\\nError generating stack: \" + x.message + \"\\n\" + x.stack;\n  }\n}\nfunction getToStringValue(value) {\n  switch (typeof value) {\n    case \"bigint\":\n    case \"boolean\":\n    case \"number\":\n    case \"string\":\n    case \"undefined\":\n      return value;\n    case \"object\":\n      return value;\n    default:\n      return \"\";\n  }\n}\nfunction isCheckable(elem) {\n  var type = elem.type;\n  return (\n    (elem = elem.nodeName) &&\n    \"input\" === elem.toLowerCase() &&\n    (\"checkbox\" === type || \"radio\" === type)\n  );\n}\nfunction trackValueOnNode(node) {\n  var valueField = isCheckable(node) ? \"checked\" : \"value\",\n    descriptor = Object.getOwnPropertyDescriptor(\n      node.constructor.prototype,\n      valueField\n    ),\n    currentValue = \"\" + node[valueField];\n  if (\n    !node.hasOwnProperty(valueField) &&\n    \"undefined\" !== typeof descriptor &&\n    \"function\" === typeof descriptor.get &&\n    \"function\" === typeof descriptor.set\n  ) {\n    var get = descriptor.get,\n      set = descriptor.set;\n    Object.defineProperty(node, valueField, {\n      configurable: !0,\n      get: function () {\n        return get.call(this);\n      },\n      set: function (value) {\n        currentValue = \"\" + value;\n        set.call(this, value);\n      }\n    });\n    Object.defineProperty(node, valueField, {\n      enumerable: descriptor.enumerable\n    });\n    return {\n      getValue: function () {\n        return currentValue;\n      },\n      setValue: function (value) {\n        currentValue = \"\" + value;\n      },\n      stopTracking: function () {\n        node._valueTracker = null;\n        delete node[valueField];\n      }\n    };\n  }\n}\nfunction track(node) {\n  node._valueTracker || (node._valueTracker = trackValueOnNode(node));\n}\nfunction updateValueIfChanged(node) {\n  if (!node) return !1;\n  var tracker = node._valueTracker;\n  if (!tracker) return !0;\n  var lastValue = tracker.getValue();\n  var value = \"\";\n  node &&\n    (value = isCheckable(node)\n      ? node.checked\n        ? \"true\"\n        : \"false\"\n      : node.value);\n  node = value;\n  return node !== lastValue ? (tracker.setValue(node), !0) : !1;\n}\nfunction getActiveElement(doc) {\n  doc = doc || (\"undefined\" !== typeof document ? document : void 0);\n  if (\"undefined\" === typeof doc) return null;\n  try {\n    return doc.activeElement || doc.body;\n  } catch (e) {\n    return doc.body;\n  }\n}\nvar escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\\n\"\\\\]/g;\nfunction escapeSelectorAttributeValueInsideDoubleQuotes(value) {\n  return value.replace(\n    escapeSelectorAttributeValueInsideDoubleQuotesRegex,\n    function (ch) {\n      return \"\\\\\" + ch.charCodeAt(0).toString(16) + \" \";\n    }\n  );\n}\nfunction updateInput(\n  element,\n  value,\n  defaultValue,\n  lastDefaultValue,\n  checked,\n  defaultChecked,\n  type,\n  name\n) {\n  element.name = \"\";\n  null != type &&\n  \"function\" !== typeof type &&\n  \"symbol\" !== typeof type &&\n  \"boolean\" !== typeof type\n    ? (element.type = type)\n    : element.removeAttribute(\"type\");\n  if (null != value)\n    if (\"number\" === type) {\n      if ((0 === value && \"\" === element.value) || element.value != value)\n        element.value = \"\" + getToStringValue(value);\n    } else\n      element.value !== \"\" + getToStringValue(value) &&\n        (element.value = \"\" + getToStringValue(value));\n  else\n    (\"submit\" !== type && \"reset\" !== type) || element.removeAttribute(\"value\");\n  null != value\n    ? setDefaultValue(element, type, getToStringValue(value))\n    : null != defaultValue\n      ? setDefaultValue(element, type, getToStringValue(defaultValue))\n      : null != lastDefaultValue && element.removeAttribute(\"value\");\n  null == checked &&\n    null != defaultChecked &&\n    (element.defaultChecked = !!defaultChecked);\n  null != checked &&\n    (element.checked =\n      checked && \"function\" !== typeof checked && \"symbol\" !== typeof checked);\n  null != name &&\n  \"function\" !== typeof name &&\n  \"symbol\" !== typeof name &&\n  \"boolean\" !== typeof name\n    ? (element.name = \"\" + getToStringValue(name))\n    : element.removeAttribute(\"name\");\n}\nfunction initInput(\n  element,\n  value,\n  defaultValue,\n  checked,\n  defaultChecked,\n  type,\n  name,\n  isHydrating\n) {\n  null != type &&\n    \"function\" !== typeof type &&\n    \"symbol\" !== typeof type &&\n    \"boolean\" !== typeof type &&\n    (element.type = type);\n  if (null != value || null != defaultValue) {\n    if (\n      !(\n        (\"submit\" !== type && \"reset\" !== type) ||\n        (void 0 !== value && null !== value)\n      )\n    )\n      return;\n    defaultValue =\n      null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n    value = null != value ? \"\" + getToStringValue(value) : defaultValue;\n    isHydrating || value === element.value || (element.value = value);\n    element.defaultValue = value;\n  }\n  checked = null != checked ? checked : defaultChecked;\n  checked =\n    \"function\" !== typeof checked && \"symbol\" !== typeof checked && !!checked;\n  element.checked = isHydrating ? element.checked : !!checked;\n  element.defaultChecked = !!checked;\n  null != name &&\n    \"function\" !== typeof name &&\n    \"symbol\" !== typeof name &&\n    \"boolean\" !== typeof name &&\n    (element.name = name);\n}\nfunction setDefaultValue(node, type, value) {\n  (\"number\" === type && getActiveElement(node.ownerDocument) === node) ||\n    node.defaultValue === \"\" + value ||\n    (node.defaultValue = \"\" + value);\n}\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n  node = node.options;\n  if (multiple) {\n    multiple = {};\n    for (var i = 0; i < propValue.length; i++)\n      multiple[\"$\" + propValue[i]] = !0;\n    for (propValue = 0; propValue < node.length; propValue++)\n      (i = multiple.hasOwnProperty(\"$\" + node[propValue].value)),\n        node[propValue].selected !== i && (node[propValue].selected = i),\n        i && setDefaultSelected && (node[propValue].defaultSelected = !0);\n  } else {\n    propValue = \"\" + getToStringValue(propValue);\n    multiple = null;\n    for (i = 0; i < node.length; i++) {\n      if (node[i].value === propValue) {\n        node[i].selected = !0;\n        setDefaultSelected && (node[i].defaultSelected = !0);\n        return;\n      }\n      null !== multiple || node[i].disabled || (multiple = node[i]);\n    }\n    null !== multiple && (multiple.selected = !0);\n  }\n}\nfunction updateTextarea(element, value, defaultValue) {\n  if (\n    null != value &&\n    ((value = \"\" + getToStringValue(value)),\n    value !== element.value && (element.value = value),\n    null == defaultValue)\n  ) {\n    element.defaultValue !== value && (element.defaultValue = value);\n    return;\n  }\n  element.defaultValue =\n    null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n}\nfunction initTextarea(element, value, defaultValue, children) {\n  if (null == value) {\n    if (null != children) {\n      if (null != defaultValue) throw Error(formatProdErrorMessage(92));\n      if (isArrayImpl(children)) {\n        if (1 < children.length) throw Error(formatProdErrorMessage(93));\n        children = children[0];\n      }\n      defaultValue = children;\n    }\n    null == defaultValue && (defaultValue = \"\");\n    value = defaultValue;\n  }\n  defaultValue = getToStringValue(value);\n  element.defaultValue = defaultValue;\n  children = element.textContent;\n  children === defaultValue &&\n    \"\" !== children &&\n    null !== children &&\n    (element.value = children);\n}\nfunction setTextContent(node, text) {\n  if (text) {\n    var firstChild = node.firstChild;\n    if (\n      firstChild &&\n      firstChild === node.lastChild &&\n      3 === firstChild.nodeType\n    ) {\n      firstChild.nodeValue = text;\n      return;\n    }\n  }\n  node.textContent = text;\n}\nvar unitlessNumbers = new Set(\n  \"animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp\".split(\n    \" \"\n  )\n);\nfunction setValueForStyle(style, styleName, value) {\n  var isCustomProperty = 0 === styleName.indexOf(\"--\");\n  null == value || \"boolean\" === typeof value || \"\" === value\n    ? isCustomProperty\n      ? style.setProperty(styleName, \"\")\n      : \"float\" === styleName\n        ? (style.cssFloat = \"\")\n        : (style[styleName] = \"\")\n    : isCustomProperty\n      ? style.setProperty(styleName, value)\n      : \"number\" !== typeof value ||\n          0 === value ||\n          unitlessNumbers.has(styleName)\n        ? \"float\" === styleName\n          ? (style.cssFloat = value)\n          : (style[styleName] = (\"\" + value).trim())\n        : (style[styleName] = value + \"px\");\n}\nfunction setValueForStyles(node, styles, prevStyles) {\n  if (null != styles && \"object\" !== typeof styles)\n    throw Error(formatProdErrorMessage(62));\n  node = node.style;\n  if (null != prevStyles) {\n    for (var styleName in prevStyles)\n      !prevStyles.hasOwnProperty(styleName) ||\n        (null != styles && styles.hasOwnProperty(styleName)) ||\n        (0 === styleName.indexOf(\"--\")\n          ? node.setProperty(styleName, \"\")\n          : \"float\" === styleName\n            ? (node.cssFloat = \"\")\n            : (node[styleName] = \"\"));\n    for (var styleName$16 in styles)\n      (styleName = styles[styleName$16]),\n        styles.hasOwnProperty(styleName$16) &&\n          prevStyles[styleName$16] !== styleName &&\n          setValueForStyle(node, styleName$16, styleName);\n  } else\n    for (var styleName$17 in styles)\n      styles.hasOwnProperty(styleName$17) &&\n        setValueForStyle(node, styleName$17, styles[styleName$17]);\n}\nfunction isCustomElement(tagName) {\n  if (-1 === tagName.indexOf(\"-\")) return !1;\n  switch (tagName) {\n    case \"annotation-xml\":\n    case \"color-profile\":\n    case \"font-face\":\n    case \"font-face-src\":\n    case \"font-face-uri\":\n    case \"font-face-format\":\n    case \"font-face-name\":\n    case \"missing-glyph\":\n      return !1;\n    default:\n      return !0;\n  }\n}\nvar aliases = new Map([\n    [\"acceptCharset\", \"accept-charset\"],\n    [\"htmlFor\", \"for\"],\n    [\"httpEquiv\", \"http-equiv\"],\n    [\"crossOrigin\", \"crossorigin\"],\n    [\"accentHeight\", \"accent-height\"],\n    [\"alignmentBaseline\", \"alignment-baseline\"],\n    [\"arabicForm\", \"arabic-form\"],\n    [\"baselineShift\", \"baseline-shift\"],\n    [\"capHeight\", \"cap-height\"],\n    [\"clipPath\", \"clip-path\"],\n    [\"clipRule\", \"clip-rule\"],\n    [\"colorInterpolation\", \"color-interpolation\"],\n    [\"colorInterpolationFilters\", \"color-interpolation-filters\"],\n    [\"colorProfile\", \"color-profile\"],\n    [\"colorRendering\", \"color-rendering\"],\n    [\"dominantBaseline\", \"dominant-baseline\"],\n    [\"enableBackground\", \"enable-background\"],\n    [\"fillOpacity\", \"fill-opacity\"],\n    [\"fillRule\", \"fill-rule\"],\n    [\"floodColor\", \"flood-color\"],\n    [\"floodOpacity\", \"flood-opacity\"],\n    [\"fontFamily\", \"font-family\"],\n    [\"fontSize\", \"font-size\"],\n    [\"fontSizeAdjust\", \"font-size-adjust\"],\n    [\"fontStretch\", \"font-stretch\"],\n    [\"fontStyle\", \"font-style\"],\n    [\"fontVariant\", \"font-variant\"],\n    [\"fontWeight\", \"font-weight\"],\n    [\"glyphName\", \"glyph-name\"],\n    [\"glyphOrientationHorizontal\", \"glyph-orientation-horizontal\"],\n    [\"glyphOrientationVertical\", \"glyph-orientation-vertical\"],\n    [\"horizAdvX\", \"horiz-adv-x\"],\n    [\"horizOriginX\", \"horiz-origin-x\"],\n    [\"imageRendering\", \"image-rendering\"],\n    [\"letterSpacing\", \"letter-spacing\"],\n    [\"lightingColor\", \"lighting-color\"],\n    [\"markerEnd\", \"marker-end\"],\n    [\"markerMid\", \"marker-mid\"],\n    [\"markerStart\", \"marker-start\"],\n    [\"overlinePosition\", \"overline-position\"],\n    [\"overlineThickness\", \"overline-thickness\"],\n    [\"paintOrder\", \"paint-order\"],\n    [\"panose-1\", \"panose-1\"],\n    [\"pointerEvents\", \"pointer-events\"],\n    [\"renderingIntent\", \"rendering-intent\"],\n    [\"shapeRendering\", \"shape-rendering\"],\n    [\"stopColor\", \"stop-color\"],\n    [\"stopOpacity\", \"stop-opacity\"],\n    [\"strikethroughPosition\", \"strikethrough-position\"],\n    [\"strikethroughThickness\", \"strikethrough-thickness\"],\n    [\"strokeDasharray\", \"stroke-dasharray\"],\n    [\"strokeDashoffset\", \"stroke-dashoffset\"],\n    [\"strokeLinecap\", \"stroke-linecap\"],\n    [\"strokeLinejoin\", \"stroke-linejoin\"],\n    [\"strokeMiterlimit\", \"stroke-miterlimit\"],\n    [\"strokeOpacity\", \"stroke-opacity\"],\n    [\"strokeWidth\", \"stroke-width\"],\n    [\"textAnchor\", \"text-anchor\"],\n    [\"textDecoration\", \"text-decoration\"],\n    [\"textRendering\", \"text-rendering\"],\n    [\"transformOrigin\", \"transform-origin\"],\n    [\"underlinePosition\", \"underline-position\"],\n    [\"underlineThickness\", \"underline-thickness\"],\n    [\"unicodeBidi\", \"unicode-bidi\"],\n    [\"unicodeRange\", \"unicode-range\"],\n    [\"unitsPerEm\", \"units-per-em\"],\n    [\"vAlphabetic\", \"v-alphabetic\"],\n    [\"vHanging\", \"v-hanging\"],\n    [\"vIdeographic\", \"v-ideographic\"],\n    [\"vMathematical\", \"v-mathematical\"],\n    [\"vectorEffect\", \"vector-effect\"],\n    [\"vertAdvY\", \"vert-adv-y\"],\n    [\"vertOriginX\", \"vert-origin-x\"],\n    [\"vertOriginY\", \"vert-origin-y\"],\n    [\"wordSpacing\", \"word-spacing\"],\n    [\"writingMode\", \"writing-mode\"],\n    [\"xmlnsXlink\", \"xmlns:xlink\"],\n    [\"xHeight\", \"x-height\"]\n  ]),\n  isJavaScriptProtocol =\n    /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;\nfunction sanitizeURL(url) {\n  return isJavaScriptProtocol.test(\"\" + url)\n    ? \"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')\"\n    : url;\n}\nvar currentReplayingEvent = null;\nfunction getEventTarget(nativeEvent) {\n  nativeEvent = nativeEvent.target || nativeEvent.srcElement || window;\n  nativeEvent.correspondingUseElement &&\n    (nativeEvent = nativeEvent.correspondingUseElement);\n  return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent;\n}\nvar restoreTarget = null,\n  restoreQueue = null;\nfunction restoreStateOfTarget(target) {\n  var internalInstance = getInstanceFromNode(target);\n  if (internalInstance && (target = internalInstance.stateNode)) {\n    var props = target[internalPropsKey] || null;\n    a: switch (((target = internalInstance.stateNode), internalInstance.type)) {\n      case \"input\":\n        updateInput(\n          target,\n          props.value,\n          props.defaultValue,\n          props.defaultValue,\n          props.checked,\n          props.defaultChecked,\n          props.type,\n          props.name\n        );\n        internalInstance = props.name;\n        if (\"radio\" === props.type && null != internalInstance) {\n          for (props = target; props.parentNode; ) props = props.parentNode;\n          props = props.querySelectorAll(\n            'input[name=\"' +\n              escapeSelectorAttributeValueInsideDoubleQuotes(\n                \"\" + internalInstance\n              ) +\n              '\"][type=\"radio\"]'\n          );\n          for (\n            internalInstance = 0;\n            internalInstance < props.length;\n            internalInstance++\n          ) {\n            var otherNode = props[internalInstance];\n            if (otherNode !== target && otherNode.form === target.form) {\n              var otherProps = otherNode[internalPropsKey] || null;\n              if (!otherProps) throw Error(formatProdErrorMessage(90));\n              updateInput(\n                otherNode,\n                otherProps.value,\n                otherProps.defaultValue,\n                otherProps.defaultValue,\n                otherProps.checked,\n                otherProps.defaultChecked,\n                otherProps.type,\n                otherProps.name\n              );\n            }\n          }\n          for (\n            internalInstance = 0;\n            internalInstance < props.length;\n            internalInstance++\n          )\n            (otherNode = props[internalInstance]),\n              otherNode.form === target.form && updateValueIfChanged(otherNode);\n        }\n        break a;\n      case \"textarea\":\n        updateTextarea(target, props.value, props.defaultValue);\n        break a;\n      case \"select\":\n        (internalInstance = props.value),\n          null != internalInstance &&\n            updateOptions(target, !!props.multiple, internalInstance, !1);\n    }\n  }\n}\nvar isInsideEventHandler = !1;\nfunction batchedUpdates$1(fn, a, b) {\n  if (isInsideEventHandler) return fn(a, b);\n  isInsideEventHandler = !0;\n  try {\n    var JSCompiler_inline_result = fn(a);\n    return JSCompiler_inline_result;\n  } finally {\n    if (\n      ((isInsideEventHandler = !1),\n      null !== restoreTarget || null !== restoreQueue)\n    )\n      if (\n        (flushSyncWork$1(),\n        restoreTarget &&\n          ((a = restoreTarget),\n          (fn = restoreQueue),\n          (restoreQueue = restoreTarget = null),\n          restoreStateOfTarget(a),\n          fn))\n      )\n        for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]);\n  }\n}\nfunction getListener(inst, registrationName) {\n  var stateNode = inst.stateNode;\n  if (null === stateNode) return null;\n  var props = stateNode[internalPropsKey] || null;\n  if (null === props) return null;\n  stateNode = props[registrationName];\n  a: switch (registrationName) {\n    case \"onClick\":\n    case \"onClickCapture\":\n    case \"onDoubleClick\":\n    case \"onDoubleClickCapture\":\n    case \"onMouseDown\":\n    case \"onMouseDownCapture\":\n    case \"onMouseMove\":\n    case \"onMouseMoveCapture\":\n    case \"onMouseUp\":\n    case \"onMouseUpCapture\":\n    case \"onMouseEnter\":\n      (props = !props.disabled) ||\n        ((inst = inst.type),\n        (props = !(\n          \"button\" === inst ||\n          \"input\" === inst ||\n          \"select\" === inst ||\n          \"textarea\" === inst\n        )));\n      inst = !props;\n      break a;\n    default:\n      inst = !1;\n  }\n  if (inst) return null;\n  if (stateNode && \"function\" !== typeof stateNode)\n    throw Error(\n      formatProdErrorMessage(231, registrationName, typeof stateNode)\n    );\n  return stateNode;\n}\nvar canUseDOM = !(\n    \"undefined\" === typeof window ||\n    \"undefined\" === typeof window.document ||\n    \"undefined\" === typeof window.document.createElement\n  ),\n  passiveBrowserEventsSupported = !1;\nif (canUseDOM)\n  try {\n    var options = {};\n    Object.defineProperty(options, \"passive\", {\n      get: function () {\n        passiveBrowserEventsSupported = !0;\n      }\n    });\n    window.addEventListener(\"test\", options, options);\n    window.removeEventListener(\"test\", options, options);\n  } catch (e) {\n    passiveBrowserEventsSupported = !1;\n  }\nvar root = null,\n  startText = null,\n  fallbackText = null;\nfunction getData() {\n  if (fallbackText) return fallbackText;\n  var start,\n    startValue = startText,\n    startLength = startValue.length,\n    end,\n    endValue = \"value\" in root ? root.value : root.textContent,\n    endLength = endValue.length;\n  for (\n    start = 0;\n    start < startLength && startValue[start] === endValue[start];\n    start++\n  );\n  var minEnd = startLength - start;\n  for (\n    end = 1;\n    end <= minEnd &&\n    startValue[startLength - end] === endValue[endLength - end];\n    end++\n  );\n  return (fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0));\n}\nfunction getEventCharCode(nativeEvent) {\n  var keyCode = nativeEvent.keyCode;\n  \"charCode\" in nativeEvent\n    ? ((nativeEvent = nativeEvent.charCode),\n      0 === nativeEvent && 13 === keyCode && (nativeEvent = 13))\n    : (nativeEvent = keyCode);\n  10 === nativeEvent && (nativeEvent = 13);\n  return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0;\n}\nfunction functionThatReturnsTrue() {\n  return !0;\n}\nfunction functionThatReturnsFalse() {\n  return !1;\n}\nfunction createSyntheticEvent(Interface) {\n  function SyntheticBaseEvent(\n    reactName,\n    reactEventType,\n    targetInst,\n    nativeEvent,\n    nativeEventTarget\n  ) {\n    this._reactName = reactName;\n    this._targetInst = targetInst;\n    this.type = reactEventType;\n    this.nativeEvent = nativeEvent;\n    this.target = nativeEventTarget;\n    this.currentTarget = null;\n    for (var propName in Interface)\n      Interface.hasOwnProperty(propName) &&\n        ((reactName = Interface[propName]),\n        (this[propName] = reactName\n          ? reactName(nativeEvent)\n          : nativeEvent[propName]));\n    this.isDefaultPrevented = (\n      null != nativeEvent.defaultPrevented\n        ? nativeEvent.defaultPrevented\n        : !1 === nativeEvent.returnValue\n    )\n      ? functionThatReturnsTrue\n      : functionThatReturnsFalse;\n    this.isPropagationStopped = functionThatReturnsFalse;\n    return this;\n  }\n  assign(SyntheticBaseEvent.prototype, {\n    preventDefault: function () {\n      this.defaultPrevented = !0;\n      var event = this.nativeEvent;\n      event &&\n        (event.preventDefault\n          ? event.preventDefault()\n          : \"unknown\" !== typeof event.returnValue && (event.returnValue = !1),\n        (this.isDefaultPrevented = functionThatReturnsTrue));\n    },\n    stopPropagation: function () {\n      var event = this.nativeEvent;\n      event &&\n        (event.stopPropagation\n          ? event.stopPropagation()\n          : \"unknown\" !== typeof event.cancelBubble &&\n            (event.cancelBubble = !0),\n        (this.isPropagationStopped = functionThatReturnsTrue));\n    },\n    persist: function () {},\n    isPersistent: functionThatReturnsTrue\n  });\n  return SyntheticBaseEvent;\n}\nvar EventInterface = {\n    eventPhase: 0,\n    bubbles: 0,\n    cancelable: 0,\n    timeStamp: function (event) {\n      return event.timeStamp || Date.now();\n    },\n    defaultPrevented: 0,\n    isTrusted: 0\n  },\n  SyntheticEvent = createSyntheticEvent(EventInterface),\n  UIEventInterface = assign({}, EventInterface, { view: 0, detail: 0 }),\n  SyntheticUIEvent = createSyntheticEvent(UIEventInterface),\n  lastMovementX,\n  lastMovementY,\n  lastMouseEvent,\n  MouseEventInterface = assign({}, UIEventInterface, {\n    screenX: 0,\n    screenY: 0,\n    clientX: 0,\n    clientY: 0,\n    pageX: 0,\n    pageY: 0,\n    ctrlKey: 0,\n    shiftKey: 0,\n    altKey: 0,\n    metaKey: 0,\n    getModifierState: getEventModifierState,\n    button: 0,\n    buttons: 0,\n    relatedTarget: function (event) {\n      return void 0 === event.relatedTarget\n        ? event.fromElement === event.srcElement\n          ? event.toElement\n          : event.fromElement\n        : event.relatedTarget;\n    },\n    movementX: function (event) {\n      if (\"movementX\" in event) return event.movementX;\n      event !== lastMouseEvent &&\n        (lastMouseEvent && \"mousemove\" === event.type\n          ? ((lastMovementX = event.screenX - lastMouseEvent.screenX),\n            (lastMovementY = event.screenY - lastMouseEvent.screenY))\n          : (lastMovementY = lastMovementX = 0),\n        (lastMouseEvent = event));\n      return lastMovementX;\n    },\n    movementY: function (event) {\n      return \"movementY\" in event ? event.movementY : lastMovementY;\n    }\n  }),\n  SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface),\n  DragEventInterface = assign({}, MouseEventInterface, { dataTransfer: 0 }),\n  SyntheticDragEvent = createSyntheticEvent(DragEventInterface),\n  FocusEventInterface = assign({}, UIEventInterface, { relatedTarget: 0 }),\n  SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface),\n  AnimationEventInterface = assign({}, EventInterface, {\n    animationName: 0,\n    elapsedTime: 0,\n    pseudoElement: 0\n  }),\n  SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface),\n  ClipboardEventInterface = assign({}, EventInterface, {\n    clipboardData: function (event) {\n      return \"clipboardData\" in event\n        ? event.clipboardData\n        : window.clipboardData;\n    }\n  }),\n  SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface),\n  CompositionEventInterface = assign({}, EventInterface, { data: 0 }),\n  SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface),\n  normalizeKey = {\n    Esc: \"Escape\",\n    Spacebar: \" \",\n    Left: \"ArrowLeft\",\n    Up: \"ArrowUp\",\n    Right: \"ArrowRight\",\n    Down: \"ArrowDown\",\n    Del: \"Delete\",\n    Win: \"OS\",\n    Menu: \"ContextMenu\",\n    Apps: \"ContextMenu\",\n    Scroll: \"ScrollLock\",\n    MozPrintableKey: \"Unidentified\"\n  },\n  translateToKey = {\n    8: \"Backspace\",\n    9: \"Tab\",\n    12: \"Clear\",\n    13: \"Enter\",\n    16: \"Shift\",\n    17: \"Control\",\n    18: \"Alt\",\n    19: \"Pause\",\n    20: \"CapsLock\",\n    27: \"Escape\",\n    32: \" \",\n    33: \"PageUp\",\n    34: \"PageDown\",\n    35: \"End\",\n    36: \"Home\",\n    37: \"ArrowLeft\",\n    38: \"ArrowUp\",\n    39: \"ArrowRight\",\n    40: \"ArrowDown\",\n    45: \"Insert\",\n    46: \"Delete\",\n    112: \"F1\",\n    113: \"F2\",\n    114: \"F3\",\n    115: \"F4\",\n    116: \"F5\",\n    117: \"F6\",\n    118: \"F7\",\n    119: \"F8\",\n    120: \"F9\",\n    121: \"F10\",\n    122: \"F11\",\n    123: \"F12\",\n    144: \"NumLock\",\n    145: \"ScrollLock\",\n    224: \"Meta\"\n  },\n  modifierKeyToProp = {\n    Alt: \"altKey\",\n    Control: \"ctrlKey\",\n    Meta: \"metaKey\",\n    Shift: \"shiftKey\"\n  };\nfunction modifierStateGetter(keyArg) {\n  var nativeEvent = this.nativeEvent;\n  return nativeEvent.getModifierState\n    ? nativeEvent.getModifierState(keyArg)\n    : (keyArg = modifierKeyToProp[keyArg])\n      ? !!nativeEvent[keyArg]\n      : !1;\n}\nfunction getEventModifierState() {\n  return modifierStateGetter;\n}\nvar KeyboardEventInterface = assign({}, UIEventInterface, {\n    key: function (nativeEvent) {\n      if (nativeEvent.key) {\n        var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n        if (\"Unidentified\" !== key) return key;\n      }\n      return \"keypress\" === nativeEvent.type\n        ? ((nativeEvent = getEventCharCode(nativeEvent)),\n          13 === nativeEvent ? \"Enter\" : String.fromCharCode(nativeEvent))\n        : \"keydown\" === nativeEvent.type || \"keyup\" === nativeEvent.type\n          ? translateToKey[nativeEvent.keyCode] || \"Unidentified\"\n          : \"\";\n    },\n    code: 0,\n    location: 0,\n    ctrlKey: 0,\n    shiftKey: 0,\n    altKey: 0,\n    metaKey: 0,\n    repeat: 0,\n    locale: 0,\n    getModifierState: getEventModifierState,\n    charCode: function (event) {\n      return \"keypress\" === event.type ? getEventCharCode(event) : 0;\n    },\n    keyCode: function (event) {\n      return \"keydown\" === event.type || \"keyup\" === event.type\n        ? event.keyCode\n        : 0;\n    },\n    which: function (event) {\n      return \"keypress\" === event.type\n        ? getEventCharCode(event)\n        : \"keydown\" === event.type || \"keyup\" === event.type\n          ? event.keyCode\n          : 0;\n    }\n  }),\n  SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface),\n  PointerEventInterface = assign({}, MouseEventInterface, {\n    pointerId: 0,\n    width: 0,\n    height: 0,\n    pressure: 0,\n    tangentialPressure: 0,\n    tiltX: 0,\n    tiltY: 0,\n    twist: 0,\n    pointerType: 0,\n    isPrimary: 0\n  }),\n  SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface),\n  TouchEventInterface = assign({}, UIEventInterface, {\n    touches: 0,\n    targetTouches: 0,\n    changedTouches: 0,\n    altKey: 0,\n    metaKey: 0,\n    ctrlKey: 0,\n    shiftKey: 0,\n    getModifierState: getEventModifierState\n  }),\n  SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface),\n  TransitionEventInterface = assign({}, EventInterface, {\n    propertyName: 0,\n    elapsedTime: 0,\n    pseudoElement: 0\n  }),\n  SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface),\n  WheelEventInterface = assign({}, MouseEventInterface, {\n    deltaX: function (event) {\n      return \"deltaX\" in event\n        ? event.deltaX\n        : \"wheelDeltaX\" in event\n          ? -event.wheelDeltaX\n          : 0;\n    },\n    deltaY: function (event) {\n      return \"deltaY\" in event\n        ? event.deltaY\n        : \"wheelDeltaY\" in event\n          ? -event.wheelDeltaY\n          : \"wheelDelta\" in event\n            ? -event.wheelDelta\n            : 0;\n    },\n    deltaZ: 0,\n    deltaMode: 0\n  }),\n  SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface),\n  ToggleEventInterface = assign({}, EventInterface, {\n    newState: 0,\n    oldState: 0\n  }),\n  SyntheticToggleEvent = createSyntheticEvent(ToggleEventInterface),\n  END_KEYCODES = [9, 13, 27, 32],\n  canUseCompositionEvent = canUseDOM && \"CompositionEvent\" in window,\n  documentMode = null;\ncanUseDOM &&\n  \"documentMode\" in document &&\n  (documentMode = document.documentMode);\nvar canUseTextInputEvent = canUseDOM && \"TextEvent\" in window && !documentMode,\n  useFallbackCompositionData =\n    canUseDOM &&\n    (!canUseCompositionEvent ||\n      (documentMode && 8 < documentMode && 11 >= documentMode)),\n  SPACEBAR_CHAR = String.fromCharCode(32),\n  hasSpaceKeypress = !1;\nfunction isFallbackCompositionEnd(domEventName, nativeEvent) {\n  switch (domEventName) {\n    case \"keyup\":\n      return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);\n    case \"keydown\":\n      return 229 !== nativeEvent.keyCode;\n    case \"keypress\":\n    case \"mousedown\":\n    case \"focusout\":\n      return !0;\n    default:\n      return !1;\n  }\n}\nfunction getDataFromCustomEvent(nativeEvent) {\n  nativeEvent = nativeEvent.detail;\n  return \"object\" === typeof nativeEvent && \"data\" in nativeEvent\n    ? nativeEvent.data\n    : null;\n}\nvar isComposing = !1;\nfunction getNativeBeforeInputChars(domEventName, nativeEvent) {\n  switch (domEventName) {\n    case \"compositionend\":\n      return getDataFromCustomEvent(nativeEvent);\n    case \"keypress\":\n      if (32 !== nativeEvent.which) return null;\n      hasSpaceKeypress = !0;\n      return SPACEBAR_CHAR;\n    case \"textInput\":\n      return (\n        (domEventName = nativeEvent.data),\n        domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName\n      );\n    default:\n      return null;\n  }\n}\nfunction getFallbackBeforeInputChars(domEventName, nativeEvent) {\n  if (isComposing)\n    return \"compositionend\" === domEventName ||\n      (!canUseCompositionEvent &&\n        isFallbackCompositionEnd(domEventName, nativeEvent))\n      ? ((domEventName = getData()),\n        (fallbackText = startText = root = null),\n        (isComposing = !1),\n        domEventName)\n      : null;\n  switch (domEventName) {\n    case \"paste\":\n      return null;\n    case \"keypress\":\n      if (\n        !(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) ||\n        (nativeEvent.ctrlKey && nativeEvent.altKey)\n      ) {\n        if (nativeEvent.char && 1 < nativeEvent.char.length)\n          return nativeEvent.char;\n        if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);\n      }\n      return null;\n    case \"compositionend\":\n      return useFallbackCompositionData && \"ko\" !== nativeEvent.locale\n        ? null\n        : nativeEvent.data;\n    default:\n      return null;\n  }\n}\nvar supportedInputTypes = {\n  color: !0,\n  date: !0,\n  datetime: !0,\n  \"datetime-local\": !0,\n  email: !0,\n  month: !0,\n  number: !0,\n  password: !0,\n  range: !0,\n  search: !0,\n  tel: !0,\n  text: !0,\n  time: !0,\n  url: !0,\n  week: !0\n};\nfunction isTextInputElement(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n  return \"input\" === nodeName\n    ? !!supportedInputTypes[elem.type]\n    : \"textarea\" === nodeName\n      ? !0\n      : !1;\n}\nfunction createAndAccumulateChangeEvent(\n  dispatchQueue,\n  inst,\n  nativeEvent,\n  target\n) {\n  restoreTarget\n    ? restoreQueue\n      ? restoreQueue.push(target)\n      : (restoreQueue = [target])\n    : (restoreTarget = target);\n  inst = accumulateTwoPhaseListeners(inst, \"onChange\");\n  0 < inst.length &&\n    ((nativeEvent = new SyntheticEvent(\n      \"onChange\",\n      \"change\",\n      null,\n      nativeEvent,\n      target\n    )),\n    dispatchQueue.push({ event: nativeEvent, listeners: inst }));\n}\nvar activeElement$1 = null,\n  activeElementInst$1 = null;\nfunction runEventInBatch(dispatchQueue) {\n  processDispatchQueue(dispatchQueue, 0);\n}\nfunction getInstIfValueChanged(targetInst) {\n  var targetNode = getNodeFromInstance(targetInst);\n  if (updateValueIfChanged(targetNode)) return targetInst;\n}\nfunction getTargetInstForChangeEvent(domEventName, targetInst) {\n  if (\"change\" === domEventName) return targetInst;\n}\nvar isInputEventSupported = !1;\nif (canUseDOM) {\n  var JSCompiler_inline_result$jscomp$282;\n  if (canUseDOM) {\n    var isSupported$jscomp$inline_417 = \"oninput\" in document;\n    if (!isSupported$jscomp$inline_417) {\n      var element$jscomp$inline_418 = document.createElement(\"div\");\n      element$jscomp$inline_418.setAttribute(\"oninput\", \"return;\");\n      isSupported$jscomp$inline_417 =\n        \"function\" === typeof element$jscomp$inline_418.oninput;\n    }\n    JSCompiler_inline_result$jscomp$282 = isSupported$jscomp$inline_417;\n  } else JSCompiler_inline_result$jscomp$282 = !1;\n  isInputEventSupported =\n    JSCompiler_inline_result$jscomp$282 &&\n    (!document.documentMode || 9 < document.documentMode);\n}\nfunction stopWatchingForValueChange() {\n  activeElement$1 &&\n    (activeElement$1.detachEvent(\"onpropertychange\", handlePropertyChange),\n    (activeElementInst$1 = activeElement$1 = null));\n}\nfunction handlePropertyChange(nativeEvent) {\n  if (\n    \"value\" === nativeEvent.propertyName &&\n    getInstIfValueChanged(activeElementInst$1)\n  ) {\n    var dispatchQueue = [];\n    createAndAccumulateChangeEvent(\n      dispatchQueue,\n      activeElementInst$1,\n      nativeEvent,\n      getEventTarget(nativeEvent)\n    );\n    batchedUpdates$1(runEventInBatch, dispatchQueue);\n  }\n}\nfunction handleEventsForInputEventPolyfill(domEventName, target, targetInst) {\n  \"focusin\" === domEventName\n    ? (stopWatchingForValueChange(),\n      (activeElement$1 = target),\n      (activeElementInst$1 = targetInst),\n      activeElement$1.attachEvent(\"onpropertychange\", handlePropertyChange))\n    : \"focusout\" === domEventName && stopWatchingForValueChange();\n}\nfunction getTargetInstForInputEventPolyfill(domEventName) {\n  if (\n    \"selectionchange\" === domEventName ||\n    \"keyup\" === domEventName ||\n    \"keydown\" === domEventName\n  )\n    return getInstIfValueChanged(activeElementInst$1);\n}\nfunction getTargetInstForClickEvent(domEventName, targetInst) {\n  if (\"click\" === domEventName) return getInstIfValueChanged(targetInst);\n}\nfunction getTargetInstForInputOrChangeEvent(domEventName, targetInst) {\n  if (\"input\" === domEventName || \"change\" === domEventName)\n    return getInstIfValueChanged(targetInst);\n}\nfunction is(x, y) {\n  return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is;\nfunction shallowEqual(objA, objB) {\n  if (objectIs(objA, objB)) return !0;\n  if (\n    \"object\" !== typeof objA ||\n    null === objA ||\n    \"object\" !== typeof objB ||\n    null === objB\n  )\n    return !1;\n  var keysA = Object.keys(objA),\n    keysB = Object.keys(objB);\n  if (keysA.length !== keysB.length) return !1;\n  for (keysB = 0; keysB < keysA.length; keysB++) {\n    var currentKey = keysA[keysB];\n    if (\n      !hasOwnProperty.call(objB, currentKey) ||\n      !objectIs(objA[currentKey], objB[currentKey])\n    )\n      return !1;\n  }\n  return !0;\n}\nfunction getLeafNode(node) {\n  for (; node && node.firstChild; ) node = node.firstChild;\n  return node;\n}\nfunction getNodeForCharacterOffset(root, offset) {\n  var node = getLeafNode(root);\n  root = 0;\n  for (var nodeEnd; node; ) {\n    if (3 === node.nodeType) {\n      nodeEnd = root + node.textContent.length;\n      if (root <= offset && nodeEnd >= offset)\n        return { node: node, offset: offset - root };\n      root = nodeEnd;\n    }\n    a: {\n      for (; node; ) {\n        if (node.nextSibling) {\n          node = node.nextSibling;\n          break a;\n        }\n        node = node.parentNode;\n      }\n      node = void 0;\n    }\n    node = getLeafNode(node);\n  }\n}\nfunction containsNode(outerNode, innerNode) {\n  return outerNode && innerNode\n    ? outerNode === innerNode\n      ? !0\n      : outerNode && 3 === outerNode.nodeType\n        ? !1\n        : innerNode && 3 === innerNode.nodeType\n          ? containsNode(outerNode, innerNode.parentNode)\n          : \"contains\" in outerNode\n            ? outerNode.contains(innerNode)\n            : outerNode.compareDocumentPosition\n              ? !!(outerNode.compareDocumentPosition(innerNode) & 16)\n              : !1\n    : !1;\n}\nfunction getActiveElementDeep(containerInfo) {\n  containerInfo =\n    null != containerInfo &&\n    null != containerInfo.ownerDocument &&\n    null != containerInfo.ownerDocument.defaultView\n      ? containerInfo.ownerDocument.defaultView\n      : window;\n  for (\n    var element = getActiveElement(containerInfo.document);\n    element instanceof containerInfo.HTMLIFrameElement;\n\n  ) {\n    try {\n      var JSCompiler_inline_result =\n        \"string\" === typeof element.contentWindow.location.href;\n    } catch (err) {\n      JSCompiler_inline_result = !1;\n    }\n    if (JSCompiler_inline_result) containerInfo = element.contentWindow;\n    else break;\n    element = getActiveElement(containerInfo.document);\n  }\n  return element;\n}\nfunction hasSelectionCapabilities(elem) {\n  var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n  return (\n    nodeName &&\n    ((\"input\" === nodeName &&\n      (\"text\" === elem.type ||\n        \"search\" === elem.type ||\n        \"tel\" === elem.type ||\n        \"url\" === elem.type ||\n        \"password\" === elem.type)) ||\n      \"textarea\" === nodeName ||\n      \"true\" === elem.contentEditable)\n  );\n}\nvar skipSelectionChangeEvent =\n    canUseDOM && \"documentMode\" in document && 11 >= document.documentMode,\n  activeElement = null,\n  activeElementInst = null,\n  lastSelection = null,\n  mouseDown = !1;\nfunction constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {\n  var doc =\n    nativeEventTarget.window === nativeEventTarget\n      ? nativeEventTarget.document\n      : 9 === nativeEventTarget.nodeType\n        ? nativeEventTarget\n        : nativeEventTarget.ownerDocument;\n  mouseDown ||\n    null == activeElement ||\n    activeElement !== getActiveElement(doc) ||\n    ((doc = activeElement),\n    \"selectionStart\" in doc && hasSelectionCapabilities(doc)\n      ? (doc = { start: doc.selectionStart, end: doc.selectionEnd })\n      : ((doc = (\n          (doc.ownerDocument && doc.ownerDocument.defaultView) ||\n          window\n        ).getSelection()),\n        (doc = {\n          anchorNode: doc.anchorNode,\n          anchorOffset: doc.anchorOffset,\n          focusNode: doc.focusNode,\n          focusOffset: doc.focusOffset\n        })),\n    (lastSelection && shallowEqual(lastSelection, doc)) ||\n      ((lastSelection = doc),\n      (doc = accumulateTwoPhaseListeners(activeElementInst, \"onSelect\")),\n      0 < doc.length &&\n        ((nativeEvent = new SyntheticEvent(\n          \"onSelect\",\n          \"select\",\n          null,\n          nativeEvent,\n          nativeEventTarget\n        )),\n        dispatchQueue.push({ event: nativeEvent, listeners: doc }),\n        (nativeEvent.target = activeElement))));\n}\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes[\"Webkit\" + styleProp] = \"webkit\" + eventName;\n  prefixes[\"Moz\" + styleProp] = \"moz\" + eventName;\n  return prefixes;\n}\nvar vendorPrefixes = {\n    animationend: makePrefixMap(\"Animation\", \"AnimationEnd\"),\n    animationiteration: makePrefixMap(\"Animation\", \"AnimationIteration\"),\n    animationstart: makePrefixMap(\"Animation\", \"AnimationStart\"),\n    transitionrun: makePrefixMap(\"Transition\", \"TransitionRun\"),\n    transitionstart: makePrefixMap(\"Transition\", \"TransitionStart\"),\n    transitioncancel: makePrefixMap(\"Transition\", \"TransitionCancel\"),\n    transitionend: makePrefixMap(\"Transition\", \"TransitionEnd\")\n  },\n  prefixedEventNames = {},\n  style = {};\ncanUseDOM &&\n  ((style = document.createElement(\"div\").style),\n  \"AnimationEvent\" in window ||\n    (delete vendorPrefixes.animationend.animation,\n    delete vendorPrefixes.animationiteration.animation,\n    delete vendorPrefixes.animationstart.animation),\n  \"TransitionEvent\" in window ||\n    delete vendorPrefixes.transitionend.transition);\nfunction getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];\n  if (!vendorPrefixes[eventName]) return eventName;\n  var prefixMap = vendorPrefixes[eventName],\n    styleProp;\n  for (styleProp in prefixMap)\n    if (prefixMap.hasOwnProperty(styleProp) && styleProp in style)\n      return (prefixedEventNames[eventName] = prefixMap[styleProp]);\n  return eventName;\n}\nvar ANIMATION_END = getVendorPrefixedEventName(\"animationend\"),\n  ANIMATION_ITERATION = getVendorPrefixedEventName(\"animationiteration\"),\n  ANIMATION_START = getVendorPrefixedEventName(\"animationstart\"),\n  TRANSITION_RUN = getVendorPrefixedEventName(\"transitionrun\"),\n  TRANSITION_START = getVendorPrefixedEventName(\"transitionstart\"),\n  TRANSITION_CANCEL = getVendorPrefixedEventName(\"transitioncancel\"),\n  TRANSITION_END = getVendorPrefixedEventName(\"transitionend\"),\n  topLevelEventsToReactNames = new Map(),\n  simpleEventPluginEvents =\n    \"abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\n      \" \"\n    );\nsimpleEventPluginEvents.push(\"scrollEnd\");\nfunction registerSimpleEvent(domEventName, reactName) {\n  topLevelEventsToReactNames.set(domEventName, reactName);\n  registerTwoPhaseEvent(reactName, [domEventName]);\n}\nvar CapturedStacks = new WeakMap();\nfunction createCapturedValueAtFiber(value, source) {\n  if (\"object\" === typeof value && null !== value) {\n    var existing = CapturedStacks.get(value);\n    if (void 0 !== existing) return existing;\n    source = {\n      value: value,\n      source: source,\n      stack: getStackByFiberInDevAndProd(source)\n    };\n    CapturedStacks.set(value, source);\n    return source;\n  }\n  return {\n    value: value,\n    source: source,\n    stack: getStackByFiberInDevAndProd(source)\n  };\n}\nvar concurrentQueues = [],\n  concurrentQueuesIndex = 0,\n  concurrentlyUpdatedLanes = 0;\nfunction finishQueueingConcurrentUpdates() {\n  for (\n    var endIndex = concurrentQueuesIndex,\n      i = (concurrentlyUpdatedLanes = concurrentQueuesIndex = 0);\n    i < endIndex;\n\n  ) {\n    var fiber = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    var queue = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    var update = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    var lane = concurrentQueues[i];\n    concurrentQueues[i++] = null;\n    if (null !== queue && null !== update) {\n      var pending = queue.pending;\n      null === pending\n        ? (update.next = update)\n        : ((update.next = pending.next), (pending.next = update));\n      queue.pending = update;\n    }\n    0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane);\n  }\n}\nfunction enqueueUpdate$1(fiber, queue, update, lane) {\n  concurrentQueues[concurrentQueuesIndex++] = fiber;\n  concurrentQueues[concurrentQueuesIndex++] = queue;\n  concurrentQueues[concurrentQueuesIndex++] = update;\n  concurrentQueues[concurrentQueuesIndex++] = lane;\n  concurrentlyUpdatedLanes |= lane;\n  fiber.lanes |= lane;\n  fiber = fiber.alternate;\n  null !== fiber && (fiber.lanes |= lane);\n}\nfunction enqueueConcurrentHookUpdate(fiber, queue, update, lane) {\n  enqueueUpdate$1(fiber, queue, update, lane);\n  return getRootForUpdatedFiber(fiber);\n}\nfunction enqueueConcurrentRenderForLane(fiber, lane) {\n  enqueueUpdate$1(fiber, null, null, lane);\n  return getRootForUpdatedFiber(fiber);\n}\nfunction markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) {\n  sourceFiber.lanes |= lane;\n  var alternate = sourceFiber.alternate;\n  null !== alternate && (alternate.lanes |= lane);\n  for (var isHidden = !1, parent = sourceFiber.return; null !== parent; )\n    (parent.childLanes |= lane),\n      (alternate = parent.alternate),\n      null !== alternate && (alternate.childLanes |= lane),\n      22 === parent.tag &&\n        ((sourceFiber = parent.stateNode),\n        null === sourceFiber || sourceFiber._visibility & 1 || (isHidden = !0)),\n      (sourceFiber = parent),\n      (parent = parent.return);\n  return 3 === sourceFiber.tag\n    ? ((parent = sourceFiber.stateNode),\n      isHidden &&\n        null !== update &&\n        ((isHidden = 31 - clz32(lane)),\n        (sourceFiber = parent.hiddenUpdates),\n        (alternate = sourceFiber[isHidden]),\n        null === alternate\n          ? (sourceFiber[isHidden] = [update])\n          : alternate.push(update),\n        (update.lane = lane | 536870912)),\n      parent)\n    : null;\n}\nfunction getRootForUpdatedFiber(sourceFiber) {\n  if (50 < nestedUpdateCount)\n    throw (\n      ((nestedUpdateCount = 0),\n      (rootWithNestedUpdates = null),\n      Error(formatProdErrorMessage(185)))\n    );\n  for (var parent = sourceFiber.return; null !== parent; )\n    (sourceFiber = parent), (parent = sourceFiber.return);\n  return 3 === sourceFiber.tag ? sourceFiber.stateNode : null;\n}\nvar emptyContextObject = {};\nfunction FiberNode(tag, pendingProps, key, mode) {\n  this.tag = tag;\n  this.key = key;\n  this.sibling =\n    this.child =\n    this.return =\n    this.stateNode =\n    this.type =\n    this.elementType =\n      null;\n  this.index = 0;\n  this.refCleanup = this.ref = null;\n  this.pendingProps = pendingProps;\n  this.dependencies =\n    this.memoizedState =\n    this.updateQueue =\n    this.memoizedProps =\n      null;\n  this.mode = mode;\n  this.subtreeFlags = this.flags = 0;\n  this.deletions = null;\n  this.childLanes = this.lanes = 0;\n  this.alternate = null;\n}\nfunction createFiberImplClass(tag, pendingProps, key, mode) {\n  return new FiberNode(tag, pendingProps, key, mode);\n}\nfunction shouldConstruct(Component) {\n  Component = Component.prototype;\n  return !(!Component || !Component.isReactComponent);\n}\nfunction createWorkInProgress(current, pendingProps) {\n  var workInProgress = current.alternate;\n  null === workInProgress\n    ? ((workInProgress = createFiberImplClass(\n        current.tag,\n        pendingProps,\n        current.key,\n        current.mode\n      )),\n      (workInProgress.elementType = current.elementType),\n      (workInProgress.type = current.type),\n      (workInProgress.stateNode = current.stateNode),\n      (workInProgress.alternate = current),\n      (current.alternate = workInProgress))\n    : ((workInProgress.pendingProps = pendingProps),\n      (workInProgress.type = current.type),\n      (workInProgress.flags = 0),\n      (workInProgress.subtreeFlags = 0),\n      (workInProgress.deletions = null));\n  workInProgress.flags = current.flags & 65011712;\n  workInProgress.childLanes = current.childLanes;\n  workInProgress.lanes = current.lanes;\n  workInProgress.child = current.child;\n  workInProgress.memoizedProps = current.memoizedProps;\n  workInProgress.memoizedState = current.memoizedState;\n  workInProgress.updateQueue = current.updateQueue;\n  pendingProps = current.dependencies;\n  workInProgress.dependencies =\n    null === pendingProps\n      ? null\n      : { lanes: pendingProps.lanes, firstContext: pendingProps.firstContext };\n  workInProgress.sibling = current.sibling;\n  workInProgress.index = current.index;\n  workInProgress.ref = current.ref;\n  workInProgress.refCleanup = current.refCleanup;\n  return workInProgress;\n}\nfunction resetWorkInProgress(workInProgress, renderLanes) {\n  workInProgress.flags &= 65011714;\n  var current = workInProgress.alternate;\n  null === current\n    ? ((workInProgress.childLanes = 0),\n      (workInProgress.lanes = renderLanes),\n      (workInProgress.child = null),\n      (workInProgress.subtreeFlags = 0),\n      (workInProgress.memoizedProps = null),\n      (workInProgress.memoizedState = null),\n      (workInProgress.updateQueue = null),\n      (workInProgress.dependencies = null),\n      (workInProgress.stateNode = null))\n    : ((workInProgress.childLanes = current.childLanes),\n      (workInProgress.lanes = current.lanes),\n      (workInProgress.child = current.child),\n      (workInProgress.subtreeFlags = 0),\n      (workInProgress.deletions = null),\n      (workInProgress.memoizedProps = current.memoizedProps),\n      (workInProgress.memoizedState = current.memoizedState),\n      (workInProgress.updateQueue = current.updateQueue),\n      (workInProgress.type = current.type),\n      (renderLanes = current.dependencies),\n      (workInProgress.dependencies =\n        null === renderLanes\n          ? null\n          : {\n              lanes: renderLanes.lanes,\n              firstContext: renderLanes.firstContext\n            }));\n  return workInProgress;\n}\nfunction createFiberFromTypeAndProps(\n  type,\n  key,\n  pendingProps,\n  owner,\n  mode,\n  lanes\n) {\n  var fiberTag = 0;\n  owner = type;\n  if (\"function\" === typeof type) shouldConstruct(type) && (fiberTag = 1);\n  else if (\"string\" === typeof type)\n    fiberTag = isHostHoistableType(\n      type,\n      pendingProps,\n      contextStackCursor.current\n    )\n      ? 26\n      : \"html\" === type || \"head\" === type || \"body\" === type\n        ? 27\n        : 5;\n  else\n    a: switch (type) {\n      case REACT_ACTIVITY_TYPE:\n        return (\n          (type = createFiberImplClass(31, pendingProps, key, mode)),\n          (type.elementType = REACT_ACTIVITY_TYPE),\n          (type.lanes = lanes),\n          type\n        );\n      case REACT_FRAGMENT_TYPE:\n        return createFiberFromFragment(pendingProps.children, mode, lanes, key);\n      case REACT_STRICT_MODE_TYPE:\n        fiberTag = 8;\n        mode |= 24;\n        break;\n      case REACT_PROFILER_TYPE:\n        return (\n          (type = createFiberImplClass(12, pendingProps, key, mode | 2)),\n          (type.elementType = REACT_PROFILER_TYPE),\n          (type.lanes = lanes),\n          type\n        );\n      case REACT_SUSPENSE_TYPE:\n        return (\n          (type = createFiberImplClass(13, pendingProps, key, mode)),\n          (type.elementType = REACT_SUSPENSE_TYPE),\n          (type.lanes = lanes),\n          type\n        );\n      case REACT_SUSPENSE_LIST_TYPE:\n        return (\n          (type = createFiberImplClass(19, pendingProps, key, mode)),\n          (type.elementType = REACT_SUSPENSE_LIST_TYPE),\n          (type.lanes = lanes),\n          type\n        );\n      default:\n        if (\"object\" === typeof type && null !== type)\n          switch (type.$$typeof) {\n            case REACT_PROVIDER_TYPE:\n            case REACT_CONTEXT_TYPE:\n              fiberTag = 10;\n              break a;\n            case REACT_CONSUMER_TYPE:\n              fiberTag = 9;\n              break a;\n            case REACT_FORWARD_REF_TYPE:\n              fiberTag = 11;\n              break a;\n            case REACT_MEMO_TYPE:\n              fiberTag = 14;\n              break a;\n            case REACT_LAZY_TYPE:\n              fiberTag = 16;\n              owner = null;\n              break a;\n          }\n        fiberTag = 29;\n        pendingProps = Error(\n          formatProdErrorMessage(130, null === type ? \"null\" : typeof type, \"\")\n        );\n        owner = null;\n    }\n  key = createFiberImplClass(fiberTag, pendingProps, key, mode);\n  key.elementType = type;\n  key.type = owner;\n  key.lanes = lanes;\n  return key;\n}\nfunction createFiberFromFragment(elements, mode, lanes, key) {\n  elements = createFiberImplClass(7, elements, key, mode);\n  elements.lanes = lanes;\n  return elements;\n}\nfunction createFiberFromText(content, mode, lanes) {\n  content = createFiberImplClass(6, content, null, mode);\n  content.lanes = lanes;\n  return content;\n}\nfunction createFiberFromPortal(portal, mode, lanes) {\n  mode = createFiberImplClass(\n    4,\n    null !== portal.children ? portal.children : [],\n    portal.key,\n    mode\n  );\n  mode.lanes = lanes;\n  mode.stateNode = {\n    containerInfo: portal.containerInfo,\n    pendingChildren: null,\n    implementation: portal.implementation\n  };\n  return mode;\n}\nvar forkStack = [],\n  forkStackIndex = 0,\n  treeForkProvider = null,\n  treeForkCount = 0,\n  idStack = [],\n  idStackIndex = 0,\n  treeContextProvider = null,\n  treeContextId = 1,\n  treeContextOverflow = \"\";\nfunction pushTreeFork(workInProgress, totalChildren) {\n  forkStack[forkStackIndex++] = treeForkCount;\n  forkStack[forkStackIndex++] = treeForkProvider;\n  treeForkProvider = workInProgress;\n  treeForkCount = totalChildren;\n}\nfunction pushTreeId(workInProgress, totalChildren, index) {\n  idStack[idStackIndex++] = treeContextId;\n  idStack[idStackIndex++] = treeContextOverflow;\n  idStack[idStackIndex++] = treeContextProvider;\n  treeContextProvider = workInProgress;\n  var baseIdWithLeadingBit = treeContextId;\n  workInProgress = treeContextOverflow;\n  var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1;\n  baseIdWithLeadingBit &= ~(1 << baseLength);\n  index += 1;\n  var length = 32 - clz32(totalChildren) + baseLength;\n  if (30 < length) {\n    var numberOfOverflowBits = baseLength - (baseLength % 5);\n    length = (\n      baseIdWithLeadingBit &\n      ((1 << numberOfOverflowBits) - 1)\n    ).toString(32);\n    baseIdWithLeadingBit >>= numberOfOverflowBits;\n    baseLength -= numberOfOverflowBits;\n    treeContextId =\n      (1 << (32 - clz32(totalChildren) + baseLength)) |\n      (index << baseLength) |\n      baseIdWithLeadingBit;\n    treeContextOverflow = length + workInProgress;\n  } else\n    (treeContextId =\n      (1 << length) | (index << baseLength) | baseIdWithLeadingBit),\n      (treeContextOverflow = workInProgress);\n}\nfunction pushMaterializedTreeId(workInProgress) {\n  null !== workInProgress.return &&\n    (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0));\n}\nfunction popTreeContext(workInProgress) {\n  for (; workInProgress === treeForkProvider; )\n    (treeForkProvider = forkStack[--forkStackIndex]),\n      (forkStack[forkStackIndex] = null),\n      (treeForkCount = forkStack[--forkStackIndex]),\n      (forkStack[forkStackIndex] = null);\n  for (; workInProgress === treeContextProvider; )\n    (treeContextProvider = idStack[--idStackIndex]),\n      (idStack[idStackIndex] = null),\n      (treeContextOverflow = idStack[--idStackIndex]),\n      (idStack[idStackIndex] = null),\n      (treeContextId = idStack[--idStackIndex]),\n      (idStack[idStackIndex] = null);\n}\nvar hydrationParentFiber = null,\n  nextHydratableInstance = null,\n  isHydrating = !1,\n  hydrationErrors = null,\n  rootOrSingletonContext = !1,\n  HydrationMismatchException = Error(formatProdErrorMessage(519));\nfunction throwOnHydrationMismatch(fiber) {\n  var error = Error(formatProdErrorMessage(418, \"\"));\n  queueHydrationError(createCapturedValueAtFiber(error, fiber));\n  throw HydrationMismatchException;\n}\nfunction prepareToHydrateHostInstance(fiber) {\n  var instance = fiber.stateNode,\n    type = fiber.type,\n    props = fiber.memoizedProps;\n  instance[internalInstanceKey] = fiber;\n  instance[internalPropsKey] = props;\n  switch (type) {\n    case \"dialog\":\n      listenToNonDelegatedEvent(\"cancel\", instance);\n      listenToNonDelegatedEvent(\"close\", instance);\n      break;\n    case \"iframe\":\n    case \"object\":\n    case \"embed\":\n      listenToNonDelegatedEvent(\"load\", instance);\n      break;\n    case \"video\":\n    case \"audio\":\n      for (type = 0; type < mediaEventTypes.length; type++)\n        listenToNonDelegatedEvent(mediaEventTypes[type], instance);\n      break;\n    case \"source\":\n      listenToNonDelegatedEvent(\"error\", instance);\n      break;\n    case \"img\":\n    case \"image\":\n    case \"link\":\n      listenToNonDelegatedEvent(\"error\", instance);\n      listenToNonDelegatedEvent(\"load\", instance);\n      break;\n    case \"details\":\n      listenToNonDelegatedEvent(\"toggle\", instance);\n      break;\n    case \"input\":\n      listenToNonDelegatedEvent(\"invalid\", instance);\n      initInput(\n        instance,\n        props.value,\n        props.defaultValue,\n        props.checked,\n        props.defaultChecked,\n        props.type,\n        props.name,\n        !0\n      );\n      track(instance);\n      break;\n    case \"select\":\n      listenToNonDelegatedEvent(\"invalid\", instance);\n      break;\n    case \"textarea\":\n      listenToNonDelegatedEvent(\"invalid\", instance),\n        initTextarea(instance, props.value, props.defaultValue, props.children),\n        track(instance);\n  }\n  type = props.children;\n  (\"string\" !== typeof type &&\n    \"number\" !== typeof type &&\n    \"bigint\" !== typeof type) ||\n  instance.textContent === \"\" + type ||\n  !0 === props.suppressHydrationWarning ||\n  checkForUnmatchedText(instance.textContent, type)\n    ? (null != props.popover &&\n        (listenToNonDelegatedEvent(\"beforetoggle\", instance),\n        listenToNonDelegatedEvent(\"toggle\", instance)),\n      null != props.onScroll && listenToNonDelegatedEvent(\"scroll\", instance),\n      null != props.onScrollEnd &&\n        listenToNonDelegatedEvent(\"scrollend\", instance),\n      null != props.onClick && (instance.onclick = noop$1),\n      (instance = !0))\n    : (instance = !1);\n  instance || throwOnHydrationMismatch(fiber);\n}\nfunction popToNextHostParent(fiber) {\n  for (hydrationParentFiber = fiber.return; hydrationParentFiber; )\n    switch (hydrationParentFiber.tag) {\n      case 5:\n      case 13:\n        rootOrSingletonContext = !1;\n        return;\n      case 27:\n      case 3:\n        rootOrSingletonContext = !0;\n        return;\n      default:\n        hydrationParentFiber = hydrationParentFiber.return;\n    }\n}\nfunction popHydrationState(fiber) {\n  if (fiber !== hydrationParentFiber) return !1;\n  if (!isHydrating) return popToNextHostParent(fiber), (isHydrating = !0), !1;\n  var tag = fiber.tag,\n    JSCompiler_temp;\n  if ((JSCompiler_temp = 3 !== tag && 27 !== tag)) {\n    if ((JSCompiler_temp = 5 === tag))\n      (JSCompiler_temp = fiber.type),\n        (JSCompiler_temp =\n          !(\"form\" !== JSCompiler_temp && \"button\" !== JSCompiler_temp) ||\n          shouldSetTextContent(fiber.type, fiber.memoizedProps));\n    JSCompiler_temp = !JSCompiler_temp;\n  }\n  JSCompiler_temp && nextHydratableInstance && throwOnHydrationMismatch(fiber);\n  popToNextHostParent(fiber);\n  if (13 === tag) {\n    fiber = fiber.memoizedState;\n    fiber = null !== fiber ? fiber.dehydrated : null;\n    if (!fiber) throw Error(formatProdErrorMessage(317));\n    a: {\n      fiber = fiber.nextSibling;\n      for (tag = 0; fiber; ) {\n        if (8 === fiber.nodeType)\n          if (((JSCompiler_temp = fiber.data), \"/$\" === JSCompiler_temp)) {\n            if (0 === tag) {\n              nextHydratableInstance = getNextHydratable(fiber.nextSibling);\n              break a;\n            }\n            tag--;\n          } else\n            (\"$\" !== JSCompiler_temp &&\n              \"$!\" !== JSCompiler_temp &&\n              \"$?\" !== JSCompiler_temp) ||\n              tag++;\n        fiber = fiber.nextSibling;\n      }\n      nextHydratableInstance = null;\n    }\n  } else\n    27 === tag\n      ? ((tag = nextHydratableInstance),\n        isSingletonScope(fiber.type)\n          ? ((fiber = previousHydratableOnEnteringScopedSingleton),\n            (previousHydratableOnEnteringScopedSingleton = null),\n            (nextHydratableInstance = fiber))\n          : (nextHydratableInstance = tag))\n      : (nextHydratableInstance = hydrationParentFiber\n          ? getNextHydratable(fiber.stateNode.nextSibling)\n          : null);\n  return !0;\n}\nfunction resetHydrationState() {\n  nextHydratableInstance = hydrationParentFiber = null;\n  isHydrating = !1;\n}\nfunction upgradeHydrationErrorsToRecoverable() {\n  var queuedErrors = hydrationErrors;\n  null !== queuedErrors &&\n    (null === workInProgressRootRecoverableErrors\n      ? (workInProgressRootRecoverableErrors = queuedErrors)\n      : workInProgressRootRecoverableErrors.push.apply(\n          workInProgressRootRecoverableErrors,\n          queuedErrors\n        ),\n    (hydrationErrors = null));\n  return queuedErrors;\n}\nfunction queueHydrationError(error) {\n  null === hydrationErrors\n    ? (hydrationErrors = [error])\n    : hydrationErrors.push(error);\n}\nvar valueCursor = createCursor(null),\n  currentlyRenderingFiber$1 = null,\n  lastContextDependency = null;\nfunction pushProvider(providerFiber, context, nextValue) {\n  push(valueCursor, context._currentValue);\n  context._currentValue = nextValue;\n}\nfunction popProvider(context) {\n  context._currentValue = valueCursor.current;\n  pop(valueCursor);\n}\nfunction scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {\n  for (; null !== parent; ) {\n    var alternate = parent.alternate;\n    (parent.childLanes & renderLanes) !== renderLanes\n      ? ((parent.childLanes |= renderLanes),\n        null !== alternate && (alternate.childLanes |= renderLanes))\n      : null !== alternate &&\n        (alternate.childLanes & renderLanes) !== renderLanes &&\n        (alternate.childLanes |= renderLanes);\n    if (parent === propagationRoot) break;\n    parent = parent.return;\n  }\n}\nfunction propagateContextChanges(\n  workInProgress,\n  contexts,\n  renderLanes,\n  forcePropagateEntireTree\n) {\n  var fiber = workInProgress.child;\n  null !== fiber && (fiber.return = workInProgress);\n  for (; null !== fiber; ) {\n    var list = fiber.dependencies;\n    if (null !== list) {\n      var nextFiber = fiber.child;\n      list = list.firstContext;\n      a: for (; null !== list; ) {\n        var dependency = list;\n        list = fiber;\n        for (var i = 0; i < contexts.length; i++)\n          if (dependency.context === contexts[i]) {\n            list.lanes |= renderLanes;\n            dependency = list.alternate;\n            null !== dependency && (dependency.lanes |= renderLanes);\n            scheduleContextWorkOnParentPath(\n              list.return,\n              renderLanes,\n              workInProgress\n            );\n            forcePropagateEntireTree || (nextFiber = null);\n            break a;\n          }\n        list = dependency.next;\n      }\n    } else if (18 === fiber.tag) {\n      nextFiber = fiber.return;\n      if (null === nextFiber) throw Error(formatProdErrorMessage(341));\n      nextFiber.lanes |= renderLanes;\n      list = nextFiber.alternate;\n      null !== list && (list.lanes |= renderLanes);\n      scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress);\n      nextFiber = null;\n    } else nextFiber = fiber.child;\n    if (null !== nextFiber) nextFiber.return = fiber;\n    else\n      for (nextFiber = fiber; null !== nextFiber; ) {\n        if (nextFiber === workInProgress) {\n          nextFiber = null;\n          break;\n        }\n        fiber = nextFiber.sibling;\n        if (null !== fiber) {\n          fiber.return = nextFiber.return;\n          nextFiber = fiber;\n          break;\n        }\n        nextFiber = nextFiber.return;\n      }\n    fiber = nextFiber;\n  }\n}\nfunction propagateParentContextChanges(\n  current,\n  workInProgress,\n  renderLanes,\n  forcePropagateEntireTree\n) {\n  current = null;\n  for (\n    var parent = workInProgress, isInsidePropagationBailout = !1;\n    null !== parent;\n\n  ) {\n    if (!isInsidePropagationBailout)\n      if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0;\n      else if (0 !== (parent.flags & 262144)) break;\n    if (10 === parent.tag) {\n      var currentParent = parent.alternate;\n      if (null === currentParent) throw Error(formatProdErrorMessage(387));\n      currentParent = currentParent.memoizedProps;\n      if (null !== currentParent) {\n        var context = parent.type;\n        objectIs(parent.pendingProps.value, currentParent.value) ||\n          (null !== current ? current.push(context) : (current = [context]));\n      }\n    } else if (parent === hostTransitionProviderCursor.current) {\n      currentParent = parent.alternate;\n      if (null === currentParent) throw Error(formatProdErrorMessage(387));\n      currentParent.memoizedState.memoizedState !==\n        parent.memoizedState.memoizedState &&\n        (null !== current\n          ? current.push(HostTransitionContext)\n          : (current = [HostTransitionContext]));\n    }\n    parent = parent.return;\n  }\n  null !== current &&\n    propagateContextChanges(\n      workInProgress,\n      current,\n      renderLanes,\n      forcePropagateEntireTree\n    );\n  workInProgress.flags |= 262144;\n}\nfunction checkIfContextChanged(currentDependencies) {\n  for (\n    currentDependencies = currentDependencies.firstContext;\n    null !== currentDependencies;\n\n  ) {\n    if (\n      !objectIs(\n        currentDependencies.context._currentValue,\n        currentDependencies.memoizedValue\n      )\n    )\n      return !0;\n    currentDependencies = currentDependencies.next;\n  }\n  return !1;\n}\nfunction prepareToReadContext(workInProgress) {\n  currentlyRenderingFiber$1 = workInProgress;\n  lastContextDependency = null;\n  workInProgress = workInProgress.dependencies;\n  null !== workInProgress && (workInProgress.firstContext = null);\n}\nfunction readContext(context) {\n  return readContextForConsumer(currentlyRenderingFiber$1, context);\n}\nfunction readContextDuringReconciliation(consumer, context) {\n  null === currentlyRenderingFiber$1 && prepareToReadContext(consumer);\n  return readContextForConsumer(consumer, context);\n}\nfunction readContextForConsumer(consumer, context) {\n  var value = context._currentValue;\n  context = { context: context, memoizedValue: value, next: null };\n  if (null === lastContextDependency) {\n    if (null === consumer) throw Error(formatProdErrorMessage(308));\n    lastContextDependency = context;\n    consumer.dependencies = { lanes: 0, firstContext: context };\n    consumer.flags |= 524288;\n  } else lastContextDependency = lastContextDependency.next = context;\n  return value;\n}\nvar AbortControllerLocal =\n    \"undefined\" !== typeof AbortController\n      ? AbortController\n      : function () {\n          var listeners = [],\n            signal = (this.signal = {\n              aborted: !1,\n              addEventListener: function (type, listener) {\n                listeners.push(listener);\n              }\n            });\n          this.abort = function () {\n            signal.aborted = !0;\n            listeners.forEach(function (listener) {\n              return listener();\n            });\n          };\n        },\n  scheduleCallback$2 = Scheduler.unstable_scheduleCallback,\n  NormalPriority = Scheduler.unstable_NormalPriority,\n  CacheContext = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    Consumer: null,\n    Provider: null,\n    _currentValue: null,\n    _currentValue2: null,\n    _threadCount: 0\n  };\nfunction createCache() {\n  return {\n    controller: new AbortControllerLocal(),\n    data: new Map(),\n    refCount: 0\n  };\n}\nfunction releaseCache(cache) {\n  cache.refCount--;\n  0 === cache.refCount &&\n    scheduleCallback$2(NormalPriority, function () {\n      cache.controller.abort();\n    });\n}\nvar currentEntangledListeners = null,\n  currentEntangledPendingCount = 0,\n  currentEntangledLane = 0,\n  currentEntangledActionThenable = null;\nfunction entangleAsyncAction(transition, thenable) {\n  if (null === currentEntangledListeners) {\n    var entangledListeners = (currentEntangledListeners = []);\n    currentEntangledPendingCount = 0;\n    currentEntangledLane = requestTransitionLane();\n    currentEntangledActionThenable = {\n      status: \"pending\",\n      value: void 0,\n      then: function (resolve) {\n        entangledListeners.push(resolve);\n      }\n    };\n  }\n  currentEntangledPendingCount++;\n  thenable.then(pingEngtangledActionScope, pingEngtangledActionScope);\n  return thenable;\n}\nfunction pingEngtangledActionScope() {\n  if (\n    0 === --currentEntangledPendingCount &&\n    null !== currentEntangledListeners\n  ) {\n    null !== currentEntangledActionThenable &&\n      (currentEntangledActionThenable.status = \"fulfilled\");\n    var listeners = currentEntangledListeners;\n    currentEntangledListeners = null;\n    currentEntangledLane = 0;\n    currentEntangledActionThenable = null;\n    for (var i = 0; i < listeners.length; i++) (0, listeners[i])();\n  }\n}\nfunction chainThenableValue(thenable, result) {\n  var listeners = [],\n    thenableWithOverride = {\n      status: \"pending\",\n      value: null,\n      reason: null,\n      then: function (resolve) {\n        listeners.push(resolve);\n      }\n    };\n  thenable.then(\n    function () {\n      thenableWithOverride.status = \"fulfilled\";\n      thenableWithOverride.value = result;\n      for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result);\n    },\n    function (error) {\n      thenableWithOverride.status = \"rejected\";\n      thenableWithOverride.reason = error;\n      for (error = 0; error < listeners.length; error++)\n        (0, listeners[error])(void 0);\n    }\n  );\n  return thenableWithOverride;\n}\nvar prevOnStartTransitionFinish = ReactSharedInternals.S;\nReactSharedInternals.S = function (transition, returnValue) {\n  \"object\" === typeof returnValue &&\n    null !== returnValue &&\n    \"function\" === typeof returnValue.then &&\n    entangleAsyncAction(transition, returnValue);\n  null !== prevOnStartTransitionFinish &&\n    prevOnStartTransitionFinish(transition, returnValue);\n};\nvar resumedCache = createCursor(null);\nfunction peekCacheFromPool() {\n  var cacheResumedFromPreviousRender = resumedCache.current;\n  return null !== cacheResumedFromPreviousRender\n    ? cacheResumedFromPreviousRender\n    : workInProgressRoot.pooledCache;\n}\nfunction pushTransition(offscreenWorkInProgress, prevCachePool) {\n  null === prevCachePool\n    ? push(resumedCache, resumedCache.current)\n    : push(resumedCache, prevCachePool.pool);\n}\nfunction getSuspendedCache() {\n  var cacheFromPool = peekCacheFromPool();\n  return null === cacheFromPool\n    ? null\n    : { parent: CacheContext._currentValue, pool: cacheFromPool };\n}\nvar SuspenseException = Error(formatProdErrorMessage(460)),\n  SuspenseyCommitException = Error(formatProdErrorMessage(474)),\n  SuspenseActionException = Error(formatProdErrorMessage(542)),\n  noopSuspenseyCommitThenable = { then: function () {} };\nfunction isThenableResolved(thenable) {\n  thenable = thenable.status;\n  return \"fulfilled\" === thenable || \"rejected\" === thenable;\n}\nfunction noop$3() {}\nfunction trackUsedThenable(thenableState, thenable, index) {\n  index = thenableState[index];\n  void 0 === index\n    ? thenableState.push(thenable)\n    : index !== thenable && (thenable.then(noop$3, noop$3), (thenable = index));\n  switch (thenable.status) {\n    case \"fulfilled\":\n      return thenable.value;\n    case \"rejected\":\n      throw (\n        ((thenableState = thenable.reason),\n        checkIfUseWrappedInAsyncCatch(thenableState),\n        thenableState)\n      );\n    default:\n      if (\"string\" === typeof thenable.status) thenable.then(noop$3, noop$3);\n      else {\n        thenableState = workInProgressRoot;\n        if (null !== thenableState && 100 < thenableState.shellSuspendCounter)\n          throw Error(formatProdErrorMessage(482));\n        thenableState = thenable;\n        thenableState.status = \"pending\";\n        thenableState.then(\n          function (fulfilledValue) {\n            if (\"pending\" === thenable.status) {\n              var fulfilledThenable = thenable;\n              fulfilledThenable.status = \"fulfilled\";\n              fulfilledThenable.value = fulfilledValue;\n            }\n          },\n          function (error) {\n            if (\"pending\" === thenable.status) {\n              var rejectedThenable = thenable;\n              rejectedThenable.status = \"rejected\";\n              rejectedThenable.reason = error;\n            }\n          }\n        );\n      }\n      switch (thenable.status) {\n        case \"fulfilled\":\n          return thenable.value;\n        case \"rejected\":\n          throw (\n            ((thenableState = thenable.reason),\n            checkIfUseWrappedInAsyncCatch(thenableState),\n            thenableState)\n          );\n      }\n      suspendedThenable = thenable;\n      throw SuspenseException;\n  }\n}\nvar suspendedThenable = null;\nfunction getSuspendedThenable() {\n  if (null === suspendedThenable) throw Error(formatProdErrorMessage(459));\n  var thenable = suspendedThenable;\n  suspendedThenable = null;\n  return thenable;\n}\nfunction checkIfUseWrappedInAsyncCatch(rejectedReason) {\n  if (\n    rejectedReason === SuspenseException ||\n    rejectedReason === SuspenseActionException\n  )\n    throw Error(formatProdErrorMessage(483));\n}\nvar hasForceUpdate = !1;\nfunction initializeUpdateQueue(fiber) {\n  fiber.updateQueue = {\n    baseState: fiber.memoizedState,\n    firstBaseUpdate: null,\n    lastBaseUpdate: null,\n    shared: { pending: null, lanes: 0, hiddenCallbacks: null },\n    callbacks: null\n  };\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n  current = current.updateQueue;\n  workInProgress.updateQueue === current &&\n    (workInProgress.updateQueue = {\n      baseState: current.baseState,\n      firstBaseUpdate: current.firstBaseUpdate,\n      lastBaseUpdate: current.lastBaseUpdate,\n      shared: current.shared,\n      callbacks: null\n    });\n}\nfunction createUpdate(lane) {\n  return { lane: lane, tag: 0, payload: null, callback: null, next: null };\n}\nfunction enqueueUpdate(fiber, update, lane) {\n  var updateQueue = fiber.updateQueue;\n  if (null === updateQueue) return null;\n  updateQueue = updateQueue.shared;\n  if (0 !== (executionContext & 2)) {\n    var pending = updateQueue.pending;\n    null === pending\n      ? (update.next = update)\n      : ((update.next = pending.next), (pending.next = update));\n    updateQueue.pending = update;\n    update = getRootForUpdatedFiber(fiber);\n    markUpdateLaneFromFiberToRoot(fiber, null, lane);\n    return update;\n  }\n  enqueueUpdate$1(fiber, updateQueue, update, lane);\n  return getRootForUpdatedFiber(fiber);\n}\nfunction entangleTransitions(root, fiber, lane) {\n  fiber = fiber.updateQueue;\n  if (null !== fiber && ((fiber = fiber.shared), 0 !== (lane & 4194048))) {\n    var queueLanes = fiber.lanes;\n    queueLanes &= root.pendingLanes;\n    lane |= queueLanes;\n    fiber.lanes = lane;\n    markRootEntangled(root, lane);\n  }\n}\nfunction enqueueCapturedUpdate(workInProgress, capturedUpdate) {\n  var queue = workInProgress.updateQueue,\n    current = workInProgress.alternate;\n  if (\n    null !== current &&\n    ((current = current.updateQueue), queue === current)\n  ) {\n    var newFirst = null,\n      newLast = null;\n    queue = queue.firstBaseUpdate;\n    if (null !== queue) {\n      do {\n        var clone = {\n          lane: queue.lane,\n          tag: queue.tag,\n          payload: queue.payload,\n          callback: null,\n          next: null\n        };\n        null === newLast\n          ? (newFirst = newLast = clone)\n          : (newLast = newLast.next = clone);\n        queue = queue.next;\n      } while (null !== queue);\n      null === newLast\n        ? (newFirst = newLast = capturedUpdate)\n        : (newLast = newLast.next = capturedUpdate);\n    } else newFirst = newLast = capturedUpdate;\n    queue = {\n      baseState: current.baseState,\n      firstBaseUpdate: newFirst,\n      lastBaseUpdate: newLast,\n      shared: current.shared,\n      callbacks: current.callbacks\n    };\n    workInProgress.updateQueue = queue;\n    return;\n  }\n  workInProgress = queue.lastBaseUpdate;\n  null === workInProgress\n    ? (queue.firstBaseUpdate = capturedUpdate)\n    : (workInProgress.next = capturedUpdate);\n  queue.lastBaseUpdate = capturedUpdate;\n}\nvar didReadFromEntangledAsyncAction = !1;\nfunction suspendIfUpdateReadFromEntangledAsyncAction() {\n  if (didReadFromEntangledAsyncAction) {\n    var entangledActionThenable = currentEntangledActionThenable;\n    if (null !== entangledActionThenable) throw entangledActionThenable;\n  }\n}\nfunction processUpdateQueue(\n  workInProgress$jscomp$0,\n  props,\n  instance$jscomp$0,\n  renderLanes\n) {\n  didReadFromEntangledAsyncAction = !1;\n  var queue = workInProgress$jscomp$0.updateQueue;\n  hasForceUpdate = !1;\n  var firstBaseUpdate = queue.firstBaseUpdate,\n    lastBaseUpdate = queue.lastBaseUpdate,\n    pendingQueue = queue.shared.pending;\n  if (null !== pendingQueue) {\n    queue.shared.pending = null;\n    var lastPendingUpdate = pendingQueue,\n      firstPendingUpdate = lastPendingUpdate.next;\n    lastPendingUpdate.next = null;\n    null === lastBaseUpdate\n      ? (firstBaseUpdate = firstPendingUpdate)\n      : (lastBaseUpdate.next = firstPendingUpdate);\n    lastBaseUpdate = lastPendingUpdate;\n    var current = workInProgress$jscomp$0.alternate;\n    null !== current &&\n      ((current = current.updateQueue),\n      (pendingQueue = current.lastBaseUpdate),\n      pendingQueue !== lastBaseUpdate &&\n        (null === pendingQueue\n          ? (current.firstBaseUpdate = firstPendingUpdate)\n          : (pendingQueue.next = firstPendingUpdate),\n        (current.lastBaseUpdate = lastPendingUpdate)));\n  }\n  if (null !== firstBaseUpdate) {\n    var newState = queue.baseState;\n    lastBaseUpdate = 0;\n    current = firstPendingUpdate = lastPendingUpdate = null;\n    pendingQueue = firstBaseUpdate;\n    do {\n      var updateLane = pendingQueue.lane & -536870913,\n        isHiddenUpdate = updateLane !== pendingQueue.lane;\n      if (\n        isHiddenUpdate\n          ? (workInProgressRootRenderLanes & updateLane) === updateLane\n          : (renderLanes & updateLane) === updateLane\n      ) {\n        0 !== updateLane &&\n          updateLane === currentEntangledLane &&\n          (didReadFromEntangledAsyncAction = !0);\n        null !== current &&\n          (current = current.next =\n            {\n              lane: 0,\n              tag: pendingQueue.tag,\n              payload: pendingQueue.payload,\n              callback: null,\n              next: null\n            });\n        a: {\n          var workInProgress = workInProgress$jscomp$0,\n            update = pendingQueue;\n          updateLane = props;\n          var instance = instance$jscomp$0;\n          switch (update.tag) {\n            case 1:\n              workInProgress = update.payload;\n              if (\"function\" === typeof workInProgress) {\n                newState = workInProgress.call(instance, newState, updateLane);\n                break a;\n              }\n              newState = workInProgress;\n              break a;\n            case 3:\n              workInProgress.flags = (workInProgress.flags & -65537) | 128;\n            case 0:\n              workInProgress = update.payload;\n              updateLane =\n                \"function\" === typeof workInProgress\n                  ? workInProgress.call(instance, newState, updateLane)\n                  : workInProgress;\n              if (null === updateLane || void 0 === updateLane) break a;\n              newState = assign({}, newState, updateLane);\n              break a;\n            case 2:\n              hasForceUpdate = !0;\n          }\n        }\n        updateLane = pendingQueue.callback;\n        null !== updateLane &&\n          ((workInProgress$jscomp$0.flags |= 64),\n          isHiddenUpdate && (workInProgress$jscomp$0.flags |= 8192),\n          (isHiddenUpdate = queue.callbacks),\n          null === isHiddenUpdate\n            ? (queue.callbacks = [updateLane])\n            : isHiddenUpdate.push(updateLane));\n      } else\n        (isHiddenUpdate = {\n          lane: updateLane,\n          tag: pendingQueue.tag,\n          payload: pendingQueue.payload,\n          callback: pendingQueue.callback,\n          next: null\n        }),\n          null === current\n            ? ((firstPendingUpdate = current = isHiddenUpdate),\n              (lastPendingUpdate = newState))\n            : (current = current.next = isHiddenUpdate),\n          (lastBaseUpdate |= updateLane);\n      pendingQueue = pendingQueue.next;\n      if (null === pendingQueue)\n        if (((pendingQueue = queue.shared.pending), null === pendingQueue))\n          break;\n        else\n          (isHiddenUpdate = pendingQueue),\n            (pendingQueue = isHiddenUpdate.next),\n            (isHiddenUpdate.next = null),\n            (queue.lastBaseUpdate = isHiddenUpdate),\n            (queue.shared.pending = null);\n    } while (1);\n    null === current && (lastPendingUpdate = newState);\n    queue.baseState = lastPendingUpdate;\n    queue.firstBaseUpdate = firstPendingUpdate;\n    queue.lastBaseUpdate = current;\n    null === firstBaseUpdate && (queue.shared.lanes = 0);\n    workInProgressRootSkippedLanes |= lastBaseUpdate;\n    workInProgress$jscomp$0.lanes = lastBaseUpdate;\n    workInProgress$jscomp$0.memoizedState = newState;\n  }\n}\nfunction callCallback(callback, context) {\n  if (\"function\" !== typeof callback)\n    throw Error(formatProdErrorMessage(191, callback));\n  callback.call(context);\n}\nfunction commitCallbacks(updateQueue, context) {\n  var callbacks = updateQueue.callbacks;\n  if (null !== callbacks)\n    for (\n      updateQueue.callbacks = null, updateQueue = 0;\n      updateQueue < callbacks.length;\n      updateQueue++\n    )\n      callCallback(callbacks[updateQueue], context);\n}\nvar currentTreeHiddenStackCursor = createCursor(null),\n  prevEntangledRenderLanesCursor = createCursor(0);\nfunction pushHiddenContext(fiber, context) {\n  fiber = entangledRenderLanes;\n  push(prevEntangledRenderLanesCursor, fiber);\n  push(currentTreeHiddenStackCursor, context);\n  entangledRenderLanes = fiber | context.baseLanes;\n}\nfunction reuseHiddenContextOnStack() {\n  push(prevEntangledRenderLanesCursor, entangledRenderLanes);\n  push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current);\n}\nfunction popHiddenContext() {\n  entangledRenderLanes = prevEntangledRenderLanesCursor.current;\n  pop(currentTreeHiddenStackCursor);\n  pop(prevEntangledRenderLanesCursor);\n}\nvar renderLanes = 0,\n  currentlyRenderingFiber = null,\n  currentHook = null,\n  workInProgressHook = null,\n  didScheduleRenderPhaseUpdate = !1,\n  didScheduleRenderPhaseUpdateDuringThisPass = !1,\n  shouldDoubleInvokeUserFnsInHooksDEV = !1,\n  localIdCounter = 0,\n  thenableIndexCounter$1 = 0,\n  thenableState$1 = null,\n  globalClientIdCounter = 0;\nfunction throwInvalidHookError() {\n  throw Error(formatProdErrorMessage(321));\n}\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n  if (null === prevDeps) return !1;\n  for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++)\n    if (!objectIs(nextDeps[i], prevDeps[i])) return !1;\n  return !0;\n}\nfunction renderWithHooks(\n  current,\n  workInProgress,\n  Component,\n  props,\n  secondArg,\n  nextRenderLanes\n) {\n  renderLanes = nextRenderLanes;\n  currentlyRenderingFiber = workInProgress;\n  workInProgress.memoizedState = null;\n  workInProgress.updateQueue = null;\n  workInProgress.lanes = 0;\n  ReactSharedInternals.H =\n    null === current || null === current.memoizedState\n      ? HooksDispatcherOnMount\n      : HooksDispatcherOnUpdate;\n  shouldDoubleInvokeUserFnsInHooksDEV = !1;\n  nextRenderLanes = Component(props, secondArg);\n  shouldDoubleInvokeUserFnsInHooksDEV = !1;\n  didScheduleRenderPhaseUpdateDuringThisPass &&\n    (nextRenderLanes = renderWithHooksAgain(\n      workInProgress,\n      Component,\n      props,\n      secondArg\n    ));\n  finishRenderingHooks(current);\n  return nextRenderLanes;\n}\nfunction finishRenderingHooks(current) {\n  ReactSharedInternals.H = ContextOnlyDispatcher;\n  var didRenderTooFewHooks = null !== currentHook && null !== currentHook.next;\n  renderLanes = 0;\n  workInProgressHook = currentHook = currentlyRenderingFiber = null;\n  didScheduleRenderPhaseUpdate = !1;\n  thenableIndexCounter$1 = 0;\n  thenableState$1 = null;\n  if (didRenderTooFewHooks) throw Error(formatProdErrorMessage(300));\n  null === current ||\n    didReceiveUpdate ||\n    ((current = current.dependencies),\n    null !== current &&\n      checkIfContextChanged(current) &&\n      (didReceiveUpdate = !0));\n}\nfunction renderWithHooksAgain(workInProgress, Component, props, secondArg) {\n  currentlyRenderingFiber = workInProgress;\n  var numberOfReRenders = 0;\n  do {\n    didScheduleRenderPhaseUpdateDuringThisPass && (thenableState$1 = null);\n    thenableIndexCounter$1 = 0;\n    didScheduleRenderPhaseUpdateDuringThisPass = !1;\n    if (25 <= numberOfReRenders) throw Error(formatProdErrorMessage(301));\n    numberOfReRenders += 1;\n    workInProgressHook = currentHook = null;\n    if (null != workInProgress.updateQueue) {\n      var children = workInProgress.updateQueue;\n      children.lastEffect = null;\n      children.events = null;\n      children.stores = null;\n      null != children.memoCache && (children.memoCache.index = 0);\n    }\n    ReactSharedInternals.H = HooksDispatcherOnRerender;\n    children = Component(props, secondArg);\n  } while (didScheduleRenderPhaseUpdateDuringThisPass);\n  return children;\n}\nfunction TransitionAwareHostComponent() {\n  var dispatcher = ReactSharedInternals.H,\n    maybeThenable = dispatcher.useState()[0];\n  maybeThenable =\n    \"function\" === typeof maybeThenable.then\n      ? useThenable(maybeThenable)\n      : maybeThenable;\n  dispatcher = dispatcher.useState()[0];\n  (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher &&\n    (currentlyRenderingFiber.flags |= 1024);\n  return maybeThenable;\n}\nfunction checkDidRenderIdHook() {\n  var didRenderIdHook = 0 !== localIdCounter;\n  localIdCounter = 0;\n  return didRenderIdHook;\n}\nfunction bailoutHooks(current, workInProgress, lanes) {\n  workInProgress.updateQueue = current.updateQueue;\n  workInProgress.flags &= -2053;\n  current.lanes &= ~lanes;\n}\nfunction resetHooksOnUnwind(workInProgress) {\n  if (didScheduleRenderPhaseUpdate) {\n    for (\n      workInProgress = workInProgress.memoizedState;\n      null !== workInProgress;\n\n    ) {\n      var queue = workInProgress.queue;\n      null !== queue && (queue.pending = null);\n      workInProgress = workInProgress.next;\n    }\n    didScheduleRenderPhaseUpdate = !1;\n  }\n  renderLanes = 0;\n  workInProgressHook = currentHook = currentlyRenderingFiber = null;\n  didScheduleRenderPhaseUpdateDuringThisPass = !1;\n  thenableIndexCounter$1 = localIdCounter = 0;\n  thenableState$1 = null;\n}\nfunction mountWorkInProgressHook() {\n  var hook = {\n    memoizedState: null,\n    baseState: null,\n    baseQueue: null,\n    queue: null,\n    next: null\n  };\n  null === workInProgressHook\n    ? (currentlyRenderingFiber.memoizedState = workInProgressHook = hook)\n    : (workInProgressHook = workInProgressHook.next = hook);\n  return workInProgressHook;\n}\nfunction updateWorkInProgressHook() {\n  if (null === currentHook) {\n    var nextCurrentHook = currentlyRenderingFiber.alternate;\n    nextCurrentHook =\n      null !== nextCurrentHook ? nextCurrentHook.memoizedState : null;\n  } else nextCurrentHook = currentHook.next;\n  var nextWorkInProgressHook =\n    null === workInProgressHook\n      ? currentlyRenderingFiber.memoizedState\n      : workInProgressHook.next;\n  if (null !== nextWorkInProgressHook)\n    (workInProgressHook = nextWorkInProgressHook),\n      (currentHook = nextCurrentHook);\n  else {\n    if (null === nextCurrentHook) {\n      if (null === currentlyRenderingFiber.alternate)\n        throw Error(formatProdErrorMessage(467));\n      throw Error(formatProdErrorMessage(310));\n    }\n    currentHook = nextCurrentHook;\n    nextCurrentHook = {\n      memoizedState: currentHook.memoizedState,\n      baseState: currentHook.baseState,\n      baseQueue: currentHook.baseQueue,\n      queue: currentHook.queue,\n      next: null\n    };\n    null === workInProgressHook\n      ? (currentlyRenderingFiber.memoizedState = workInProgressHook =\n          nextCurrentHook)\n      : (workInProgressHook = workInProgressHook.next = nextCurrentHook);\n  }\n  return workInProgressHook;\n}\nfunction createFunctionComponentUpdateQueue() {\n  return { lastEffect: null, events: null, stores: null, memoCache: null };\n}\nfunction useThenable(thenable) {\n  var index = thenableIndexCounter$1;\n  thenableIndexCounter$1 += 1;\n  null === thenableState$1 && (thenableState$1 = []);\n  thenable = trackUsedThenable(thenableState$1, thenable, index);\n  index = currentlyRenderingFiber;\n  null ===\n    (null === workInProgressHook\n      ? index.memoizedState\n      : workInProgressHook.next) &&\n    ((index = index.alternate),\n    (ReactSharedInternals.H =\n      null === index || null === index.memoizedState\n        ? HooksDispatcherOnMount\n        : HooksDispatcherOnUpdate));\n  return thenable;\n}\nfunction use(usable) {\n  if (null !== usable && \"object\" === typeof usable) {\n    if (\"function\" === typeof usable.then) return useThenable(usable);\n    if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable);\n  }\n  throw Error(formatProdErrorMessage(438, String(usable)));\n}\nfunction useMemoCache(size) {\n  var memoCache = null,\n    updateQueue = currentlyRenderingFiber.updateQueue;\n  null !== updateQueue && (memoCache = updateQueue.memoCache);\n  if (null == memoCache) {\n    var current = currentlyRenderingFiber.alternate;\n    null !== current &&\n      ((current = current.updateQueue),\n      null !== current &&\n        ((current = current.memoCache),\n        null != current &&\n          (memoCache = {\n            data: current.data.map(function (array) {\n              return array.slice();\n            }),\n            index: 0\n          })));\n  }\n  null == memoCache && (memoCache = { data: [], index: 0 });\n  null === updateQueue &&\n    ((updateQueue = createFunctionComponentUpdateQueue()),\n    (currentlyRenderingFiber.updateQueue = updateQueue));\n  updateQueue.memoCache = memoCache;\n  updateQueue = memoCache.data[memoCache.index];\n  if (void 0 === updateQueue)\n    for (\n      updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0;\n      current < size;\n      current++\n    )\n      updateQueue[current] = REACT_MEMO_CACHE_SENTINEL;\n  memoCache.index++;\n  return updateQueue;\n}\nfunction basicStateReducer(state, action) {\n  return \"function\" === typeof action ? action(state) : action;\n}\nfunction updateReducer(reducer) {\n  var hook = updateWorkInProgressHook();\n  return updateReducerImpl(hook, currentHook, reducer);\n}\nfunction updateReducerImpl(hook, current, reducer) {\n  var queue = hook.queue;\n  if (null === queue) throw Error(formatProdErrorMessage(311));\n  queue.lastRenderedReducer = reducer;\n  var baseQueue = hook.baseQueue,\n    pendingQueue = queue.pending;\n  if (null !== pendingQueue) {\n    if (null !== baseQueue) {\n      var baseFirst = baseQueue.next;\n      baseQueue.next = pendingQueue.next;\n      pendingQueue.next = baseFirst;\n    }\n    current.baseQueue = baseQueue = pendingQueue;\n    queue.pending = null;\n  }\n  pendingQueue = hook.baseState;\n  if (null === baseQueue) hook.memoizedState = pendingQueue;\n  else {\n    current = baseQueue.next;\n    var newBaseQueueFirst = (baseFirst = null),\n      newBaseQueueLast = null,\n      update = current,\n      didReadFromEntangledAsyncAction$32 = !1;\n    do {\n      var updateLane = update.lane & -536870913;\n      if (\n        updateLane !== update.lane\n          ? (workInProgressRootRenderLanes & updateLane) === updateLane\n          : (renderLanes & updateLane) === updateLane\n      ) {\n        var revertLane = update.revertLane;\n        if (0 === revertLane)\n          null !== newBaseQueueLast &&\n            (newBaseQueueLast = newBaseQueueLast.next =\n              {\n                lane: 0,\n                revertLane: 0,\n                action: update.action,\n                hasEagerState: update.hasEagerState,\n                eagerState: update.eagerState,\n                next: null\n              }),\n            updateLane === currentEntangledLane &&\n              (didReadFromEntangledAsyncAction$32 = !0);\n        else if ((renderLanes & revertLane) === revertLane) {\n          update = update.next;\n          revertLane === currentEntangledLane &&\n            (didReadFromEntangledAsyncAction$32 = !0);\n          continue;\n        } else\n          (updateLane = {\n            lane: 0,\n            revertLane: update.revertLane,\n            action: update.action,\n            hasEagerState: update.hasEagerState,\n            eagerState: update.eagerState,\n            next: null\n          }),\n            null === newBaseQueueLast\n              ? ((newBaseQueueFirst = newBaseQueueLast = updateLane),\n                (baseFirst = pendingQueue))\n              : (newBaseQueueLast = newBaseQueueLast.next = updateLane),\n            (currentlyRenderingFiber.lanes |= revertLane),\n            (workInProgressRootSkippedLanes |= revertLane);\n        updateLane = update.action;\n        shouldDoubleInvokeUserFnsInHooksDEV &&\n          reducer(pendingQueue, updateLane);\n        pendingQueue = update.hasEagerState\n          ? update.eagerState\n          : reducer(pendingQueue, updateLane);\n      } else\n        (revertLane = {\n          lane: updateLane,\n          revertLane: update.revertLane,\n          action: update.action,\n          hasEagerState: update.hasEagerState,\n          eagerState: update.eagerState,\n          next: null\n        }),\n          null === newBaseQueueLast\n            ? ((newBaseQueueFirst = newBaseQueueLast = revertLane),\n              (baseFirst = pendingQueue))\n            : (newBaseQueueLast = newBaseQueueLast.next = revertLane),\n          (currentlyRenderingFiber.lanes |= updateLane),\n          (workInProgressRootSkippedLanes |= updateLane);\n      update = update.next;\n    } while (null !== update && update !== current);\n    null === newBaseQueueLast\n      ? (baseFirst = pendingQueue)\n      : (newBaseQueueLast.next = newBaseQueueFirst);\n    if (\n      !objectIs(pendingQueue, hook.memoizedState) &&\n      ((didReceiveUpdate = !0),\n      didReadFromEntangledAsyncAction$32 &&\n        ((reducer = currentEntangledActionThenable), null !== reducer))\n    )\n      throw reducer;\n    hook.memoizedState = pendingQueue;\n    hook.baseState = baseFirst;\n    hook.baseQueue = newBaseQueueLast;\n    queue.lastRenderedState = pendingQueue;\n  }\n  null === baseQueue && (queue.lanes = 0);\n  return [hook.memoizedState, queue.dispatch];\n}\nfunction rerenderReducer(reducer) {\n  var hook = updateWorkInProgressHook(),\n    queue = hook.queue;\n  if (null === queue) throw Error(formatProdErrorMessage(311));\n  queue.lastRenderedReducer = reducer;\n  var dispatch = queue.dispatch,\n    lastRenderPhaseUpdate = queue.pending,\n    newState = hook.memoizedState;\n  if (null !== lastRenderPhaseUpdate) {\n    queue.pending = null;\n    var update = (lastRenderPhaseUpdate = lastRenderPhaseUpdate.next);\n    do (newState = reducer(newState, update.action)), (update = update.next);\n    while (update !== lastRenderPhaseUpdate);\n    objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0);\n    hook.memoizedState = newState;\n    null === hook.baseQueue && (hook.baseState = newState);\n    queue.lastRenderedState = newState;\n  }\n  return [newState, dispatch];\n}\nfunction updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {\n  var fiber = currentlyRenderingFiber,\n    hook = updateWorkInProgressHook(),\n    isHydrating$jscomp$0 = isHydrating;\n  if (isHydrating$jscomp$0) {\n    if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407));\n    getServerSnapshot = getServerSnapshot();\n  } else getServerSnapshot = getSnapshot();\n  var snapshotChanged = !objectIs(\n    (currentHook || hook).memoizedState,\n    getServerSnapshot\n  );\n  snapshotChanged &&\n    ((hook.memoizedState = getServerSnapshot), (didReceiveUpdate = !0));\n  hook = hook.queue;\n  var create = subscribeToStore.bind(null, fiber, hook, subscribe);\n  updateEffectImpl(2048, 8, create, [subscribe]);\n  if (\n    hook.getSnapshot !== getSnapshot ||\n    snapshotChanged ||\n    (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1)\n  ) {\n    fiber.flags |= 2048;\n    pushSimpleEffect(\n      9,\n      createEffectInstance(),\n      updateStoreInstance.bind(\n        null,\n        fiber,\n        hook,\n        getServerSnapshot,\n        getSnapshot\n      ),\n      null\n    );\n    if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349));\n    isHydrating$jscomp$0 ||\n      0 !== (renderLanes & 124) ||\n      pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n  }\n  return getServerSnapshot;\n}\nfunction pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {\n  fiber.flags |= 16384;\n  fiber = { getSnapshot: getSnapshot, value: renderedSnapshot };\n  getSnapshot = currentlyRenderingFiber.updateQueue;\n  null === getSnapshot\n    ? ((getSnapshot = createFunctionComponentUpdateQueue()),\n      (currentlyRenderingFiber.updateQueue = getSnapshot),\n      (getSnapshot.stores = [fiber]))\n    : ((renderedSnapshot = getSnapshot.stores),\n      null === renderedSnapshot\n        ? (getSnapshot.stores = [fiber])\n        : renderedSnapshot.push(fiber));\n}\nfunction updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {\n  inst.value = nextSnapshot;\n  inst.getSnapshot = getSnapshot;\n  checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n}\nfunction subscribeToStore(fiber, inst, subscribe) {\n  return subscribe(function () {\n    checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n  });\n}\nfunction checkIfSnapshotChanged(inst) {\n  var latestGetSnapshot = inst.getSnapshot;\n  inst = inst.value;\n  try {\n    var nextValue = latestGetSnapshot();\n    return !objectIs(inst, nextValue);\n  } catch (error) {\n    return !0;\n  }\n}\nfunction forceStoreRerender(fiber) {\n  var root = enqueueConcurrentRenderForLane(fiber, 2);\n  null !== root && scheduleUpdateOnFiber(root, fiber, 2);\n}\nfunction mountStateImpl(initialState) {\n  var hook = mountWorkInProgressHook();\n  if (\"function\" === typeof initialState) {\n    var initialStateInitializer = initialState;\n    initialState = initialStateInitializer();\n    if (shouldDoubleInvokeUserFnsInHooksDEV) {\n      setIsStrictModeForDevtools(!0);\n      try {\n        initialStateInitializer();\n      } finally {\n        setIsStrictModeForDevtools(!1);\n      }\n    }\n  }\n  hook.memoizedState = hook.baseState = initialState;\n  hook.queue = {\n    pending: null,\n    lanes: 0,\n    dispatch: null,\n    lastRenderedReducer: basicStateReducer,\n    lastRenderedState: initialState\n  };\n  return hook;\n}\nfunction updateOptimisticImpl(hook, current, passthrough, reducer) {\n  hook.baseState = passthrough;\n  return updateReducerImpl(\n    hook,\n    currentHook,\n    \"function\" === typeof reducer ? reducer : basicStateReducer\n  );\n}\nfunction dispatchActionState(\n  fiber,\n  actionQueue,\n  setPendingState,\n  setState,\n  payload\n) {\n  if (isRenderPhaseUpdate(fiber)) throw Error(formatProdErrorMessage(485));\n  fiber = actionQueue.action;\n  if (null !== fiber) {\n    var actionNode = {\n      payload: payload,\n      action: fiber,\n      next: null,\n      isTransition: !0,\n      status: \"pending\",\n      value: null,\n      reason: null,\n      listeners: [],\n      then: function (listener) {\n        actionNode.listeners.push(listener);\n      }\n    };\n    null !== ReactSharedInternals.T\n      ? setPendingState(!0)\n      : (actionNode.isTransition = !1);\n    setState(actionNode);\n    setPendingState = actionQueue.pending;\n    null === setPendingState\n      ? ((actionNode.next = actionQueue.pending = actionNode),\n        runActionStateAction(actionQueue, actionNode))\n      : ((actionNode.next = setPendingState.next),\n        (actionQueue.pending = setPendingState.next = actionNode));\n  }\n}\nfunction runActionStateAction(actionQueue, node) {\n  var action = node.action,\n    payload = node.payload,\n    prevState = actionQueue.state;\n  if (node.isTransition) {\n    var prevTransition = ReactSharedInternals.T,\n      currentTransition = {};\n    ReactSharedInternals.T = currentTransition;\n    try {\n      var returnValue = action(prevState, payload),\n        onStartTransitionFinish = ReactSharedInternals.S;\n      null !== onStartTransitionFinish &&\n        onStartTransitionFinish(currentTransition, returnValue);\n      handleActionReturnValue(actionQueue, node, returnValue);\n    } catch (error) {\n      onActionError(actionQueue, node, error);\n    } finally {\n      ReactSharedInternals.T = prevTransition;\n    }\n  } else\n    try {\n      (prevTransition = action(prevState, payload)),\n        handleActionReturnValue(actionQueue, node, prevTransition);\n    } catch (error$38) {\n      onActionError(actionQueue, node, error$38);\n    }\n}\nfunction handleActionReturnValue(actionQueue, node, returnValue) {\n  null !== returnValue &&\n  \"object\" === typeof returnValue &&\n  \"function\" === typeof returnValue.then\n    ? returnValue.then(\n        function (nextState) {\n          onActionSuccess(actionQueue, node, nextState);\n        },\n        function (error) {\n          return onActionError(actionQueue, node, error);\n        }\n      )\n    : onActionSuccess(actionQueue, node, returnValue);\n}\nfunction onActionSuccess(actionQueue, actionNode, nextState) {\n  actionNode.status = \"fulfilled\";\n  actionNode.value = nextState;\n  notifyActionListeners(actionNode);\n  actionQueue.state = nextState;\n  actionNode = actionQueue.pending;\n  null !== actionNode &&\n    ((nextState = actionNode.next),\n    nextState === actionNode\n      ? (actionQueue.pending = null)\n      : ((nextState = nextState.next),\n        (actionNode.next = nextState),\n        runActionStateAction(actionQueue, nextState)));\n}\nfunction onActionError(actionQueue, actionNode, error) {\n  var last = actionQueue.pending;\n  actionQueue.pending = null;\n  if (null !== last) {\n    last = last.next;\n    do\n      (actionNode.status = \"rejected\"),\n        (actionNode.reason = error),\n        notifyActionListeners(actionNode),\n        (actionNode = actionNode.next);\n    while (actionNode !== last);\n  }\n  actionQueue.action = null;\n}\nfunction notifyActionListeners(actionNode) {\n  actionNode = actionNode.listeners;\n  for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])();\n}\nfunction actionStateReducer(oldState, newState) {\n  return newState;\n}\nfunction mountActionState(action, initialStateProp) {\n  if (isHydrating) {\n    var ssrFormState = workInProgressRoot.formState;\n    if (null !== ssrFormState) {\n      a: {\n        var JSCompiler_inline_result = currentlyRenderingFiber;\n        if (isHydrating) {\n          if (nextHydratableInstance) {\n            b: {\n              var JSCompiler_inline_result$jscomp$0 = nextHydratableInstance;\n              for (\n                var inRootOrSingleton = rootOrSingletonContext;\n                8 !== JSCompiler_inline_result$jscomp$0.nodeType;\n\n              ) {\n                if (!inRootOrSingleton) {\n                  JSCompiler_inline_result$jscomp$0 = null;\n                  break b;\n                }\n                JSCompiler_inline_result$jscomp$0 = getNextHydratable(\n                  JSCompiler_inline_result$jscomp$0.nextSibling\n                );\n                if (null === JSCompiler_inline_result$jscomp$0) {\n                  JSCompiler_inline_result$jscomp$0 = null;\n                  break b;\n                }\n              }\n              inRootOrSingleton = JSCompiler_inline_result$jscomp$0.data;\n              JSCompiler_inline_result$jscomp$0 =\n                \"F!\" === inRootOrSingleton || \"F\" === inRootOrSingleton\n                  ? JSCompiler_inline_result$jscomp$0\n                  : null;\n            }\n            if (JSCompiler_inline_result$jscomp$0) {\n              nextHydratableInstance = getNextHydratable(\n                JSCompiler_inline_result$jscomp$0.nextSibling\n              );\n              JSCompiler_inline_result =\n                \"F!\" === JSCompiler_inline_result$jscomp$0.data;\n              break a;\n            }\n          }\n          throwOnHydrationMismatch(JSCompiler_inline_result);\n        }\n        JSCompiler_inline_result = !1;\n      }\n      JSCompiler_inline_result && (initialStateProp = ssrFormState[0]);\n    }\n  }\n  ssrFormState = mountWorkInProgressHook();\n  ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp;\n  JSCompiler_inline_result = {\n    pending: null,\n    lanes: 0,\n    dispatch: null,\n    lastRenderedReducer: actionStateReducer,\n    lastRenderedState: initialStateProp\n  };\n  ssrFormState.queue = JSCompiler_inline_result;\n  ssrFormState = dispatchSetState.bind(\n    null,\n    currentlyRenderingFiber,\n    JSCompiler_inline_result\n  );\n  JSCompiler_inline_result.dispatch = ssrFormState;\n  JSCompiler_inline_result = mountStateImpl(!1);\n  inRootOrSingleton = dispatchOptimisticSetState.bind(\n    null,\n    currentlyRenderingFiber,\n    !1,\n    JSCompiler_inline_result.queue\n  );\n  JSCompiler_inline_result = mountWorkInProgressHook();\n  JSCompiler_inline_result$jscomp$0 = {\n    state: initialStateProp,\n    dispatch: null,\n    action: action,\n    pending: null\n  };\n  JSCompiler_inline_result.queue = JSCompiler_inline_result$jscomp$0;\n  ssrFormState = dispatchActionState.bind(\n    null,\n    currentlyRenderingFiber,\n    JSCompiler_inline_result$jscomp$0,\n    inRootOrSingleton,\n    ssrFormState\n  );\n  JSCompiler_inline_result$jscomp$0.dispatch = ssrFormState;\n  JSCompiler_inline_result.memoizedState = action;\n  return [initialStateProp, ssrFormState, !1];\n}\nfunction updateActionState(action) {\n  var stateHook = updateWorkInProgressHook();\n  return updateActionStateImpl(stateHook, currentHook, action);\n}\nfunction updateActionStateImpl(stateHook, currentStateHook, action) {\n  currentStateHook = updateReducerImpl(\n    stateHook,\n    currentStateHook,\n    actionStateReducer\n  )[0];\n  stateHook = updateReducer(basicStateReducer)[0];\n  if (\n    \"object\" === typeof currentStateHook &&\n    null !== currentStateHook &&\n    \"function\" === typeof currentStateHook.then\n  )\n    try {\n      var state = useThenable(currentStateHook);\n    } catch (x) {\n      if (x === SuspenseException) throw SuspenseActionException;\n      throw x;\n    }\n  else state = currentStateHook;\n  currentStateHook = updateWorkInProgressHook();\n  var actionQueue = currentStateHook.queue,\n    dispatch = actionQueue.dispatch;\n  action !== currentStateHook.memoizedState &&\n    ((currentlyRenderingFiber.flags |= 2048),\n    pushSimpleEffect(\n      9,\n      createEffectInstance(),\n      actionStateActionEffect.bind(null, actionQueue, action),\n      null\n    ));\n  return [state, dispatch, stateHook];\n}\nfunction actionStateActionEffect(actionQueue, action) {\n  actionQueue.action = action;\n}\nfunction rerenderActionState(action) {\n  var stateHook = updateWorkInProgressHook(),\n    currentStateHook = currentHook;\n  if (null !== currentStateHook)\n    return updateActionStateImpl(stateHook, currentStateHook, action);\n  updateWorkInProgressHook();\n  stateHook = stateHook.memoizedState;\n  currentStateHook = updateWorkInProgressHook();\n  var dispatch = currentStateHook.queue.dispatch;\n  currentStateHook.memoizedState = action;\n  return [stateHook, dispatch, !1];\n}\nfunction pushSimpleEffect(tag, inst, create, createDeps) {\n  tag = { tag: tag, create: create, deps: createDeps, inst: inst, next: null };\n  inst = currentlyRenderingFiber.updateQueue;\n  null === inst &&\n    ((inst = createFunctionComponentUpdateQueue()),\n    (currentlyRenderingFiber.updateQueue = inst));\n  create = inst.lastEffect;\n  null === create\n    ? (inst.lastEffect = tag.next = tag)\n    : ((createDeps = create.next),\n      (create.next = tag),\n      (tag.next = createDeps),\n      (inst.lastEffect = tag));\n  return tag;\n}\nfunction createEffectInstance() {\n  return { destroy: void 0, resource: void 0 };\n}\nfunction updateRef() {\n  return updateWorkInProgressHook().memoizedState;\n}\nfunction mountEffectImpl(fiberFlags, hookFlags, create, createDeps) {\n  var hook = mountWorkInProgressHook();\n  createDeps = void 0 === createDeps ? null : createDeps;\n  currentlyRenderingFiber.flags |= fiberFlags;\n  hook.memoizedState = pushSimpleEffect(\n    1 | hookFlags,\n    createEffectInstance(),\n    create,\n    createDeps\n  );\n}\nfunction updateEffectImpl(fiberFlags, hookFlags, create, deps) {\n  var hook = updateWorkInProgressHook();\n  deps = void 0 === deps ? null : deps;\n  var inst = hook.memoizedState.inst;\n  null !== currentHook &&\n  null !== deps &&\n  areHookInputsEqual(deps, currentHook.memoizedState.deps)\n    ? (hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps))\n    : ((currentlyRenderingFiber.flags |= fiberFlags),\n      (hook.memoizedState = pushSimpleEffect(\n        1 | hookFlags,\n        inst,\n        create,\n        deps\n      )));\n}\nfunction mountEffect(create, createDeps) {\n  mountEffectImpl(8390656, 8, create, createDeps);\n}\nfunction updateEffect(create, createDeps) {\n  updateEffectImpl(2048, 8, create, createDeps);\n}\nfunction updateInsertionEffect(create, deps) {\n  return updateEffectImpl(4, 2, create, deps);\n}\nfunction updateLayoutEffect(create, deps) {\n  return updateEffectImpl(4, 4, create, deps);\n}\nfunction imperativeHandleEffect(create, ref) {\n  if (\"function\" === typeof ref) {\n    create = create();\n    var refCleanup = ref(create);\n    return function () {\n      \"function\" === typeof refCleanup ? refCleanup() : ref(null);\n    };\n  }\n  if (null !== ref && void 0 !== ref)\n    return (\n      (create = create()),\n      (ref.current = create),\n      function () {\n        ref.current = null;\n      }\n    );\n}\nfunction updateImperativeHandle(ref, create, deps) {\n  deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n  updateEffectImpl(4, 4, imperativeHandleEffect.bind(null, create, ref), deps);\n}\nfunction mountDebugValue() {}\nfunction updateCallback(callback, deps) {\n  var hook = updateWorkInProgressHook();\n  deps = void 0 === deps ? null : deps;\n  var prevState = hook.memoizedState;\n  if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n    return prevState[0];\n  hook.memoizedState = [callback, deps];\n  return callback;\n}\nfunction updateMemo(nextCreate, deps) {\n  var hook = updateWorkInProgressHook();\n  deps = void 0 === deps ? null : deps;\n  var prevState = hook.memoizedState;\n  if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n    return prevState[0];\n  prevState = nextCreate();\n  if (shouldDoubleInvokeUserFnsInHooksDEV) {\n    setIsStrictModeForDevtools(!0);\n    try {\n      nextCreate();\n    } finally {\n      setIsStrictModeForDevtools(!1);\n    }\n  }\n  hook.memoizedState = [prevState, deps];\n  return prevState;\n}\nfunction mountDeferredValueImpl(hook, value, initialValue) {\n  if (void 0 === initialValue || 0 !== (renderLanes & 1073741824))\n    return (hook.memoizedState = value);\n  hook.memoizedState = initialValue;\n  hook = requestDeferredLane();\n  currentlyRenderingFiber.lanes |= hook;\n  workInProgressRootSkippedLanes |= hook;\n  return initialValue;\n}\nfunction updateDeferredValueImpl(hook, prevValue, value, initialValue) {\n  if (objectIs(value, prevValue)) return value;\n  if (null !== currentTreeHiddenStackCursor.current)\n    return (\n      (hook = mountDeferredValueImpl(hook, value, initialValue)),\n      objectIs(hook, prevValue) || (didReceiveUpdate = !0),\n      hook\n    );\n  if (0 === (renderLanes & 42))\n    return (didReceiveUpdate = !0), (hook.memoizedState = value);\n  hook = requestDeferredLane();\n  currentlyRenderingFiber.lanes |= hook;\n  workInProgressRootSkippedLanes |= hook;\n  return prevValue;\n}\nfunction startTransition(fiber, queue, pendingState, finishedState, callback) {\n  var previousPriority = ReactDOMSharedInternals.p;\n  ReactDOMSharedInternals.p =\n    0 !== previousPriority && 8 > previousPriority ? previousPriority : 8;\n  var prevTransition = ReactSharedInternals.T,\n    currentTransition = {};\n  ReactSharedInternals.T = currentTransition;\n  dispatchOptimisticSetState(fiber, !1, queue, pendingState);\n  try {\n    var returnValue = callback(),\n      onStartTransitionFinish = ReactSharedInternals.S;\n    null !== onStartTransitionFinish &&\n      onStartTransitionFinish(currentTransition, returnValue);\n    if (\n      null !== returnValue &&\n      \"object\" === typeof returnValue &&\n      \"function\" === typeof returnValue.then\n    ) {\n      var thenableForFinishedState = chainThenableValue(\n        returnValue,\n        finishedState\n      );\n      dispatchSetStateInternal(\n        fiber,\n        queue,\n        thenableForFinishedState,\n        requestUpdateLane(fiber)\n      );\n    } else\n      dispatchSetStateInternal(\n        fiber,\n        queue,\n        finishedState,\n        requestUpdateLane(fiber)\n      );\n  } catch (error) {\n    dispatchSetStateInternal(\n      fiber,\n      queue,\n      { then: function () {}, status: \"rejected\", reason: error },\n      requestUpdateLane()\n    );\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition);\n  }\n}\nfunction noop$2() {}\nfunction startHostTransition(formFiber, pendingState, action, formData) {\n  if (5 !== formFiber.tag) throw Error(formatProdErrorMessage(476));\n  var queue = ensureFormComponentIsStateful(formFiber).queue;\n  startTransition(\n    formFiber,\n    queue,\n    pendingState,\n    sharedNotPendingObject,\n    null === action\n      ? noop$2\n      : function () {\n          requestFormReset$1(formFiber);\n          return action(formData);\n        }\n  );\n}\nfunction ensureFormComponentIsStateful(formFiber) {\n  var existingStateHook = formFiber.memoizedState;\n  if (null !== existingStateHook) return existingStateHook;\n  existingStateHook = {\n    memoizedState: sharedNotPendingObject,\n    baseState: sharedNotPendingObject,\n    baseQueue: null,\n    queue: {\n      pending: null,\n      lanes: 0,\n      dispatch: null,\n      lastRenderedReducer: basicStateReducer,\n      lastRenderedState: sharedNotPendingObject\n    },\n    next: null\n  };\n  var initialResetState = {};\n  existingStateHook.next = {\n    memoizedState: initialResetState,\n    baseState: initialResetState,\n    baseQueue: null,\n    queue: {\n      pending: null,\n      lanes: 0,\n      dispatch: null,\n      lastRenderedReducer: basicStateReducer,\n      lastRenderedState: initialResetState\n    },\n    next: null\n  };\n  formFiber.memoizedState = existingStateHook;\n  formFiber = formFiber.alternate;\n  null !== formFiber && (formFiber.memoizedState = existingStateHook);\n  return existingStateHook;\n}\nfunction requestFormReset$1(formFiber) {\n  var resetStateQueue = ensureFormComponentIsStateful(formFiber).next.queue;\n  dispatchSetStateInternal(formFiber, resetStateQueue, {}, requestUpdateLane());\n}\nfunction useHostTransitionStatus() {\n  return readContext(HostTransitionContext);\n}\nfunction updateId() {\n  return updateWorkInProgressHook().memoizedState;\n}\nfunction updateRefresh() {\n  return updateWorkInProgressHook().memoizedState;\n}\nfunction refreshCache(fiber) {\n  for (var provider = fiber.return; null !== provider; ) {\n    switch (provider.tag) {\n      case 24:\n      case 3:\n        var lane = requestUpdateLane();\n        fiber = createUpdate(lane);\n        var root$41 = enqueueUpdate(provider, fiber, lane);\n        null !== root$41 &&\n          (scheduleUpdateOnFiber(root$41, provider, lane),\n          entangleTransitions(root$41, provider, lane));\n        provider = { cache: createCache() };\n        fiber.payload = provider;\n        return;\n    }\n    provider = provider.return;\n  }\n}\nfunction dispatchReducerAction(fiber, queue, action) {\n  var lane = requestUpdateLane();\n  action = {\n    lane: lane,\n    revertLane: 0,\n    action: action,\n    hasEagerState: !1,\n    eagerState: null,\n    next: null\n  };\n  isRenderPhaseUpdate(fiber)\n    ? enqueueRenderPhaseUpdate(queue, action)\n    : ((action = enqueueConcurrentHookUpdate(fiber, queue, action, lane)),\n      null !== action &&\n        (scheduleUpdateOnFiber(action, fiber, lane),\n        entangleTransitionUpdate(action, queue, lane)));\n}\nfunction dispatchSetState(fiber, queue, action) {\n  var lane = requestUpdateLane();\n  dispatchSetStateInternal(fiber, queue, action, lane);\n}\nfunction dispatchSetStateInternal(fiber, queue, action, lane) {\n  var update = {\n    lane: lane,\n    revertLane: 0,\n    action: action,\n    hasEagerState: !1,\n    eagerState: null,\n    next: null\n  };\n  if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update);\n  else {\n    var alternate = fiber.alternate;\n    if (\n      0 === fiber.lanes &&\n      (null === alternate || 0 === alternate.lanes) &&\n      ((alternate = queue.lastRenderedReducer), null !== alternate)\n    )\n      try {\n        var currentState = queue.lastRenderedState,\n          eagerState = alternate(currentState, action);\n        update.hasEagerState = !0;\n        update.eagerState = eagerState;\n        if (objectIs(eagerState, currentState))\n          return (\n            enqueueUpdate$1(fiber, queue, update, 0),\n            null === workInProgressRoot && finishQueueingConcurrentUpdates(),\n            !1\n          );\n      } catch (error) {\n      } finally {\n      }\n    action = enqueueConcurrentHookUpdate(fiber, queue, update, lane);\n    if (null !== action)\n      return (\n        scheduleUpdateOnFiber(action, fiber, lane),\n        entangleTransitionUpdate(action, queue, lane),\n        !0\n      );\n  }\n  return !1;\n}\nfunction dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) {\n  action = {\n    lane: 2,\n    revertLane: requestTransitionLane(),\n    action: action,\n    hasEagerState: !1,\n    eagerState: null,\n    next: null\n  };\n  if (isRenderPhaseUpdate(fiber)) {\n    if (throwIfDuringRender) throw Error(formatProdErrorMessage(479));\n  } else\n    (throwIfDuringRender = enqueueConcurrentHookUpdate(\n      fiber,\n      queue,\n      action,\n      2\n    )),\n      null !== throwIfDuringRender &&\n        scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2);\n}\nfunction isRenderPhaseUpdate(fiber) {\n  var alternate = fiber.alternate;\n  return (\n    fiber === currentlyRenderingFiber ||\n    (null !== alternate && alternate === currentlyRenderingFiber)\n  );\n}\nfunction enqueueRenderPhaseUpdate(queue, update) {\n  didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate =\n    !0;\n  var pending = queue.pending;\n  null === pending\n    ? (update.next = update)\n    : ((update.next = pending.next), (pending.next = update));\n  queue.pending = update;\n}\nfunction entangleTransitionUpdate(root, queue, lane) {\n  if (0 !== (lane & 4194048)) {\n    var queueLanes = queue.lanes;\n    queueLanes &= root.pendingLanes;\n    lane |= queueLanes;\n    queue.lanes = lane;\n    markRootEntangled(root, lane);\n  }\n}\nvar ContextOnlyDispatcher = {\n    readContext: readContext,\n    use: use,\n    useCallback: throwInvalidHookError,\n    useContext: throwInvalidHookError,\n    useEffect: throwInvalidHookError,\n    useImperativeHandle: throwInvalidHookError,\n    useLayoutEffect: throwInvalidHookError,\n    useInsertionEffect: throwInvalidHookError,\n    useMemo: throwInvalidHookError,\n    useReducer: throwInvalidHookError,\n    useRef: throwInvalidHookError,\n    useState: throwInvalidHookError,\n    useDebugValue: throwInvalidHookError,\n    useDeferredValue: throwInvalidHookError,\n    useTransition: throwInvalidHookError,\n    useSyncExternalStore: throwInvalidHookError,\n    useId: throwInvalidHookError,\n    useHostTransitionStatus: throwInvalidHookError,\n    useFormState: throwInvalidHookError,\n    useActionState: throwInvalidHookError,\n    useOptimistic: throwInvalidHookError,\n    useMemoCache: throwInvalidHookError,\n    useCacheRefresh: throwInvalidHookError\n  },\n  HooksDispatcherOnMount = {\n    readContext: readContext,\n    use: use,\n    useCallback: function (callback, deps) {\n      mountWorkInProgressHook().memoizedState = [\n        callback,\n        void 0 === deps ? null : deps\n      ];\n      return callback;\n    },\n    useContext: readContext,\n    useEffect: mountEffect,\n    useImperativeHandle: function (ref, create, deps) {\n      deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n      mountEffectImpl(\n        4194308,\n        4,\n        imperativeHandleEffect.bind(null, create, ref),\n        deps\n      );\n    },\n    useLayoutEffect: function (create, deps) {\n      return mountEffectImpl(4194308, 4, create, deps);\n    },\n    useInsertionEffect: function (create, deps) {\n      mountEffectImpl(4, 2, create, deps);\n    },\n    useMemo: function (nextCreate, deps) {\n      var hook = mountWorkInProgressHook();\n      deps = void 0 === deps ? null : deps;\n      var nextValue = nextCreate();\n      if (shouldDoubleInvokeUserFnsInHooksDEV) {\n        setIsStrictModeForDevtools(!0);\n        try {\n          nextCreate();\n        } finally {\n          setIsStrictModeForDevtools(!1);\n        }\n      }\n      hook.memoizedState = [nextValue, deps];\n      return nextValue;\n    },\n    useReducer: function (reducer, initialArg, init) {\n      var hook = mountWorkInProgressHook();\n      if (void 0 !== init) {\n        var initialState = init(initialArg);\n        if (shouldDoubleInvokeUserFnsInHooksDEV) {\n          setIsStrictModeForDevtools(!0);\n          try {\n            init(initialArg);\n          } finally {\n            setIsStrictModeForDevtools(!1);\n          }\n        }\n      } else initialState = initialArg;\n      hook.memoizedState = hook.baseState = initialState;\n      reducer = {\n        pending: null,\n        lanes: 0,\n        dispatch: null,\n        lastRenderedReducer: reducer,\n        lastRenderedState: initialState\n      };\n      hook.queue = reducer;\n      reducer = reducer.dispatch = dispatchReducerAction.bind(\n        null,\n        currentlyRenderingFiber,\n        reducer\n      );\n      return [hook.memoizedState, reducer];\n    },\n    useRef: function (initialValue) {\n      var hook = mountWorkInProgressHook();\n      initialValue = { current: initialValue };\n      return (hook.memoizedState = initialValue);\n    },\n    useState: function (initialState) {\n      initialState = mountStateImpl(initialState);\n      var queue = initialState.queue,\n        dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue);\n      queue.dispatch = dispatch;\n      return [initialState.memoizedState, dispatch];\n    },\n    useDebugValue: mountDebugValue,\n    useDeferredValue: function (value, initialValue) {\n      var hook = mountWorkInProgressHook();\n      return mountDeferredValueImpl(hook, value, initialValue);\n    },\n    useTransition: function () {\n      var stateHook = mountStateImpl(!1);\n      stateHook = startTransition.bind(\n        null,\n        currentlyRenderingFiber,\n        stateHook.queue,\n        !0,\n        !1\n      );\n      mountWorkInProgressHook().memoizedState = stateHook;\n      return [!1, stateHook];\n    },\n    useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {\n      var fiber = currentlyRenderingFiber,\n        hook = mountWorkInProgressHook();\n      if (isHydrating) {\n        if (void 0 === getServerSnapshot)\n          throw Error(formatProdErrorMessage(407));\n        getServerSnapshot = getServerSnapshot();\n      } else {\n        getServerSnapshot = getSnapshot();\n        if (null === workInProgressRoot)\n          throw Error(formatProdErrorMessage(349));\n        0 !== (workInProgressRootRenderLanes & 124) ||\n          pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n      }\n      hook.memoizedState = getServerSnapshot;\n      var inst = { value: getServerSnapshot, getSnapshot: getSnapshot };\n      hook.queue = inst;\n      mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [\n        subscribe\n      ]);\n      fiber.flags |= 2048;\n      pushSimpleEffect(\n        9,\n        createEffectInstance(),\n        updateStoreInstance.bind(\n          null,\n          fiber,\n          inst,\n          getServerSnapshot,\n          getSnapshot\n        ),\n        null\n      );\n      return getServerSnapshot;\n    },\n    useId: function () {\n      var hook = mountWorkInProgressHook(),\n        identifierPrefix = workInProgressRoot.identifierPrefix;\n      if (isHydrating) {\n        var JSCompiler_inline_result = treeContextOverflow;\n        var idWithLeadingBit = treeContextId;\n        JSCompiler_inline_result =\n          (\n            idWithLeadingBit & ~(1 << (32 - clz32(idWithLeadingBit) - 1))\n          ).toString(32) + JSCompiler_inline_result;\n        identifierPrefix =\n          \"\\u00ab\" + identifierPrefix + \"R\" + JSCompiler_inline_result;\n        JSCompiler_inline_result = localIdCounter++;\n        0 < JSCompiler_inline_result &&\n          (identifierPrefix += \"H\" + JSCompiler_inline_result.toString(32));\n        identifierPrefix += \"\\u00bb\";\n      } else\n        (JSCompiler_inline_result = globalClientIdCounter++),\n          (identifierPrefix =\n            \"\\u00ab\" +\n            identifierPrefix +\n            \"r\" +\n            JSCompiler_inline_result.toString(32) +\n            \"\\u00bb\");\n      return (hook.memoizedState = identifierPrefix);\n    },\n    useHostTransitionStatus: useHostTransitionStatus,\n    useFormState: mountActionState,\n    useActionState: mountActionState,\n    useOptimistic: function (passthrough) {\n      var hook = mountWorkInProgressHook();\n      hook.memoizedState = hook.baseState = passthrough;\n      var queue = {\n        pending: null,\n        lanes: 0,\n        dispatch: null,\n        lastRenderedReducer: null,\n        lastRenderedState: null\n      };\n      hook.queue = queue;\n      hook = dispatchOptimisticSetState.bind(\n        null,\n        currentlyRenderingFiber,\n        !0,\n        queue\n      );\n      queue.dispatch = hook;\n      return [passthrough, hook];\n    },\n    useMemoCache: useMemoCache,\n    useCacheRefresh: function () {\n      return (mountWorkInProgressHook().memoizedState = refreshCache.bind(\n        null,\n        currentlyRenderingFiber\n      ));\n    }\n  },\n  HooksDispatcherOnUpdate = {\n    readContext: readContext,\n    use: use,\n    useCallback: updateCallback,\n    useContext: readContext,\n    useEffect: updateEffect,\n    useImperativeHandle: updateImperativeHandle,\n    useInsertionEffect: updateInsertionEffect,\n    useLayoutEffect: updateLayoutEffect,\n    useMemo: updateMemo,\n    useReducer: updateReducer,\n    useRef: updateRef,\n    useState: function () {\n      return updateReducer(basicStateReducer);\n    },\n    useDebugValue: mountDebugValue,\n    useDeferredValue: function (value, initialValue) {\n      var hook = updateWorkInProgressHook();\n      return updateDeferredValueImpl(\n        hook,\n        currentHook.memoizedState,\n        value,\n        initialValue\n      );\n    },\n    useTransition: function () {\n      var booleanOrThenable = updateReducer(basicStateReducer)[0],\n        start = updateWorkInProgressHook().memoizedState;\n      return [\n        \"boolean\" === typeof booleanOrThenable\n          ? booleanOrThenable\n          : useThenable(booleanOrThenable),\n        start\n      ];\n    },\n    useSyncExternalStore: updateSyncExternalStore,\n    useId: updateId,\n    useHostTransitionStatus: useHostTransitionStatus,\n    useFormState: updateActionState,\n    useActionState: updateActionState,\n    useOptimistic: function (passthrough, reducer) {\n      var hook = updateWorkInProgressHook();\n      return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n    },\n    useMemoCache: useMemoCache,\n    useCacheRefresh: updateRefresh\n  },\n  HooksDispatcherOnRerender = {\n    readContext: readContext,\n    use: use,\n    useCallback: updateCallback,\n    useContext: readContext,\n    useEffect: updateEffect,\n    useImperativeHandle: updateImperativeHandle,\n    useInsertionEffect: updateInsertionEffect,\n    useLayoutEffect: updateLayoutEffect,\n    useMemo: updateMemo,\n    useReducer: rerenderReducer,\n    useRef: updateRef,\n    useState: function () {\n      return rerenderReducer(basicStateReducer);\n    },\n    useDebugValue: mountDebugValue,\n    useDeferredValue: function (value, initialValue) {\n      var hook = updateWorkInProgressHook();\n      return null === currentHook\n        ? mountDeferredValueImpl(hook, value, initialValue)\n        : updateDeferredValueImpl(\n            hook,\n            currentHook.memoizedState,\n            value,\n            initialValue\n          );\n    },\n    useTransition: function () {\n      var booleanOrThenable = rerenderReducer(basicStateReducer)[0],\n        start = updateWorkInProgressHook().memoizedState;\n      return [\n        \"boolean\" === typeof booleanOrThenable\n          ? booleanOrThenable\n          : useThenable(booleanOrThenable),\n        start\n      ];\n    },\n    useSyncExternalStore: updateSyncExternalStore,\n    useId: updateId,\n    useHostTransitionStatus: useHostTransitionStatus,\n    useFormState: rerenderActionState,\n    useActionState: rerenderActionState,\n    useOptimistic: function (passthrough, reducer) {\n      var hook = updateWorkInProgressHook();\n      if (null !== currentHook)\n        return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n      hook.baseState = passthrough;\n      return [passthrough, hook.queue.dispatch];\n    },\n    useMemoCache: useMemoCache,\n    useCacheRefresh: updateRefresh\n  },\n  thenableState = null,\n  thenableIndexCounter = 0;\nfunction unwrapThenable(thenable) {\n  var index = thenableIndexCounter;\n  thenableIndexCounter += 1;\n  null === thenableState && (thenableState = []);\n  return trackUsedThenable(thenableState, thenable, index);\n}\nfunction coerceRef(workInProgress, element) {\n  element = element.props.ref;\n  workInProgress.ref = void 0 !== element ? element : null;\n}\nfunction throwOnInvalidObjectType(returnFiber, newChild) {\n  if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE)\n    throw Error(formatProdErrorMessage(525));\n  returnFiber = Object.prototype.toString.call(newChild);\n  throw Error(\n    formatProdErrorMessage(\n      31,\n      \"[object Object]\" === returnFiber\n        ? \"object with keys {\" + Object.keys(newChild).join(\", \") + \"}\"\n        : returnFiber\n    )\n  );\n}\nfunction resolveLazy(lazyType) {\n  var init = lazyType._init;\n  return init(lazyType._payload);\n}\nfunction createChildReconciler(shouldTrackSideEffects) {\n  function deleteChild(returnFiber, childToDelete) {\n    if (shouldTrackSideEffects) {\n      var deletions = returnFiber.deletions;\n      null === deletions\n        ? ((returnFiber.deletions = [childToDelete]), (returnFiber.flags |= 16))\n        : deletions.push(childToDelete);\n    }\n  }\n  function deleteRemainingChildren(returnFiber, currentFirstChild) {\n    if (!shouldTrackSideEffects) return null;\n    for (; null !== currentFirstChild; )\n      deleteChild(returnFiber, currentFirstChild),\n        (currentFirstChild = currentFirstChild.sibling);\n    return null;\n  }\n  function mapRemainingChildren(currentFirstChild) {\n    for (var existingChildren = new Map(); null !== currentFirstChild; )\n      null !== currentFirstChild.key\n        ? existingChildren.set(currentFirstChild.key, currentFirstChild)\n        : existingChildren.set(currentFirstChild.index, currentFirstChild),\n        (currentFirstChild = currentFirstChild.sibling);\n    return existingChildren;\n  }\n  function useFiber(fiber, pendingProps) {\n    fiber = createWorkInProgress(fiber, pendingProps);\n    fiber.index = 0;\n    fiber.sibling = null;\n    return fiber;\n  }\n  function placeChild(newFiber, lastPlacedIndex, newIndex) {\n    newFiber.index = newIndex;\n    if (!shouldTrackSideEffects)\n      return (newFiber.flags |= 1048576), lastPlacedIndex;\n    newIndex = newFiber.alternate;\n    if (null !== newIndex)\n      return (\n        (newIndex = newIndex.index),\n        newIndex < lastPlacedIndex\n          ? ((newFiber.flags |= 67108866), lastPlacedIndex)\n          : newIndex\n      );\n    newFiber.flags |= 67108866;\n    return lastPlacedIndex;\n  }\n  function placeSingleChild(newFiber) {\n    shouldTrackSideEffects &&\n      null === newFiber.alternate &&\n      (newFiber.flags |= 67108866);\n    return newFiber;\n  }\n  function updateTextNode(returnFiber, current, textContent, lanes) {\n    if (null === current || 6 !== current.tag)\n      return (\n        (current = createFiberFromText(textContent, returnFiber.mode, lanes)),\n        (current.return = returnFiber),\n        current\n      );\n    current = useFiber(current, textContent);\n    current.return = returnFiber;\n    return current;\n  }\n  function updateElement(returnFiber, current, element, lanes) {\n    var elementType = element.type;\n    if (elementType === REACT_FRAGMENT_TYPE)\n      return updateFragment(\n        returnFiber,\n        current,\n        element.props.children,\n        lanes,\n        element.key\n      );\n    if (\n      null !== current &&\n      (current.elementType === elementType ||\n        (\"object\" === typeof elementType &&\n          null !== elementType &&\n          elementType.$$typeof === REACT_LAZY_TYPE &&\n          resolveLazy(elementType) === current.type))\n    )\n      return (\n        (current = useFiber(current, element.props)),\n        coerceRef(current, element),\n        (current.return = returnFiber),\n        current\n      );\n    current = createFiberFromTypeAndProps(\n      element.type,\n      element.key,\n      element.props,\n      null,\n      returnFiber.mode,\n      lanes\n    );\n    coerceRef(current, element);\n    current.return = returnFiber;\n    return current;\n  }\n  function updatePortal(returnFiber, current, portal, lanes) {\n    if (\n      null === current ||\n      4 !== current.tag ||\n      current.stateNode.containerInfo !== portal.containerInfo ||\n      current.stateNode.implementation !== portal.implementation\n    )\n      return (\n        (current = createFiberFromPortal(portal, returnFiber.mode, lanes)),\n        (current.return = returnFiber),\n        current\n      );\n    current = useFiber(current, portal.children || []);\n    current.return = returnFiber;\n    return current;\n  }\n  function updateFragment(returnFiber, current, fragment, lanes, key) {\n    if (null === current || 7 !== current.tag)\n      return (\n        (current = createFiberFromFragment(\n          fragment,\n          returnFiber.mode,\n          lanes,\n          key\n        )),\n        (current.return = returnFiber),\n        current\n      );\n    current = useFiber(current, fragment);\n    current.return = returnFiber;\n    return current;\n  }\n  function createChild(returnFiber, newChild, lanes) {\n    if (\n      (\"string\" === typeof newChild && \"\" !== newChild) ||\n      \"number\" === typeof newChild ||\n      \"bigint\" === typeof newChild\n    )\n      return (\n        (newChild = createFiberFromText(\n          \"\" + newChild,\n          returnFiber.mode,\n          lanes\n        )),\n        (newChild.return = returnFiber),\n        newChild\n      );\n    if (\"object\" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return (\n            (lanes = createFiberFromTypeAndProps(\n              newChild.type,\n              newChild.key,\n              newChild.props,\n              null,\n              returnFiber.mode,\n              lanes\n            )),\n            coerceRef(lanes, newChild),\n            (lanes.return = returnFiber),\n            lanes\n          );\n        case REACT_PORTAL_TYPE:\n          return (\n            (newChild = createFiberFromPortal(\n              newChild,\n              returnFiber.mode,\n              lanes\n            )),\n            (newChild.return = returnFiber),\n            newChild\n          );\n        case REACT_LAZY_TYPE:\n          var init = newChild._init;\n          newChild = init(newChild._payload);\n          return createChild(returnFiber, newChild, lanes);\n      }\n      if (isArrayImpl(newChild) || getIteratorFn(newChild))\n        return (\n          (newChild = createFiberFromFragment(\n            newChild,\n            returnFiber.mode,\n            lanes,\n            null\n          )),\n          (newChild.return = returnFiber),\n          newChild\n        );\n      if (\"function\" === typeof newChild.then)\n        return createChild(returnFiber, unwrapThenable(newChild), lanes);\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return createChild(\n          returnFiber,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return null;\n  }\n  function updateSlot(returnFiber, oldFiber, newChild, lanes) {\n    var key = null !== oldFiber ? oldFiber.key : null;\n    if (\n      (\"string\" === typeof newChild && \"\" !== newChild) ||\n      \"number\" === typeof newChild ||\n      \"bigint\" === typeof newChild\n    )\n      return null !== key\n        ? null\n        : updateTextNode(returnFiber, oldFiber, \"\" + newChild, lanes);\n    if (\"object\" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return newChild.key === key\n            ? updateElement(returnFiber, oldFiber, newChild, lanes)\n            : null;\n        case REACT_PORTAL_TYPE:\n          return newChild.key === key\n            ? updatePortal(returnFiber, oldFiber, newChild, lanes)\n            : null;\n        case REACT_LAZY_TYPE:\n          return (\n            (key = newChild._init),\n            (newChild = key(newChild._payload)),\n            updateSlot(returnFiber, oldFiber, newChild, lanes)\n          );\n      }\n      if (isArrayImpl(newChild) || getIteratorFn(newChild))\n        return null !== key\n          ? null\n          : updateFragment(returnFiber, oldFiber, newChild, lanes, null);\n      if (\"function\" === typeof newChild.then)\n        return updateSlot(\n          returnFiber,\n          oldFiber,\n          unwrapThenable(newChild),\n          lanes\n        );\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return updateSlot(\n          returnFiber,\n          oldFiber,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return null;\n  }\n  function updateFromMap(\n    existingChildren,\n    returnFiber,\n    newIdx,\n    newChild,\n    lanes\n  ) {\n    if (\n      (\"string\" === typeof newChild && \"\" !== newChild) ||\n      \"number\" === typeof newChild ||\n      \"bigint\" === typeof newChild\n    )\n      return (\n        (existingChildren = existingChildren.get(newIdx) || null),\n        updateTextNode(returnFiber, existingChildren, \"\" + newChild, lanes)\n      );\n    if (\"object\" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          return (\n            (existingChildren =\n              existingChildren.get(\n                null === newChild.key ? newIdx : newChild.key\n              ) || null),\n            updateElement(returnFiber, existingChildren, newChild, lanes)\n          );\n        case REACT_PORTAL_TYPE:\n          return (\n            (existingChildren =\n              existingChildren.get(\n                null === newChild.key ? newIdx : newChild.key\n              ) || null),\n            updatePortal(returnFiber, existingChildren, newChild, lanes)\n          );\n        case REACT_LAZY_TYPE:\n          var init = newChild._init;\n          newChild = init(newChild._payload);\n          return updateFromMap(\n            existingChildren,\n            returnFiber,\n            newIdx,\n            newChild,\n            lanes\n          );\n      }\n      if (isArrayImpl(newChild) || getIteratorFn(newChild))\n        return (\n          (existingChildren = existingChildren.get(newIdx) || null),\n          updateFragment(returnFiber, existingChildren, newChild, lanes, null)\n        );\n      if (\"function\" === typeof newChild.then)\n        return updateFromMap(\n          existingChildren,\n          returnFiber,\n          newIdx,\n          unwrapThenable(newChild),\n          lanes\n        );\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return updateFromMap(\n          existingChildren,\n          returnFiber,\n          newIdx,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return null;\n  }\n  function reconcileChildrenArray(\n    returnFiber,\n    currentFirstChild,\n    newChildren,\n    lanes\n  ) {\n    for (\n      var resultingFirstChild = null,\n        previousNewFiber = null,\n        oldFiber = currentFirstChild,\n        newIdx = (currentFirstChild = 0),\n        nextOldFiber = null;\n      null !== oldFiber && newIdx < newChildren.length;\n      newIdx++\n    ) {\n      oldFiber.index > newIdx\n        ? ((nextOldFiber = oldFiber), (oldFiber = null))\n        : (nextOldFiber = oldFiber.sibling);\n      var newFiber = updateSlot(\n        returnFiber,\n        oldFiber,\n        newChildren[newIdx],\n        lanes\n      );\n      if (null === newFiber) {\n        null === oldFiber && (oldFiber = nextOldFiber);\n        break;\n      }\n      shouldTrackSideEffects &&\n        oldFiber &&\n        null === newFiber.alternate &&\n        deleteChild(returnFiber, oldFiber);\n      currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n      null === previousNewFiber\n        ? (resultingFirstChild = newFiber)\n        : (previousNewFiber.sibling = newFiber);\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n    if (newIdx === newChildren.length)\n      return (\n        deleteRemainingChildren(returnFiber, oldFiber),\n        isHydrating && pushTreeFork(returnFiber, newIdx),\n        resultingFirstChild\n      );\n    if (null === oldFiber) {\n      for (; newIdx < newChildren.length; newIdx++)\n        (oldFiber = createChild(returnFiber, newChildren[newIdx], lanes)),\n          null !== oldFiber &&\n            ((currentFirstChild = placeChild(\n              oldFiber,\n              currentFirstChild,\n              newIdx\n            )),\n            null === previousNewFiber\n              ? (resultingFirstChild = oldFiber)\n              : (previousNewFiber.sibling = oldFiber),\n            (previousNewFiber = oldFiber));\n      isHydrating && pushTreeFork(returnFiber, newIdx);\n      return resultingFirstChild;\n    }\n    for (\n      oldFiber = mapRemainingChildren(oldFiber);\n      newIdx < newChildren.length;\n      newIdx++\n    )\n      (nextOldFiber = updateFromMap(\n        oldFiber,\n        returnFiber,\n        newIdx,\n        newChildren[newIdx],\n        lanes\n      )),\n        null !== nextOldFiber &&\n          (shouldTrackSideEffects &&\n            null !== nextOldFiber.alternate &&\n            oldFiber.delete(\n              null === nextOldFiber.key ? newIdx : nextOldFiber.key\n            ),\n          (currentFirstChild = placeChild(\n            nextOldFiber,\n            currentFirstChild,\n            newIdx\n          )),\n          null === previousNewFiber\n            ? (resultingFirstChild = nextOldFiber)\n            : (previousNewFiber.sibling = nextOldFiber),\n          (previousNewFiber = nextOldFiber));\n    shouldTrackSideEffects &&\n      oldFiber.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    isHydrating && pushTreeFork(returnFiber, newIdx);\n    return resultingFirstChild;\n  }\n  function reconcileChildrenIterator(\n    returnFiber,\n    currentFirstChild,\n    newChildren,\n    lanes\n  ) {\n    if (null == newChildren) throw Error(formatProdErrorMessage(151));\n    for (\n      var resultingFirstChild = null,\n        previousNewFiber = null,\n        oldFiber = currentFirstChild,\n        newIdx = (currentFirstChild = 0),\n        nextOldFiber = null,\n        step = newChildren.next();\n      null !== oldFiber && !step.done;\n      newIdx++, step = newChildren.next()\n    ) {\n      oldFiber.index > newIdx\n        ? ((nextOldFiber = oldFiber), (oldFiber = null))\n        : (nextOldFiber = oldFiber.sibling);\n      var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);\n      if (null === newFiber) {\n        null === oldFiber && (oldFiber = nextOldFiber);\n        break;\n      }\n      shouldTrackSideEffects &&\n        oldFiber &&\n        null === newFiber.alternate &&\n        deleteChild(returnFiber, oldFiber);\n      currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n      null === previousNewFiber\n        ? (resultingFirstChild = newFiber)\n        : (previousNewFiber.sibling = newFiber);\n      previousNewFiber = newFiber;\n      oldFiber = nextOldFiber;\n    }\n    if (step.done)\n      return (\n        deleteRemainingChildren(returnFiber, oldFiber),\n        isHydrating && pushTreeFork(returnFiber, newIdx),\n        resultingFirstChild\n      );\n    if (null === oldFiber) {\n      for (; !step.done; newIdx++, step = newChildren.next())\n        (step = createChild(returnFiber, step.value, lanes)),\n          null !== step &&\n            ((currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n            null === previousNewFiber\n              ? (resultingFirstChild = step)\n              : (previousNewFiber.sibling = step),\n            (previousNewFiber = step));\n      isHydrating && pushTreeFork(returnFiber, newIdx);\n      return resultingFirstChild;\n    }\n    for (\n      oldFiber = mapRemainingChildren(oldFiber);\n      !step.done;\n      newIdx++, step = newChildren.next()\n    )\n      (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)),\n        null !== step &&\n          (shouldTrackSideEffects &&\n            null !== step.alternate &&\n            oldFiber.delete(null === step.key ? newIdx : step.key),\n          (currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n          null === previousNewFiber\n            ? (resultingFirstChild = step)\n            : (previousNewFiber.sibling = step),\n          (previousNewFiber = step));\n    shouldTrackSideEffects &&\n      oldFiber.forEach(function (child) {\n        return deleteChild(returnFiber, child);\n      });\n    isHydrating && pushTreeFork(returnFiber, newIdx);\n    return resultingFirstChild;\n  }\n  function reconcileChildFibersImpl(\n    returnFiber,\n    currentFirstChild,\n    newChild,\n    lanes\n  ) {\n    \"object\" === typeof newChild &&\n      null !== newChild &&\n      newChild.type === REACT_FRAGMENT_TYPE &&\n      null === newChild.key &&\n      (newChild = newChild.props.children);\n    if (\"object\" === typeof newChild && null !== newChild) {\n      switch (newChild.$$typeof) {\n        case REACT_ELEMENT_TYPE:\n          a: {\n            for (var key = newChild.key; null !== currentFirstChild; ) {\n              if (currentFirstChild.key === key) {\n                key = newChild.type;\n                if (key === REACT_FRAGMENT_TYPE) {\n                  if (7 === currentFirstChild.tag) {\n                    deleteRemainingChildren(\n                      returnFiber,\n                      currentFirstChild.sibling\n                    );\n                    lanes = useFiber(\n                      currentFirstChild,\n                      newChild.props.children\n                    );\n                    lanes.return = returnFiber;\n                    returnFiber = lanes;\n                    break a;\n                  }\n                } else if (\n                  currentFirstChild.elementType === key ||\n                  (\"object\" === typeof key &&\n                    null !== key &&\n                    key.$$typeof === REACT_LAZY_TYPE &&\n                    resolveLazy(key) === currentFirstChild.type)\n                ) {\n                  deleteRemainingChildren(\n                    returnFiber,\n                    currentFirstChild.sibling\n                  );\n                  lanes = useFiber(currentFirstChild, newChild.props);\n                  coerceRef(lanes, newChild);\n                  lanes.return = returnFiber;\n                  returnFiber = lanes;\n                  break a;\n                }\n                deleteRemainingChildren(returnFiber, currentFirstChild);\n                break;\n              } else deleteChild(returnFiber, currentFirstChild);\n              currentFirstChild = currentFirstChild.sibling;\n            }\n            newChild.type === REACT_FRAGMENT_TYPE\n              ? ((lanes = createFiberFromFragment(\n                  newChild.props.children,\n                  returnFiber.mode,\n                  lanes,\n                  newChild.key\n                )),\n                (lanes.return = returnFiber),\n                (returnFiber = lanes))\n              : ((lanes = createFiberFromTypeAndProps(\n                  newChild.type,\n                  newChild.key,\n                  newChild.props,\n                  null,\n                  returnFiber.mode,\n                  lanes\n                )),\n                coerceRef(lanes, newChild),\n                (lanes.return = returnFiber),\n                (returnFiber = lanes));\n          }\n          return placeSingleChild(returnFiber);\n        case REACT_PORTAL_TYPE:\n          a: {\n            for (key = newChild.key; null !== currentFirstChild; ) {\n              if (currentFirstChild.key === key)\n                if (\n                  4 === currentFirstChild.tag &&\n                  currentFirstChild.stateNode.containerInfo ===\n                    newChild.containerInfo &&\n                  currentFirstChild.stateNode.implementation ===\n                    newChild.implementation\n                ) {\n                  deleteRemainingChildren(\n                    returnFiber,\n                    currentFirstChild.sibling\n                  );\n                  lanes = useFiber(currentFirstChild, newChild.children || []);\n                  lanes.return = returnFiber;\n                  returnFiber = lanes;\n                  break a;\n                } else {\n                  deleteRemainingChildren(returnFiber, currentFirstChild);\n                  break;\n                }\n              else deleteChild(returnFiber, currentFirstChild);\n              currentFirstChild = currentFirstChild.sibling;\n            }\n            lanes = createFiberFromPortal(newChild, returnFiber.mode, lanes);\n            lanes.return = returnFiber;\n            returnFiber = lanes;\n          }\n          return placeSingleChild(returnFiber);\n        case REACT_LAZY_TYPE:\n          return (\n            (key = newChild._init),\n            (newChild = key(newChild._payload)),\n            reconcileChildFibersImpl(\n              returnFiber,\n              currentFirstChild,\n              newChild,\n              lanes\n            )\n          );\n      }\n      if (isArrayImpl(newChild))\n        return reconcileChildrenArray(\n          returnFiber,\n          currentFirstChild,\n          newChild,\n          lanes\n        );\n      if (getIteratorFn(newChild)) {\n        key = getIteratorFn(newChild);\n        if (\"function\" !== typeof key) throw Error(formatProdErrorMessage(150));\n        newChild = key.call(newChild);\n        return reconcileChildrenIterator(\n          returnFiber,\n          currentFirstChild,\n          newChild,\n          lanes\n        );\n      }\n      if (\"function\" === typeof newChild.then)\n        return reconcileChildFibersImpl(\n          returnFiber,\n          currentFirstChild,\n          unwrapThenable(newChild),\n          lanes\n        );\n      if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n        return reconcileChildFibersImpl(\n          returnFiber,\n          currentFirstChild,\n          readContextDuringReconciliation(returnFiber, newChild),\n          lanes\n        );\n      throwOnInvalidObjectType(returnFiber, newChild);\n    }\n    return (\"string\" === typeof newChild && \"\" !== newChild) ||\n      \"number\" === typeof newChild ||\n      \"bigint\" === typeof newChild\n      ? ((newChild = \"\" + newChild),\n        null !== currentFirstChild && 6 === currentFirstChild.tag\n          ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling),\n            (lanes = useFiber(currentFirstChild, newChild)),\n            (lanes.return = returnFiber),\n            (returnFiber = lanes))\n          : (deleteRemainingChildren(returnFiber, currentFirstChild),\n            (lanes = createFiberFromText(newChild, returnFiber.mode, lanes)),\n            (lanes.return = returnFiber),\n            (returnFiber = lanes)),\n        placeSingleChild(returnFiber))\n      : deleteRemainingChildren(returnFiber, currentFirstChild);\n  }\n  return function (returnFiber, currentFirstChild, newChild, lanes) {\n    try {\n      thenableIndexCounter = 0;\n      var firstChildFiber = reconcileChildFibersImpl(\n        returnFiber,\n        currentFirstChild,\n        newChild,\n        lanes\n      );\n      thenableState = null;\n      return firstChildFiber;\n    } catch (x) {\n      if (x === SuspenseException || x === SuspenseActionException) throw x;\n      var fiber = createFiberImplClass(29, x, null, returnFiber.mode);\n      fiber.lanes = lanes;\n      fiber.return = returnFiber;\n      return fiber;\n    } finally {\n    }\n  };\n}\nvar reconcileChildFibers = createChildReconciler(!0),\n  mountChildFibers = createChildReconciler(!1),\n  suspenseHandlerStackCursor = createCursor(null),\n  shellBoundary = null;\nfunction pushPrimaryTreeSuspenseHandler(handler) {\n  var current = handler.alternate;\n  push(suspenseStackCursor, suspenseStackCursor.current & 1);\n  push(suspenseHandlerStackCursor, handler);\n  null === shellBoundary &&\n    (null === current || null !== currentTreeHiddenStackCursor.current\n      ? (shellBoundary = handler)\n      : null !== current.memoizedState && (shellBoundary = handler));\n}\nfunction pushOffscreenSuspenseHandler(fiber) {\n  if (22 === fiber.tag) {\n    if (\n      (push(suspenseStackCursor, suspenseStackCursor.current),\n      push(suspenseHandlerStackCursor, fiber),\n      null === shellBoundary)\n    ) {\n      var current = fiber.alternate;\n      null !== current &&\n        null !== current.memoizedState &&\n        (shellBoundary = fiber);\n    }\n  } else reuseSuspenseHandlerOnStack(fiber);\n}\nfunction reuseSuspenseHandlerOnStack() {\n  push(suspenseStackCursor, suspenseStackCursor.current);\n  push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current);\n}\nfunction popSuspenseHandler(fiber) {\n  pop(suspenseHandlerStackCursor);\n  shellBoundary === fiber && (shellBoundary = null);\n  pop(suspenseStackCursor);\n}\nvar suspenseStackCursor = createCursor(0);\nfunction findFirstSuspended(row) {\n  for (var node = row; null !== node; ) {\n    if (13 === node.tag) {\n      var state = node.memoizedState;\n      if (\n        null !== state &&\n        ((state = state.dehydrated),\n        null === state ||\n          \"$?\" === state.data ||\n          isSuspenseInstanceFallback(state))\n      )\n        return node;\n    } else if (19 === node.tag && void 0 !== node.memoizedProps.revealOrder) {\n      if (0 !== (node.flags & 128)) return node;\n    } else if (null !== node.child) {\n      node.child.return = node;\n      node = node.child;\n      continue;\n    }\n    if (node === row) break;\n    for (; null === node.sibling; ) {\n      if (null === node.return || node.return === row) return null;\n      node = node.return;\n    }\n    node.sibling.return = node.return;\n    node = node.sibling;\n  }\n  return null;\n}\nfunction applyDerivedStateFromProps(\n  workInProgress,\n  ctor,\n  getDerivedStateFromProps,\n  nextProps\n) {\n  ctor = workInProgress.memoizedState;\n  getDerivedStateFromProps = getDerivedStateFromProps(nextProps, ctor);\n  getDerivedStateFromProps =\n    null === getDerivedStateFromProps || void 0 === getDerivedStateFromProps\n      ? ctor\n      : assign({}, ctor, getDerivedStateFromProps);\n  workInProgress.memoizedState = getDerivedStateFromProps;\n  0 === workInProgress.lanes &&\n    (workInProgress.updateQueue.baseState = getDerivedStateFromProps);\n}\nvar classComponentUpdater = {\n  enqueueSetState: function (inst, payload, callback) {\n    inst = inst._reactInternals;\n    var lane = requestUpdateLane(),\n      update = createUpdate(lane);\n    update.payload = payload;\n    void 0 !== callback && null !== callback && (update.callback = callback);\n    payload = enqueueUpdate(inst, update, lane);\n    null !== payload &&\n      (scheduleUpdateOnFiber(payload, inst, lane),\n      entangleTransitions(payload, inst, lane));\n  },\n  enqueueReplaceState: function (inst, payload, callback) {\n    inst = inst._reactInternals;\n    var lane = requestUpdateLane(),\n      update = createUpdate(lane);\n    update.tag = 1;\n    update.payload = payload;\n    void 0 !== callback && null !== callback && (update.callback = callback);\n    payload = enqueueUpdate(inst, update, lane);\n    null !== payload &&\n      (scheduleUpdateOnFiber(payload, inst, lane),\n      entangleTransitions(payload, inst, lane));\n  },\n  enqueueForceUpdate: function (inst, callback) {\n    inst = inst._reactInternals;\n    var lane = requestUpdateLane(),\n      update = createUpdate(lane);\n    update.tag = 2;\n    void 0 !== callback && null !== callback && (update.callback = callback);\n    callback = enqueueUpdate(inst, update, lane);\n    null !== callback &&\n      (scheduleUpdateOnFiber(callback, inst, lane),\n      entangleTransitions(callback, inst, lane));\n  }\n};\nfunction checkShouldComponentUpdate(\n  workInProgress,\n  ctor,\n  oldProps,\n  newProps,\n  oldState,\n  newState,\n  nextContext\n) {\n  workInProgress = workInProgress.stateNode;\n  return \"function\" === typeof workInProgress.shouldComponentUpdate\n    ? workInProgress.shouldComponentUpdate(newProps, newState, nextContext)\n    : ctor.prototype && ctor.prototype.isPureReactComponent\n      ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)\n      : !0;\n}\nfunction callComponentWillReceiveProps(\n  workInProgress,\n  instance,\n  newProps,\n  nextContext\n) {\n  workInProgress = instance.state;\n  \"function\" === typeof instance.componentWillReceiveProps &&\n    instance.componentWillReceiveProps(newProps, nextContext);\n  \"function\" === typeof instance.UNSAFE_componentWillReceiveProps &&\n    instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n  instance.state !== workInProgress &&\n    classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n}\nfunction resolveClassComponentProps(Component, baseProps) {\n  var newProps = baseProps;\n  if (\"ref\" in baseProps) {\n    newProps = {};\n    for (var propName in baseProps)\n      \"ref\" !== propName && (newProps[propName] = baseProps[propName]);\n  }\n  if ((Component = Component.defaultProps)) {\n    newProps === baseProps && (newProps = assign({}, newProps));\n    for (var propName$73 in Component)\n      void 0 === newProps[propName$73] &&\n        (newProps[propName$73] = Component[propName$73]);\n  }\n  return newProps;\n}\nvar reportGlobalError =\n  \"function\" === typeof reportError\n    ? reportError\n    : function (error) {\n        if (\n          \"object\" === typeof window &&\n          \"function\" === typeof window.ErrorEvent\n        ) {\n          var event = new window.ErrorEvent(\"error\", {\n            bubbles: !0,\n            cancelable: !0,\n            message:\n              \"object\" === typeof error &&\n              null !== error &&\n              \"string\" === typeof error.message\n                ? String(error.message)\n                : String(error),\n            error: error\n          });\n          if (!window.dispatchEvent(event)) return;\n        } else if (\n          \"object\" === typeof process &&\n          \"function\" === typeof process.emit\n        ) {\n          process.emit(\"uncaughtException\", error);\n          return;\n        }\n        console.error(error);\n      };\nfunction defaultOnUncaughtError(error) {\n  reportGlobalError(error);\n}\nfunction defaultOnCaughtError(error) {\n  console.error(error);\n}\nfunction defaultOnRecoverableError(error) {\n  reportGlobalError(error);\n}\nfunction logUncaughtError(root, errorInfo) {\n  try {\n    var onUncaughtError = root.onUncaughtError;\n    onUncaughtError(errorInfo.value, { componentStack: errorInfo.stack });\n  } catch (e$74) {\n    setTimeout(function () {\n      throw e$74;\n    });\n  }\n}\nfunction logCaughtError(root, boundary, errorInfo) {\n  try {\n    var onCaughtError = root.onCaughtError;\n    onCaughtError(errorInfo.value, {\n      componentStack: errorInfo.stack,\n      errorBoundary: 1 === boundary.tag ? boundary.stateNode : null\n    });\n  } catch (e$75) {\n    setTimeout(function () {\n      throw e$75;\n    });\n  }\n}\nfunction createRootErrorUpdate(root, errorInfo, lane) {\n  lane = createUpdate(lane);\n  lane.tag = 3;\n  lane.payload = { element: null };\n  lane.callback = function () {\n    logUncaughtError(root, errorInfo);\n  };\n  return lane;\n}\nfunction createClassErrorUpdate(lane) {\n  lane = createUpdate(lane);\n  lane.tag = 3;\n  return lane;\n}\nfunction initializeClassErrorUpdate(update, root, fiber, errorInfo) {\n  var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n  if (\"function\" === typeof getDerivedStateFromError) {\n    var error = errorInfo.value;\n    update.payload = function () {\n      return getDerivedStateFromError(error);\n    };\n    update.callback = function () {\n      logCaughtError(root, fiber, errorInfo);\n    };\n  }\n  var inst = fiber.stateNode;\n  null !== inst &&\n    \"function\" === typeof inst.componentDidCatch &&\n    (update.callback = function () {\n      logCaughtError(root, fiber, errorInfo);\n      \"function\" !== typeof getDerivedStateFromError &&\n        (null === legacyErrorBoundariesThatAlreadyFailed\n          ? (legacyErrorBoundariesThatAlreadyFailed = new Set([this]))\n          : legacyErrorBoundariesThatAlreadyFailed.add(this));\n      var stack = errorInfo.stack;\n      this.componentDidCatch(errorInfo.value, {\n        componentStack: null !== stack ? stack : \"\"\n      });\n    });\n}\nfunction throwException(\n  root,\n  returnFiber,\n  sourceFiber,\n  value,\n  rootRenderLanes\n) {\n  sourceFiber.flags |= 32768;\n  if (\n    null !== value &&\n    \"object\" === typeof value &&\n    \"function\" === typeof value.then\n  ) {\n    returnFiber = sourceFiber.alternate;\n    null !== returnFiber &&\n      propagateParentContextChanges(\n        returnFiber,\n        sourceFiber,\n        rootRenderLanes,\n        !0\n      );\n    sourceFiber = suspenseHandlerStackCursor.current;\n    if (null !== sourceFiber) {\n      switch (sourceFiber.tag) {\n        case 13:\n          return (\n            null === shellBoundary\n              ? renderDidSuspendDelayIfPossible()\n              : null === sourceFiber.alternate &&\n                0 === workInProgressRootExitStatus &&\n                (workInProgressRootExitStatus = 3),\n            (sourceFiber.flags &= -257),\n            (sourceFiber.flags |= 65536),\n            (sourceFiber.lanes = rootRenderLanes),\n            value === noopSuspenseyCommitThenable\n              ? (sourceFiber.flags |= 16384)\n              : ((returnFiber = sourceFiber.updateQueue),\n                null === returnFiber\n                  ? (sourceFiber.updateQueue = new Set([value]))\n                  : returnFiber.add(value),\n                attachPingListener(root, value, rootRenderLanes)),\n            !1\n          );\n        case 22:\n          return (\n            (sourceFiber.flags |= 65536),\n            value === noopSuspenseyCommitThenable\n              ? (sourceFiber.flags |= 16384)\n              : ((returnFiber = sourceFiber.updateQueue),\n                null === returnFiber\n                  ? ((returnFiber = {\n                      transitions: null,\n                      markerInstances: null,\n                      retryQueue: new Set([value])\n                    }),\n                    (sourceFiber.updateQueue = returnFiber))\n                  : ((sourceFiber = returnFiber.retryQueue),\n                    null === sourceFiber\n                      ? (returnFiber.retryQueue = new Set([value]))\n                      : sourceFiber.add(value)),\n                attachPingListener(root, value, rootRenderLanes)),\n            !1\n          );\n      }\n      throw Error(formatProdErrorMessage(435, sourceFiber.tag));\n    }\n    attachPingListener(root, value, rootRenderLanes);\n    renderDidSuspendDelayIfPossible();\n    return !1;\n  }\n  if (isHydrating)\n    return (\n      (returnFiber = suspenseHandlerStackCursor.current),\n      null !== returnFiber\n        ? (0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256),\n          (returnFiber.flags |= 65536),\n          (returnFiber.lanes = rootRenderLanes),\n          value !== HydrationMismatchException &&\n            ((root = Error(formatProdErrorMessage(422), { cause: value })),\n            queueHydrationError(createCapturedValueAtFiber(root, sourceFiber))))\n        : (value !== HydrationMismatchException &&\n            ((returnFiber = Error(formatProdErrorMessage(423), {\n              cause: value\n            })),\n            queueHydrationError(\n              createCapturedValueAtFiber(returnFiber, sourceFiber)\n            )),\n          (root = root.current.alternate),\n          (root.flags |= 65536),\n          (rootRenderLanes &= -rootRenderLanes),\n          (root.lanes |= rootRenderLanes),\n          (value = createCapturedValueAtFiber(value, sourceFiber)),\n          (rootRenderLanes = createRootErrorUpdate(\n            root.stateNode,\n            value,\n            rootRenderLanes\n          )),\n          enqueueCapturedUpdate(root, rootRenderLanes),\n          4 !== workInProgressRootExitStatus &&\n            (workInProgressRootExitStatus = 2)),\n      !1\n    );\n  var wrapperError = Error(formatProdErrorMessage(520), { cause: value });\n  wrapperError = createCapturedValueAtFiber(wrapperError, sourceFiber);\n  null === workInProgressRootConcurrentErrors\n    ? (workInProgressRootConcurrentErrors = [wrapperError])\n    : workInProgressRootConcurrentErrors.push(wrapperError);\n  4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2);\n  if (null === returnFiber) return !0;\n  value = createCapturedValueAtFiber(value, sourceFiber);\n  sourceFiber = returnFiber;\n  do {\n    switch (sourceFiber.tag) {\n      case 3:\n        return (\n          (sourceFiber.flags |= 65536),\n          (root = rootRenderLanes & -rootRenderLanes),\n          (sourceFiber.lanes |= root),\n          (root = createRootErrorUpdate(sourceFiber.stateNode, value, root)),\n          enqueueCapturedUpdate(sourceFiber, root),\n          !1\n        );\n      case 1:\n        if (\n          ((returnFiber = sourceFiber.type),\n          (wrapperError = sourceFiber.stateNode),\n          0 === (sourceFiber.flags & 128) &&\n            (\"function\" === typeof returnFiber.getDerivedStateFromError ||\n              (null !== wrapperError &&\n                \"function\" === typeof wrapperError.componentDidCatch &&\n                (null === legacyErrorBoundariesThatAlreadyFailed ||\n                  !legacyErrorBoundariesThatAlreadyFailed.has(wrapperError)))))\n        )\n          return (\n            (sourceFiber.flags |= 65536),\n            (rootRenderLanes &= -rootRenderLanes),\n            (sourceFiber.lanes |= rootRenderLanes),\n            (rootRenderLanes = createClassErrorUpdate(rootRenderLanes)),\n            initializeClassErrorUpdate(\n              rootRenderLanes,\n              root,\n              sourceFiber,\n              value\n            ),\n            enqueueCapturedUpdate(sourceFiber, rootRenderLanes),\n            !1\n          );\n    }\n    sourceFiber = sourceFiber.return;\n  } while (null !== sourceFiber);\n  return !1;\n}\nvar SelectiveHydrationException = Error(formatProdErrorMessage(461)),\n  didReceiveUpdate = !1;\nfunction reconcileChildren(current, workInProgress, nextChildren, renderLanes) {\n  workInProgress.child =\n    null === current\n      ? mountChildFibers(workInProgress, null, nextChildren, renderLanes)\n      : reconcileChildFibers(\n          workInProgress,\n          current.child,\n          nextChildren,\n          renderLanes\n        );\n}\nfunction updateForwardRef(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  Component = Component.render;\n  var ref = workInProgress.ref;\n  if (\"ref\" in nextProps) {\n    var propsWithoutRef = {};\n    for (var key in nextProps)\n      \"ref\" !== key && (propsWithoutRef[key] = nextProps[key]);\n  } else propsWithoutRef = nextProps;\n  prepareToReadContext(workInProgress);\n  nextProps = renderWithHooks(\n    current,\n    workInProgress,\n    Component,\n    propsWithoutRef,\n    ref,\n    renderLanes\n  );\n  key = checkDidRenderIdHook();\n  if (null !== current && !didReceiveUpdate)\n    return (\n      bailoutHooks(current, workInProgress, renderLanes),\n      bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n    );\n  isHydrating && key && pushMaterializedTreeId(workInProgress);\n  workInProgress.flags |= 1;\n  reconcileChildren(current, workInProgress, nextProps, renderLanes);\n  return workInProgress.child;\n}\nfunction updateMemoComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  if (null === current) {\n    var type = Component.type;\n    if (\n      \"function\" === typeof type &&\n      !shouldConstruct(type) &&\n      void 0 === type.defaultProps &&\n      null === Component.compare\n    )\n      return (\n        (workInProgress.tag = 15),\n        (workInProgress.type = type),\n        updateSimpleMemoComponent(\n          current,\n          workInProgress,\n          type,\n          nextProps,\n          renderLanes\n        )\n      );\n    current = createFiberFromTypeAndProps(\n      Component.type,\n      null,\n      nextProps,\n      workInProgress,\n      workInProgress.mode,\n      renderLanes\n    );\n    current.ref = workInProgress.ref;\n    current.return = workInProgress;\n    return (workInProgress.child = current);\n  }\n  type = current.child;\n  if (!checkScheduledUpdateOrContext(current, renderLanes)) {\n    var prevProps = type.memoizedProps;\n    Component = Component.compare;\n    Component = null !== Component ? Component : shallowEqual;\n    if (Component(prevProps, nextProps) && current.ref === workInProgress.ref)\n      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n  }\n  workInProgress.flags |= 1;\n  current = createWorkInProgress(type, nextProps);\n  current.ref = workInProgress.ref;\n  current.return = workInProgress;\n  return (workInProgress.child = current);\n}\nfunction updateSimpleMemoComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  if (null !== current) {\n    var prevProps = current.memoizedProps;\n    if (\n      shallowEqual(prevProps, nextProps) &&\n      current.ref === workInProgress.ref\n    )\n      if (\n        ((didReceiveUpdate = !1),\n        (workInProgress.pendingProps = nextProps = prevProps),\n        checkScheduledUpdateOrContext(current, renderLanes))\n      )\n        0 !== (current.flags & 131072) && (didReceiveUpdate = !0);\n      else\n        return (\n          (workInProgress.lanes = current.lanes),\n          bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n        );\n  }\n  return updateFunctionComponent(\n    current,\n    workInProgress,\n    Component,\n    nextProps,\n    renderLanes\n  );\n}\nfunction updateOffscreenComponent(current, workInProgress, renderLanes) {\n  var nextProps = workInProgress.pendingProps,\n    nextChildren = nextProps.children,\n    prevState = null !== current ? current.memoizedState : null;\n  if (\"hidden\" === nextProps.mode) {\n    if (0 !== (workInProgress.flags & 128)) {\n      nextProps =\n        null !== prevState ? prevState.baseLanes | renderLanes : renderLanes;\n      if (null !== current) {\n        nextChildren = workInProgress.child = current.child;\n        for (prevState = 0; null !== nextChildren; )\n          (prevState =\n            prevState | nextChildren.lanes | nextChildren.childLanes),\n            (nextChildren = nextChildren.sibling);\n        workInProgress.childLanes = prevState & ~nextProps;\n      } else (workInProgress.childLanes = 0), (workInProgress.child = null);\n      return deferHiddenOffscreenComponent(\n        current,\n        workInProgress,\n        nextProps,\n        renderLanes\n      );\n    }\n    if (0 !== (renderLanes & 536870912))\n      (workInProgress.memoizedState = { baseLanes: 0, cachePool: null }),\n        null !== current &&\n          pushTransition(\n            workInProgress,\n            null !== prevState ? prevState.cachePool : null\n          ),\n        null !== prevState\n          ? pushHiddenContext(workInProgress, prevState)\n          : reuseHiddenContextOnStack(),\n        pushOffscreenSuspenseHandler(workInProgress);\n    else\n      return (\n        (workInProgress.lanes = workInProgress.childLanes = 536870912),\n        deferHiddenOffscreenComponent(\n          current,\n          workInProgress,\n          null !== prevState ? prevState.baseLanes | renderLanes : renderLanes,\n          renderLanes\n        )\n      );\n  } else\n    null !== prevState\n      ? (pushTransition(workInProgress, prevState.cachePool),\n        pushHiddenContext(workInProgress, prevState),\n        reuseSuspenseHandlerOnStack(workInProgress),\n        (workInProgress.memoizedState = null))\n      : (null !== current && pushTransition(workInProgress, null),\n        reuseHiddenContextOnStack(),\n        reuseSuspenseHandlerOnStack(workInProgress));\n  reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n  return workInProgress.child;\n}\nfunction deferHiddenOffscreenComponent(\n  current,\n  workInProgress,\n  nextBaseLanes,\n  renderLanes\n) {\n  var JSCompiler_inline_result = peekCacheFromPool();\n  JSCompiler_inline_result =\n    null === JSCompiler_inline_result\n      ? null\n      : { parent: CacheContext._currentValue, pool: JSCompiler_inline_result };\n  workInProgress.memoizedState = {\n    baseLanes: nextBaseLanes,\n    cachePool: JSCompiler_inline_result\n  };\n  null !== current && pushTransition(workInProgress, null);\n  reuseHiddenContextOnStack();\n  pushOffscreenSuspenseHandler(workInProgress);\n  null !== current &&\n    propagateParentContextChanges(current, workInProgress, renderLanes, !0);\n  return null;\n}\nfunction markRef(current, workInProgress) {\n  var ref = workInProgress.ref;\n  if (null === ref)\n    null !== current &&\n      null !== current.ref &&\n      (workInProgress.flags |= 4194816);\n  else {\n    if (\"function\" !== typeof ref && \"object\" !== typeof ref)\n      throw Error(formatProdErrorMessage(284));\n    if (null === current || current.ref !== ref)\n      workInProgress.flags |= 4194816;\n  }\n}\nfunction updateFunctionComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  prepareToReadContext(workInProgress);\n  Component = renderWithHooks(\n    current,\n    workInProgress,\n    Component,\n    nextProps,\n    void 0,\n    renderLanes\n  );\n  nextProps = checkDidRenderIdHook();\n  if (null !== current && !didReceiveUpdate)\n    return (\n      bailoutHooks(current, workInProgress, renderLanes),\n      bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n    );\n  isHydrating && nextProps && pushMaterializedTreeId(workInProgress);\n  workInProgress.flags |= 1;\n  reconcileChildren(current, workInProgress, Component, renderLanes);\n  return workInProgress.child;\n}\nfunction replayFunctionComponent(\n  current,\n  workInProgress,\n  nextProps,\n  Component,\n  secondArg,\n  renderLanes\n) {\n  prepareToReadContext(workInProgress);\n  workInProgress.updateQueue = null;\n  nextProps = renderWithHooksAgain(\n    workInProgress,\n    Component,\n    nextProps,\n    secondArg\n  );\n  finishRenderingHooks(current);\n  Component = checkDidRenderIdHook();\n  if (null !== current && !didReceiveUpdate)\n    return (\n      bailoutHooks(current, workInProgress, renderLanes),\n      bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n    );\n  isHydrating && Component && pushMaterializedTreeId(workInProgress);\n  workInProgress.flags |= 1;\n  reconcileChildren(current, workInProgress, nextProps, renderLanes);\n  return workInProgress.child;\n}\nfunction updateClassComponent(\n  current,\n  workInProgress,\n  Component,\n  nextProps,\n  renderLanes\n) {\n  prepareToReadContext(workInProgress);\n  if (null === workInProgress.stateNode) {\n    var context = emptyContextObject,\n      contextType = Component.contextType;\n    \"object\" === typeof contextType &&\n      null !== contextType &&\n      (context = readContext(contextType));\n    context = new Component(nextProps, context);\n    workInProgress.memoizedState =\n      null !== context.state && void 0 !== context.state ? context.state : null;\n    context.updater = classComponentUpdater;\n    workInProgress.stateNode = context;\n    context._reactInternals = workInProgress;\n    context = workInProgress.stateNode;\n    context.props = nextProps;\n    context.state = workInProgress.memoizedState;\n    context.refs = {};\n    initializeUpdateQueue(workInProgress);\n    contextType = Component.contextType;\n    context.context =\n      \"object\" === typeof contextType && null !== contextType\n        ? readContext(contextType)\n        : emptyContextObject;\n    context.state = workInProgress.memoizedState;\n    contextType = Component.getDerivedStateFromProps;\n    \"function\" === typeof contextType &&\n      (applyDerivedStateFromProps(\n        workInProgress,\n        Component,\n        contextType,\n        nextProps\n      ),\n      (context.state = workInProgress.memoizedState));\n    \"function\" === typeof Component.getDerivedStateFromProps ||\n      \"function\" === typeof context.getSnapshotBeforeUpdate ||\n      (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n        \"function\" !== typeof context.componentWillMount) ||\n      ((contextType = context.state),\n      \"function\" === typeof context.componentWillMount &&\n        context.componentWillMount(),\n      \"function\" === typeof context.UNSAFE_componentWillMount &&\n        context.UNSAFE_componentWillMount(),\n      contextType !== context.state &&\n        classComponentUpdater.enqueueReplaceState(context, context.state, null),\n      processUpdateQueue(workInProgress, nextProps, context, renderLanes),\n      suspendIfUpdateReadFromEntangledAsyncAction(),\n      (context.state = workInProgress.memoizedState));\n    \"function\" === typeof context.componentDidMount &&\n      (workInProgress.flags |= 4194308);\n    nextProps = !0;\n  } else if (null === current) {\n    context = workInProgress.stateNode;\n    var unresolvedOldProps = workInProgress.memoizedProps,\n      oldProps = resolveClassComponentProps(Component, unresolvedOldProps);\n    context.props = oldProps;\n    var oldContext = context.context,\n      contextType$jscomp$0 = Component.contextType;\n    contextType = emptyContextObject;\n    \"object\" === typeof contextType$jscomp$0 &&\n      null !== contextType$jscomp$0 &&\n      (contextType = readContext(contextType$jscomp$0));\n    var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n    contextType$jscomp$0 =\n      \"function\" === typeof getDerivedStateFromProps ||\n      \"function\" === typeof context.getSnapshotBeforeUpdate;\n    unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps;\n    contextType$jscomp$0 ||\n      (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n        \"function\" !== typeof context.componentWillReceiveProps) ||\n      ((unresolvedOldProps || oldContext !== contextType) &&\n        callComponentWillReceiveProps(\n          workInProgress,\n          context,\n          nextProps,\n          contextType\n        ));\n    hasForceUpdate = !1;\n    var oldState = workInProgress.memoizedState;\n    context.state = oldState;\n    processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n    suspendIfUpdateReadFromEntangledAsyncAction();\n    oldContext = workInProgress.memoizedState;\n    unresolvedOldProps || oldState !== oldContext || hasForceUpdate\n      ? (\"function\" === typeof getDerivedStateFromProps &&\n          (applyDerivedStateFromProps(\n            workInProgress,\n            Component,\n            getDerivedStateFromProps,\n            nextProps\n          ),\n          (oldContext = workInProgress.memoizedState)),\n        (oldProps =\n          hasForceUpdate ||\n          checkShouldComponentUpdate(\n            workInProgress,\n            Component,\n            oldProps,\n            nextProps,\n            oldState,\n            oldContext,\n            contextType\n          ))\n          ? (contextType$jscomp$0 ||\n              (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n                \"function\" !== typeof context.componentWillMount) ||\n              (\"function\" === typeof context.componentWillMount &&\n                context.componentWillMount(),\n              \"function\" === typeof context.UNSAFE_componentWillMount &&\n                context.UNSAFE_componentWillMount()),\n            \"function\" === typeof context.componentDidMount &&\n              (workInProgress.flags |= 4194308))\n          : (\"function\" === typeof context.componentDidMount &&\n              (workInProgress.flags |= 4194308),\n            (workInProgress.memoizedProps = nextProps),\n            (workInProgress.memoizedState = oldContext)),\n        (context.props = nextProps),\n        (context.state = oldContext),\n        (context.context = contextType),\n        (nextProps = oldProps))\n      : (\"function\" === typeof context.componentDidMount &&\n          (workInProgress.flags |= 4194308),\n        (nextProps = !1));\n  } else {\n    context = workInProgress.stateNode;\n    cloneUpdateQueue(current, workInProgress);\n    contextType = workInProgress.memoizedProps;\n    contextType$jscomp$0 = resolveClassComponentProps(Component, contextType);\n    context.props = contextType$jscomp$0;\n    getDerivedStateFromProps = workInProgress.pendingProps;\n    oldState = context.context;\n    oldContext = Component.contextType;\n    oldProps = emptyContextObject;\n    \"object\" === typeof oldContext &&\n      null !== oldContext &&\n      (oldProps = readContext(oldContext));\n    unresolvedOldProps = Component.getDerivedStateFromProps;\n    (oldContext =\n      \"function\" === typeof unresolvedOldProps ||\n      \"function\" === typeof context.getSnapshotBeforeUpdate) ||\n      (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n        \"function\" !== typeof context.componentWillReceiveProps) ||\n      ((contextType !== getDerivedStateFromProps || oldState !== oldProps) &&\n        callComponentWillReceiveProps(\n          workInProgress,\n          context,\n          nextProps,\n          oldProps\n        ));\n    hasForceUpdate = !1;\n    oldState = workInProgress.memoizedState;\n    context.state = oldState;\n    processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n    suspendIfUpdateReadFromEntangledAsyncAction();\n    var newState = workInProgress.memoizedState;\n    contextType !== getDerivedStateFromProps ||\n    oldState !== newState ||\n    hasForceUpdate ||\n    (null !== current &&\n      null !== current.dependencies &&\n      checkIfContextChanged(current.dependencies))\n      ? (\"function\" === typeof unresolvedOldProps &&\n          (applyDerivedStateFromProps(\n            workInProgress,\n            Component,\n            unresolvedOldProps,\n            nextProps\n          ),\n          (newState = workInProgress.memoizedState)),\n        (contextType$jscomp$0 =\n          hasForceUpdate ||\n          checkShouldComponentUpdate(\n            workInProgress,\n            Component,\n            contextType$jscomp$0,\n            nextProps,\n            oldState,\n            newState,\n            oldProps\n          ) ||\n          (null !== current &&\n            null !== current.dependencies &&\n            checkIfContextChanged(current.dependencies)))\n          ? (oldContext ||\n              (\"function\" !== typeof context.UNSAFE_componentWillUpdate &&\n                \"function\" !== typeof context.componentWillUpdate) ||\n              (\"function\" === typeof context.componentWillUpdate &&\n                context.componentWillUpdate(nextProps, newState, oldProps),\n              \"function\" === typeof context.UNSAFE_componentWillUpdate &&\n                context.UNSAFE_componentWillUpdate(\n                  nextProps,\n                  newState,\n                  oldProps\n                )),\n            \"function\" === typeof context.componentDidUpdate &&\n              (workInProgress.flags |= 4),\n            \"function\" === typeof context.getSnapshotBeforeUpdate &&\n              (workInProgress.flags |= 1024))\n          : (\"function\" !== typeof context.componentDidUpdate ||\n              (contextType === current.memoizedProps &&\n                oldState === current.memoizedState) ||\n              (workInProgress.flags |= 4),\n            \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n              (contextType === current.memoizedProps &&\n                oldState === current.memoizedState) ||\n              (workInProgress.flags |= 1024),\n            (workInProgress.memoizedProps = nextProps),\n            (workInProgress.memoizedState = newState)),\n        (context.props = nextProps),\n        (context.state = newState),\n        (context.context = oldProps),\n        (nextProps = contextType$jscomp$0))\n      : (\"function\" !== typeof context.componentDidUpdate ||\n          (contextType === current.memoizedProps &&\n            oldState === current.memoizedState) ||\n          (workInProgress.flags |= 4),\n        \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n          (contextType === current.memoizedProps &&\n            oldState === current.memoizedState) ||\n          (workInProgress.flags |= 1024),\n        (nextProps = !1));\n  }\n  context = nextProps;\n  markRef(current, workInProgress);\n  nextProps = 0 !== (workInProgress.flags & 128);\n  context || nextProps\n    ? ((context = workInProgress.stateNode),\n      (Component =\n        nextProps && \"function\" !== typeof Component.getDerivedStateFromError\n          ? null\n          : context.render()),\n      (workInProgress.flags |= 1),\n      null !== current && nextProps\n        ? ((workInProgress.child = reconcileChildFibers(\n            workInProgress,\n            current.child,\n            null,\n            renderLanes\n          )),\n          (workInProgress.child = reconcileChildFibers(\n            workInProgress,\n            null,\n            Component,\n            renderLanes\n          )))\n        : reconcileChildren(current, workInProgress, Component, renderLanes),\n      (workInProgress.memoizedState = context.state),\n      (current = workInProgress.child))\n    : (current = bailoutOnAlreadyFinishedWork(\n        current,\n        workInProgress,\n        renderLanes\n      ));\n  return current;\n}\nfunction mountHostRootWithoutHydrating(\n  current,\n  workInProgress,\n  nextChildren,\n  renderLanes\n) {\n  resetHydrationState();\n  workInProgress.flags |= 256;\n  reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n  return workInProgress.child;\n}\nvar SUSPENDED_MARKER = {\n  dehydrated: null,\n  treeContext: null,\n  retryLane: 0,\n  hydrationErrors: null\n};\nfunction mountSuspenseOffscreenState(renderLanes) {\n  return { baseLanes: renderLanes, cachePool: getSuspendedCache() };\n}\nfunction getRemainingWorkInPrimaryTree(\n  current,\n  primaryTreeDidDefer,\n  renderLanes\n) {\n  current = null !== current ? current.childLanes & ~renderLanes : 0;\n  primaryTreeDidDefer && (current |= workInProgressDeferredLane);\n  return current;\n}\nfunction updateSuspenseComponent(current, workInProgress, renderLanes) {\n  var nextProps = workInProgress.pendingProps,\n    showFallback = !1,\n    didSuspend = 0 !== (workInProgress.flags & 128),\n    JSCompiler_temp;\n  (JSCompiler_temp = didSuspend) ||\n    (JSCompiler_temp =\n      null !== current && null === current.memoizedState\n        ? !1\n        : 0 !== (suspenseStackCursor.current & 2));\n  JSCompiler_temp && ((showFallback = !0), (workInProgress.flags &= -129));\n  JSCompiler_temp = 0 !== (workInProgress.flags & 32);\n  workInProgress.flags &= -33;\n  if (null === current) {\n    if (isHydrating) {\n      showFallback\n        ? pushPrimaryTreeSuspenseHandler(workInProgress)\n        : reuseSuspenseHandlerOnStack(workInProgress);\n      if (isHydrating) {\n        var nextInstance = nextHydratableInstance,\n          JSCompiler_temp$jscomp$0;\n        if ((JSCompiler_temp$jscomp$0 = nextInstance)) {\n          c: {\n            JSCompiler_temp$jscomp$0 = nextInstance;\n            for (\n              nextInstance = rootOrSingletonContext;\n              8 !== JSCompiler_temp$jscomp$0.nodeType;\n\n            ) {\n              if (!nextInstance) {\n                nextInstance = null;\n                break c;\n              }\n              JSCompiler_temp$jscomp$0 = getNextHydratable(\n                JSCompiler_temp$jscomp$0.nextSibling\n              );\n              if (null === JSCompiler_temp$jscomp$0) {\n                nextInstance = null;\n                break c;\n              }\n            }\n            nextInstance = JSCompiler_temp$jscomp$0;\n          }\n          null !== nextInstance\n            ? ((workInProgress.memoizedState = {\n                dehydrated: nextInstance,\n                treeContext:\n                  null !== treeContextProvider\n                    ? { id: treeContextId, overflow: treeContextOverflow }\n                    : null,\n                retryLane: 536870912,\n                hydrationErrors: null\n              }),\n              (JSCompiler_temp$jscomp$0 = createFiberImplClass(\n                18,\n                null,\n                null,\n                0\n              )),\n              (JSCompiler_temp$jscomp$0.stateNode = nextInstance),\n              (JSCompiler_temp$jscomp$0.return = workInProgress),\n              (workInProgress.child = JSCompiler_temp$jscomp$0),\n              (hydrationParentFiber = workInProgress),\n              (nextHydratableInstance = null),\n              (JSCompiler_temp$jscomp$0 = !0))\n            : (JSCompiler_temp$jscomp$0 = !1);\n        }\n        JSCompiler_temp$jscomp$0 || throwOnHydrationMismatch(workInProgress);\n      }\n      nextInstance = workInProgress.memoizedState;\n      if (\n        null !== nextInstance &&\n        ((nextInstance = nextInstance.dehydrated), null !== nextInstance)\n      )\n        return (\n          isSuspenseInstanceFallback(nextInstance)\n            ? (workInProgress.lanes = 32)\n            : (workInProgress.lanes = 536870912),\n          null\n        );\n      popSuspenseHandler(workInProgress);\n    }\n    nextInstance = nextProps.children;\n    nextProps = nextProps.fallback;\n    if (showFallback)\n      return (\n        reuseSuspenseHandlerOnStack(workInProgress),\n        (showFallback = workInProgress.mode),\n        (nextInstance = mountWorkInProgressOffscreenFiber(\n          { mode: \"hidden\", children: nextInstance },\n          showFallback\n        )),\n        (nextProps = createFiberFromFragment(\n          nextProps,\n          showFallback,\n          renderLanes,\n          null\n        )),\n        (nextInstance.return = workInProgress),\n        (nextProps.return = workInProgress),\n        (nextInstance.sibling = nextProps),\n        (workInProgress.child = nextInstance),\n        (showFallback = workInProgress.child),\n        (showFallback.memoizedState = mountSuspenseOffscreenState(renderLanes)),\n        (showFallback.childLanes = getRemainingWorkInPrimaryTree(\n          current,\n          JSCompiler_temp,\n          renderLanes\n        )),\n        (workInProgress.memoizedState = SUSPENDED_MARKER),\n        nextProps\n      );\n    pushPrimaryTreeSuspenseHandler(workInProgress);\n    return mountSuspensePrimaryChildren(workInProgress, nextInstance);\n  }\n  JSCompiler_temp$jscomp$0 = current.memoizedState;\n  if (\n    null !== JSCompiler_temp$jscomp$0 &&\n    ((nextInstance = JSCompiler_temp$jscomp$0.dehydrated),\n    null !== nextInstance)\n  ) {\n    if (didSuspend)\n      workInProgress.flags & 256\n        ? (pushPrimaryTreeSuspenseHandler(workInProgress),\n          (workInProgress.flags &= -257),\n          (workInProgress = retrySuspenseComponentWithoutHydrating(\n            current,\n            workInProgress,\n            renderLanes\n          )))\n        : null !== workInProgress.memoizedState\n          ? (reuseSuspenseHandlerOnStack(workInProgress),\n            (workInProgress.child = current.child),\n            (workInProgress.flags |= 128),\n            (workInProgress = null))\n          : (reuseSuspenseHandlerOnStack(workInProgress),\n            (showFallback = nextProps.fallback),\n            (nextInstance = workInProgress.mode),\n            (nextProps = mountWorkInProgressOffscreenFiber(\n              { mode: \"visible\", children: nextProps.children },\n              nextInstance\n            )),\n            (showFallback = createFiberFromFragment(\n              showFallback,\n              nextInstance,\n              renderLanes,\n              null\n            )),\n            (showFallback.flags |= 2),\n            (nextProps.return = workInProgress),\n            (showFallback.return = workInProgress),\n            (nextProps.sibling = showFallback),\n            (workInProgress.child = nextProps),\n            reconcileChildFibers(\n              workInProgress,\n              current.child,\n              null,\n              renderLanes\n            ),\n            (nextProps = workInProgress.child),\n            (nextProps.memoizedState =\n              mountSuspenseOffscreenState(renderLanes)),\n            (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n              current,\n              JSCompiler_temp,\n              renderLanes\n            )),\n            (workInProgress.memoizedState = SUSPENDED_MARKER),\n            (workInProgress = showFallback));\n    else if (\n      (pushPrimaryTreeSuspenseHandler(workInProgress),\n      isSuspenseInstanceFallback(nextInstance))\n    ) {\n      JSCompiler_temp =\n        nextInstance.nextSibling && nextInstance.nextSibling.dataset;\n      if (JSCompiler_temp) var digest = JSCompiler_temp.dgst;\n      JSCompiler_temp = digest;\n      nextProps = Error(formatProdErrorMessage(419));\n      nextProps.stack = \"\";\n      nextProps.digest = JSCompiler_temp;\n      queueHydrationError({ value: nextProps, source: null, stack: null });\n      workInProgress = retrySuspenseComponentWithoutHydrating(\n        current,\n        workInProgress,\n        renderLanes\n      );\n    } else if (\n      (didReceiveUpdate ||\n        propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n      (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)),\n      didReceiveUpdate || JSCompiler_temp)\n    ) {\n      JSCompiler_temp = workInProgressRoot;\n      if (\n        null !== JSCompiler_temp &&\n        ((nextProps = renderLanes & -renderLanes),\n        (nextProps =\n          0 !== (nextProps & 42)\n            ? 1\n            : getBumpedLaneForHydrationByLane(nextProps)),\n        (nextProps =\n          0 !== (nextProps & (JSCompiler_temp.suspendedLanes | renderLanes))\n            ? 0\n            : nextProps),\n        0 !== nextProps && nextProps !== JSCompiler_temp$jscomp$0.retryLane)\n      )\n        throw (\n          ((JSCompiler_temp$jscomp$0.retryLane = nextProps),\n          enqueueConcurrentRenderForLane(current, nextProps),\n          scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps),\n          SelectiveHydrationException)\n        );\n      \"$?\" === nextInstance.data || renderDidSuspendDelayIfPossible();\n      workInProgress = retrySuspenseComponentWithoutHydrating(\n        current,\n        workInProgress,\n        renderLanes\n      );\n    } else\n      \"$?\" === nextInstance.data\n        ? ((workInProgress.flags |= 192),\n          (workInProgress.child = current.child),\n          (workInProgress = null))\n        : ((current = JSCompiler_temp$jscomp$0.treeContext),\n          (nextHydratableInstance = getNextHydratable(\n            nextInstance.nextSibling\n          )),\n          (hydrationParentFiber = workInProgress),\n          (isHydrating = !0),\n          (hydrationErrors = null),\n          (rootOrSingletonContext = !1),\n          null !== current &&\n            ((idStack[idStackIndex++] = treeContextId),\n            (idStack[idStackIndex++] = treeContextOverflow),\n            (idStack[idStackIndex++] = treeContextProvider),\n            (treeContextId = current.id),\n            (treeContextOverflow = current.overflow),\n            (treeContextProvider = workInProgress)),\n          (workInProgress = mountSuspensePrimaryChildren(\n            workInProgress,\n            nextProps.children\n          )),\n          (workInProgress.flags |= 4096));\n    return workInProgress;\n  }\n  if (showFallback)\n    return (\n      reuseSuspenseHandlerOnStack(workInProgress),\n      (showFallback = nextProps.fallback),\n      (nextInstance = workInProgress.mode),\n      (JSCompiler_temp$jscomp$0 = current.child),\n      (digest = JSCompiler_temp$jscomp$0.sibling),\n      (nextProps = createWorkInProgress(JSCompiler_temp$jscomp$0, {\n        mode: \"hidden\",\n        children: nextProps.children\n      })),\n      (nextProps.subtreeFlags =\n        JSCompiler_temp$jscomp$0.subtreeFlags & 65011712),\n      null !== digest\n        ? (showFallback = createWorkInProgress(digest, showFallback))\n        : ((showFallback = createFiberFromFragment(\n            showFallback,\n            nextInstance,\n            renderLanes,\n            null\n          )),\n          (showFallback.flags |= 2)),\n      (showFallback.return = workInProgress),\n      (nextProps.return = workInProgress),\n      (nextProps.sibling = showFallback),\n      (workInProgress.child = nextProps),\n      (nextProps = showFallback),\n      (showFallback = workInProgress.child),\n      (nextInstance = current.child.memoizedState),\n      null === nextInstance\n        ? (nextInstance = mountSuspenseOffscreenState(renderLanes))\n        : ((JSCompiler_temp$jscomp$0 = nextInstance.cachePool),\n          null !== JSCompiler_temp$jscomp$0\n            ? ((digest = CacheContext._currentValue),\n              (JSCompiler_temp$jscomp$0 =\n                JSCompiler_temp$jscomp$0.parent !== digest\n                  ? { parent: digest, pool: digest }\n                  : JSCompiler_temp$jscomp$0))\n            : (JSCompiler_temp$jscomp$0 = getSuspendedCache()),\n          (nextInstance = {\n            baseLanes: nextInstance.baseLanes | renderLanes,\n            cachePool: JSCompiler_temp$jscomp$0\n          })),\n      (showFallback.memoizedState = nextInstance),\n      (showFallback.childLanes = getRemainingWorkInPrimaryTree(\n        current,\n        JSCompiler_temp,\n        renderLanes\n      )),\n      (workInProgress.memoizedState = SUSPENDED_MARKER),\n      nextProps\n    );\n  pushPrimaryTreeSuspenseHandler(workInProgress);\n  renderLanes = current.child;\n  current = renderLanes.sibling;\n  renderLanes = createWorkInProgress(renderLanes, {\n    mode: \"visible\",\n    children: nextProps.children\n  });\n  renderLanes.return = workInProgress;\n  renderLanes.sibling = null;\n  null !== current &&\n    ((JSCompiler_temp = workInProgress.deletions),\n    null === JSCompiler_temp\n      ? ((workInProgress.deletions = [current]), (workInProgress.flags |= 16))\n      : JSCompiler_temp.push(current));\n  workInProgress.child = renderLanes;\n  workInProgress.memoizedState = null;\n  return renderLanes;\n}\nfunction mountSuspensePrimaryChildren(workInProgress, primaryChildren) {\n  primaryChildren = mountWorkInProgressOffscreenFiber(\n    { mode: \"visible\", children: primaryChildren },\n    workInProgress.mode\n  );\n  primaryChildren.return = workInProgress;\n  return (workInProgress.child = primaryChildren);\n}\nfunction mountWorkInProgressOffscreenFiber(offscreenProps, mode) {\n  offscreenProps = createFiberImplClass(22, offscreenProps, null, mode);\n  offscreenProps.lanes = 0;\n  offscreenProps.stateNode = {\n    _visibility: 1,\n    _pendingMarkers: null,\n    _retryCache: null,\n    _transitions: null\n  };\n  return offscreenProps;\n}\nfunction retrySuspenseComponentWithoutHydrating(\n  current,\n  workInProgress,\n  renderLanes\n) {\n  reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n  current = mountSuspensePrimaryChildren(\n    workInProgress,\n    workInProgress.pendingProps.children\n  );\n  current.flags |= 2;\n  workInProgress.memoizedState = null;\n  return current;\n}\nfunction scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {\n  fiber.lanes |= renderLanes;\n  var alternate = fiber.alternate;\n  null !== alternate && (alternate.lanes |= renderLanes);\n  scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);\n}\nfunction initSuspenseListRenderState(\n  workInProgress,\n  isBackwards,\n  tail,\n  lastContentRow,\n  tailMode\n) {\n  var renderState = workInProgress.memoizedState;\n  null === renderState\n    ? (workInProgress.memoizedState = {\n        isBackwards: isBackwards,\n        rendering: null,\n        renderingStartTime: 0,\n        last: lastContentRow,\n        tail: tail,\n        tailMode: tailMode\n      })\n    : ((renderState.isBackwards = isBackwards),\n      (renderState.rendering = null),\n      (renderState.renderingStartTime = 0),\n      (renderState.last = lastContentRow),\n      (renderState.tail = tail),\n      (renderState.tailMode = tailMode));\n}\nfunction updateSuspenseListComponent(current, workInProgress, renderLanes) {\n  var nextProps = workInProgress.pendingProps,\n    revealOrder = nextProps.revealOrder,\n    tailMode = nextProps.tail;\n  reconcileChildren(current, workInProgress, nextProps.children, renderLanes);\n  nextProps = suspenseStackCursor.current;\n  if (0 !== (nextProps & 2))\n    (nextProps = (nextProps & 1) | 2), (workInProgress.flags |= 128);\n  else {\n    if (null !== current && 0 !== (current.flags & 128))\n      a: for (current = workInProgress.child; null !== current; ) {\n        if (13 === current.tag)\n          null !== current.memoizedState &&\n            scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n        else if (19 === current.tag)\n          scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n        else if (null !== current.child) {\n          current.child.return = current;\n          current = current.child;\n          continue;\n        }\n        if (current === workInProgress) break a;\n        for (; null === current.sibling; ) {\n          if (null === current.return || current.return === workInProgress)\n            break a;\n          current = current.return;\n        }\n        current.sibling.return = current.return;\n        current = current.sibling;\n      }\n    nextProps &= 1;\n  }\n  push(suspenseStackCursor, nextProps);\n  switch (revealOrder) {\n    case \"forwards\":\n      renderLanes = workInProgress.child;\n      for (revealOrder = null; null !== renderLanes; )\n        (current = renderLanes.alternate),\n          null !== current &&\n            null === findFirstSuspended(current) &&\n            (revealOrder = renderLanes),\n          (renderLanes = renderLanes.sibling);\n      renderLanes = revealOrder;\n      null === renderLanes\n        ? ((revealOrder = workInProgress.child), (workInProgress.child = null))\n        : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null));\n      initSuspenseListRenderState(\n        workInProgress,\n        !1,\n        revealOrder,\n        renderLanes,\n        tailMode\n      );\n      break;\n    case \"backwards\":\n      renderLanes = null;\n      revealOrder = workInProgress.child;\n      for (workInProgress.child = null; null !== revealOrder; ) {\n        current = revealOrder.alternate;\n        if (null !== current && null === findFirstSuspended(current)) {\n          workInProgress.child = revealOrder;\n          break;\n        }\n        current = revealOrder.sibling;\n        revealOrder.sibling = renderLanes;\n        renderLanes = revealOrder;\n        revealOrder = current;\n      }\n      initSuspenseListRenderState(\n        workInProgress,\n        !0,\n        renderLanes,\n        null,\n        tailMode\n      );\n      break;\n    case \"together\":\n      initSuspenseListRenderState(workInProgress, !1, null, null, void 0);\n      break;\n    default:\n      workInProgress.memoizedState = null;\n  }\n  return workInProgress.child;\n}\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {\n  null !== current && (workInProgress.dependencies = current.dependencies);\n  workInProgressRootSkippedLanes |= workInProgress.lanes;\n  if (0 === (renderLanes & workInProgress.childLanes))\n    if (null !== current) {\n      if (\n        (propagateParentContextChanges(\n          current,\n          workInProgress,\n          renderLanes,\n          !1\n        ),\n        0 === (renderLanes & workInProgress.childLanes))\n      )\n        return null;\n    } else return null;\n  if (null !== current && workInProgress.child !== current.child)\n    throw Error(formatProdErrorMessage(153));\n  if (null !== workInProgress.child) {\n    current = workInProgress.child;\n    renderLanes = createWorkInProgress(current, current.pendingProps);\n    workInProgress.child = renderLanes;\n    for (renderLanes.return = workInProgress; null !== current.sibling; )\n      (current = current.sibling),\n        (renderLanes = renderLanes.sibling =\n          createWorkInProgress(current, current.pendingProps)),\n        (renderLanes.return = workInProgress);\n    renderLanes.sibling = null;\n  }\n  return workInProgress.child;\n}\nfunction checkScheduledUpdateOrContext(current, renderLanes) {\n  if (0 !== (current.lanes & renderLanes)) return !0;\n  current = current.dependencies;\n  return null !== current && checkIfContextChanged(current) ? !0 : !1;\n}\nfunction attemptEarlyBailoutIfNoScheduledUpdate(\n  current,\n  workInProgress,\n  renderLanes\n) {\n  switch (workInProgress.tag) {\n    case 3:\n      pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n      pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n      resetHydrationState();\n      break;\n    case 27:\n    case 5:\n      pushHostContext(workInProgress);\n      break;\n    case 4:\n      pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n      break;\n    case 10:\n      pushProvider(\n        workInProgress,\n        workInProgress.type,\n        workInProgress.memoizedProps.value\n      );\n      break;\n    case 13:\n      var state = workInProgress.memoizedState;\n      if (null !== state) {\n        if (null !== state.dehydrated)\n          return (\n            pushPrimaryTreeSuspenseHandler(workInProgress),\n            (workInProgress.flags |= 128),\n            null\n          );\n        if (0 !== (renderLanes & workInProgress.child.childLanes))\n          return updateSuspenseComponent(current, workInProgress, renderLanes);\n        pushPrimaryTreeSuspenseHandler(workInProgress);\n        current = bailoutOnAlreadyFinishedWork(\n          current,\n          workInProgress,\n          renderLanes\n        );\n        return null !== current ? current.sibling : null;\n      }\n      pushPrimaryTreeSuspenseHandler(workInProgress);\n      break;\n    case 19:\n      var didSuspendBefore = 0 !== (current.flags & 128);\n      state = 0 !== (renderLanes & workInProgress.childLanes);\n      state ||\n        (propagateParentContextChanges(\n          current,\n          workInProgress,\n          renderLanes,\n          !1\n        ),\n        (state = 0 !== (renderLanes & workInProgress.childLanes)));\n      if (didSuspendBefore) {\n        if (state)\n          return updateSuspenseListComponent(\n            current,\n            workInProgress,\n            renderLanes\n          );\n        workInProgress.flags |= 128;\n      }\n      didSuspendBefore = workInProgress.memoizedState;\n      null !== didSuspendBefore &&\n        ((didSuspendBefore.rendering = null),\n        (didSuspendBefore.tail = null),\n        (didSuspendBefore.lastEffect = null));\n      push(suspenseStackCursor, suspenseStackCursor.current);\n      if (state) break;\n      else return null;\n    case 22:\n    case 23:\n      return (\n        (workInProgress.lanes = 0),\n        updateOffscreenComponent(current, workInProgress, renderLanes)\n      );\n    case 24:\n      pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n  }\n  return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n}\nfunction beginWork(current, workInProgress, renderLanes) {\n  if (null !== current)\n    if (current.memoizedProps !== workInProgress.pendingProps)\n      didReceiveUpdate = !0;\n    else {\n      if (\n        !checkScheduledUpdateOrContext(current, renderLanes) &&\n        0 === (workInProgress.flags & 128)\n      )\n        return (\n          (didReceiveUpdate = !1),\n          attemptEarlyBailoutIfNoScheduledUpdate(\n            current,\n            workInProgress,\n            renderLanes\n          )\n        );\n      didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1;\n    }\n  else\n    (didReceiveUpdate = !1),\n      isHydrating &&\n        0 !== (workInProgress.flags & 1048576) &&\n        pushTreeId(workInProgress, treeForkCount, workInProgress.index);\n  workInProgress.lanes = 0;\n  switch (workInProgress.tag) {\n    case 16:\n      a: {\n        current = workInProgress.pendingProps;\n        var lazyComponent = workInProgress.elementType,\n          init = lazyComponent._init;\n        lazyComponent = init(lazyComponent._payload);\n        workInProgress.type = lazyComponent;\n        if (\"function\" === typeof lazyComponent)\n          shouldConstruct(lazyComponent)\n            ? ((current = resolveClassComponentProps(lazyComponent, current)),\n              (workInProgress.tag = 1),\n              (workInProgress = updateClassComponent(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              )))\n            : ((workInProgress.tag = 0),\n              (workInProgress = updateFunctionComponent(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              )));\n        else {\n          if (void 0 !== lazyComponent && null !== lazyComponent)\n            if (\n              ((init = lazyComponent.$$typeof), init === REACT_FORWARD_REF_TYPE)\n            ) {\n              workInProgress.tag = 11;\n              workInProgress = updateForwardRef(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              );\n              break a;\n            } else if (init === REACT_MEMO_TYPE) {\n              workInProgress.tag = 14;\n              workInProgress = updateMemoComponent(\n                null,\n                workInProgress,\n                lazyComponent,\n                current,\n                renderLanes\n              );\n              break a;\n            }\n          workInProgress =\n            getComponentNameFromType(lazyComponent) || lazyComponent;\n          throw Error(formatProdErrorMessage(306, workInProgress, \"\"));\n        }\n      }\n      return workInProgress;\n    case 0:\n      return updateFunctionComponent(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 1:\n      return (\n        (lazyComponent = workInProgress.type),\n        (init = resolveClassComponentProps(\n          lazyComponent,\n          workInProgress.pendingProps\n        )),\n        updateClassComponent(\n          current,\n          workInProgress,\n          lazyComponent,\n          init,\n          renderLanes\n        )\n      );\n    case 3:\n      a: {\n        pushHostContainer(\n          workInProgress,\n          workInProgress.stateNode.containerInfo\n        );\n        if (null === current) throw Error(formatProdErrorMessage(387));\n        lazyComponent = workInProgress.pendingProps;\n        var prevState = workInProgress.memoizedState;\n        init = prevState.element;\n        cloneUpdateQueue(current, workInProgress);\n        processUpdateQueue(workInProgress, lazyComponent, null, renderLanes);\n        var nextState = workInProgress.memoizedState;\n        lazyComponent = nextState.cache;\n        pushProvider(workInProgress, CacheContext, lazyComponent);\n        lazyComponent !== prevState.cache &&\n          propagateContextChanges(\n            workInProgress,\n            [CacheContext],\n            renderLanes,\n            !0\n          );\n        suspendIfUpdateReadFromEntangledAsyncAction();\n        lazyComponent = nextState.element;\n        if (prevState.isDehydrated)\n          if (\n            ((prevState = {\n              element: lazyComponent,\n              isDehydrated: !1,\n              cache: nextState.cache\n            }),\n            (workInProgress.updateQueue.baseState = prevState),\n            (workInProgress.memoizedState = prevState),\n            workInProgress.flags & 256)\n          ) {\n            workInProgress = mountHostRootWithoutHydrating(\n              current,\n              workInProgress,\n              lazyComponent,\n              renderLanes\n            );\n            break a;\n          } else if (lazyComponent !== init) {\n            init = createCapturedValueAtFiber(\n              Error(formatProdErrorMessage(424)),\n              workInProgress\n            );\n            queueHydrationError(init);\n            workInProgress = mountHostRootWithoutHydrating(\n              current,\n              workInProgress,\n              lazyComponent,\n              renderLanes\n            );\n            break a;\n          } else {\n            current = workInProgress.stateNode.containerInfo;\n            switch (current.nodeType) {\n              case 9:\n                current = current.body;\n                break;\n              default:\n                current =\n                  \"HTML\" === current.nodeName\n                    ? current.ownerDocument.body\n                    : current;\n            }\n            nextHydratableInstance = getNextHydratable(current.firstChild);\n            hydrationParentFiber = workInProgress;\n            isHydrating = !0;\n            hydrationErrors = null;\n            rootOrSingletonContext = !0;\n            renderLanes = mountChildFibers(\n              workInProgress,\n              null,\n              lazyComponent,\n              renderLanes\n            );\n            for (workInProgress.child = renderLanes; renderLanes; )\n              (renderLanes.flags = (renderLanes.flags & -3) | 4096),\n                (renderLanes = renderLanes.sibling);\n          }\n        else {\n          resetHydrationState();\n          if (lazyComponent === init) {\n            workInProgress = bailoutOnAlreadyFinishedWork(\n              current,\n              workInProgress,\n              renderLanes\n            );\n            break a;\n          }\n          reconcileChildren(\n            current,\n            workInProgress,\n            lazyComponent,\n            renderLanes\n          );\n        }\n        workInProgress = workInProgress.child;\n      }\n      return workInProgress;\n    case 26:\n      return (\n        markRef(current, workInProgress),\n        null === current\n          ? (renderLanes = getResource(\n              workInProgress.type,\n              null,\n              workInProgress.pendingProps,\n              null\n            ))\n            ? (workInProgress.memoizedState = renderLanes)\n            : isHydrating ||\n              ((renderLanes = workInProgress.type),\n              (current = workInProgress.pendingProps),\n              (lazyComponent = getOwnerDocumentFromRootContainer(\n                rootInstanceStackCursor.current\n              ).createElement(renderLanes)),\n              (lazyComponent[internalInstanceKey] = workInProgress),\n              (lazyComponent[internalPropsKey] = current),\n              setInitialProperties(lazyComponent, renderLanes, current),\n              markNodeAsHoistable(lazyComponent),\n              (workInProgress.stateNode = lazyComponent))\n          : (workInProgress.memoizedState = getResource(\n              workInProgress.type,\n              current.memoizedProps,\n              workInProgress.pendingProps,\n              current.memoizedState\n            )),\n        null\n      );\n    case 27:\n      return (\n        pushHostContext(workInProgress),\n        null === current &&\n          isHydrating &&\n          ((lazyComponent = workInProgress.stateNode =\n            resolveSingletonInstance(\n              workInProgress.type,\n              workInProgress.pendingProps,\n              rootInstanceStackCursor.current\n            )),\n          (hydrationParentFiber = workInProgress),\n          (rootOrSingletonContext = !0),\n          (init = nextHydratableInstance),\n          isSingletonScope(workInProgress.type)\n            ? ((previousHydratableOnEnteringScopedSingleton = init),\n              (nextHydratableInstance = getNextHydratable(\n                lazyComponent.firstChild\n              )))\n            : (nextHydratableInstance = init)),\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        markRef(current, workInProgress),\n        null === current && (workInProgress.flags |= 4194304),\n        workInProgress.child\n      );\n    case 5:\n      if (null === current && isHydrating) {\n        if ((init = lazyComponent = nextHydratableInstance))\n          (lazyComponent = canHydrateInstance(\n            lazyComponent,\n            workInProgress.type,\n            workInProgress.pendingProps,\n            rootOrSingletonContext\n          )),\n            null !== lazyComponent\n              ? ((workInProgress.stateNode = lazyComponent),\n                (hydrationParentFiber = workInProgress),\n                (nextHydratableInstance = getNextHydratable(\n                  lazyComponent.firstChild\n                )),\n                (rootOrSingletonContext = !1),\n                (init = !0))\n              : (init = !1);\n        init || throwOnHydrationMismatch(workInProgress);\n      }\n      pushHostContext(workInProgress);\n      init = workInProgress.type;\n      prevState = workInProgress.pendingProps;\n      nextState = null !== current ? current.memoizedProps : null;\n      lazyComponent = prevState.children;\n      shouldSetTextContent(init, prevState)\n        ? (lazyComponent = null)\n        : null !== nextState &&\n          shouldSetTextContent(init, nextState) &&\n          (workInProgress.flags |= 32);\n      null !== workInProgress.memoizedState &&\n        ((init = renderWithHooks(\n          current,\n          workInProgress,\n          TransitionAwareHostComponent,\n          null,\n          null,\n          renderLanes\n        )),\n        (HostTransitionContext._currentValue = init));\n      markRef(current, workInProgress);\n      reconcileChildren(current, workInProgress, lazyComponent, renderLanes);\n      return workInProgress.child;\n    case 6:\n      if (null === current && isHydrating) {\n        if ((current = renderLanes = nextHydratableInstance))\n          (renderLanes = canHydrateTextInstance(\n            renderLanes,\n            workInProgress.pendingProps,\n            rootOrSingletonContext\n          )),\n            null !== renderLanes\n              ? ((workInProgress.stateNode = renderLanes),\n                (hydrationParentFiber = workInProgress),\n                (nextHydratableInstance = null),\n                (current = !0))\n              : (current = !1);\n        current || throwOnHydrationMismatch(workInProgress);\n      }\n      return null;\n    case 13:\n      return updateSuspenseComponent(current, workInProgress, renderLanes);\n    case 4:\n      return (\n        pushHostContainer(\n          workInProgress,\n          workInProgress.stateNode.containerInfo\n        ),\n        (lazyComponent = workInProgress.pendingProps),\n        null === current\n          ? (workInProgress.child = reconcileChildFibers(\n              workInProgress,\n              null,\n              lazyComponent,\n              renderLanes\n            ))\n          : reconcileChildren(\n              current,\n              workInProgress,\n              lazyComponent,\n              renderLanes\n            ),\n        workInProgress.child\n      );\n    case 11:\n      return updateForwardRef(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 7:\n      return (\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 8:\n      return (\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 12:\n      return (\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 10:\n      return (\n        (lazyComponent = workInProgress.pendingProps),\n        pushProvider(workInProgress, workInProgress.type, lazyComponent.value),\n        reconcileChildren(\n          current,\n          workInProgress,\n          lazyComponent.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 9:\n      return (\n        (init = workInProgress.type._context),\n        (lazyComponent = workInProgress.pendingProps.children),\n        prepareToReadContext(workInProgress),\n        (init = readContext(init)),\n        (lazyComponent = lazyComponent(init)),\n        (workInProgress.flags |= 1),\n        reconcileChildren(current, workInProgress, lazyComponent, renderLanes),\n        workInProgress.child\n      );\n    case 14:\n      return updateMemoComponent(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 15:\n      return updateSimpleMemoComponent(\n        current,\n        workInProgress,\n        workInProgress.type,\n        workInProgress.pendingProps,\n        renderLanes\n      );\n    case 19:\n      return updateSuspenseListComponent(current, workInProgress, renderLanes);\n    case 31:\n      return (\n        (lazyComponent = workInProgress.pendingProps),\n        (renderLanes = workInProgress.mode),\n        (lazyComponent = {\n          mode: lazyComponent.mode,\n          children: lazyComponent.children\n        }),\n        null === current\n          ? ((renderLanes = mountWorkInProgressOffscreenFiber(\n              lazyComponent,\n              renderLanes\n            )),\n            (renderLanes.ref = workInProgress.ref),\n            (workInProgress.child = renderLanes),\n            (renderLanes.return = workInProgress),\n            (workInProgress = renderLanes))\n          : ((renderLanes = createWorkInProgress(current.child, lazyComponent)),\n            (renderLanes.ref = workInProgress.ref),\n            (workInProgress.child = renderLanes),\n            (renderLanes.return = workInProgress),\n            (workInProgress = renderLanes)),\n        workInProgress\n      );\n    case 22:\n      return updateOffscreenComponent(current, workInProgress, renderLanes);\n    case 24:\n      return (\n        prepareToReadContext(workInProgress),\n        (lazyComponent = readContext(CacheContext)),\n        null === current\n          ? ((init = peekCacheFromPool()),\n            null === init &&\n              ((init = workInProgressRoot),\n              (prevState = createCache()),\n              (init.pooledCache = prevState),\n              prevState.refCount++,\n              null !== prevState && (init.pooledCacheLanes |= renderLanes),\n              (init = prevState)),\n            (workInProgress.memoizedState = {\n              parent: lazyComponent,\n              cache: init\n            }),\n            initializeUpdateQueue(workInProgress),\n            pushProvider(workInProgress, CacheContext, init))\n          : (0 !== (current.lanes & renderLanes) &&\n              (cloneUpdateQueue(current, workInProgress),\n              processUpdateQueue(workInProgress, null, null, renderLanes),\n              suspendIfUpdateReadFromEntangledAsyncAction()),\n            (init = current.memoizedState),\n            (prevState = workInProgress.memoizedState),\n            init.parent !== lazyComponent\n              ? ((init = { parent: lazyComponent, cache: lazyComponent }),\n                (workInProgress.memoizedState = init),\n                0 === workInProgress.lanes &&\n                  (workInProgress.memoizedState =\n                    workInProgress.updateQueue.baseState =\n                      init),\n                pushProvider(workInProgress, CacheContext, lazyComponent))\n              : ((lazyComponent = prevState.cache),\n                pushProvider(workInProgress, CacheContext, lazyComponent),\n                lazyComponent !== init.cache &&\n                  propagateContextChanges(\n                    workInProgress,\n                    [CacheContext],\n                    renderLanes,\n                    !0\n                  ))),\n        reconcileChildren(\n          current,\n          workInProgress,\n          workInProgress.pendingProps.children,\n          renderLanes\n        ),\n        workInProgress.child\n      );\n    case 29:\n      throw workInProgress.pendingProps;\n  }\n  throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction markUpdate(workInProgress) {\n  workInProgress.flags |= 4;\n}\nfunction preloadResourceAndSuspendIfNeeded(workInProgress, resource) {\n  if (\"stylesheet\" !== resource.type || 0 !== (resource.state.loading & 4))\n    workInProgress.flags &= -16777217;\n  else if (((workInProgress.flags |= 16777216), !preloadResource(resource))) {\n    resource = suspenseHandlerStackCursor.current;\n    if (\n      null !== resource &&\n      ((workInProgressRootRenderLanes & 4194048) ===\n      workInProgressRootRenderLanes\n        ? null !== shellBoundary\n        : ((workInProgressRootRenderLanes & 62914560) !==\n            workInProgressRootRenderLanes &&\n            0 === (workInProgressRootRenderLanes & 536870912)) ||\n          resource !== shellBoundary)\n    )\n      throw (\n        ((suspendedThenable = noopSuspenseyCommitThenable),\n        SuspenseyCommitException)\n      );\n    workInProgress.flags |= 8192;\n  }\n}\nfunction scheduleRetryEffect(workInProgress, retryQueue) {\n  null !== retryQueue && (workInProgress.flags |= 4);\n  workInProgress.flags & 16384 &&\n    ((retryQueue =\n      22 !== workInProgress.tag ? claimNextRetryLane() : 536870912),\n    (workInProgress.lanes |= retryQueue),\n    (workInProgressSuspendedRetryLanes |= retryQueue));\n}\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n  if (!isHydrating)\n    switch (renderState.tailMode) {\n      case \"hidden\":\n        hasRenderedATailFallback = renderState.tail;\n        for (var lastTailNode = null; null !== hasRenderedATailFallback; )\n          null !== hasRenderedATailFallback.alternate &&\n            (lastTailNode = hasRenderedATailFallback),\n            (hasRenderedATailFallback = hasRenderedATailFallback.sibling);\n        null === lastTailNode\n          ? (renderState.tail = null)\n          : (lastTailNode.sibling = null);\n        break;\n      case \"collapsed\":\n        lastTailNode = renderState.tail;\n        for (var lastTailNode$113 = null; null !== lastTailNode; )\n          null !== lastTailNode.alternate && (lastTailNode$113 = lastTailNode),\n            (lastTailNode = lastTailNode.sibling);\n        null === lastTailNode$113\n          ? hasRenderedATailFallback || null === renderState.tail\n            ? (renderState.tail = null)\n            : (renderState.tail.sibling = null)\n          : (lastTailNode$113.sibling = null);\n    }\n}\nfunction bubbleProperties(completedWork) {\n  var didBailout =\n      null !== completedWork.alternate &&\n      completedWork.alternate.child === completedWork.child,\n    newChildLanes = 0,\n    subtreeFlags = 0;\n  if (didBailout)\n    for (var child$114 = completedWork.child; null !== child$114; )\n      (newChildLanes |= child$114.lanes | child$114.childLanes),\n        (subtreeFlags |= child$114.subtreeFlags & 65011712),\n        (subtreeFlags |= child$114.flags & 65011712),\n        (child$114.return = completedWork),\n        (child$114 = child$114.sibling);\n  else\n    for (child$114 = completedWork.child; null !== child$114; )\n      (newChildLanes |= child$114.lanes | child$114.childLanes),\n        (subtreeFlags |= child$114.subtreeFlags),\n        (subtreeFlags |= child$114.flags),\n        (child$114.return = completedWork),\n        (child$114 = child$114.sibling);\n  completedWork.subtreeFlags |= subtreeFlags;\n  completedWork.childLanes = newChildLanes;\n  return didBailout;\n}\nfunction completeWork(current, workInProgress, renderLanes) {\n  var newProps = workInProgress.pendingProps;\n  popTreeContext(workInProgress);\n  switch (workInProgress.tag) {\n    case 31:\n    case 16:\n    case 15:\n    case 0:\n    case 11:\n    case 7:\n    case 8:\n    case 12:\n    case 9:\n    case 14:\n      return bubbleProperties(workInProgress), null;\n    case 1:\n      return bubbleProperties(workInProgress), null;\n    case 3:\n      renderLanes = workInProgress.stateNode;\n      newProps = null;\n      null !== current && (newProps = current.memoizedState.cache);\n      workInProgress.memoizedState.cache !== newProps &&\n        (workInProgress.flags |= 2048);\n      popProvider(CacheContext);\n      popHostContainer();\n      renderLanes.pendingContext &&\n        ((renderLanes.context = renderLanes.pendingContext),\n        (renderLanes.pendingContext = null));\n      if (null === current || null === current.child)\n        popHydrationState(workInProgress)\n          ? markUpdate(workInProgress)\n          : null === current ||\n            (current.memoizedState.isDehydrated &&\n              0 === (workInProgress.flags & 256)) ||\n            ((workInProgress.flags |= 1024),\n            upgradeHydrationErrorsToRecoverable());\n      bubbleProperties(workInProgress);\n      return null;\n    case 26:\n      return (\n        (renderLanes = workInProgress.memoizedState),\n        null === current\n          ? (markUpdate(workInProgress),\n            null !== renderLanes\n              ? (bubbleProperties(workInProgress),\n                preloadResourceAndSuspendIfNeeded(workInProgress, renderLanes))\n              : (bubbleProperties(workInProgress),\n                (workInProgress.flags &= -16777217)))\n          : renderLanes\n            ? renderLanes !== current.memoizedState\n              ? (markUpdate(workInProgress),\n                bubbleProperties(workInProgress),\n                preloadResourceAndSuspendIfNeeded(workInProgress, renderLanes))\n              : (bubbleProperties(workInProgress),\n                (workInProgress.flags &= -16777217))\n            : (current.memoizedProps !== newProps && markUpdate(workInProgress),\n              bubbleProperties(workInProgress),\n              (workInProgress.flags &= -16777217)),\n        null\n      );\n    case 27:\n      popHostContext(workInProgress);\n      renderLanes = rootInstanceStackCursor.current;\n      var type = workInProgress.type;\n      if (null !== current && null != workInProgress.stateNode)\n        current.memoizedProps !== newProps && markUpdate(workInProgress);\n      else {\n        if (!newProps) {\n          if (null === workInProgress.stateNode)\n            throw Error(formatProdErrorMessage(166));\n          bubbleProperties(workInProgress);\n          return null;\n        }\n        current = contextStackCursor.current;\n        popHydrationState(workInProgress)\n          ? prepareToHydrateHostInstance(workInProgress, current)\n          : ((current = resolveSingletonInstance(type, newProps, renderLanes)),\n            (workInProgress.stateNode = current),\n            markUpdate(workInProgress));\n      }\n      bubbleProperties(workInProgress);\n      return null;\n    case 5:\n      popHostContext(workInProgress);\n      renderLanes = workInProgress.type;\n      if (null !== current && null != workInProgress.stateNode)\n        current.memoizedProps !== newProps && markUpdate(workInProgress);\n      else {\n        if (!newProps) {\n          if (null === workInProgress.stateNode)\n            throw Error(formatProdErrorMessage(166));\n          bubbleProperties(workInProgress);\n          return null;\n        }\n        current = contextStackCursor.current;\n        if (popHydrationState(workInProgress))\n          prepareToHydrateHostInstance(workInProgress, current);\n        else {\n          type = getOwnerDocumentFromRootContainer(\n            rootInstanceStackCursor.current\n          );\n          switch (current) {\n            case 1:\n              current = type.createElementNS(\n                \"http://www.w3.org/2000/svg\",\n                renderLanes\n              );\n              break;\n            case 2:\n              current = type.createElementNS(\n                \"http://www.w3.org/1998/Math/MathML\",\n                renderLanes\n              );\n              break;\n            default:\n              switch (renderLanes) {\n                case \"svg\":\n                  current = type.createElementNS(\n                    \"http://www.w3.org/2000/svg\",\n                    renderLanes\n                  );\n                  break;\n                case \"math\":\n                  current = type.createElementNS(\n                    \"http://www.w3.org/1998/Math/MathML\",\n                    renderLanes\n                  );\n                  break;\n                case \"script\":\n                  current = type.createElement(\"div\");\n                  current.innerHTML = \"<script>\\x3c/script>\";\n                  current = current.removeChild(current.firstChild);\n                  break;\n                case \"select\":\n                  current =\n                    \"string\" === typeof newProps.is\n                      ? type.createElement(\"select\", { is: newProps.is })\n                      : type.createElement(\"select\");\n                  newProps.multiple\n                    ? (current.multiple = !0)\n                    : newProps.size && (current.size = newProps.size);\n                  break;\n                default:\n                  current =\n                    \"string\" === typeof newProps.is\n                      ? type.createElement(renderLanes, { is: newProps.is })\n                      : type.createElement(renderLanes);\n              }\n          }\n          current[internalInstanceKey] = workInProgress;\n          current[internalPropsKey] = newProps;\n          a: for (type = workInProgress.child; null !== type; ) {\n            if (5 === type.tag || 6 === type.tag)\n              current.appendChild(type.stateNode);\n            else if (4 !== type.tag && 27 !== type.tag && null !== type.child) {\n              type.child.return = type;\n              type = type.child;\n              continue;\n            }\n            if (type === workInProgress) break a;\n            for (; null === type.sibling; ) {\n              if (null === type.return || type.return === workInProgress)\n                break a;\n              type = type.return;\n            }\n            type.sibling.return = type.return;\n            type = type.sibling;\n          }\n          workInProgress.stateNode = current;\n          a: switch (\n            (setInitialProperties(current, renderLanes, newProps), renderLanes)\n          ) {\n            case \"button\":\n            case \"input\":\n            case \"select\":\n            case \"textarea\":\n              current = !!newProps.autoFocus;\n              break a;\n            case \"img\":\n              current = !0;\n              break a;\n            default:\n              current = !1;\n          }\n          current && markUpdate(workInProgress);\n        }\n      }\n      bubbleProperties(workInProgress);\n      workInProgress.flags &= -16777217;\n      return null;\n    case 6:\n      if (current && null != workInProgress.stateNode)\n        current.memoizedProps !== newProps && markUpdate(workInProgress);\n      else {\n        if (\"string\" !== typeof newProps && null === workInProgress.stateNode)\n          throw Error(formatProdErrorMessage(166));\n        current = rootInstanceStackCursor.current;\n        if (popHydrationState(workInProgress)) {\n          current = workInProgress.stateNode;\n          renderLanes = workInProgress.memoizedProps;\n          newProps = null;\n          type = hydrationParentFiber;\n          if (null !== type)\n            switch (type.tag) {\n              case 27:\n              case 5:\n                newProps = type.memoizedProps;\n            }\n          current[internalInstanceKey] = workInProgress;\n          current =\n            current.nodeValue === renderLanes ||\n            (null !== newProps && !0 === newProps.suppressHydrationWarning) ||\n            checkForUnmatchedText(current.nodeValue, renderLanes)\n              ? !0\n              : !1;\n          current || throwOnHydrationMismatch(workInProgress);\n        } else\n          (current =\n            getOwnerDocumentFromRootContainer(current).createTextNode(\n              newProps\n            )),\n            (current[internalInstanceKey] = workInProgress),\n            (workInProgress.stateNode = current);\n      }\n      bubbleProperties(workInProgress);\n      return null;\n    case 13:\n      newProps = workInProgress.memoizedState;\n      if (\n        null === current ||\n        (null !== current.memoizedState &&\n          null !== current.memoizedState.dehydrated)\n      ) {\n        type = popHydrationState(workInProgress);\n        if (null !== newProps && null !== newProps.dehydrated) {\n          if (null === current) {\n            if (!type) throw Error(formatProdErrorMessage(318));\n            type = workInProgress.memoizedState;\n            type = null !== type ? type.dehydrated : null;\n            if (!type) throw Error(formatProdErrorMessage(317));\n            type[internalInstanceKey] = workInProgress;\n          } else\n            resetHydrationState(),\n              0 === (workInProgress.flags & 128) &&\n                (workInProgress.memoizedState = null),\n              (workInProgress.flags |= 4);\n          bubbleProperties(workInProgress);\n          type = !1;\n        } else\n          (type = upgradeHydrationErrorsToRecoverable()),\n            null !== current &&\n              null !== current.memoizedState &&\n              (current.memoizedState.hydrationErrors = type),\n            (type = !0);\n        if (!type) {\n          if (workInProgress.flags & 256)\n            return popSuspenseHandler(workInProgress), workInProgress;\n          popSuspenseHandler(workInProgress);\n          return null;\n        }\n      }\n      popSuspenseHandler(workInProgress);\n      if (0 !== (workInProgress.flags & 128))\n        return (workInProgress.lanes = renderLanes), workInProgress;\n      renderLanes = null !== newProps;\n      current = null !== current && null !== current.memoizedState;\n      if (renderLanes) {\n        newProps = workInProgress.child;\n        type = null;\n        null !== newProps.alternate &&\n          null !== newProps.alternate.memoizedState &&\n          null !== newProps.alternate.memoizedState.cachePool &&\n          (type = newProps.alternate.memoizedState.cachePool.pool);\n        var cache$127 = null;\n        null !== newProps.memoizedState &&\n          null !== newProps.memoizedState.cachePool &&\n          (cache$127 = newProps.memoizedState.cachePool.pool);\n        cache$127 !== type && (newProps.flags |= 2048);\n      }\n      renderLanes !== current &&\n        renderLanes &&\n        (workInProgress.child.flags |= 8192);\n      scheduleRetryEffect(workInProgress, workInProgress.updateQueue);\n      bubbleProperties(workInProgress);\n      return null;\n    case 4:\n      return (\n        popHostContainer(),\n        null === current &&\n          listenToAllSupportedEvents(workInProgress.stateNode.containerInfo),\n        bubbleProperties(workInProgress),\n        null\n      );\n    case 10:\n      return (\n        popProvider(workInProgress.type), bubbleProperties(workInProgress), null\n      );\n    case 19:\n      pop(suspenseStackCursor);\n      type = workInProgress.memoizedState;\n      if (null === type) return bubbleProperties(workInProgress), null;\n      newProps = 0 !== (workInProgress.flags & 128);\n      cache$127 = type.rendering;\n      if (null === cache$127)\n        if (newProps) cutOffTailIfNeeded(type, !1);\n        else {\n          if (\n            0 !== workInProgressRootExitStatus ||\n            (null !== current && 0 !== (current.flags & 128))\n          )\n            for (current = workInProgress.child; null !== current; ) {\n              cache$127 = findFirstSuspended(current);\n              if (null !== cache$127) {\n                workInProgress.flags |= 128;\n                cutOffTailIfNeeded(type, !1);\n                current = cache$127.updateQueue;\n                workInProgress.updateQueue = current;\n                scheduleRetryEffect(workInProgress, current);\n                workInProgress.subtreeFlags = 0;\n                current = renderLanes;\n                for (renderLanes = workInProgress.child; null !== renderLanes; )\n                  resetWorkInProgress(renderLanes, current),\n                    (renderLanes = renderLanes.sibling);\n                push(\n                  suspenseStackCursor,\n                  (suspenseStackCursor.current & 1) | 2\n                );\n                return workInProgress.child;\n              }\n              current = current.sibling;\n            }\n          null !== type.tail &&\n            now() > workInProgressRootRenderTargetTime &&\n            ((workInProgress.flags |= 128),\n            (newProps = !0),\n            cutOffTailIfNeeded(type, !1),\n            (workInProgress.lanes = 4194304));\n        }\n      else {\n        if (!newProps)\n          if (((current = findFirstSuspended(cache$127)), null !== current)) {\n            if (\n              ((workInProgress.flags |= 128),\n              (newProps = !0),\n              (current = current.updateQueue),\n              (workInProgress.updateQueue = current),\n              scheduleRetryEffect(workInProgress, current),\n              cutOffTailIfNeeded(type, !0),\n              null === type.tail &&\n                \"hidden\" === type.tailMode &&\n                !cache$127.alternate &&\n                !isHydrating)\n            )\n              return bubbleProperties(workInProgress), null;\n          } else\n            2 * now() - type.renderingStartTime >\n              workInProgressRootRenderTargetTime &&\n              536870912 !== renderLanes &&\n              ((workInProgress.flags |= 128),\n              (newProps = !0),\n              cutOffTailIfNeeded(type, !1),\n              (workInProgress.lanes = 4194304));\n        type.isBackwards\n          ? ((cache$127.sibling = workInProgress.child),\n            (workInProgress.child = cache$127))\n          : ((current = type.last),\n            null !== current\n              ? (current.sibling = cache$127)\n              : (workInProgress.child = cache$127),\n            (type.last = cache$127));\n      }\n      if (null !== type.tail)\n        return (\n          (workInProgress = type.tail),\n          (type.rendering = workInProgress),\n          (type.tail = workInProgress.sibling),\n          (type.renderingStartTime = now()),\n          (workInProgress.sibling = null),\n          (current = suspenseStackCursor.current),\n          push(suspenseStackCursor, newProps ? (current & 1) | 2 : current & 1),\n          workInProgress\n        );\n      bubbleProperties(workInProgress);\n      return null;\n    case 22:\n    case 23:\n      return (\n        popSuspenseHandler(workInProgress),\n        popHiddenContext(),\n        (newProps = null !== workInProgress.memoizedState),\n        null !== current\n          ? (null !== current.memoizedState) !== newProps &&\n            (workInProgress.flags |= 8192)\n          : newProps && (workInProgress.flags |= 8192),\n        newProps\n          ? 0 !== (renderLanes & 536870912) &&\n            0 === (workInProgress.flags & 128) &&\n            (bubbleProperties(workInProgress),\n            workInProgress.subtreeFlags & 6 && (workInProgress.flags |= 8192))\n          : bubbleProperties(workInProgress),\n        (renderLanes = workInProgress.updateQueue),\n        null !== renderLanes &&\n          scheduleRetryEffect(workInProgress, renderLanes.retryQueue),\n        (renderLanes = null),\n        null !== current &&\n          null !== current.memoizedState &&\n          null !== current.memoizedState.cachePool &&\n          (renderLanes = current.memoizedState.cachePool.pool),\n        (newProps = null),\n        null !== workInProgress.memoizedState &&\n          null !== workInProgress.memoizedState.cachePool &&\n          (newProps = workInProgress.memoizedState.cachePool.pool),\n        newProps !== renderLanes && (workInProgress.flags |= 2048),\n        null !== current && pop(resumedCache),\n        null\n      );\n    case 24:\n      return (\n        (renderLanes = null),\n        null !== current && (renderLanes = current.memoizedState.cache),\n        workInProgress.memoizedState.cache !== renderLanes &&\n          (workInProgress.flags |= 2048),\n        popProvider(CacheContext),\n        bubbleProperties(workInProgress),\n        null\n      );\n    case 25:\n      return null;\n    case 30:\n      return null;\n  }\n  throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction unwindWork(current, workInProgress) {\n  popTreeContext(workInProgress);\n  switch (workInProgress.tag) {\n    case 1:\n      return (\n        (current = workInProgress.flags),\n        current & 65536\n          ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n          : null\n      );\n    case 3:\n      return (\n        popProvider(CacheContext),\n        popHostContainer(),\n        (current = workInProgress.flags),\n        0 !== (current & 65536) && 0 === (current & 128)\n          ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n          : null\n      );\n    case 26:\n    case 27:\n    case 5:\n      return popHostContext(workInProgress), null;\n    case 13:\n      popSuspenseHandler(workInProgress);\n      current = workInProgress.memoizedState;\n      if (null !== current && null !== current.dehydrated) {\n        if (null === workInProgress.alternate)\n          throw Error(formatProdErrorMessage(340));\n        resetHydrationState();\n      }\n      current = workInProgress.flags;\n      return current & 65536\n        ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n        : null;\n    case 19:\n      return pop(suspenseStackCursor), null;\n    case 4:\n      return popHostContainer(), null;\n    case 10:\n      return popProvider(workInProgress.type), null;\n    case 22:\n    case 23:\n      return (\n        popSuspenseHandler(workInProgress),\n        popHiddenContext(),\n        null !== current && pop(resumedCache),\n        (current = workInProgress.flags),\n        current & 65536\n          ? ((workInProgress.flags = (current & -65537) | 128), workInProgress)\n          : null\n      );\n    case 24:\n      return popProvider(CacheContext), null;\n    case 25:\n      return null;\n    default:\n      return null;\n  }\n}\nfunction unwindInterruptedWork(current, interruptedWork) {\n  popTreeContext(interruptedWork);\n  switch (interruptedWork.tag) {\n    case 3:\n      popProvider(CacheContext);\n      popHostContainer();\n      break;\n    case 26:\n    case 27:\n    case 5:\n      popHostContext(interruptedWork);\n      break;\n    case 4:\n      popHostContainer();\n      break;\n    case 13:\n      popSuspenseHandler(interruptedWork);\n      break;\n    case 19:\n      pop(suspenseStackCursor);\n      break;\n    case 10:\n      popProvider(interruptedWork.type);\n      break;\n    case 22:\n    case 23:\n      popSuspenseHandler(interruptedWork);\n      popHiddenContext();\n      null !== current && pop(resumedCache);\n      break;\n    case 24:\n      popProvider(CacheContext);\n  }\n}\nfunction commitHookEffectListMount(flags, finishedWork) {\n  try {\n    var updateQueue = finishedWork.updateQueue,\n      lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;\n    if (null !== lastEffect) {\n      var firstEffect = lastEffect.next;\n      updateQueue = firstEffect;\n      do {\n        if ((updateQueue.tag & flags) === flags) {\n          lastEffect = void 0;\n          var create = updateQueue.create,\n            inst = updateQueue.inst;\n          lastEffect = create();\n          inst.destroy = lastEffect;\n        }\n        updateQueue = updateQueue.next;\n      } while (updateQueue !== firstEffect);\n    }\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction commitHookEffectListUnmount(\n  flags,\n  finishedWork,\n  nearestMountedAncestor$jscomp$0\n) {\n  try {\n    var updateQueue = finishedWork.updateQueue,\n      lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;\n    if (null !== lastEffect) {\n      var firstEffect = lastEffect.next;\n      updateQueue = firstEffect;\n      do {\n        if ((updateQueue.tag & flags) === flags) {\n          var inst = updateQueue.inst,\n            destroy = inst.destroy;\n          if (void 0 !== destroy) {\n            inst.destroy = void 0;\n            lastEffect = finishedWork;\n            var nearestMountedAncestor = nearestMountedAncestor$jscomp$0,\n              destroy_ = destroy;\n            try {\n              destroy_();\n            } catch (error) {\n              captureCommitPhaseError(\n                lastEffect,\n                nearestMountedAncestor,\n                error\n              );\n            }\n          }\n        }\n        updateQueue = updateQueue.next;\n      } while (updateQueue !== firstEffect);\n    }\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction commitClassCallbacks(finishedWork) {\n  var updateQueue = finishedWork.updateQueue;\n  if (null !== updateQueue) {\n    var instance = finishedWork.stateNode;\n    try {\n      commitCallbacks(updateQueue, instance);\n    } catch (error) {\n      captureCommitPhaseError(finishedWork, finishedWork.return, error);\n    }\n  }\n}\nfunction safelyCallComponentWillUnmount(\n  current,\n  nearestMountedAncestor,\n  instance\n) {\n  instance.props = resolveClassComponentProps(\n    current.type,\n    current.memoizedProps\n  );\n  instance.state = current.memoizedState;\n  try {\n    instance.componentWillUnmount();\n  } catch (error) {\n    captureCommitPhaseError(current, nearestMountedAncestor, error);\n  }\n}\nfunction safelyAttachRef(current, nearestMountedAncestor) {\n  try {\n    var ref = current.ref;\n    if (null !== ref) {\n      switch (current.tag) {\n        case 26:\n        case 27:\n        case 5:\n          var instanceToUse = current.stateNode;\n          break;\n        case 30:\n          instanceToUse = current.stateNode;\n          break;\n        default:\n          instanceToUse = current.stateNode;\n      }\n      \"function\" === typeof ref\n        ? (current.refCleanup = ref(instanceToUse))\n        : (ref.current = instanceToUse);\n    }\n  } catch (error) {\n    captureCommitPhaseError(current, nearestMountedAncestor, error);\n  }\n}\nfunction safelyDetachRef(current, nearestMountedAncestor) {\n  var ref = current.ref,\n    refCleanup = current.refCleanup;\n  if (null !== ref)\n    if (\"function\" === typeof refCleanup)\n      try {\n        refCleanup();\n      } catch (error) {\n        captureCommitPhaseError(current, nearestMountedAncestor, error);\n      } finally {\n        (current.refCleanup = null),\n          (current = current.alternate),\n          null != current && (current.refCleanup = null);\n      }\n    else if (\"function\" === typeof ref)\n      try {\n        ref(null);\n      } catch (error$143) {\n        captureCommitPhaseError(current, nearestMountedAncestor, error$143);\n      }\n    else ref.current = null;\n}\nfunction commitHostMount(finishedWork) {\n  var type = finishedWork.type,\n    props = finishedWork.memoizedProps,\n    instance = finishedWork.stateNode;\n  try {\n    a: switch (type) {\n      case \"button\":\n      case \"input\":\n      case \"select\":\n      case \"textarea\":\n        props.autoFocus && instance.focus();\n        break a;\n      case \"img\":\n        props.src\n          ? (instance.src = props.src)\n          : props.srcSet && (instance.srcset = props.srcSet);\n    }\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction commitHostUpdate(finishedWork, newProps, oldProps) {\n  try {\n    var domElement = finishedWork.stateNode;\n    updateProperties(domElement, finishedWork.type, oldProps, newProps);\n    domElement[internalPropsKey] = newProps;\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nfunction isHostParent(fiber) {\n  return (\n    5 === fiber.tag ||\n    3 === fiber.tag ||\n    26 === fiber.tag ||\n    (27 === fiber.tag && isSingletonScope(fiber.type)) ||\n    4 === fiber.tag\n  );\n}\nfunction getHostSibling(fiber) {\n  a: for (;;) {\n    for (; null === fiber.sibling; ) {\n      if (null === fiber.return || isHostParent(fiber.return)) return null;\n      fiber = fiber.return;\n    }\n    fiber.sibling.return = fiber.return;\n    for (\n      fiber = fiber.sibling;\n      5 !== fiber.tag && 6 !== fiber.tag && 18 !== fiber.tag;\n\n    ) {\n      if (27 === fiber.tag && isSingletonScope(fiber.type)) continue a;\n      if (fiber.flags & 2) continue a;\n      if (null === fiber.child || 4 === fiber.tag) continue a;\n      else (fiber.child.return = fiber), (fiber = fiber.child);\n    }\n    if (!(fiber.flags & 2)) return fiber.stateNode;\n  }\n}\nfunction insertOrAppendPlacementNodeIntoContainer(node, before, parent) {\n  var tag = node.tag;\n  if (5 === tag || 6 === tag)\n    (node = node.stateNode),\n      before\n        ? (9 === parent.nodeType\n            ? parent.body\n            : \"HTML\" === parent.nodeName\n              ? parent.ownerDocument.body\n              : parent\n          ).insertBefore(node, before)\n        : ((before =\n            9 === parent.nodeType\n              ? parent.body\n              : \"HTML\" === parent.nodeName\n                ? parent.ownerDocument.body\n                : parent),\n          before.appendChild(node),\n          (parent = parent._reactRootContainer),\n          (null !== parent && void 0 !== parent) ||\n            null !== before.onclick ||\n            (before.onclick = noop$1));\n  else if (\n    4 !== tag &&\n    (27 === tag &&\n      isSingletonScope(node.type) &&\n      ((parent = node.stateNode), (before = null)),\n    (node = node.child),\n    null !== node)\n  )\n    for (\n      insertOrAppendPlacementNodeIntoContainer(node, before, parent),\n        node = node.sibling;\n      null !== node;\n\n    )\n      insertOrAppendPlacementNodeIntoContainer(node, before, parent),\n        (node = node.sibling);\n}\nfunction insertOrAppendPlacementNode(node, before, parent) {\n  var tag = node.tag;\n  if (5 === tag || 6 === tag)\n    (node = node.stateNode),\n      before ? parent.insertBefore(node, before) : parent.appendChild(node);\n  else if (\n    4 !== tag &&\n    (27 === tag && isSingletonScope(node.type) && (parent = node.stateNode),\n    (node = node.child),\n    null !== node)\n  )\n    for (\n      insertOrAppendPlacementNode(node, before, parent), node = node.sibling;\n      null !== node;\n\n    )\n      insertOrAppendPlacementNode(node, before, parent), (node = node.sibling);\n}\nfunction commitHostSingletonAcquisition(finishedWork) {\n  var singleton = finishedWork.stateNode,\n    props = finishedWork.memoizedProps;\n  try {\n    for (\n      var type = finishedWork.type, attributes = singleton.attributes;\n      attributes.length;\n\n    )\n      singleton.removeAttributeNode(attributes[0]);\n    setInitialProperties(singleton, type, props);\n    singleton[internalInstanceKey] = finishedWork;\n    singleton[internalPropsKey] = props;\n  } catch (error) {\n    captureCommitPhaseError(finishedWork, finishedWork.return, error);\n  }\n}\nvar offscreenSubtreeIsHidden = !1,\n  offscreenSubtreeWasHidden = !1,\n  needsFormReset = !1,\n  PossiblyWeakSet = \"function\" === typeof WeakSet ? WeakSet : Set,\n  nextEffect = null;\nfunction commitBeforeMutationEffects(root, firstChild) {\n  root = root.containerInfo;\n  eventsEnabled = _enabled;\n  root = getActiveElementDeep(root);\n  if (hasSelectionCapabilities(root)) {\n    if (\"selectionStart\" in root)\n      var JSCompiler_temp = {\n        start: root.selectionStart,\n        end: root.selectionEnd\n      };\n    else\n      a: {\n        JSCompiler_temp =\n          ((JSCompiler_temp = root.ownerDocument) &&\n            JSCompiler_temp.defaultView) ||\n          window;\n        var selection =\n          JSCompiler_temp.getSelection && JSCompiler_temp.getSelection();\n        if (selection && 0 !== selection.rangeCount) {\n          JSCompiler_temp = selection.anchorNode;\n          var anchorOffset = selection.anchorOffset,\n            focusNode = selection.focusNode;\n          selection = selection.focusOffset;\n          try {\n            JSCompiler_temp.nodeType, focusNode.nodeType;\n          } catch (e$20) {\n            JSCompiler_temp = null;\n            break a;\n          }\n          var length = 0,\n            start = -1,\n            end = -1,\n            indexWithinAnchor = 0,\n            indexWithinFocus = 0,\n            node = root,\n            parentNode = null;\n          b: for (;;) {\n            for (var next; ; ) {\n              node !== JSCompiler_temp ||\n                (0 !== anchorOffset && 3 !== node.nodeType) ||\n                (start = length + anchorOffset);\n              node !== focusNode ||\n                (0 !== selection && 3 !== node.nodeType) ||\n                (end = length + selection);\n              3 === node.nodeType && (length += node.nodeValue.length);\n              if (null === (next = node.firstChild)) break;\n              parentNode = node;\n              node = next;\n            }\n            for (;;) {\n              if (node === root) break b;\n              parentNode === JSCompiler_temp &&\n                ++indexWithinAnchor === anchorOffset &&\n                (start = length);\n              parentNode === focusNode &&\n                ++indexWithinFocus === selection &&\n                (end = length);\n              if (null !== (next = node.nextSibling)) break;\n              node = parentNode;\n              parentNode = node.parentNode;\n            }\n            node = next;\n          }\n          JSCompiler_temp =\n            -1 === start || -1 === end ? null : { start: start, end: end };\n        } else JSCompiler_temp = null;\n      }\n    JSCompiler_temp = JSCompiler_temp || { start: 0, end: 0 };\n  } else JSCompiler_temp = null;\n  selectionInformation = { focusedElem: root, selectionRange: JSCompiler_temp };\n  _enabled = !1;\n  for (nextEffect = firstChild; null !== nextEffect; )\n    if (\n      ((firstChild = nextEffect),\n      (root = firstChild.child),\n      0 !== (firstChild.subtreeFlags & 1024) && null !== root)\n    )\n      (root.return = firstChild), (nextEffect = root);\n    else\n      for (; null !== nextEffect; ) {\n        firstChild = nextEffect;\n        focusNode = firstChild.alternate;\n        root = firstChild.flags;\n        switch (firstChild.tag) {\n          case 0:\n            break;\n          case 11:\n          case 15:\n            break;\n          case 1:\n            if (0 !== (root & 1024) && null !== focusNode) {\n              root = void 0;\n              JSCompiler_temp = firstChild;\n              anchorOffset = focusNode.memoizedProps;\n              focusNode = focusNode.memoizedState;\n              selection = JSCompiler_temp.stateNode;\n              try {\n                var resolvedPrevProps = resolveClassComponentProps(\n                  JSCompiler_temp.type,\n                  anchorOffset,\n                  JSCompiler_temp.elementType === JSCompiler_temp.type\n                );\n                root = selection.getSnapshotBeforeUpdate(\n                  resolvedPrevProps,\n                  focusNode\n                );\n                selection.__reactInternalSnapshotBeforeUpdate = root;\n              } catch (error) {\n                captureCommitPhaseError(\n                  JSCompiler_temp,\n                  JSCompiler_temp.return,\n                  error\n                );\n              }\n            }\n            break;\n          case 3:\n            if (0 !== (root & 1024))\n              if (\n                ((root = firstChild.stateNode.containerInfo),\n                (JSCompiler_temp = root.nodeType),\n                9 === JSCompiler_temp)\n              )\n                clearContainerSparingly(root);\n              else if (1 === JSCompiler_temp)\n                switch (root.nodeName) {\n                  case \"HEAD\":\n                  case \"HTML\":\n                  case \"BODY\":\n                    clearContainerSparingly(root);\n                    break;\n                  default:\n                    root.textContent = \"\";\n                }\n            break;\n          case 5:\n          case 26:\n          case 27:\n          case 6:\n          case 4:\n          case 17:\n            break;\n          default:\n            if (0 !== (root & 1024)) throw Error(formatProdErrorMessage(163));\n        }\n        root = firstChild.sibling;\n        if (null !== root) {\n          root.return = firstChild.return;\n          nextEffect = root;\n          break;\n        }\n        nextEffect = firstChild.return;\n      }\n}\nfunction commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) {\n  var flags = finishedWork.flags;\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 15:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      flags & 4 && commitHookEffectListMount(5, finishedWork);\n      break;\n    case 1:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      if (flags & 4)\n        if (((finishedRoot = finishedWork.stateNode), null === current))\n          try {\n            finishedRoot.componentDidMount();\n          } catch (error) {\n            captureCommitPhaseError(finishedWork, finishedWork.return, error);\n          }\n        else {\n          var prevProps = resolveClassComponentProps(\n            finishedWork.type,\n            current.memoizedProps\n          );\n          current = current.memoizedState;\n          try {\n            finishedRoot.componentDidUpdate(\n              prevProps,\n              current,\n              finishedRoot.__reactInternalSnapshotBeforeUpdate\n            );\n          } catch (error$142) {\n            captureCommitPhaseError(\n              finishedWork,\n              finishedWork.return,\n              error$142\n            );\n          }\n        }\n      flags & 64 && commitClassCallbacks(finishedWork);\n      flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);\n      break;\n    case 3:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      if (\n        flags & 64 &&\n        ((finishedRoot = finishedWork.updateQueue), null !== finishedRoot)\n      ) {\n        current = null;\n        if (null !== finishedWork.child)\n          switch (finishedWork.child.tag) {\n            case 27:\n            case 5:\n              current = finishedWork.child.stateNode;\n              break;\n            case 1:\n              current = finishedWork.child.stateNode;\n          }\n        try {\n          commitCallbacks(finishedRoot, current);\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      }\n      break;\n    case 27:\n      null === current &&\n        flags & 4 &&\n        commitHostSingletonAcquisition(finishedWork);\n    case 26:\n    case 5:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      null === current && flags & 4 && commitHostMount(finishedWork);\n      flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);\n      break;\n    case 12:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      break;\n    case 13:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n      flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n      flags & 64 &&\n        ((finishedRoot = finishedWork.memoizedState),\n        null !== finishedRoot &&\n          ((finishedRoot = finishedRoot.dehydrated),\n          null !== finishedRoot &&\n            ((finishedWork = retryDehydratedSuspenseBoundary.bind(\n              null,\n              finishedWork\n            )),\n            registerSuspenseInstanceRetry(finishedRoot, finishedWork))));\n      break;\n    case 22:\n      flags = null !== finishedWork.memoizedState || offscreenSubtreeIsHidden;\n      if (!flags) {\n        current =\n          (null !== current && null !== current.memoizedState) ||\n          offscreenSubtreeWasHidden;\n        prevProps = offscreenSubtreeIsHidden;\n        var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;\n        offscreenSubtreeIsHidden = flags;\n        (offscreenSubtreeWasHidden = current) && !prevOffscreenSubtreeWasHidden\n          ? recursivelyTraverseReappearLayoutEffects(\n              finishedRoot,\n              finishedWork,\n              0 !== (finishedWork.subtreeFlags & 8772)\n            )\n          : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n        offscreenSubtreeIsHidden = prevProps;\n        offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;\n      }\n      break;\n    case 30:\n      break;\n    default:\n      recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);\n  }\n}\nfunction detachFiberAfterEffects(fiber) {\n  var alternate = fiber.alternate;\n  null !== alternate &&\n    ((fiber.alternate = null), detachFiberAfterEffects(alternate));\n  fiber.child = null;\n  fiber.deletions = null;\n  fiber.sibling = null;\n  5 === fiber.tag &&\n    ((alternate = fiber.stateNode),\n    null !== alternate && detachDeletedInstance(alternate));\n  fiber.stateNode = null;\n  fiber.return = null;\n  fiber.dependencies = null;\n  fiber.memoizedProps = null;\n  fiber.memoizedState = null;\n  fiber.pendingProps = null;\n  fiber.stateNode = null;\n  fiber.updateQueue = null;\n}\nvar hostParent = null,\n  hostParentIsContainer = !1;\nfunction recursivelyTraverseDeletionEffects(\n  finishedRoot,\n  nearestMountedAncestor,\n  parent\n) {\n  for (parent = parent.child; null !== parent; )\n    commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, parent),\n      (parent = parent.sibling);\n}\nfunction commitDeletionEffectsOnFiber(\n  finishedRoot,\n  nearestMountedAncestor,\n  deletedFiber\n) {\n  if (injectedHook && \"function\" === typeof injectedHook.onCommitFiberUnmount)\n    try {\n      injectedHook.onCommitFiberUnmount(rendererID, deletedFiber);\n    } catch (err) {}\n  switch (deletedFiber.tag) {\n    case 26:\n      offscreenSubtreeWasHidden ||\n        safelyDetachRef(deletedFiber, nearestMountedAncestor);\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      deletedFiber.memoizedState\n        ? deletedFiber.memoizedState.count--\n        : deletedFiber.stateNode &&\n          ((deletedFiber = deletedFiber.stateNode),\n          deletedFiber.parentNode.removeChild(deletedFiber));\n      break;\n    case 27:\n      offscreenSubtreeWasHidden ||\n        safelyDetachRef(deletedFiber, nearestMountedAncestor);\n      var prevHostParent = hostParent,\n        prevHostParentIsContainer = hostParentIsContainer;\n      isSingletonScope(deletedFiber.type) &&\n        ((hostParent = deletedFiber.stateNode), (hostParentIsContainer = !1));\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      releaseSingletonInstance(deletedFiber.stateNode);\n      hostParent = prevHostParent;\n      hostParentIsContainer = prevHostParentIsContainer;\n      break;\n    case 5:\n      offscreenSubtreeWasHidden ||\n        safelyDetachRef(deletedFiber, nearestMountedAncestor);\n    case 6:\n      prevHostParent = hostParent;\n      prevHostParentIsContainer = hostParentIsContainer;\n      hostParent = null;\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      hostParent = prevHostParent;\n      hostParentIsContainer = prevHostParentIsContainer;\n      if (null !== hostParent)\n        if (hostParentIsContainer)\n          try {\n            (9 === hostParent.nodeType\n              ? hostParent.body\n              : \"HTML\" === hostParent.nodeName\n                ? hostParent.ownerDocument.body\n                : hostParent\n            ).removeChild(deletedFiber.stateNode);\n          } catch (error) {\n            captureCommitPhaseError(\n              deletedFiber,\n              nearestMountedAncestor,\n              error\n            );\n          }\n        else\n          try {\n            hostParent.removeChild(deletedFiber.stateNode);\n          } catch (error) {\n            captureCommitPhaseError(\n              deletedFiber,\n              nearestMountedAncestor,\n              error\n            );\n          }\n      break;\n    case 18:\n      null !== hostParent &&\n        (hostParentIsContainer\n          ? ((finishedRoot = hostParent),\n            clearSuspenseBoundary(\n              9 === finishedRoot.nodeType\n                ? finishedRoot.body\n                : \"HTML\" === finishedRoot.nodeName\n                  ? finishedRoot.ownerDocument.body\n                  : finishedRoot,\n              deletedFiber.stateNode\n            ),\n            retryIfBlockedOn(finishedRoot))\n          : clearSuspenseBoundary(hostParent, deletedFiber.stateNode));\n      break;\n    case 4:\n      prevHostParent = hostParent;\n      prevHostParentIsContainer = hostParentIsContainer;\n      hostParent = deletedFiber.stateNode.containerInfo;\n      hostParentIsContainer = !0;\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      hostParent = prevHostParent;\n      hostParentIsContainer = prevHostParentIsContainer;\n      break;\n    case 0:\n    case 11:\n    case 14:\n    case 15:\n      offscreenSubtreeWasHidden ||\n        commitHookEffectListUnmount(2, deletedFiber, nearestMountedAncestor);\n      offscreenSubtreeWasHidden ||\n        commitHookEffectListUnmount(4, deletedFiber, nearestMountedAncestor);\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      break;\n    case 1:\n      offscreenSubtreeWasHidden ||\n        (safelyDetachRef(deletedFiber, nearestMountedAncestor),\n        (prevHostParent = deletedFiber.stateNode),\n        \"function\" === typeof prevHostParent.componentWillUnmount &&\n          safelyCallComponentWillUnmount(\n            deletedFiber,\n            nearestMountedAncestor,\n            prevHostParent\n          ));\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      break;\n    case 21:\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      break;\n    case 22:\n      offscreenSubtreeWasHidden =\n        (prevHostParent = offscreenSubtreeWasHidden) ||\n        null !== deletedFiber.memoizedState;\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n      offscreenSubtreeWasHidden = prevHostParent;\n      break;\n    default:\n      recursivelyTraverseDeletionEffects(\n        finishedRoot,\n        nearestMountedAncestor,\n        deletedFiber\n      );\n  }\n}\nfunction commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {\n  if (\n    null === finishedWork.memoizedState &&\n    ((finishedRoot = finishedWork.alternate),\n    null !== finishedRoot &&\n      ((finishedRoot = finishedRoot.memoizedState),\n      null !== finishedRoot &&\n        ((finishedRoot = finishedRoot.dehydrated), null !== finishedRoot)))\n  )\n    try {\n      retryIfBlockedOn(finishedRoot);\n    } catch (error) {\n      captureCommitPhaseError(finishedWork, finishedWork.return, error);\n    }\n}\nfunction getRetryCache(finishedWork) {\n  switch (finishedWork.tag) {\n    case 13:\n    case 19:\n      var retryCache = finishedWork.stateNode;\n      null === retryCache &&\n        (retryCache = finishedWork.stateNode = new PossiblyWeakSet());\n      return retryCache;\n    case 22:\n      return (\n        (finishedWork = finishedWork.stateNode),\n        (retryCache = finishedWork._retryCache),\n        null === retryCache &&\n          (retryCache = finishedWork._retryCache = new PossiblyWeakSet()),\n        retryCache\n      );\n    default:\n      throw Error(formatProdErrorMessage(435, finishedWork.tag));\n  }\n}\nfunction attachSuspenseRetryListeners(finishedWork, wakeables) {\n  var retryCache = getRetryCache(finishedWork);\n  wakeables.forEach(function (wakeable) {\n    var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);\n    retryCache.has(wakeable) ||\n      (retryCache.add(wakeable), wakeable.then(retry, retry));\n  });\n}\nfunction recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber) {\n  var deletions = parentFiber.deletions;\n  if (null !== deletions)\n    for (var i = 0; i < deletions.length; i++) {\n      var childToDelete = deletions[i],\n        root = root$jscomp$0,\n        returnFiber = parentFiber,\n        parent = returnFiber;\n      a: for (; null !== parent; ) {\n        switch (parent.tag) {\n          case 27:\n            if (isSingletonScope(parent.type)) {\n              hostParent = parent.stateNode;\n              hostParentIsContainer = !1;\n              break a;\n            }\n            break;\n          case 5:\n            hostParent = parent.stateNode;\n            hostParentIsContainer = !1;\n            break a;\n          case 3:\n          case 4:\n            hostParent = parent.stateNode.containerInfo;\n            hostParentIsContainer = !0;\n            break a;\n        }\n        parent = parent.return;\n      }\n      if (null === hostParent) throw Error(formatProdErrorMessage(160));\n      commitDeletionEffectsOnFiber(root, returnFiber, childToDelete);\n      hostParent = null;\n      hostParentIsContainer = !1;\n      root = childToDelete.alternate;\n      null !== root && (root.return = null);\n      childToDelete.return = null;\n    }\n  if (parentFiber.subtreeFlags & 13878)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitMutationEffectsOnFiber(parentFiber, root$jscomp$0),\n        (parentFiber = parentFiber.sibling);\n}\nvar currentHoistableRoot = null;\nfunction commitMutationEffectsOnFiber(finishedWork, root) {\n  var current = finishedWork.alternate,\n    flags = finishedWork.flags;\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 14:\n    case 15:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 4 &&\n        (commitHookEffectListUnmount(3, finishedWork, finishedWork.return),\n        commitHookEffectListMount(3, finishedWork),\n        commitHookEffectListUnmount(5, finishedWork, finishedWork.return));\n      break;\n    case 1:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      flags & 64 &&\n        offscreenSubtreeIsHidden &&\n        ((finishedWork = finishedWork.updateQueue),\n        null !== finishedWork &&\n          ((flags = finishedWork.callbacks),\n          null !== flags &&\n            ((current = finishedWork.shared.hiddenCallbacks),\n            (finishedWork.shared.hiddenCallbacks =\n              null === current ? flags : current.concat(flags)))));\n      break;\n    case 26:\n      var hoistableRoot = currentHoistableRoot;\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      if (flags & 4) {\n        var currentResource = null !== current ? current.memoizedState : null;\n        flags = finishedWork.memoizedState;\n        if (null === current)\n          if (null === flags)\n            if (null === finishedWork.stateNode) {\n              a: {\n                flags = finishedWork.type;\n                current = finishedWork.memoizedProps;\n                hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n                b: switch (flags) {\n                  case \"title\":\n                    currentResource =\n                      hoistableRoot.getElementsByTagName(\"title\")[0];\n                    if (\n                      !currentResource ||\n                      currentResource[internalHoistableMarker] ||\n                      currentResource[internalInstanceKey] ||\n                      \"http://www.w3.org/2000/svg\" ===\n                        currentResource.namespaceURI ||\n                      currentResource.hasAttribute(\"itemprop\")\n                    )\n                      (currentResource = hoistableRoot.createElement(flags)),\n                        hoistableRoot.head.insertBefore(\n                          currentResource,\n                          hoistableRoot.querySelector(\"head > title\")\n                        );\n                    setInitialProperties(currentResource, flags, current);\n                    currentResource[internalInstanceKey] = finishedWork;\n                    markNodeAsHoistable(currentResource);\n                    flags = currentResource;\n                    break a;\n                  case \"link\":\n                    var maybeNodes = getHydratableHoistableCache(\n                      \"link\",\n                      \"href\",\n                      hoistableRoot\n                    ).get(flags + (current.href || \"\"));\n                    if (maybeNodes)\n                      for (var i = 0; i < maybeNodes.length; i++)\n                        if (\n                          ((currentResource = maybeNodes[i]),\n                          currentResource.getAttribute(\"href\") ===\n                            (null == current.href || \"\" === current.href\n                              ? null\n                              : current.href) &&\n                            currentResource.getAttribute(\"rel\") ===\n                              (null == current.rel ? null : current.rel) &&\n                            currentResource.getAttribute(\"title\") ===\n                              (null == current.title ? null : current.title) &&\n                            currentResource.getAttribute(\"crossorigin\") ===\n                              (null == current.crossOrigin\n                                ? null\n                                : current.crossOrigin))\n                        ) {\n                          maybeNodes.splice(i, 1);\n                          break b;\n                        }\n                    currentResource = hoistableRoot.createElement(flags);\n                    setInitialProperties(currentResource, flags, current);\n                    hoistableRoot.head.appendChild(currentResource);\n                    break;\n                  case \"meta\":\n                    if (\n                      (maybeNodes = getHydratableHoistableCache(\n                        \"meta\",\n                        \"content\",\n                        hoistableRoot\n                      ).get(flags + (current.content || \"\")))\n                    )\n                      for (i = 0; i < maybeNodes.length; i++)\n                        if (\n                          ((currentResource = maybeNodes[i]),\n                          currentResource.getAttribute(\"content\") ===\n                            (null == current.content\n                              ? null\n                              : \"\" + current.content) &&\n                            currentResource.getAttribute(\"name\") ===\n                              (null == current.name ? null : current.name) &&\n                            currentResource.getAttribute(\"property\") ===\n                              (null == current.property\n                                ? null\n                                : current.property) &&\n                            currentResource.getAttribute(\"http-equiv\") ===\n                              (null == current.httpEquiv\n                                ? null\n                                : current.httpEquiv) &&\n                            currentResource.getAttribute(\"charset\") ===\n                              (null == current.charSet\n                                ? null\n                                : current.charSet))\n                        ) {\n                          maybeNodes.splice(i, 1);\n                          break b;\n                        }\n                    currentResource = hoistableRoot.createElement(flags);\n                    setInitialProperties(currentResource, flags, current);\n                    hoistableRoot.head.appendChild(currentResource);\n                    break;\n                  default:\n                    throw Error(formatProdErrorMessage(468, flags));\n                }\n                currentResource[internalInstanceKey] = finishedWork;\n                markNodeAsHoistable(currentResource);\n                flags = currentResource;\n              }\n              finishedWork.stateNode = flags;\n            } else\n              mountHoistable(\n                hoistableRoot,\n                finishedWork.type,\n                finishedWork.stateNode\n              );\n          else\n            finishedWork.stateNode = acquireResource(\n              hoistableRoot,\n              flags,\n              finishedWork.memoizedProps\n            );\n        else\n          currentResource !== flags\n            ? (null === currentResource\n                ? null !== current.stateNode &&\n                  ((current = current.stateNode),\n                  current.parentNode.removeChild(current))\n                : currentResource.count--,\n              null === flags\n                ? mountHoistable(\n                    hoistableRoot,\n                    finishedWork.type,\n                    finishedWork.stateNode\n                  )\n                : acquireResource(\n                    hoistableRoot,\n                    flags,\n                    finishedWork.memoizedProps\n                  ))\n            : null === flags &&\n              null !== finishedWork.stateNode &&\n              commitHostUpdate(\n                finishedWork,\n                finishedWork.memoizedProps,\n                current.memoizedProps\n              );\n      }\n      break;\n    case 27:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      null !== current &&\n        flags & 4 &&\n        commitHostUpdate(\n          finishedWork,\n          finishedWork.memoizedProps,\n          current.memoizedProps\n        );\n      break;\n    case 5:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 512 &&\n        (offscreenSubtreeWasHidden ||\n          null === current ||\n          safelyDetachRef(current, current.return));\n      if (finishedWork.flags & 32) {\n        hoistableRoot = finishedWork.stateNode;\n        try {\n          setTextContent(hoistableRoot, \"\");\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      }\n      flags & 4 &&\n        null != finishedWork.stateNode &&\n        ((hoistableRoot = finishedWork.memoizedProps),\n        commitHostUpdate(\n          finishedWork,\n          hoistableRoot,\n          null !== current ? current.memoizedProps : hoistableRoot\n        ));\n      flags & 1024 && (needsFormReset = !0);\n      break;\n    case 6:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      if (flags & 4) {\n        if (null === finishedWork.stateNode)\n          throw Error(formatProdErrorMessage(162));\n        flags = finishedWork.memoizedProps;\n        current = finishedWork.stateNode;\n        try {\n          current.nodeValue = flags;\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      }\n      break;\n    case 3:\n      tagCaches = null;\n      hoistableRoot = currentHoistableRoot;\n      currentHoistableRoot = getHoistableRoot(root.containerInfo);\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      currentHoistableRoot = hoistableRoot;\n      commitReconciliationEffects(finishedWork);\n      if (flags & 4 && null !== current && current.memoizedState.isDehydrated)\n        try {\n          retryIfBlockedOn(root.containerInfo);\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      needsFormReset &&\n        ((needsFormReset = !1), recursivelyResetForms(finishedWork));\n      break;\n    case 4:\n      flags = currentHoistableRoot;\n      currentHoistableRoot = getHoistableRoot(\n        finishedWork.stateNode.containerInfo\n      );\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      currentHoistableRoot = flags;\n      break;\n    case 12:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      break;\n    case 13:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      finishedWork.child.flags & 8192 &&\n        (null !== finishedWork.memoizedState) !==\n          (null !== current && null !== current.memoizedState) &&\n        (globalMostRecentFallbackTime = now());\n      flags & 4 &&\n        ((flags = finishedWork.updateQueue),\n        null !== flags &&\n          ((finishedWork.updateQueue = null),\n          attachSuspenseRetryListeners(finishedWork, flags)));\n      break;\n    case 22:\n      hoistableRoot = null !== finishedWork.memoizedState;\n      var wasHidden = null !== current && null !== current.memoizedState,\n        prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden,\n        prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;\n      offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || hoistableRoot;\n      offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || wasHidden;\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;\n      offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;\n      commitReconciliationEffects(finishedWork);\n      if (flags & 8192)\n        a: for (\n          root = finishedWork.stateNode,\n            root._visibility = hoistableRoot\n              ? root._visibility & -2\n              : root._visibility | 1,\n            hoistableRoot &&\n              (null === current ||\n                wasHidden ||\n                offscreenSubtreeIsHidden ||\n                offscreenSubtreeWasHidden ||\n                recursivelyTraverseDisappearLayoutEffects(finishedWork)),\n            current = null,\n            root = finishedWork;\n          ;\n\n        ) {\n          if (5 === root.tag || 26 === root.tag) {\n            if (null === current) {\n              wasHidden = current = root;\n              try {\n                if (((currentResource = wasHidden.stateNode), hoistableRoot))\n                  (maybeNodes = currentResource.style),\n                    \"function\" === typeof maybeNodes.setProperty\n                      ? maybeNodes.setProperty(\"display\", \"none\", \"important\")\n                      : (maybeNodes.display = \"none\");\n                else {\n                  i = wasHidden.stateNode;\n                  var styleProp = wasHidden.memoizedProps.style,\n                    display =\n                      void 0 !== styleProp &&\n                      null !== styleProp &&\n                      styleProp.hasOwnProperty(\"display\")\n                        ? styleProp.display\n                        : null;\n                  i.style.display =\n                    null == display || \"boolean\" === typeof display\n                      ? \"\"\n                      : (\"\" + display).trim();\n                }\n              } catch (error) {\n                captureCommitPhaseError(wasHidden, wasHidden.return, error);\n              }\n            }\n          } else if (6 === root.tag) {\n            if (null === current) {\n              wasHidden = root;\n              try {\n                wasHidden.stateNode.nodeValue = hoistableRoot\n                  ? \"\"\n                  : wasHidden.memoizedProps;\n              } catch (error) {\n                captureCommitPhaseError(wasHidden, wasHidden.return, error);\n              }\n            }\n          } else if (\n            ((22 !== root.tag && 23 !== root.tag) ||\n              null === root.memoizedState ||\n              root === finishedWork) &&\n            null !== root.child\n          ) {\n            root.child.return = root;\n            root = root.child;\n            continue;\n          }\n          if (root === finishedWork) break a;\n          for (; null === root.sibling; ) {\n            if (null === root.return || root.return === finishedWork) break a;\n            current === root && (current = null);\n            root = root.return;\n          }\n          current === root && (current = null);\n          root.sibling.return = root.return;\n          root = root.sibling;\n        }\n      flags & 4 &&\n        ((flags = finishedWork.updateQueue),\n        null !== flags &&\n          ((current = flags.retryQueue),\n          null !== current &&\n            ((flags.retryQueue = null),\n            attachSuspenseRetryListeners(finishedWork, current))));\n      break;\n    case 19:\n      recursivelyTraverseMutationEffects(root, finishedWork);\n      commitReconciliationEffects(finishedWork);\n      flags & 4 &&\n        ((flags = finishedWork.updateQueue),\n        null !== flags &&\n          ((finishedWork.updateQueue = null),\n          attachSuspenseRetryListeners(finishedWork, flags)));\n      break;\n    case 30:\n      break;\n    case 21:\n      break;\n    default:\n      recursivelyTraverseMutationEffects(root, finishedWork),\n        commitReconciliationEffects(finishedWork);\n  }\n}\nfunction commitReconciliationEffects(finishedWork) {\n  var flags = finishedWork.flags;\n  if (flags & 2) {\n    try {\n      for (\n        var hostParentFiber, parentFiber = finishedWork.return;\n        null !== parentFiber;\n\n      ) {\n        if (isHostParent(parentFiber)) {\n          hostParentFiber = parentFiber;\n          break;\n        }\n        parentFiber = parentFiber.return;\n      }\n      if (null == hostParentFiber) throw Error(formatProdErrorMessage(160));\n      switch (hostParentFiber.tag) {\n        case 27:\n          var parent = hostParentFiber.stateNode,\n            before = getHostSibling(finishedWork);\n          insertOrAppendPlacementNode(finishedWork, before, parent);\n          break;\n        case 5:\n          var parent$144 = hostParentFiber.stateNode;\n          hostParentFiber.flags & 32 &&\n            (setTextContent(parent$144, \"\"), (hostParentFiber.flags &= -33));\n          var before$145 = getHostSibling(finishedWork);\n          insertOrAppendPlacementNode(finishedWork, before$145, parent$144);\n          break;\n        case 3:\n        case 4:\n          var parent$146 = hostParentFiber.stateNode.containerInfo,\n            before$147 = getHostSibling(finishedWork);\n          insertOrAppendPlacementNodeIntoContainer(\n            finishedWork,\n            before$147,\n            parent$146\n          );\n          break;\n        default:\n          throw Error(formatProdErrorMessage(161));\n      }\n    } catch (error) {\n      captureCommitPhaseError(finishedWork, finishedWork.return, error);\n    }\n    finishedWork.flags &= -3;\n  }\n  flags & 4096 && (finishedWork.flags &= -4097);\n}\nfunction recursivelyResetForms(parentFiber) {\n  if (parentFiber.subtreeFlags & 1024)\n    for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n      var fiber = parentFiber;\n      recursivelyResetForms(fiber);\n      5 === fiber.tag && fiber.flags & 1024 && fiber.stateNode.reset();\n      parentFiber = parentFiber.sibling;\n    }\n}\nfunction recursivelyTraverseLayoutEffects(root, parentFiber) {\n  if (parentFiber.subtreeFlags & 8772)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitLayoutEffectOnFiber(root, parentFiber.alternate, parentFiber),\n        (parentFiber = parentFiber.sibling);\n}\nfunction recursivelyTraverseDisappearLayoutEffects(parentFiber) {\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    var finishedWork = parentFiber;\n    switch (finishedWork.tag) {\n      case 0:\n      case 11:\n      case 14:\n      case 15:\n        commitHookEffectListUnmount(4, finishedWork, finishedWork.return);\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 1:\n        safelyDetachRef(finishedWork, finishedWork.return);\n        var instance = finishedWork.stateNode;\n        \"function\" === typeof instance.componentWillUnmount &&\n          safelyCallComponentWillUnmount(\n            finishedWork,\n            finishedWork.return,\n            instance\n          );\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 27:\n        releaseSingletonInstance(finishedWork.stateNode);\n      case 26:\n      case 5:\n        safelyDetachRef(finishedWork, finishedWork.return);\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 22:\n        null === finishedWork.memoizedState &&\n          recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      case 30:\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n        break;\n      default:\n        recursivelyTraverseDisappearLayoutEffects(finishedWork);\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction recursivelyTraverseReappearLayoutEffects(\n  finishedRoot$jscomp$0,\n  parentFiber,\n  includeWorkInProgressEffects\n) {\n  includeWorkInProgressEffects =\n    includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 8772);\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    var current = parentFiber.alternate,\n      finishedRoot = finishedRoot$jscomp$0,\n      finishedWork = parentFiber,\n      flags = finishedWork.flags;\n    switch (finishedWork.tag) {\n      case 0:\n      case 11:\n      case 15:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        commitHookEffectListMount(4, finishedWork);\n        break;\n      case 1:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        current = finishedWork;\n        finishedRoot = current.stateNode;\n        if (\"function\" === typeof finishedRoot.componentDidMount)\n          try {\n            finishedRoot.componentDidMount();\n          } catch (error) {\n            captureCommitPhaseError(current, current.return, error);\n          }\n        current = finishedWork;\n        finishedRoot = current.updateQueue;\n        if (null !== finishedRoot) {\n          var instance = current.stateNode;\n          try {\n            var hiddenCallbacks = finishedRoot.shared.hiddenCallbacks;\n            if (null !== hiddenCallbacks)\n              for (\n                finishedRoot.shared.hiddenCallbacks = null, finishedRoot = 0;\n                finishedRoot < hiddenCallbacks.length;\n                finishedRoot++\n              )\n                callCallback(hiddenCallbacks[finishedRoot], instance);\n          } catch (error) {\n            captureCommitPhaseError(current, current.return, error);\n          }\n        }\n        includeWorkInProgressEffects &&\n          flags & 64 &&\n          commitClassCallbacks(finishedWork);\n        safelyAttachRef(finishedWork, finishedWork.return);\n        break;\n      case 27:\n        commitHostSingletonAcquisition(finishedWork);\n      case 26:\n      case 5:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        includeWorkInProgressEffects &&\n          null === current &&\n          flags & 4 &&\n          commitHostMount(finishedWork);\n        safelyAttachRef(finishedWork, finishedWork.return);\n        break;\n      case 12:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        break;\n      case 13:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n        includeWorkInProgressEffects &&\n          flags & 4 &&\n          commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);\n        break;\n      case 22:\n        null === finishedWork.memoizedState &&\n          recursivelyTraverseReappearLayoutEffects(\n            finishedRoot,\n            finishedWork,\n            includeWorkInProgressEffects\n          );\n        safelyAttachRef(finishedWork, finishedWork.return);\n        break;\n      case 30:\n        break;\n      default:\n        recursivelyTraverseReappearLayoutEffects(\n          finishedRoot,\n          finishedWork,\n          includeWorkInProgressEffects\n        );\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction commitOffscreenPassiveMountEffects(current, finishedWork) {\n  var previousCache = null;\n  null !== current &&\n    null !== current.memoizedState &&\n    null !== current.memoizedState.cachePool &&\n    (previousCache = current.memoizedState.cachePool.pool);\n  current = null;\n  null !== finishedWork.memoizedState &&\n    null !== finishedWork.memoizedState.cachePool &&\n    (current = finishedWork.memoizedState.cachePool.pool);\n  current !== previousCache &&\n    (null != current && current.refCount++,\n    null != previousCache && releaseCache(previousCache));\n}\nfunction commitCachePassiveMountEffect(current, finishedWork) {\n  current = null;\n  null !== finishedWork.alternate &&\n    (current = finishedWork.alternate.memoizedState.cache);\n  finishedWork = finishedWork.memoizedState.cache;\n  finishedWork !== current &&\n    (finishedWork.refCount++, null != current && releaseCache(current));\n}\nfunction recursivelyTraversePassiveMountEffects(\n  root,\n  parentFiber,\n  committedLanes,\n  committedTransitions\n) {\n  if (parentFiber.subtreeFlags & 10256)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitPassiveMountOnFiber(\n        root,\n        parentFiber,\n        committedLanes,\n        committedTransitions\n      ),\n        (parentFiber = parentFiber.sibling);\n}\nfunction commitPassiveMountOnFiber(\n  finishedRoot,\n  finishedWork,\n  committedLanes,\n  committedTransitions\n) {\n  var flags = finishedWork.flags;\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 15:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      flags & 2048 && commitHookEffectListMount(9, finishedWork);\n      break;\n    case 1:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      break;\n    case 3:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      flags & 2048 &&\n        ((finishedRoot = null),\n        null !== finishedWork.alternate &&\n          (finishedRoot = finishedWork.alternate.memoizedState.cache),\n        (finishedWork = finishedWork.memoizedState.cache),\n        finishedWork !== finishedRoot &&\n          (finishedWork.refCount++,\n          null != finishedRoot && releaseCache(finishedRoot)));\n      break;\n    case 12:\n      if (flags & 2048) {\n        recursivelyTraversePassiveMountEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions\n        );\n        finishedRoot = finishedWork.stateNode;\n        try {\n          var _finishedWork$memoize2 = finishedWork.memoizedProps,\n            id = _finishedWork$memoize2.id,\n            onPostCommit = _finishedWork$memoize2.onPostCommit;\n          \"function\" === typeof onPostCommit &&\n            onPostCommit(\n              id,\n              null === finishedWork.alternate ? \"mount\" : \"update\",\n              finishedRoot.passiveEffectDuration,\n              -0\n            );\n        } catch (error) {\n          captureCommitPhaseError(finishedWork, finishedWork.return, error);\n        }\n      } else\n        recursivelyTraversePassiveMountEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions\n        );\n      break;\n    case 13:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      break;\n    case 23:\n      break;\n    case 22:\n      _finishedWork$memoize2 = finishedWork.stateNode;\n      id = finishedWork.alternate;\n      null !== finishedWork.memoizedState\n        ? _finishedWork$memoize2._visibility & 2\n          ? recursivelyTraversePassiveMountEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions\n            )\n          : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork)\n        : _finishedWork$memoize2._visibility & 2\n          ? recursivelyTraversePassiveMountEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions\n            )\n          : ((_finishedWork$memoize2._visibility |= 2),\n            recursivelyTraverseReconnectPassiveEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions,\n              0 !== (finishedWork.subtreeFlags & 10256)\n            ));\n      flags & 2048 && commitOffscreenPassiveMountEffects(id, finishedWork);\n      break;\n    case 24:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n      flags & 2048 &&\n        commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n      break;\n    default:\n      recursivelyTraversePassiveMountEffects(\n        finishedRoot,\n        finishedWork,\n        committedLanes,\n        committedTransitions\n      );\n  }\n}\nfunction recursivelyTraverseReconnectPassiveEffects(\n  finishedRoot$jscomp$0,\n  parentFiber,\n  committedLanes$jscomp$0,\n  committedTransitions$jscomp$0,\n  includeWorkInProgressEffects\n) {\n  includeWorkInProgressEffects =\n    includeWorkInProgressEffects && 0 !== (parentFiber.subtreeFlags & 10256);\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    var finishedRoot = finishedRoot$jscomp$0,\n      finishedWork = parentFiber,\n      committedLanes = committedLanes$jscomp$0,\n      committedTransitions = committedTransitions$jscomp$0,\n      flags = finishedWork.flags;\n    switch (finishedWork.tag) {\n      case 0:\n      case 11:\n      case 15:\n        recursivelyTraverseReconnectPassiveEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions,\n          includeWorkInProgressEffects\n        );\n        commitHookEffectListMount(8, finishedWork);\n        break;\n      case 23:\n        break;\n      case 22:\n        var instance = finishedWork.stateNode;\n        null !== finishedWork.memoizedState\n          ? instance._visibility & 2\n            ? recursivelyTraverseReconnectPassiveEffects(\n                finishedRoot,\n                finishedWork,\n                committedLanes,\n                committedTransitions,\n                includeWorkInProgressEffects\n              )\n            : recursivelyTraverseAtomicPassiveEffects(\n                finishedRoot,\n                finishedWork\n              )\n          : ((instance._visibility |= 2),\n            recursivelyTraverseReconnectPassiveEffects(\n              finishedRoot,\n              finishedWork,\n              committedLanes,\n              committedTransitions,\n              includeWorkInProgressEffects\n            ));\n        includeWorkInProgressEffects &&\n          flags & 2048 &&\n          commitOffscreenPassiveMountEffects(\n            finishedWork.alternate,\n            finishedWork\n          );\n        break;\n      case 24:\n        recursivelyTraverseReconnectPassiveEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions,\n          includeWorkInProgressEffects\n        );\n        includeWorkInProgressEffects &&\n          flags & 2048 &&\n          commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n        break;\n      default:\n        recursivelyTraverseReconnectPassiveEffects(\n          finishedRoot,\n          finishedWork,\n          committedLanes,\n          committedTransitions,\n          includeWorkInProgressEffects\n        );\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction recursivelyTraverseAtomicPassiveEffects(\n  finishedRoot$jscomp$0,\n  parentFiber\n) {\n  if (parentFiber.subtreeFlags & 10256)\n    for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n      var finishedRoot = finishedRoot$jscomp$0,\n        finishedWork = parentFiber,\n        flags = finishedWork.flags;\n      switch (finishedWork.tag) {\n        case 22:\n          recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n          flags & 2048 &&\n            commitOffscreenPassiveMountEffects(\n              finishedWork.alternate,\n              finishedWork\n            );\n          break;\n        case 24:\n          recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n          flags & 2048 &&\n            commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);\n          break;\n        default:\n          recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork);\n      }\n      parentFiber = parentFiber.sibling;\n    }\n}\nvar suspenseyCommitFlag = 8192;\nfunction recursivelyAccumulateSuspenseyCommit(parentFiber) {\n  if (parentFiber.subtreeFlags & suspenseyCommitFlag)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      accumulateSuspenseyCommitOnFiber(parentFiber),\n        (parentFiber = parentFiber.sibling);\n}\nfunction accumulateSuspenseyCommitOnFiber(fiber) {\n  switch (fiber.tag) {\n    case 26:\n      recursivelyAccumulateSuspenseyCommit(fiber);\n      fiber.flags & suspenseyCommitFlag &&\n        null !== fiber.memoizedState &&\n        suspendResource(\n          currentHoistableRoot,\n          fiber.memoizedState,\n          fiber.memoizedProps\n        );\n      break;\n    case 5:\n      recursivelyAccumulateSuspenseyCommit(fiber);\n      break;\n    case 3:\n    case 4:\n      var previousHoistableRoot = currentHoistableRoot;\n      currentHoistableRoot = getHoistableRoot(fiber.stateNode.containerInfo);\n      recursivelyAccumulateSuspenseyCommit(fiber);\n      currentHoistableRoot = previousHoistableRoot;\n      break;\n    case 22:\n      null === fiber.memoizedState &&\n        ((previousHoistableRoot = fiber.alternate),\n        null !== previousHoistableRoot &&\n        null !== previousHoistableRoot.memoizedState\n          ? ((previousHoistableRoot = suspenseyCommitFlag),\n            (suspenseyCommitFlag = 16777216),\n            recursivelyAccumulateSuspenseyCommit(fiber),\n            (suspenseyCommitFlag = previousHoistableRoot))\n          : recursivelyAccumulateSuspenseyCommit(fiber));\n      break;\n    default:\n      recursivelyAccumulateSuspenseyCommit(fiber);\n  }\n}\nfunction detachAlternateSiblings(parentFiber) {\n  var previousFiber = parentFiber.alternate;\n  if (\n    null !== previousFiber &&\n    ((parentFiber = previousFiber.child), null !== parentFiber)\n  ) {\n    previousFiber.child = null;\n    do\n      (previousFiber = parentFiber.sibling),\n        (parentFiber.sibling = null),\n        (parentFiber = previousFiber);\n    while (null !== parentFiber);\n  }\n}\nfunction recursivelyTraversePassiveUnmountEffects(parentFiber) {\n  var deletions = parentFiber.deletions;\n  if (0 !== (parentFiber.flags & 16)) {\n    if (null !== deletions)\n      for (var i = 0; i < deletions.length; i++) {\n        var childToDelete = deletions[i];\n        nextEffect = childToDelete;\n        commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n          childToDelete,\n          parentFiber\n        );\n      }\n    detachAlternateSiblings(parentFiber);\n  }\n  if (parentFiber.subtreeFlags & 10256)\n    for (parentFiber = parentFiber.child; null !== parentFiber; )\n      commitPassiveUnmountOnFiber(parentFiber),\n        (parentFiber = parentFiber.sibling);\n}\nfunction commitPassiveUnmountOnFiber(finishedWork) {\n  switch (finishedWork.tag) {\n    case 0:\n    case 11:\n    case 15:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n      finishedWork.flags & 2048 &&\n        commitHookEffectListUnmount(9, finishedWork, finishedWork.return);\n      break;\n    case 3:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n      break;\n    case 12:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n      break;\n    case 22:\n      var instance = finishedWork.stateNode;\n      null !== finishedWork.memoizedState &&\n      instance._visibility & 2 &&\n      (null === finishedWork.return || 13 !== finishedWork.return.tag)\n        ? ((instance._visibility &= -3),\n          recursivelyTraverseDisconnectPassiveEffects(finishedWork))\n        : recursivelyTraversePassiveUnmountEffects(finishedWork);\n      break;\n    default:\n      recursivelyTraversePassiveUnmountEffects(finishedWork);\n  }\n}\nfunction recursivelyTraverseDisconnectPassiveEffects(parentFiber) {\n  var deletions = parentFiber.deletions;\n  if (0 !== (parentFiber.flags & 16)) {\n    if (null !== deletions)\n      for (var i = 0; i < deletions.length; i++) {\n        var childToDelete = deletions[i];\n        nextEffect = childToDelete;\n        commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n          childToDelete,\n          parentFiber\n        );\n      }\n    detachAlternateSiblings(parentFiber);\n  }\n  for (parentFiber = parentFiber.child; null !== parentFiber; ) {\n    deletions = parentFiber;\n    switch (deletions.tag) {\n      case 0:\n      case 11:\n      case 15:\n        commitHookEffectListUnmount(8, deletions, deletions.return);\n        recursivelyTraverseDisconnectPassiveEffects(deletions);\n        break;\n      case 22:\n        i = deletions.stateNode;\n        i._visibility & 2 &&\n          ((i._visibility &= -3),\n          recursivelyTraverseDisconnectPassiveEffects(deletions));\n        break;\n      default:\n        recursivelyTraverseDisconnectPassiveEffects(deletions);\n    }\n    parentFiber = parentFiber.sibling;\n  }\n}\nfunction commitPassiveUnmountEffectsInsideOfDeletedTree_begin(\n  deletedSubtreeRoot,\n  nearestMountedAncestor\n) {\n  for (; null !== nextEffect; ) {\n    var fiber = nextEffect;\n    switch (fiber.tag) {\n      case 0:\n      case 11:\n      case 15:\n        commitHookEffectListUnmount(8, fiber, nearestMountedAncestor);\n        break;\n      case 23:\n      case 22:\n        if (\n          null !== fiber.memoizedState &&\n          null !== fiber.memoizedState.cachePool\n        ) {\n          var cache = fiber.memoizedState.cachePool.pool;\n          null != cache && cache.refCount++;\n        }\n        break;\n      case 24:\n        releaseCache(fiber.memoizedState.cache);\n    }\n    cache = fiber.child;\n    if (null !== cache) (cache.return = fiber), (nextEffect = cache);\n    else\n      a: for (fiber = deletedSubtreeRoot; null !== nextEffect; ) {\n        cache = nextEffect;\n        var sibling = cache.sibling,\n          returnFiber = cache.return;\n        detachFiberAfterEffects(cache);\n        if (cache === fiber) {\n          nextEffect = null;\n          break a;\n        }\n        if (null !== sibling) {\n          sibling.return = returnFiber;\n          nextEffect = sibling;\n          break a;\n        }\n        nextEffect = returnFiber;\n      }\n  }\n}\nvar DefaultAsyncDispatcher = {\n    getCacheForType: function (resourceType) {\n      var cache = readContext(CacheContext),\n        cacheForType = cache.data.get(resourceType);\n      void 0 === cacheForType &&\n        ((cacheForType = resourceType()),\n        cache.data.set(resourceType, cacheForType));\n      return cacheForType;\n    }\n  },\n  PossiblyWeakMap = \"function\" === typeof WeakMap ? WeakMap : Map,\n  executionContext = 0,\n  workInProgressRoot = null,\n  workInProgress = null,\n  workInProgressRootRenderLanes = 0,\n  workInProgressSuspendedReason = 0,\n  workInProgressThrownValue = null,\n  workInProgressRootDidSkipSuspendedSiblings = !1,\n  workInProgressRootIsPrerendering = !1,\n  workInProgressRootDidAttachPingListener = !1,\n  entangledRenderLanes = 0,\n  workInProgressRootExitStatus = 0,\n  workInProgressRootSkippedLanes = 0,\n  workInProgressRootInterleavedUpdatedLanes = 0,\n  workInProgressRootPingedLanes = 0,\n  workInProgressDeferredLane = 0,\n  workInProgressSuspendedRetryLanes = 0,\n  workInProgressRootConcurrentErrors = null,\n  workInProgressRootRecoverableErrors = null,\n  workInProgressRootDidIncludeRecursiveRenderUpdate = !1,\n  globalMostRecentFallbackTime = 0,\n  workInProgressRootRenderTargetTime = Infinity,\n  workInProgressTransitions = null,\n  legacyErrorBoundariesThatAlreadyFailed = null,\n  pendingEffectsStatus = 0,\n  pendingEffectsRoot = null,\n  pendingFinishedWork = null,\n  pendingEffectsLanes = 0,\n  pendingEffectsRemainingLanes = 0,\n  pendingPassiveTransitions = null,\n  pendingRecoverableErrors = null,\n  nestedUpdateCount = 0,\n  rootWithNestedUpdates = null;\nfunction requestUpdateLane() {\n  if (0 !== (executionContext & 2) && 0 !== workInProgressRootRenderLanes)\n    return workInProgressRootRenderLanes & -workInProgressRootRenderLanes;\n  if (null !== ReactSharedInternals.T) {\n    var actionScopeLane = currentEntangledLane;\n    return 0 !== actionScopeLane ? actionScopeLane : requestTransitionLane();\n  }\n  return resolveUpdatePriority();\n}\nfunction requestDeferredLane() {\n  0 === workInProgressDeferredLane &&\n    (workInProgressDeferredLane =\n      0 === (workInProgressRootRenderLanes & 536870912) || isHydrating\n        ? claimNextTransitionLane()\n        : 536870912);\n  var suspenseHandler = suspenseHandlerStackCursor.current;\n  null !== suspenseHandler && (suspenseHandler.flags |= 32);\n  return workInProgressDeferredLane;\n}\nfunction scheduleUpdateOnFiber(root, fiber, lane) {\n  if (\n    (root === workInProgressRoot &&\n      (2 === workInProgressSuspendedReason ||\n        9 === workInProgressSuspendedReason)) ||\n    null !== root.cancelPendingCommit\n  )\n    prepareFreshStack(root, 0),\n      markRootSuspended(\n        root,\n        workInProgressRootRenderLanes,\n        workInProgressDeferredLane,\n        !1\n      );\n  markRootUpdated$1(root, lane);\n  if (0 === (executionContext & 2) || root !== workInProgressRoot)\n    root === workInProgressRoot &&\n      (0 === (executionContext & 2) &&\n        (workInProgressRootInterleavedUpdatedLanes |= lane),\n      4 === workInProgressRootExitStatus &&\n        markRootSuspended(\n          root,\n          workInProgressRootRenderLanes,\n          workInProgressDeferredLane,\n          !1\n        )),\n      ensureRootIsScheduled(root);\n}\nfunction performWorkOnRoot(root$jscomp$0, lanes, forceSync) {\n  if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327));\n  var shouldTimeSlice =\n      (!forceSync &&\n        0 === (lanes & 124) &&\n        0 === (lanes & root$jscomp$0.expiredLanes)) ||\n      checkIfRootIsPrerendering(root$jscomp$0, lanes),\n    exitStatus = shouldTimeSlice\n      ? renderRootConcurrent(root$jscomp$0, lanes)\n      : renderRootSync(root$jscomp$0, lanes, !0),\n    renderWasConcurrent = shouldTimeSlice;\n  do {\n    if (0 === exitStatus) {\n      workInProgressRootIsPrerendering &&\n        !shouldTimeSlice &&\n        markRootSuspended(root$jscomp$0, lanes, 0, !1);\n      break;\n    } else {\n      forceSync = root$jscomp$0.current.alternate;\n      if (\n        renderWasConcurrent &&\n        !isRenderConsistentWithExternalStores(forceSync)\n      ) {\n        exitStatus = renderRootSync(root$jscomp$0, lanes, !1);\n        renderWasConcurrent = !1;\n        continue;\n      }\n      if (2 === exitStatus) {\n        renderWasConcurrent = lanes;\n        if (root$jscomp$0.errorRecoveryDisabledLanes & renderWasConcurrent)\n          var JSCompiler_inline_result = 0;\n        else\n          (JSCompiler_inline_result = root$jscomp$0.pendingLanes & -536870913),\n            (JSCompiler_inline_result =\n              0 !== JSCompiler_inline_result\n                ? JSCompiler_inline_result\n                : JSCompiler_inline_result & 536870912\n                  ? 536870912\n                  : 0);\n        if (0 !== JSCompiler_inline_result) {\n          lanes = JSCompiler_inline_result;\n          a: {\n            var root = root$jscomp$0;\n            exitStatus = workInProgressRootConcurrentErrors;\n            var wasRootDehydrated = root.current.memoizedState.isDehydrated;\n            wasRootDehydrated &&\n              (prepareFreshStack(root, JSCompiler_inline_result).flags |= 256);\n            JSCompiler_inline_result = renderRootSync(\n              root,\n              JSCompiler_inline_result,\n              !1\n            );\n            if (2 !== JSCompiler_inline_result) {\n              if (\n                workInProgressRootDidAttachPingListener &&\n                !wasRootDehydrated\n              ) {\n                root.errorRecoveryDisabledLanes |= renderWasConcurrent;\n                workInProgressRootInterleavedUpdatedLanes |=\n                  renderWasConcurrent;\n                exitStatus = 4;\n                break a;\n              }\n              renderWasConcurrent = workInProgressRootRecoverableErrors;\n              workInProgressRootRecoverableErrors = exitStatus;\n              null !== renderWasConcurrent &&\n                (null === workInProgressRootRecoverableErrors\n                  ? (workInProgressRootRecoverableErrors = renderWasConcurrent)\n                  : workInProgressRootRecoverableErrors.push.apply(\n                      workInProgressRootRecoverableErrors,\n                      renderWasConcurrent\n                    ));\n            }\n            exitStatus = JSCompiler_inline_result;\n          }\n          renderWasConcurrent = !1;\n          if (2 !== exitStatus) continue;\n        }\n      }\n      if (1 === exitStatus) {\n        prepareFreshStack(root$jscomp$0, 0);\n        markRootSuspended(root$jscomp$0, lanes, 0, !0);\n        break;\n      }\n      a: {\n        shouldTimeSlice = root$jscomp$0;\n        renderWasConcurrent = exitStatus;\n        switch (renderWasConcurrent) {\n          case 0:\n          case 1:\n            throw Error(formatProdErrorMessage(345));\n          case 4:\n            if ((lanes & 4194048) !== lanes) break;\n          case 6:\n            markRootSuspended(\n              shouldTimeSlice,\n              lanes,\n              workInProgressDeferredLane,\n              !workInProgressRootDidSkipSuspendedSiblings\n            );\n            break a;\n          case 2:\n            workInProgressRootRecoverableErrors = null;\n            break;\n          case 3:\n          case 5:\n            break;\n          default:\n            throw Error(formatProdErrorMessage(329));\n        }\n        if (\n          (lanes & 62914560) === lanes &&\n          ((exitStatus = globalMostRecentFallbackTime + 300 - now()),\n          10 < exitStatus)\n        ) {\n          markRootSuspended(\n            shouldTimeSlice,\n            lanes,\n            workInProgressDeferredLane,\n            !workInProgressRootDidSkipSuspendedSiblings\n          );\n          if (0 !== getNextLanes(shouldTimeSlice, 0, !0)) break a;\n          shouldTimeSlice.timeoutHandle = scheduleTimeout(\n            commitRootWhenReady.bind(\n              null,\n              shouldTimeSlice,\n              forceSync,\n              workInProgressRootRecoverableErrors,\n              workInProgressTransitions,\n              workInProgressRootDidIncludeRecursiveRenderUpdate,\n              lanes,\n              workInProgressDeferredLane,\n              workInProgressRootInterleavedUpdatedLanes,\n              workInProgressSuspendedRetryLanes,\n              workInProgressRootDidSkipSuspendedSiblings,\n              renderWasConcurrent,\n              2,\n              -0,\n              0\n            ),\n            exitStatus\n          );\n          break a;\n        }\n        commitRootWhenReady(\n          shouldTimeSlice,\n          forceSync,\n          workInProgressRootRecoverableErrors,\n          workInProgressTransitions,\n          workInProgressRootDidIncludeRecursiveRenderUpdate,\n          lanes,\n          workInProgressDeferredLane,\n          workInProgressRootInterleavedUpdatedLanes,\n          workInProgressSuspendedRetryLanes,\n          workInProgressRootDidSkipSuspendedSiblings,\n          renderWasConcurrent,\n          0,\n          -0,\n          0\n        );\n      }\n    }\n    break;\n  } while (1);\n  ensureRootIsScheduled(root$jscomp$0);\n}\nfunction commitRootWhenReady(\n  root,\n  finishedWork,\n  recoverableErrors,\n  transitions,\n  didIncludeRenderPhaseUpdate,\n  lanes,\n  spawnedLane,\n  updatedLanes,\n  suspendedRetryLanes,\n  didSkipSuspendedSiblings,\n  exitStatus,\n  suspendedCommitReason,\n  completedRenderStartTime,\n  completedRenderEndTime\n) {\n  root.timeoutHandle = -1;\n  suspendedCommitReason = finishedWork.subtreeFlags;\n  if (\n    suspendedCommitReason & 8192 ||\n    16785408 === (suspendedCommitReason & 16785408)\n  )\n    if (\n      ((suspendedState = { stylesheets: null, count: 0, unsuspend: noop }),\n      accumulateSuspenseyCommitOnFiber(finishedWork),\n      (suspendedCommitReason = waitForCommitToBeReady()),\n      null !== suspendedCommitReason)\n    ) {\n      root.cancelPendingCommit = suspendedCommitReason(\n        commitRoot.bind(\n          null,\n          root,\n          finishedWork,\n          lanes,\n          recoverableErrors,\n          transitions,\n          didIncludeRenderPhaseUpdate,\n          spawnedLane,\n          updatedLanes,\n          suspendedRetryLanes,\n          exitStatus,\n          1,\n          completedRenderStartTime,\n          completedRenderEndTime\n        )\n      );\n      markRootSuspended(root, lanes, spawnedLane, !didSkipSuspendedSiblings);\n      return;\n    }\n  commitRoot(\n    root,\n    finishedWork,\n    lanes,\n    recoverableErrors,\n    transitions,\n    didIncludeRenderPhaseUpdate,\n    spawnedLane,\n    updatedLanes,\n    suspendedRetryLanes\n  );\n}\nfunction isRenderConsistentWithExternalStores(finishedWork) {\n  for (var node = finishedWork; ; ) {\n    var tag = node.tag;\n    if (\n      (0 === tag || 11 === tag || 15 === tag) &&\n      node.flags & 16384 &&\n      ((tag = node.updateQueue),\n      null !== tag && ((tag = tag.stores), null !== tag))\n    )\n      for (var i = 0; i < tag.length; i++) {\n        var check = tag[i],\n          getSnapshot = check.getSnapshot;\n        check = check.value;\n        try {\n          if (!objectIs(getSnapshot(), check)) return !1;\n        } catch (error) {\n          return !1;\n        }\n      }\n    tag = node.child;\n    if (node.subtreeFlags & 16384 && null !== tag)\n      (tag.return = node), (node = tag);\n    else {\n      if (node === finishedWork) break;\n      for (; null === node.sibling; ) {\n        if (null === node.return || node.return === finishedWork) return !0;\n        node = node.return;\n      }\n      node.sibling.return = node.return;\n      node = node.sibling;\n    }\n  }\n  return !0;\n}\nfunction markRootSuspended(\n  root,\n  suspendedLanes,\n  spawnedLane,\n  didAttemptEntireTree\n) {\n  suspendedLanes &= ~workInProgressRootPingedLanes;\n  suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes;\n  root.suspendedLanes |= suspendedLanes;\n  root.pingedLanes &= ~suspendedLanes;\n  didAttemptEntireTree && (root.warmLanes |= suspendedLanes);\n  didAttemptEntireTree = root.expirationTimes;\n  for (var lanes = suspendedLanes; 0 < lanes; ) {\n    var index$4 = 31 - clz32(lanes),\n      lane = 1 << index$4;\n    didAttemptEntireTree[index$4] = -1;\n    lanes &= ~lane;\n  }\n  0 !== spawnedLane &&\n    markSpawnedDeferredLane(root, spawnedLane, suspendedLanes);\n}\nfunction flushSyncWork$1() {\n  return 0 === (executionContext & 6)\n    ? (flushSyncWorkAcrossRoots_impl(0, !1), !1)\n    : !0;\n}\nfunction resetWorkInProgressStack() {\n  if (null !== workInProgress) {\n    if (0 === workInProgressSuspendedReason)\n      var interruptedWork = workInProgress.return;\n    else\n      (interruptedWork = workInProgress),\n        (lastContextDependency = currentlyRenderingFiber$1 = null),\n        resetHooksOnUnwind(interruptedWork),\n        (thenableState = null),\n        (thenableIndexCounter = 0),\n        (interruptedWork = workInProgress);\n    for (; null !== interruptedWork; )\n      unwindInterruptedWork(interruptedWork.alternate, interruptedWork),\n        (interruptedWork = interruptedWork.return);\n    workInProgress = null;\n  }\n}\nfunction prepareFreshStack(root, lanes) {\n  var timeoutHandle = root.timeoutHandle;\n  -1 !== timeoutHandle &&\n    ((root.timeoutHandle = -1), cancelTimeout(timeoutHandle));\n  timeoutHandle = root.cancelPendingCommit;\n  null !== timeoutHandle &&\n    ((root.cancelPendingCommit = null), timeoutHandle());\n  resetWorkInProgressStack();\n  workInProgressRoot = root;\n  workInProgress = timeoutHandle = createWorkInProgress(root.current, null);\n  workInProgressRootRenderLanes = lanes;\n  workInProgressSuspendedReason = 0;\n  workInProgressThrownValue = null;\n  workInProgressRootDidSkipSuspendedSiblings = !1;\n  workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root, lanes);\n  workInProgressRootDidAttachPingListener = !1;\n  workInProgressSuspendedRetryLanes =\n    workInProgressDeferredLane =\n    workInProgressRootPingedLanes =\n    workInProgressRootInterleavedUpdatedLanes =\n    workInProgressRootSkippedLanes =\n    workInProgressRootExitStatus =\n      0;\n  workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors =\n    null;\n  workInProgressRootDidIncludeRecursiveRenderUpdate = !1;\n  0 !== (lanes & 8) && (lanes |= lanes & 32);\n  var allEntangledLanes = root.entangledLanes;\n  if (0 !== allEntangledLanes)\n    for (\n      root = root.entanglements, allEntangledLanes &= lanes;\n      0 < allEntangledLanes;\n\n    ) {\n      var index$2 = 31 - clz32(allEntangledLanes),\n        lane = 1 << index$2;\n      lanes |= root[index$2];\n      allEntangledLanes &= ~lane;\n    }\n  entangledRenderLanes = lanes;\n  finishQueueingConcurrentUpdates();\n  return timeoutHandle;\n}\nfunction handleThrow(root, thrownValue) {\n  currentlyRenderingFiber = null;\n  ReactSharedInternals.H = ContextOnlyDispatcher;\n  thrownValue === SuspenseException || thrownValue === SuspenseActionException\n    ? ((thrownValue = getSuspendedThenable()),\n      (workInProgressSuspendedReason = 3))\n    : thrownValue === SuspenseyCommitException\n      ? ((thrownValue = getSuspendedThenable()),\n        (workInProgressSuspendedReason = 4))\n      : (workInProgressSuspendedReason =\n          thrownValue === SelectiveHydrationException\n            ? 8\n            : null !== thrownValue &&\n                \"object\" === typeof thrownValue &&\n                \"function\" === typeof thrownValue.then\n              ? 6\n              : 1);\n  workInProgressThrownValue = thrownValue;\n  null === workInProgress &&\n    ((workInProgressRootExitStatus = 1),\n    logUncaughtError(\n      root,\n      createCapturedValueAtFiber(thrownValue, root.current)\n    ));\n}\nfunction pushDispatcher() {\n  var prevDispatcher = ReactSharedInternals.H;\n  ReactSharedInternals.H = ContextOnlyDispatcher;\n  return null === prevDispatcher ? ContextOnlyDispatcher : prevDispatcher;\n}\nfunction pushAsyncDispatcher() {\n  var prevAsyncDispatcher = ReactSharedInternals.A;\n  ReactSharedInternals.A = DefaultAsyncDispatcher;\n  return prevAsyncDispatcher;\n}\nfunction renderDidSuspendDelayIfPossible() {\n  workInProgressRootExitStatus = 4;\n  workInProgressRootDidSkipSuspendedSiblings ||\n    ((workInProgressRootRenderLanes & 4194048) !==\n      workInProgressRootRenderLanes &&\n      null !== suspenseHandlerStackCursor.current) ||\n    (workInProgressRootIsPrerendering = !0);\n  (0 === (workInProgressRootSkippedLanes & 134217727) &&\n    0 === (workInProgressRootInterleavedUpdatedLanes & 134217727)) ||\n    null === workInProgressRoot ||\n    markRootSuspended(\n      workInProgressRoot,\n      workInProgressRootRenderLanes,\n      workInProgressDeferredLane,\n      !1\n    );\n}\nfunction renderRootSync(root, lanes, shouldYieldForPrerendering) {\n  var prevExecutionContext = executionContext;\n  executionContext |= 2;\n  var prevDispatcher = pushDispatcher(),\n    prevAsyncDispatcher = pushAsyncDispatcher();\n  if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes)\n    (workInProgressTransitions = null), prepareFreshStack(root, lanes);\n  lanes = !1;\n  var exitStatus = workInProgressRootExitStatus;\n  a: do\n    try {\n      if (0 !== workInProgressSuspendedReason && null !== workInProgress) {\n        var unitOfWork = workInProgress,\n          thrownValue = workInProgressThrownValue;\n        switch (workInProgressSuspendedReason) {\n          case 8:\n            resetWorkInProgressStack();\n            exitStatus = 6;\n            break a;\n          case 3:\n          case 2:\n          case 9:\n          case 6:\n            null === suspenseHandlerStackCursor.current && (lanes = !0);\n            var reason = workInProgressSuspendedReason;\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);\n            if (\n              shouldYieldForPrerendering &&\n              workInProgressRootIsPrerendering\n            ) {\n              exitStatus = 0;\n              break a;\n            }\n            break;\n          default:\n            (reason = workInProgressSuspendedReason),\n              (workInProgressSuspendedReason = 0),\n              (workInProgressThrownValue = null),\n              throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);\n        }\n      }\n      workLoopSync();\n      exitStatus = workInProgressRootExitStatus;\n      break;\n    } catch (thrownValue$167) {\n      handleThrow(root, thrownValue$167);\n    }\n  while (1);\n  lanes && root.shellSuspendCounter++;\n  lastContextDependency = currentlyRenderingFiber$1 = null;\n  executionContext = prevExecutionContext;\n  ReactSharedInternals.H = prevDispatcher;\n  ReactSharedInternals.A = prevAsyncDispatcher;\n  null === workInProgress &&\n    ((workInProgressRoot = null),\n    (workInProgressRootRenderLanes = 0),\n    finishQueueingConcurrentUpdates());\n  return exitStatus;\n}\nfunction workLoopSync() {\n  for (; null !== workInProgress; ) performUnitOfWork(workInProgress);\n}\nfunction renderRootConcurrent(root, lanes) {\n  var prevExecutionContext = executionContext;\n  executionContext |= 2;\n  var prevDispatcher = pushDispatcher(),\n    prevAsyncDispatcher = pushAsyncDispatcher();\n  workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes\n    ? ((workInProgressTransitions = null),\n      (workInProgressRootRenderTargetTime = now() + 500),\n      prepareFreshStack(root, lanes))\n    : (workInProgressRootIsPrerendering = checkIfRootIsPrerendering(\n        root,\n        lanes\n      ));\n  a: do\n    try {\n      if (0 !== workInProgressSuspendedReason && null !== workInProgress) {\n        lanes = workInProgress;\n        var thrownValue = workInProgressThrownValue;\n        b: switch (workInProgressSuspendedReason) {\n          case 1:\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, lanes, thrownValue, 1);\n            break;\n          case 2:\n          case 9:\n            if (isThenableResolved(thrownValue)) {\n              workInProgressSuspendedReason = 0;\n              workInProgressThrownValue = null;\n              replaySuspendedUnitOfWork(lanes);\n              break;\n            }\n            lanes = function () {\n              (2 !== workInProgressSuspendedReason &&\n                9 !== workInProgressSuspendedReason) ||\n                workInProgressRoot !== root ||\n                (workInProgressSuspendedReason = 7);\n              ensureRootIsScheduled(root);\n            };\n            thrownValue.then(lanes, lanes);\n            break a;\n          case 3:\n            workInProgressSuspendedReason = 7;\n            break a;\n          case 4:\n            workInProgressSuspendedReason = 5;\n            break a;\n          case 7:\n            isThenableResolved(thrownValue)\n              ? ((workInProgressSuspendedReason = 0),\n                (workInProgressThrownValue = null),\n                replaySuspendedUnitOfWork(lanes))\n              : ((workInProgressSuspendedReason = 0),\n                (workInProgressThrownValue = null),\n                throwAndUnwindWorkLoop(root, lanes, thrownValue, 7));\n            break;\n          case 5:\n            var resource = null;\n            switch (workInProgress.tag) {\n              case 26:\n                resource = workInProgress.memoizedState;\n              case 5:\n              case 27:\n                var hostFiber = workInProgress;\n                if (resource ? preloadResource(resource) : 1) {\n                  workInProgressSuspendedReason = 0;\n                  workInProgressThrownValue = null;\n                  var sibling = hostFiber.sibling;\n                  if (null !== sibling) workInProgress = sibling;\n                  else {\n                    var returnFiber = hostFiber.return;\n                    null !== returnFiber\n                      ? ((workInProgress = returnFiber),\n                        completeUnitOfWork(returnFiber))\n                      : (workInProgress = null);\n                  }\n                  break b;\n                }\n            }\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, lanes, thrownValue, 5);\n            break;\n          case 6:\n            workInProgressSuspendedReason = 0;\n            workInProgressThrownValue = null;\n            throwAndUnwindWorkLoop(root, lanes, thrownValue, 6);\n            break;\n          case 8:\n            resetWorkInProgressStack();\n            workInProgressRootExitStatus = 6;\n            break a;\n          default:\n            throw Error(formatProdErrorMessage(462));\n        }\n      }\n      workLoopConcurrentByScheduler();\n      break;\n    } catch (thrownValue$169) {\n      handleThrow(root, thrownValue$169);\n    }\n  while (1);\n  lastContextDependency = currentlyRenderingFiber$1 = null;\n  ReactSharedInternals.H = prevDispatcher;\n  ReactSharedInternals.A = prevAsyncDispatcher;\n  executionContext = prevExecutionContext;\n  if (null !== workInProgress) return 0;\n  workInProgressRoot = null;\n  workInProgressRootRenderLanes = 0;\n  finishQueueingConcurrentUpdates();\n  return workInProgressRootExitStatus;\n}\nfunction workLoopConcurrentByScheduler() {\n  for (; null !== workInProgress && !shouldYield(); )\n    performUnitOfWork(workInProgress);\n}\nfunction performUnitOfWork(unitOfWork) {\n  var next = beginWork(unitOfWork.alternate, unitOfWork, entangledRenderLanes);\n  unitOfWork.memoizedProps = unitOfWork.pendingProps;\n  null === next ? completeUnitOfWork(unitOfWork) : (workInProgress = next);\n}\nfunction replaySuspendedUnitOfWork(unitOfWork) {\n  var next = unitOfWork;\n  var current = next.alternate;\n  switch (next.tag) {\n    case 15:\n    case 0:\n      next = replayFunctionComponent(\n        current,\n        next,\n        next.pendingProps,\n        next.type,\n        void 0,\n        workInProgressRootRenderLanes\n      );\n      break;\n    case 11:\n      next = replayFunctionComponent(\n        current,\n        next,\n        next.pendingProps,\n        next.type.render,\n        next.ref,\n        workInProgressRootRenderLanes\n      );\n      break;\n    case 5:\n      resetHooksOnUnwind(next);\n    default:\n      unwindInterruptedWork(current, next),\n        (next = workInProgress =\n          resetWorkInProgress(next, entangledRenderLanes)),\n        (next = beginWork(current, next, entangledRenderLanes));\n  }\n  unitOfWork.memoizedProps = unitOfWork.pendingProps;\n  null === next ? completeUnitOfWork(unitOfWork) : (workInProgress = next);\n}\nfunction throwAndUnwindWorkLoop(\n  root,\n  unitOfWork,\n  thrownValue,\n  suspendedReason\n) {\n  lastContextDependency = currentlyRenderingFiber$1 = null;\n  resetHooksOnUnwind(unitOfWork);\n  thenableState = null;\n  thenableIndexCounter = 0;\n  var returnFiber = unitOfWork.return;\n  try {\n    if (\n      throwException(\n        root,\n        returnFiber,\n        unitOfWork,\n        thrownValue,\n        workInProgressRootRenderLanes\n      )\n    ) {\n      workInProgressRootExitStatus = 1;\n      logUncaughtError(\n        root,\n        createCapturedValueAtFiber(thrownValue, root.current)\n      );\n      workInProgress = null;\n      return;\n    }\n  } catch (error) {\n    if (null !== returnFiber) throw ((workInProgress = returnFiber), error);\n    workInProgressRootExitStatus = 1;\n    logUncaughtError(\n      root,\n      createCapturedValueAtFiber(thrownValue, root.current)\n    );\n    workInProgress = null;\n    return;\n  }\n  if (unitOfWork.flags & 32768) {\n    if (isHydrating || 1 === suspendedReason) root = !0;\n    else if (\n      workInProgressRootIsPrerendering ||\n      0 !== (workInProgressRootRenderLanes & 536870912)\n    )\n      root = !1;\n    else if (\n      ((workInProgressRootDidSkipSuspendedSiblings = root = !0),\n      2 === suspendedReason ||\n        9 === suspendedReason ||\n        3 === suspendedReason ||\n        6 === suspendedReason)\n    )\n      (suspendedReason = suspenseHandlerStackCursor.current),\n        null !== suspendedReason &&\n          13 === suspendedReason.tag &&\n          (suspendedReason.flags |= 16384);\n    unwindUnitOfWork(unitOfWork, root);\n  } else completeUnitOfWork(unitOfWork);\n}\nfunction completeUnitOfWork(unitOfWork) {\n  var completedWork = unitOfWork;\n  do {\n    if (0 !== (completedWork.flags & 32768)) {\n      unwindUnitOfWork(\n        completedWork,\n        workInProgressRootDidSkipSuspendedSiblings\n      );\n      return;\n    }\n    unitOfWork = completedWork.return;\n    var next = completeWork(\n      completedWork.alternate,\n      completedWork,\n      entangledRenderLanes\n    );\n    if (null !== next) {\n      workInProgress = next;\n      return;\n    }\n    completedWork = completedWork.sibling;\n    if (null !== completedWork) {\n      workInProgress = completedWork;\n      return;\n    }\n    workInProgress = completedWork = unitOfWork;\n  } while (null !== completedWork);\n  0 === workInProgressRootExitStatus && (workInProgressRootExitStatus = 5);\n}\nfunction unwindUnitOfWork(unitOfWork, skipSiblings) {\n  do {\n    var next = unwindWork(unitOfWork.alternate, unitOfWork);\n    if (null !== next) {\n      next.flags &= 32767;\n      workInProgress = next;\n      return;\n    }\n    next = unitOfWork.return;\n    null !== next &&\n      ((next.flags |= 32768), (next.subtreeFlags = 0), (next.deletions = null));\n    if (\n      !skipSiblings &&\n      ((unitOfWork = unitOfWork.sibling), null !== unitOfWork)\n    ) {\n      workInProgress = unitOfWork;\n      return;\n    }\n    workInProgress = unitOfWork = next;\n  } while (null !== unitOfWork);\n  workInProgressRootExitStatus = 6;\n  workInProgress = null;\n}\nfunction commitRoot(\n  root,\n  finishedWork,\n  lanes,\n  recoverableErrors,\n  transitions,\n  didIncludeRenderPhaseUpdate,\n  spawnedLane,\n  updatedLanes,\n  suspendedRetryLanes\n) {\n  root.cancelPendingCommit = null;\n  do flushPendingEffects();\n  while (0 !== pendingEffectsStatus);\n  if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(327));\n  if (null !== finishedWork) {\n    if (finishedWork === root.current) throw Error(formatProdErrorMessage(177));\n    didIncludeRenderPhaseUpdate = finishedWork.lanes | finishedWork.childLanes;\n    didIncludeRenderPhaseUpdate |= concurrentlyUpdatedLanes;\n    markRootFinished(\n      root,\n      lanes,\n      didIncludeRenderPhaseUpdate,\n      spawnedLane,\n      updatedLanes,\n      suspendedRetryLanes\n    );\n    root === workInProgressRoot &&\n      ((workInProgress = workInProgressRoot = null),\n      (workInProgressRootRenderLanes = 0));\n    pendingFinishedWork = finishedWork;\n    pendingEffectsRoot = root;\n    pendingEffectsLanes = lanes;\n    pendingEffectsRemainingLanes = didIncludeRenderPhaseUpdate;\n    pendingPassiveTransitions = transitions;\n    pendingRecoverableErrors = recoverableErrors;\n    0 !== (finishedWork.subtreeFlags & 10256) ||\n    0 !== (finishedWork.flags & 10256)\n      ? ((root.callbackNode = null),\n        (root.callbackPriority = 0),\n        scheduleCallback$1(NormalPriority$1, function () {\n          flushPassiveEffects(!0);\n          return null;\n        }))\n      : ((root.callbackNode = null), (root.callbackPriority = 0));\n    recoverableErrors = 0 !== (finishedWork.flags & 13878);\n    if (0 !== (finishedWork.subtreeFlags & 13878) || recoverableErrors) {\n      recoverableErrors = ReactSharedInternals.T;\n      ReactSharedInternals.T = null;\n      transitions = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      spawnedLane = executionContext;\n      executionContext |= 4;\n      try {\n        commitBeforeMutationEffects(root, finishedWork, lanes);\n      } finally {\n        (executionContext = spawnedLane),\n          (ReactDOMSharedInternals.p = transitions),\n          (ReactSharedInternals.T = recoverableErrors);\n      }\n    }\n    pendingEffectsStatus = 1;\n    flushMutationEffects();\n    flushLayoutEffects();\n    flushSpawnedWork();\n  }\n}\nfunction flushMutationEffects() {\n  if (1 === pendingEffectsStatus) {\n    pendingEffectsStatus = 0;\n    var root = pendingEffectsRoot,\n      finishedWork = pendingFinishedWork,\n      rootMutationHasEffect = 0 !== (finishedWork.flags & 13878);\n    if (0 !== (finishedWork.subtreeFlags & 13878) || rootMutationHasEffect) {\n      rootMutationHasEffect = ReactSharedInternals.T;\n      ReactSharedInternals.T = null;\n      var previousPriority = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      var prevExecutionContext = executionContext;\n      executionContext |= 4;\n      try {\n        commitMutationEffectsOnFiber(finishedWork, root);\n        var priorSelectionInformation = selectionInformation,\n          curFocusedElem = getActiveElementDeep(root.containerInfo),\n          priorFocusedElem = priorSelectionInformation.focusedElem,\n          priorSelectionRange = priorSelectionInformation.selectionRange;\n        if (\n          curFocusedElem !== priorFocusedElem &&\n          priorFocusedElem &&\n          priorFocusedElem.ownerDocument &&\n          containsNode(\n            priorFocusedElem.ownerDocument.documentElement,\n            priorFocusedElem\n          )\n        ) {\n          if (\n            null !== priorSelectionRange &&\n            hasSelectionCapabilities(priorFocusedElem)\n          ) {\n            var start = priorSelectionRange.start,\n              end = priorSelectionRange.end;\n            void 0 === end && (end = start);\n            if (\"selectionStart\" in priorFocusedElem)\n              (priorFocusedElem.selectionStart = start),\n                (priorFocusedElem.selectionEnd = Math.min(\n                  end,\n                  priorFocusedElem.value.length\n                ));\n            else {\n              var doc = priorFocusedElem.ownerDocument || document,\n                win = (doc && doc.defaultView) || window;\n              if (win.getSelection) {\n                var selection = win.getSelection(),\n                  length = priorFocusedElem.textContent.length,\n                  start$jscomp$0 = Math.min(priorSelectionRange.start, length),\n                  end$jscomp$0 =\n                    void 0 === priorSelectionRange.end\n                      ? start$jscomp$0\n                      : Math.min(priorSelectionRange.end, length);\n                !selection.extend &&\n                  start$jscomp$0 > end$jscomp$0 &&\n                  ((curFocusedElem = end$jscomp$0),\n                  (end$jscomp$0 = start$jscomp$0),\n                  (start$jscomp$0 = curFocusedElem));\n                var startMarker = getNodeForCharacterOffset(\n                    priorFocusedElem,\n                    start$jscomp$0\n                  ),\n                  endMarker = getNodeForCharacterOffset(\n                    priorFocusedElem,\n                    end$jscomp$0\n                  );\n                if (\n                  startMarker &&\n                  endMarker &&\n                  (1 !== selection.rangeCount ||\n                    selection.anchorNode !== startMarker.node ||\n                    selection.anchorOffset !== startMarker.offset ||\n                    selection.focusNode !== endMarker.node ||\n                    selection.focusOffset !== endMarker.offset)\n                ) {\n                  var range = doc.createRange();\n                  range.setStart(startMarker.node, startMarker.offset);\n                  selection.removeAllRanges();\n                  start$jscomp$0 > end$jscomp$0\n                    ? (selection.addRange(range),\n                      selection.extend(endMarker.node, endMarker.offset))\n                    : (range.setEnd(endMarker.node, endMarker.offset),\n                      selection.addRange(range));\n                }\n              }\n            }\n          }\n          doc = [];\n          for (\n            selection = priorFocusedElem;\n            (selection = selection.parentNode);\n\n          )\n            1 === selection.nodeType &&\n              doc.push({\n                element: selection,\n                left: selection.scrollLeft,\n                top: selection.scrollTop\n              });\n          \"function\" === typeof priorFocusedElem.focus &&\n            priorFocusedElem.focus();\n          for (\n            priorFocusedElem = 0;\n            priorFocusedElem < doc.length;\n            priorFocusedElem++\n          ) {\n            var info = doc[priorFocusedElem];\n            info.element.scrollLeft = info.left;\n            info.element.scrollTop = info.top;\n          }\n        }\n        _enabled = !!eventsEnabled;\n        selectionInformation = eventsEnabled = null;\n      } finally {\n        (executionContext = prevExecutionContext),\n          (ReactDOMSharedInternals.p = previousPriority),\n          (ReactSharedInternals.T = rootMutationHasEffect);\n      }\n    }\n    root.current = finishedWork;\n    pendingEffectsStatus = 2;\n  }\n}\nfunction flushLayoutEffects() {\n  if (2 === pendingEffectsStatus) {\n    pendingEffectsStatus = 0;\n    var root = pendingEffectsRoot,\n      finishedWork = pendingFinishedWork,\n      rootHasLayoutEffect = 0 !== (finishedWork.flags & 8772);\n    if (0 !== (finishedWork.subtreeFlags & 8772) || rootHasLayoutEffect) {\n      rootHasLayoutEffect = ReactSharedInternals.T;\n      ReactSharedInternals.T = null;\n      var previousPriority = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      var prevExecutionContext = executionContext;\n      executionContext |= 4;\n      try {\n        commitLayoutEffectOnFiber(root, finishedWork.alternate, finishedWork);\n      } finally {\n        (executionContext = prevExecutionContext),\n          (ReactDOMSharedInternals.p = previousPriority),\n          (ReactSharedInternals.T = rootHasLayoutEffect);\n      }\n    }\n    pendingEffectsStatus = 3;\n  }\n}\nfunction flushSpawnedWork() {\n  if (4 === pendingEffectsStatus || 3 === pendingEffectsStatus) {\n    pendingEffectsStatus = 0;\n    requestPaint();\n    var root = pendingEffectsRoot,\n      finishedWork = pendingFinishedWork,\n      lanes = pendingEffectsLanes,\n      recoverableErrors = pendingRecoverableErrors;\n    0 !== (finishedWork.subtreeFlags & 10256) ||\n    0 !== (finishedWork.flags & 10256)\n      ? (pendingEffectsStatus = 5)\n      : ((pendingEffectsStatus = 0),\n        (pendingFinishedWork = pendingEffectsRoot = null),\n        releaseRootPooledCache(root, root.pendingLanes));\n    var remainingLanes = root.pendingLanes;\n    0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null);\n    lanesToEventPriority(lanes);\n    finishedWork = finishedWork.stateNode;\n    if (injectedHook && \"function\" === typeof injectedHook.onCommitFiberRoot)\n      try {\n        injectedHook.onCommitFiberRoot(\n          rendererID,\n          finishedWork,\n          void 0,\n          128 === (finishedWork.current.flags & 128)\n        );\n      } catch (err) {}\n    if (null !== recoverableErrors) {\n      finishedWork = ReactSharedInternals.T;\n      remainingLanes = ReactDOMSharedInternals.p;\n      ReactDOMSharedInternals.p = 2;\n      ReactSharedInternals.T = null;\n      try {\n        for (\n          var onRecoverableError = root.onRecoverableError, i = 0;\n          i < recoverableErrors.length;\n          i++\n        ) {\n          var recoverableError = recoverableErrors[i];\n          onRecoverableError(recoverableError.value, {\n            componentStack: recoverableError.stack\n          });\n        }\n      } finally {\n        (ReactSharedInternals.T = finishedWork),\n          (ReactDOMSharedInternals.p = remainingLanes);\n      }\n    }\n    0 !== (pendingEffectsLanes & 3) && flushPendingEffects();\n    ensureRootIsScheduled(root);\n    remainingLanes = root.pendingLanes;\n    0 !== (lanes & 4194090) && 0 !== (remainingLanes & 42)\n      ? root === rootWithNestedUpdates\n        ? nestedUpdateCount++\n        : ((nestedUpdateCount = 0), (rootWithNestedUpdates = root))\n      : (nestedUpdateCount = 0);\n    flushSyncWorkAcrossRoots_impl(0, !1);\n  }\n}\nfunction releaseRootPooledCache(root, remainingLanes) {\n  0 === (root.pooledCacheLanes &= remainingLanes) &&\n    ((remainingLanes = root.pooledCache),\n    null != remainingLanes &&\n      ((root.pooledCache = null), releaseCache(remainingLanes)));\n}\nfunction flushPendingEffects(wasDelayedCommit) {\n  flushMutationEffects();\n  flushLayoutEffects();\n  flushSpawnedWork();\n  return flushPassiveEffects(wasDelayedCommit);\n}\nfunction flushPassiveEffects() {\n  if (5 !== pendingEffectsStatus) return !1;\n  var root = pendingEffectsRoot,\n    remainingLanes = pendingEffectsRemainingLanes;\n  pendingEffectsRemainingLanes = 0;\n  var renderPriority = lanesToEventPriority(pendingEffectsLanes),\n    prevTransition = ReactSharedInternals.T,\n    previousPriority = ReactDOMSharedInternals.p;\n  try {\n    ReactDOMSharedInternals.p = 32 > renderPriority ? 32 : renderPriority;\n    ReactSharedInternals.T = null;\n    renderPriority = pendingPassiveTransitions;\n    pendingPassiveTransitions = null;\n    var root$jscomp$0 = pendingEffectsRoot,\n      lanes = pendingEffectsLanes;\n    pendingEffectsStatus = 0;\n    pendingFinishedWork = pendingEffectsRoot = null;\n    pendingEffectsLanes = 0;\n    if (0 !== (executionContext & 6)) throw Error(formatProdErrorMessage(331));\n    var prevExecutionContext = executionContext;\n    executionContext |= 4;\n    commitPassiveUnmountOnFiber(root$jscomp$0.current);\n    commitPassiveMountOnFiber(\n      root$jscomp$0,\n      root$jscomp$0.current,\n      lanes,\n      renderPriority\n    );\n    executionContext = prevExecutionContext;\n    flushSyncWorkAcrossRoots_impl(0, !1);\n    if (\n      injectedHook &&\n      \"function\" === typeof injectedHook.onPostCommitFiberRoot\n    )\n      try {\n        injectedHook.onPostCommitFiberRoot(rendererID, root$jscomp$0);\n      } catch (err) {}\n    return !0;\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition),\n      releaseRootPooledCache(root, remainingLanes);\n  }\n}\nfunction captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {\n  sourceFiber = createCapturedValueAtFiber(error, sourceFiber);\n  sourceFiber = createRootErrorUpdate(rootFiber.stateNode, sourceFiber, 2);\n  rootFiber = enqueueUpdate(rootFiber, sourceFiber, 2);\n  null !== rootFiber &&\n    (markRootUpdated$1(rootFiber, 2), ensureRootIsScheduled(rootFiber));\n}\nfunction captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error) {\n  if (3 === sourceFiber.tag)\n    captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);\n  else\n    for (; null !== nearestMountedAncestor; ) {\n      if (3 === nearestMountedAncestor.tag) {\n        captureCommitPhaseErrorOnRoot(\n          nearestMountedAncestor,\n          sourceFiber,\n          error\n        );\n        break;\n      } else if (1 === nearestMountedAncestor.tag) {\n        var instance = nearestMountedAncestor.stateNode;\n        if (\n          \"function\" ===\n            typeof nearestMountedAncestor.type.getDerivedStateFromError ||\n          (\"function\" === typeof instance.componentDidCatch &&\n            (null === legacyErrorBoundariesThatAlreadyFailed ||\n              !legacyErrorBoundariesThatAlreadyFailed.has(instance)))\n        ) {\n          sourceFiber = createCapturedValueAtFiber(error, sourceFiber);\n          error = createClassErrorUpdate(2);\n          instance = enqueueUpdate(nearestMountedAncestor, error, 2);\n          null !== instance &&\n            (initializeClassErrorUpdate(\n              error,\n              instance,\n              nearestMountedAncestor,\n              sourceFiber\n            ),\n            markRootUpdated$1(instance, 2),\n            ensureRootIsScheduled(instance));\n          break;\n        }\n      }\n      nearestMountedAncestor = nearestMountedAncestor.return;\n    }\n}\nfunction attachPingListener(root, wakeable, lanes) {\n  var pingCache = root.pingCache;\n  if (null === pingCache) {\n    pingCache = root.pingCache = new PossiblyWeakMap();\n    var threadIDs = new Set();\n    pingCache.set(wakeable, threadIDs);\n  } else\n    (threadIDs = pingCache.get(wakeable)),\n      void 0 === threadIDs &&\n        ((threadIDs = new Set()), pingCache.set(wakeable, threadIDs));\n  threadIDs.has(lanes) ||\n    ((workInProgressRootDidAttachPingListener = !0),\n    threadIDs.add(lanes),\n    (root = pingSuspendedRoot.bind(null, root, wakeable, lanes)),\n    wakeable.then(root, root));\n}\nfunction pingSuspendedRoot(root, wakeable, pingedLanes) {\n  var pingCache = root.pingCache;\n  null !== pingCache && pingCache.delete(wakeable);\n  root.pingedLanes |= root.suspendedLanes & pingedLanes;\n  root.warmLanes &= ~pingedLanes;\n  workInProgressRoot === root &&\n    (workInProgressRootRenderLanes & pingedLanes) === pingedLanes &&\n    (4 === workInProgressRootExitStatus ||\n    (3 === workInProgressRootExitStatus &&\n      (workInProgressRootRenderLanes & 62914560) ===\n        workInProgressRootRenderLanes &&\n      300 > now() - globalMostRecentFallbackTime)\n      ? 0 === (executionContext & 2) && prepareFreshStack(root, 0)\n      : (workInProgressRootPingedLanes |= pingedLanes),\n    workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes &&\n      (workInProgressSuspendedRetryLanes = 0));\n  ensureRootIsScheduled(root);\n}\nfunction retryTimedOutBoundary(boundaryFiber, retryLane) {\n  0 === retryLane && (retryLane = claimNextRetryLane());\n  boundaryFiber = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);\n  null !== boundaryFiber &&\n    (markRootUpdated$1(boundaryFiber, retryLane),\n    ensureRootIsScheduled(boundaryFiber));\n}\nfunction retryDehydratedSuspenseBoundary(boundaryFiber) {\n  var suspenseState = boundaryFiber.memoizedState,\n    retryLane = 0;\n  null !== suspenseState && (retryLane = suspenseState.retryLane);\n  retryTimedOutBoundary(boundaryFiber, retryLane);\n}\nfunction resolveRetryWakeable(boundaryFiber, wakeable) {\n  var retryLane = 0;\n  switch (boundaryFiber.tag) {\n    case 13:\n      var retryCache = boundaryFiber.stateNode;\n      var suspenseState = boundaryFiber.memoizedState;\n      null !== suspenseState && (retryLane = suspenseState.retryLane);\n      break;\n    case 19:\n      retryCache = boundaryFiber.stateNode;\n      break;\n    case 22:\n      retryCache = boundaryFiber.stateNode._retryCache;\n      break;\n    default:\n      throw Error(formatProdErrorMessage(314));\n  }\n  null !== retryCache && retryCache.delete(wakeable);\n  retryTimedOutBoundary(boundaryFiber, retryLane);\n}\nfunction scheduleCallback$1(priorityLevel, callback) {\n  return scheduleCallback$3(priorityLevel, callback);\n}\nvar firstScheduledRoot = null,\n  lastScheduledRoot = null,\n  didScheduleMicrotask = !1,\n  mightHavePendingSyncWork = !1,\n  isFlushingWork = !1,\n  currentEventTransitionLane = 0;\nfunction ensureRootIsScheduled(root) {\n  root !== lastScheduledRoot &&\n    null === root.next &&\n    (null === lastScheduledRoot\n      ? (firstScheduledRoot = lastScheduledRoot = root)\n      : (lastScheduledRoot = lastScheduledRoot.next = root));\n  mightHavePendingSyncWork = !0;\n  didScheduleMicrotask ||\n    ((didScheduleMicrotask = !0), scheduleImmediateRootScheduleTask());\n}\nfunction flushSyncWorkAcrossRoots_impl(syncTransitionLanes, onlyLegacy) {\n  if (!isFlushingWork && mightHavePendingSyncWork) {\n    isFlushingWork = !0;\n    do {\n      var didPerformSomeWork = !1;\n      for (var root$174 = firstScheduledRoot; null !== root$174; ) {\n        if (!onlyLegacy)\n          if (0 !== syncTransitionLanes) {\n            var pendingLanes = root$174.pendingLanes;\n            if (0 === pendingLanes) var JSCompiler_inline_result = 0;\n            else {\n              var suspendedLanes = root$174.suspendedLanes,\n                pingedLanes = root$174.pingedLanes;\n              JSCompiler_inline_result =\n                (1 << (31 - clz32(42 | syncTransitionLanes) + 1)) - 1;\n              JSCompiler_inline_result &=\n                pendingLanes & ~(suspendedLanes & ~pingedLanes);\n              JSCompiler_inline_result =\n                JSCompiler_inline_result & 201326741\n                  ? (JSCompiler_inline_result & 201326741) | 1\n                  : JSCompiler_inline_result\n                    ? JSCompiler_inline_result | 2\n                    : 0;\n            }\n            0 !== JSCompiler_inline_result &&\n              ((didPerformSomeWork = !0),\n              performSyncWorkOnRoot(root$174, JSCompiler_inline_result));\n          } else\n            (JSCompiler_inline_result = workInProgressRootRenderLanes),\n              (JSCompiler_inline_result = getNextLanes(\n                root$174,\n                root$174 === workInProgressRoot ? JSCompiler_inline_result : 0,\n                null !== root$174.cancelPendingCommit ||\n                  -1 !== root$174.timeoutHandle\n              )),\n              0 === (JSCompiler_inline_result & 3) ||\n                checkIfRootIsPrerendering(root$174, JSCompiler_inline_result) ||\n                ((didPerformSomeWork = !0),\n                performSyncWorkOnRoot(root$174, JSCompiler_inline_result));\n        root$174 = root$174.next;\n      }\n    } while (didPerformSomeWork);\n    isFlushingWork = !1;\n  }\n}\nfunction processRootScheduleInImmediateTask() {\n  processRootScheduleInMicrotask();\n}\nfunction processRootScheduleInMicrotask() {\n  mightHavePendingSyncWork = didScheduleMicrotask = !1;\n  var syncTransitionLanes = 0;\n  0 !== currentEventTransitionLane &&\n    (shouldAttemptEagerTransition() &&\n      (syncTransitionLanes = currentEventTransitionLane),\n    (currentEventTransitionLane = 0));\n  for (\n    var currentTime = now(), prev = null, root = firstScheduledRoot;\n    null !== root;\n\n  ) {\n    var next = root.next,\n      nextLanes = scheduleTaskForRootDuringMicrotask(root, currentTime);\n    if (0 === nextLanes)\n      (root.next = null),\n        null === prev ? (firstScheduledRoot = next) : (prev.next = next),\n        null === next && (lastScheduledRoot = prev);\n    else if (\n      ((prev = root), 0 !== syncTransitionLanes || 0 !== (nextLanes & 3))\n    )\n      mightHavePendingSyncWork = !0;\n    root = next;\n  }\n  flushSyncWorkAcrossRoots_impl(syncTransitionLanes, !1);\n}\nfunction scheduleTaskForRootDuringMicrotask(root, currentTime) {\n  for (\n    var suspendedLanes = root.suspendedLanes,\n      pingedLanes = root.pingedLanes,\n      expirationTimes = root.expirationTimes,\n      lanes = root.pendingLanes & -62914561;\n    0 < lanes;\n\n  ) {\n    var index$3 = 31 - clz32(lanes),\n      lane = 1 << index$3,\n      expirationTime = expirationTimes[index$3];\n    if (-1 === expirationTime) {\n      if (0 === (lane & suspendedLanes) || 0 !== (lane & pingedLanes))\n        expirationTimes[index$3] = computeExpirationTime(lane, currentTime);\n    } else expirationTime <= currentTime && (root.expiredLanes |= lane);\n    lanes &= ~lane;\n  }\n  currentTime = workInProgressRoot;\n  suspendedLanes = workInProgressRootRenderLanes;\n  suspendedLanes = getNextLanes(\n    root,\n    root === currentTime ? suspendedLanes : 0,\n    null !== root.cancelPendingCommit || -1 !== root.timeoutHandle\n  );\n  pingedLanes = root.callbackNode;\n  if (\n    0 === suspendedLanes ||\n    (root === currentTime &&\n      (2 === workInProgressSuspendedReason ||\n        9 === workInProgressSuspendedReason)) ||\n    null !== root.cancelPendingCommit\n  )\n    return (\n      null !== pingedLanes &&\n        null !== pingedLanes &&\n        cancelCallback$1(pingedLanes),\n      (root.callbackNode = null),\n      (root.callbackPriority = 0)\n    );\n  if (\n    0 === (suspendedLanes & 3) ||\n    checkIfRootIsPrerendering(root, suspendedLanes)\n  ) {\n    currentTime = suspendedLanes & -suspendedLanes;\n    if (currentTime === root.callbackPriority) return currentTime;\n    null !== pingedLanes && cancelCallback$1(pingedLanes);\n    switch (lanesToEventPriority(suspendedLanes)) {\n      case 2:\n      case 8:\n        suspendedLanes = UserBlockingPriority;\n        break;\n      case 32:\n        suspendedLanes = NormalPriority$1;\n        break;\n      case 268435456:\n        suspendedLanes = IdlePriority;\n        break;\n      default:\n        suspendedLanes = NormalPriority$1;\n    }\n    pingedLanes = performWorkOnRootViaSchedulerTask.bind(null, root);\n    suspendedLanes = scheduleCallback$3(suspendedLanes, pingedLanes);\n    root.callbackPriority = currentTime;\n    root.callbackNode = suspendedLanes;\n    return currentTime;\n  }\n  null !== pingedLanes && null !== pingedLanes && cancelCallback$1(pingedLanes);\n  root.callbackPriority = 2;\n  root.callbackNode = null;\n  return 2;\n}\nfunction performWorkOnRootViaSchedulerTask(root, didTimeout) {\n  if (0 !== pendingEffectsStatus && 5 !== pendingEffectsStatus)\n    return (root.callbackNode = null), (root.callbackPriority = 0), null;\n  var originalCallbackNode = root.callbackNode;\n  if (flushPendingEffects(!0) && root.callbackNode !== originalCallbackNode)\n    return null;\n  var workInProgressRootRenderLanes$jscomp$0 = workInProgressRootRenderLanes;\n  workInProgressRootRenderLanes$jscomp$0 = getNextLanes(\n    root,\n    root === workInProgressRoot ? workInProgressRootRenderLanes$jscomp$0 : 0,\n    null !== root.cancelPendingCommit || -1 !== root.timeoutHandle\n  );\n  if (0 === workInProgressRootRenderLanes$jscomp$0) return null;\n  performWorkOnRoot(root, workInProgressRootRenderLanes$jscomp$0, didTimeout);\n  scheduleTaskForRootDuringMicrotask(root, now());\n  return null != root.callbackNode && root.callbackNode === originalCallbackNode\n    ? performWorkOnRootViaSchedulerTask.bind(null, root)\n    : null;\n}\nfunction performSyncWorkOnRoot(root, lanes) {\n  if (flushPendingEffects()) return null;\n  performWorkOnRoot(root, lanes, !0);\n}\nfunction scheduleImmediateRootScheduleTask() {\n  scheduleMicrotask(function () {\n    0 !== (executionContext & 6)\n      ? scheduleCallback$3(\n          ImmediatePriority,\n          processRootScheduleInImmediateTask\n        )\n      : processRootScheduleInMicrotask();\n  });\n}\nfunction requestTransitionLane() {\n  0 === currentEventTransitionLane &&\n    (currentEventTransitionLane = claimNextTransitionLane());\n  return currentEventTransitionLane;\n}\nfunction coerceFormActionProp(actionProp) {\n  return null == actionProp ||\n    \"symbol\" === typeof actionProp ||\n    \"boolean\" === typeof actionProp\n    ? null\n    : \"function\" === typeof actionProp\n      ? actionProp\n      : sanitizeURL(\"\" + actionProp);\n}\nfunction createFormDataWithSubmitter(form, submitter) {\n  var temp = submitter.ownerDocument.createElement(\"input\");\n  temp.name = submitter.name;\n  temp.value = submitter.value;\n  form.id && temp.setAttribute(\"form\", form.id);\n  submitter.parentNode.insertBefore(temp, submitter);\n  form = new FormData(form);\n  temp.parentNode.removeChild(temp);\n  return form;\n}\nfunction extractEvents$1(\n  dispatchQueue,\n  domEventName,\n  maybeTargetInst,\n  nativeEvent,\n  nativeEventTarget\n) {\n  if (\n    \"submit\" === domEventName &&\n    maybeTargetInst &&\n    maybeTargetInst.stateNode === nativeEventTarget\n  ) {\n    var action = coerceFormActionProp(\n        (nativeEventTarget[internalPropsKey] || null).action\n      ),\n      submitter = nativeEvent.submitter;\n    submitter &&\n      ((domEventName = (domEventName = submitter[internalPropsKey] || null)\n        ? coerceFormActionProp(domEventName.formAction)\n        : submitter.getAttribute(\"formAction\")),\n      null !== domEventName && ((action = domEventName), (submitter = null)));\n    var event = new SyntheticEvent(\n      \"action\",\n      \"action\",\n      null,\n      nativeEvent,\n      nativeEventTarget\n    );\n    dispatchQueue.push({\n      event: event,\n      listeners: [\n        {\n          instance: null,\n          listener: function () {\n            if (nativeEvent.defaultPrevented) {\n              if (0 !== currentEventTransitionLane) {\n                var formData = submitter\n                  ? createFormDataWithSubmitter(nativeEventTarget, submitter)\n                  : new FormData(nativeEventTarget);\n                startHostTransition(\n                  maybeTargetInst,\n                  {\n                    pending: !0,\n                    data: formData,\n                    method: nativeEventTarget.method,\n                    action: action\n                  },\n                  null,\n                  formData\n                );\n              }\n            } else\n              \"function\" === typeof action &&\n                (event.preventDefault(),\n                (formData = submitter\n                  ? createFormDataWithSubmitter(nativeEventTarget, submitter)\n                  : new FormData(nativeEventTarget)),\n                startHostTransition(\n                  maybeTargetInst,\n                  {\n                    pending: !0,\n                    data: formData,\n                    method: nativeEventTarget.method,\n                    action: action\n                  },\n                  action,\n                  formData\n                ));\n          },\n          currentTarget: nativeEventTarget\n        }\n      ]\n    });\n  }\n}\nfor (\n  var i$jscomp$inline_1528 = 0;\n  i$jscomp$inline_1528 < simpleEventPluginEvents.length;\n  i$jscomp$inline_1528++\n) {\n  var eventName$jscomp$inline_1529 =\n      simpleEventPluginEvents[i$jscomp$inline_1528],\n    domEventName$jscomp$inline_1530 =\n      eventName$jscomp$inline_1529.toLowerCase(),\n    capitalizedEvent$jscomp$inline_1531 =\n      eventName$jscomp$inline_1529[0].toUpperCase() +\n      eventName$jscomp$inline_1529.slice(1);\n  registerSimpleEvent(\n    domEventName$jscomp$inline_1530,\n    \"on\" + capitalizedEvent$jscomp$inline_1531\n  );\n}\nregisterSimpleEvent(ANIMATION_END, \"onAnimationEnd\");\nregisterSimpleEvent(ANIMATION_ITERATION, \"onAnimationIteration\");\nregisterSimpleEvent(ANIMATION_START, \"onAnimationStart\");\nregisterSimpleEvent(\"dblclick\", \"onDoubleClick\");\nregisterSimpleEvent(\"focusin\", \"onFocus\");\nregisterSimpleEvent(\"focusout\", \"onBlur\");\nregisterSimpleEvent(TRANSITION_RUN, \"onTransitionRun\");\nregisterSimpleEvent(TRANSITION_START, \"onTransitionStart\");\nregisterSimpleEvent(TRANSITION_CANCEL, \"onTransitionCancel\");\nregisterSimpleEvent(TRANSITION_END, \"onTransitionEnd\");\nregisterDirectEvent(\"onMouseEnter\", [\"mouseout\", \"mouseover\"]);\nregisterDirectEvent(\"onMouseLeave\", [\"mouseout\", \"mouseover\"]);\nregisterDirectEvent(\"onPointerEnter\", [\"pointerout\", \"pointerover\"]);\nregisterDirectEvent(\"onPointerLeave\", [\"pointerout\", \"pointerover\"]);\nregisterTwoPhaseEvent(\n  \"onChange\",\n  \"change click focusin focusout input keydown keyup selectionchange\".split(\" \")\n);\nregisterTwoPhaseEvent(\n  \"onSelect\",\n  \"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\n    \" \"\n  )\n);\nregisterTwoPhaseEvent(\"onBeforeInput\", [\n  \"compositionend\",\n  \"keypress\",\n  \"textInput\",\n  \"paste\"\n]);\nregisterTwoPhaseEvent(\n  \"onCompositionEnd\",\n  \"compositionend focusout keydown keypress keyup mousedown\".split(\" \")\n);\nregisterTwoPhaseEvent(\n  \"onCompositionStart\",\n  \"compositionstart focusout keydown keypress keyup mousedown\".split(\" \")\n);\nregisterTwoPhaseEvent(\n  \"onCompositionUpdate\",\n  \"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \")\n);\nvar mediaEventTypes =\n    \"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\n      \" \"\n    ),\n  nonDelegatedEvents = new Set(\n    \"beforetoggle cancel close invalid load scroll scrollend toggle\"\n      .split(\" \")\n      .concat(mediaEventTypes)\n  );\nfunction processDispatchQueue(dispatchQueue, eventSystemFlags) {\n  eventSystemFlags = 0 !== (eventSystemFlags & 4);\n  for (var i = 0; i < dispatchQueue.length; i++) {\n    var _dispatchQueue$i = dispatchQueue[i],\n      event = _dispatchQueue$i.event;\n    _dispatchQueue$i = _dispatchQueue$i.listeners;\n    a: {\n      var previousInstance = void 0;\n      if (eventSystemFlags)\n        for (\n          var i$jscomp$0 = _dispatchQueue$i.length - 1;\n          0 <= i$jscomp$0;\n          i$jscomp$0--\n        ) {\n          var _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0],\n            instance = _dispatchListeners$i.instance,\n            currentTarget = _dispatchListeners$i.currentTarget;\n          _dispatchListeners$i = _dispatchListeners$i.listener;\n          if (instance !== previousInstance && event.isPropagationStopped())\n            break a;\n          previousInstance = _dispatchListeners$i;\n          event.currentTarget = currentTarget;\n          try {\n            previousInstance(event);\n          } catch (error) {\n            reportGlobalError(error);\n          }\n          event.currentTarget = null;\n          previousInstance = instance;\n        }\n      else\n        for (\n          i$jscomp$0 = 0;\n          i$jscomp$0 < _dispatchQueue$i.length;\n          i$jscomp$0++\n        ) {\n          _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0];\n          instance = _dispatchListeners$i.instance;\n          currentTarget = _dispatchListeners$i.currentTarget;\n          _dispatchListeners$i = _dispatchListeners$i.listener;\n          if (instance !== previousInstance && event.isPropagationStopped())\n            break a;\n          previousInstance = _dispatchListeners$i;\n          event.currentTarget = currentTarget;\n          try {\n            previousInstance(event);\n          } catch (error) {\n            reportGlobalError(error);\n          }\n          event.currentTarget = null;\n          previousInstance = instance;\n        }\n    }\n  }\n}\nfunction listenToNonDelegatedEvent(domEventName, targetElement) {\n  var JSCompiler_inline_result = targetElement[internalEventHandlersKey];\n  void 0 === JSCompiler_inline_result &&\n    (JSCompiler_inline_result = targetElement[internalEventHandlersKey] =\n      new Set());\n  var listenerSetKey = domEventName + \"__bubble\";\n  JSCompiler_inline_result.has(listenerSetKey) ||\n    (addTrappedEventListener(targetElement, domEventName, 2, !1),\n    JSCompiler_inline_result.add(listenerSetKey));\n}\nfunction listenToNativeEvent(domEventName, isCapturePhaseListener, target) {\n  var eventSystemFlags = 0;\n  isCapturePhaseListener && (eventSystemFlags |= 4);\n  addTrappedEventListener(\n    target,\n    domEventName,\n    eventSystemFlags,\n    isCapturePhaseListener\n  );\n}\nvar listeningMarker = \"_reactListening\" + Math.random().toString(36).slice(2);\nfunction listenToAllSupportedEvents(rootContainerElement) {\n  if (!rootContainerElement[listeningMarker]) {\n    rootContainerElement[listeningMarker] = !0;\n    allNativeEvents.forEach(function (domEventName) {\n      \"selectionchange\" !== domEventName &&\n        (nonDelegatedEvents.has(domEventName) ||\n          listenToNativeEvent(domEventName, !1, rootContainerElement),\n        listenToNativeEvent(domEventName, !0, rootContainerElement));\n    });\n    var ownerDocument =\n      9 === rootContainerElement.nodeType\n        ? rootContainerElement\n        : rootContainerElement.ownerDocument;\n    null === ownerDocument ||\n      ownerDocument[listeningMarker] ||\n      ((ownerDocument[listeningMarker] = !0),\n      listenToNativeEvent(\"selectionchange\", !1, ownerDocument));\n  }\n}\nfunction addTrappedEventListener(\n  targetContainer,\n  domEventName,\n  eventSystemFlags,\n  isCapturePhaseListener\n) {\n  switch (getEventPriority(domEventName)) {\n    case 2:\n      var listenerWrapper = dispatchDiscreteEvent;\n      break;\n    case 8:\n      listenerWrapper = dispatchContinuousEvent;\n      break;\n    default:\n      listenerWrapper = dispatchEvent;\n  }\n  eventSystemFlags = listenerWrapper.bind(\n    null,\n    domEventName,\n    eventSystemFlags,\n    targetContainer\n  );\n  listenerWrapper = void 0;\n  !passiveBrowserEventsSupported ||\n    (\"touchstart\" !== domEventName &&\n      \"touchmove\" !== domEventName &&\n      \"wheel\" !== domEventName) ||\n    (listenerWrapper = !0);\n  isCapturePhaseListener\n    ? void 0 !== listenerWrapper\n      ? targetContainer.addEventListener(domEventName, eventSystemFlags, {\n          capture: !0,\n          passive: listenerWrapper\n        })\n      : targetContainer.addEventListener(domEventName, eventSystemFlags, !0)\n    : void 0 !== listenerWrapper\n      ? targetContainer.addEventListener(domEventName, eventSystemFlags, {\n          passive: listenerWrapper\n        })\n      : targetContainer.addEventListener(domEventName, eventSystemFlags, !1);\n}\nfunction dispatchEventForPluginEventSystem(\n  domEventName,\n  eventSystemFlags,\n  nativeEvent,\n  targetInst$jscomp$0,\n  targetContainer\n) {\n  var ancestorInst = targetInst$jscomp$0;\n  if (\n    0 === (eventSystemFlags & 1) &&\n    0 === (eventSystemFlags & 2) &&\n    null !== targetInst$jscomp$0\n  )\n    a: for (;;) {\n      if (null === targetInst$jscomp$0) return;\n      var nodeTag = targetInst$jscomp$0.tag;\n      if (3 === nodeTag || 4 === nodeTag) {\n        var container = targetInst$jscomp$0.stateNode.containerInfo;\n        if (container === targetContainer) break;\n        if (4 === nodeTag)\n          for (nodeTag = targetInst$jscomp$0.return; null !== nodeTag; ) {\n            var grandTag = nodeTag.tag;\n            if (\n              (3 === grandTag || 4 === grandTag) &&\n              nodeTag.stateNode.containerInfo === targetContainer\n            )\n              return;\n            nodeTag = nodeTag.return;\n          }\n        for (; null !== container; ) {\n          nodeTag = getClosestInstanceFromNode(container);\n          if (null === nodeTag) return;\n          grandTag = nodeTag.tag;\n          if (\n            5 === grandTag ||\n            6 === grandTag ||\n            26 === grandTag ||\n            27 === grandTag\n          ) {\n            targetInst$jscomp$0 = ancestorInst = nodeTag;\n            continue a;\n          }\n          container = container.parentNode;\n        }\n      }\n      targetInst$jscomp$0 = targetInst$jscomp$0.return;\n    }\n  batchedUpdates$1(function () {\n    var targetInst = ancestorInst,\n      nativeEventTarget = getEventTarget(nativeEvent),\n      dispatchQueue = [];\n    a: {\n      var reactName = topLevelEventsToReactNames.get(domEventName);\n      if (void 0 !== reactName) {\n        var SyntheticEventCtor = SyntheticEvent,\n          reactEventType = domEventName;\n        switch (domEventName) {\n          case \"keypress\":\n            if (0 === getEventCharCode(nativeEvent)) break a;\n          case \"keydown\":\n          case \"keyup\":\n            SyntheticEventCtor = SyntheticKeyboardEvent;\n            break;\n          case \"focusin\":\n            reactEventType = \"focus\";\n            SyntheticEventCtor = SyntheticFocusEvent;\n            break;\n          case \"focusout\":\n            reactEventType = \"blur\";\n            SyntheticEventCtor = SyntheticFocusEvent;\n            break;\n          case \"beforeblur\":\n          case \"afterblur\":\n            SyntheticEventCtor = SyntheticFocusEvent;\n            break;\n          case \"click\":\n            if (2 === nativeEvent.button) break a;\n          case \"auxclick\":\n          case \"dblclick\":\n          case \"mousedown\":\n          case \"mousemove\":\n          case \"mouseup\":\n          case \"mouseout\":\n          case \"mouseover\":\n          case \"contextmenu\":\n            SyntheticEventCtor = SyntheticMouseEvent;\n            break;\n          case \"drag\":\n          case \"dragend\":\n          case \"dragenter\":\n          case \"dragexit\":\n          case \"dragleave\":\n          case \"dragover\":\n          case \"dragstart\":\n          case \"drop\":\n            SyntheticEventCtor = SyntheticDragEvent;\n            break;\n          case \"touchcancel\":\n          case \"touchend\":\n          case \"touchmove\":\n          case \"touchstart\":\n            SyntheticEventCtor = SyntheticTouchEvent;\n            break;\n          case ANIMATION_END:\n          case ANIMATION_ITERATION:\n          case ANIMATION_START:\n            SyntheticEventCtor = SyntheticAnimationEvent;\n            break;\n          case TRANSITION_END:\n            SyntheticEventCtor = SyntheticTransitionEvent;\n            break;\n          case \"scroll\":\n          case \"scrollend\":\n            SyntheticEventCtor = SyntheticUIEvent;\n            break;\n          case \"wheel\":\n            SyntheticEventCtor = SyntheticWheelEvent;\n            break;\n          case \"copy\":\n          case \"cut\":\n          case \"paste\":\n            SyntheticEventCtor = SyntheticClipboardEvent;\n            break;\n          case \"gotpointercapture\":\n          case \"lostpointercapture\":\n          case \"pointercancel\":\n          case \"pointerdown\":\n          case \"pointermove\":\n          case \"pointerout\":\n          case \"pointerover\":\n          case \"pointerup\":\n            SyntheticEventCtor = SyntheticPointerEvent;\n            break;\n          case \"toggle\":\n          case \"beforetoggle\":\n            SyntheticEventCtor = SyntheticToggleEvent;\n        }\n        var inCapturePhase = 0 !== (eventSystemFlags & 4),\n          accumulateTargetOnly =\n            !inCapturePhase &&\n            (\"scroll\" === domEventName || \"scrollend\" === domEventName),\n          reactEventName = inCapturePhase\n            ? null !== reactName\n              ? reactName + \"Capture\"\n              : null\n            : reactName;\n        inCapturePhase = [];\n        for (\n          var instance = targetInst, lastHostComponent;\n          null !== instance;\n\n        ) {\n          var _instance = instance;\n          lastHostComponent = _instance.stateNode;\n          _instance = _instance.tag;\n          (5 !== _instance && 26 !== _instance && 27 !== _instance) ||\n            null === lastHostComponent ||\n            null === reactEventName ||\n            ((_instance = getListener(instance, reactEventName)),\n            null != _instance &&\n              inCapturePhase.push(\n                createDispatchListener(instance, _instance, lastHostComponent)\n              ));\n          if (accumulateTargetOnly) break;\n          instance = instance.return;\n        }\n        0 < inCapturePhase.length &&\n          ((reactName = new SyntheticEventCtor(\n            reactName,\n            reactEventType,\n            null,\n            nativeEvent,\n            nativeEventTarget\n          )),\n          dispatchQueue.push({ event: reactName, listeners: inCapturePhase }));\n      }\n    }\n    if (0 === (eventSystemFlags & 7)) {\n      a: {\n        reactName =\n          \"mouseover\" === domEventName || \"pointerover\" === domEventName;\n        SyntheticEventCtor =\n          \"mouseout\" === domEventName || \"pointerout\" === domEventName;\n        if (\n          reactName &&\n          nativeEvent !== currentReplayingEvent &&\n          (reactEventType =\n            nativeEvent.relatedTarget || nativeEvent.fromElement) &&\n          (getClosestInstanceFromNode(reactEventType) ||\n            reactEventType[internalContainerInstanceKey])\n        )\n          break a;\n        if (SyntheticEventCtor || reactName) {\n          reactName =\n            nativeEventTarget.window === nativeEventTarget\n              ? nativeEventTarget\n              : (reactName = nativeEventTarget.ownerDocument)\n                ? reactName.defaultView || reactName.parentWindow\n                : window;\n          if (SyntheticEventCtor) {\n            if (\n              ((reactEventType =\n                nativeEvent.relatedTarget || nativeEvent.toElement),\n              (SyntheticEventCtor = targetInst),\n              (reactEventType = reactEventType\n                ? getClosestInstanceFromNode(reactEventType)\n                : null),\n              null !== reactEventType &&\n                ((accumulateTargetOnly =\n                  getNearestMountedFiber(reactEventType)),\n                (inCapturePhase = reactEventType.tag),\n                reactEventType !== accumulateTargetOnly ||\n                  (5 !== inCapturePhase &&\n                    27 !== inCapturePhase &&\n                    6 !== inCapturePhase)))\n            )\n              reactEventType = null;\n          } else (SyntheticEventCtor = null), (reactEventType = targetInst);\n          if (SyntheticEventCtor !== reactEventType) {\n            inCapturePhase = SyntheticMouseEvent;\n            _instance = \"onMouseLeave\";\n            reactEventName = \"onMouseEnter\";\n            instance = \"mouse\";\n            if (\"pointerout\" === domEventName || \"pointerover\" === domEventName)\n              (inCapturePhase = SyntheticPointerEvent),\n                (_instance = \"onPointerLeave\"),\n                (reactEventName = \"onPointerEnter\"),\n                (instance = \"pointer\");\n            accumulateTargetOnly =\n              null == SyntheticEventCtor\n                ? reactName\n                : getNodeFromInstance(SyntheticEventCtor);\n            lastHostComponent =\n              null == reactEventType\n                ? reactName\n                : getNodeFromInstance(reactEventType);\n            reactName = new inCapturePhase(\n              _instance,\n              instance + \"leave\",\n              SyntheticEventCtor,\n              nativeEvent,\n              nativeEventTarget\n            );\n            reactName.target = accumulateTargetOnly;\n            reactName.relatedTarget = lastHostComponent;\n            _instance = null;\n            getClosestInstanceFromNode(nativeEventTarget) === targetInst &&\n              ((inCapturePhase = new inCapturePhase(\n                reactEventName,\n                instance + \"enter\",\n                reactEventType,\n                nativeEvent,\n                nativeEventTarget\n              )),\n              (inCapturePhase.target = lastHostComponent),\n              (inCapturePhase.relatedTarget = accumulateTargetOnly),\n              (_instance = inCapturePhase));\n            accumulateTargetOnly = _instance;\n            if (SyntheticEventCtor && reactEventType)\n              b: {\n                inCapturePhase = SyntheticEventCtor;\n                reactEventName = reactEventType;\n                instance = 0;\n                for (\n                  lastHostComponent = inCapturePhase;\n                  lastHostComponent;\n                  lastHostComponent = getParent(lastHostComponent)\n                )\n                  instance++;\n                lastHostComponent = 0;\n                for (\n                  _instance = reactEventName;\n                  _instance;\n                  _instance = getParent(_instance)\n                )\n                  lastHostComponent++;\n                for (; 0 < instance - lastHostComponent; )\n                  (inCapturePhase = getParent(inCapturePhase)), instance--;\n                for (; 0 < lastHostComponent - instance; )\n                  (reactEventName = getParent(reactEventName)),\n                    lastHostComponent--;\n                for (; instance--; ) {\n                  if (\n                    inCapturePhase === reactEventName ||\n                    (null !== reactEventName &&\n                      inCapturePhase === reactEventName.alternate)\n                  )\n                    break b;\n                  inCapturePhase = getParent(inCapturePhase);\n                  reactEventName = getParent(reactEventName);\n                }\n                inCapturePhase = null;\n              }\n            else inCapturePhase = null;\n            null !== SyntheticEventCtor &&\n              accumulateEnterLeaveListenersForEvent(\n                dispatchQueue,\n                reactName,\n                SyntheticEventCtor,\n                inCapturePhase,\n                !1\n              );\n            null !== reactEventType &&\n              null !== accumulateTargetOnly &&\n              accumulateEnterLeaveListenersForEvent(\n                dispatchQueue,\n                accumulateTargetOnly,\n                reactEventType,\n                inCapturePhase,\n                !0\n              );\n          }\n        }\n      }\n      a: {\n        reactName = targetInst ? getNodeFromInstance(targetInst) : window;\n        SyntheticEventCtor =\n          reactName.nodeName && reactName.nodeName.toLowerCase();\n        if (\n          \"select\" === SyntheticEventCtor ||\n          (\"input\" === SyntheticEventCtor && \"file\" === reactName.type)\n        )\n          var getTargetInstFunc = getTargetInstForChangeEvent;\n        else if (isTextInputElement(reactName))\n          if (isInputEventSupported)\n            getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n          else {\n            getTargetInstFunc = getTargetInstForInputEventPolyfill;\n            var handleEventFunc = handleEventsForInputEventPolyfill;\n          }\n        else\n          (SyntheticEventCtor = reactName.nodeName),\n            !SyntheticEventCtor ||\n            \"input\" !== SyntheticEventCtor.toLowerCase() ||\n            (\"checkbox\" !== reactName.type && \"radio\" !== reactName.type)\n              ? targetInst &&\n                isCustomElement(targetInst.elementType) &&\n                (getTargetInstFunc = getTargetInstForChangeEvent)\n              : (getTargetInstFunc = getTargetInstForClickEvent);\n        if (\n          getTargetInstFunc &&\n          (getTargetInstFunc = getTargetInstFunc(domEventName, targetInst))\n        ) {\n          createAndAccumulateChangeEvent(\n            dispatchQueue,\n            getTargetInstFunc,\n            nativeEvent,\n            nativeEventTarget\n          );\n          break a;\n        }\n        handleEventFunc && handleEventFunc(domEventName, reactName, targetInst);\n        \"focusout\" === domEventName &&\n          targetInst &&\n          \"number\" === reactName.type &&\n          null != targetInst.memoizedProps.value &&\n          setDefaultValue(reactName, \"number\", reactName.value);\n      }\n      handleEventFunc = targetInst ? getNodeFromInstance(targetInst) : window;\n      switch (domEventName) {\n        case \"focusin\":\n          if (\n            isTextInputElement(handleEventFunc) ||\n            \"true\" === handleEventFunc.contentEditable\n          )\n            (activeElement = handleEventFunc),\n              (activeElementInst = targetInst),\n              (lastSelection = null);\n          break;\n        case \"focusout\":\n          lastSelection = activeElementInst = activeElement = null;\n          break;\n        case \"mousedown\":\n          mouseDown = !0;\n          break;\n        case \"contextmenu\":\n        case \"mouseup\":\n        case \"dragend\":\n          mouseDown = !1;\n          constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);\n          break;\n        case \"selectionchange\":\n          if (skipSelectionChangeEvent) break;\n        case \"keydown\":\n        case \"keyup\":\n          constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);\n      }\n      var fallbackData;\n      if (canUseCompositionEvent)\n        b: {\n          switch (domEventName) {\n            case \"compositionstart\":\n              var eventType = \"onCompositionStart\";\n              break b;\n            case \"compositionend\":\n              eventType = \"onCompositionEnd\";\n              break b;\n            case \"compositionupdate\":\n              eventType = \"onCompositionUpdate\";\n              break b;\n          }\n          eventType = void 0;\n        }\n      else\n        isComposing\n          ? isFallbackCompositionEnd(domEventName, nativeEvent) &&\n            (eventType = \"onCompositionEnd\")\n          : \"keydown\" === domEventName &&\n            229 === nativeEvent.keyCode &&\n            (eventType = \"onCompositionStart\");\n      eventType &&\n        (useFallbackCompositionData &&\n          \"ko\" !== nativeEvent.locale &&\n          (isComposing || \"onCompositionStart\" !== eventType\n            ? \"onCompositionEnd\" === eventType &&\n              isComposing &&\n              (fallbackData = getData())\n            : ((root = nativeEventTarget),\n              (startText = \"value\" in root ? root.value : root.textContent),\n              (isComposing = !0))),\n        (handleEventFunc = accumulateTwoPhaseListeners(targetInst, eventType)),\n        0 < handleEventFunc.length &&\n          ((eventType = new SyntheticCompositionEvent(\n            eventType,\n            domEventName,\n            null,\n            nativeEvent,\n            nativeEventTarget\n          )),\n          dispatchQueue.push({ event: eventType, listeners: handleEventFunc }),\n          fallbackData\n            ? (eventType.data = fallbackData)\n            : ((fallbackData = getDataFromCustomEvent(nativeEvent)),\n              null !== fallbackData && (eventType.data = fallbackData))));\n      if (\n        (fallbackData = canUseTextInputEvent\n          ? getNativeBeforeInputChars(domEventName, nativeEvent)\n          : getFallbackBeforeInputChars(domEventName, nativeEvent))\n      )\n        (eventType = accumulateTwoPhaseListeners(targetInst, \"onBeforeInput\")),\n          0 < eventType.length &&\n            ((handleEventFunc = new SyntheticCompositionEvent(\n              \"onBeforeInput\",\n              \"beforeinput\",\n              null,\n              nativeEvent,\n              nativeEventTarget\n            )),\n            dispatchQueue.push({\n              event: handleEventFunc,\n              listeners: eventType\n            }),\n            (handleEventFunc.data = fallbackData));\n      extractEvents$1(\n        dispatchQueue,\n        domEventName,\n        targetInst,\n        nativeEvent,\n        nativeEventTarget\n      );\n    }\n    processDispatchQueue(dispatchQueue, eventSystemFlags);\n  });\n}\nfunction createDispatchListener(instance, listener, currentTarget) {\n  return {\n    instance: instance,\n    listener: listener,\n    currentTarget: currentTarget\n  };\n}\nfunction accumulateTwoPhaseListeners(targetFiber, reactName) {\n  for (\n    var captureName = reactName + \"Capture\", listeners = [];\n    null !== targetFiber;\n\n  ) {\n    var _instance2 = targetFiber,\n      stateNode = _instance2.stateNode;\n    _instance2 = _instance2.tag;\n    (5 !== _instance2 && 26 !== _instance2 && 27 !== _instance2) ||\n      null === stateNode ||\n      ((_instance2 = getListener(targetFiber, captureName)),\n      null != _instance2 &&\n        listeners.unshift(\n          createDispatchListener(targetFiber, _instance2, stateNode)\n        ),\n      (_instance2 = getListener(targetFiber, reactName)),\n      null != _instance2 &&\n        listeners.push(\n          createDispatchListener(targetFiber, _instance2, stateNode)\n        ));\n    if (3 === targetFiber.tag) return listeners;\n    targetFiber = targetFiber.return;\n  }\n  return [];\n}\nfunction getParent(inst) {\n  if (null === inst) return null;\n  do inst = inst.return;\n  while (inst && 5 !== inst.tag && 27 !== inst.tag);\n  return inst ? inst : null;\n}\nfunction accumulateEnterLeaveListenersForEvent(\n  dispatchQueue,\n  event,\n  target,\n  common,\n  inCapturePhase\n) {\n  for (\n    var registrationName = event._reactName, listeners = [];\n    null !== target && target !== common;\n\n  ) {\n    var _instance3 = target,\n      alternate = _instance3.alternate,\n      stateNode = _instance3.stateNode;\n    _instance3 = _instance3.tag;\n    if (null !== alternate && alternate === common) break;\n    (5 !== _instance3 && 26 !== _instance3 && 27 !== _instance3) ||\n      null === stateNode ||\n      ((alternate = stateNode),\n      inCapturePhase\n        ? ((stateNode = getListener(target, registrationName)),\n          null != stateNode &&\n            listeners.unshift(\n              createDispatchListener(target, stateNode, alternate)\n            ))\n        : inCapturePhase ||\n          ((stateNode = getListener(target, registrationName)),\n          null != stateNode &&\n            listeners.push(\n              createDispatchListener(target, stateNode, alternate)\n            )));\n    target = target.return;\n  }\n  0 !== listeners.length &&\n    dispatchQueue.push({ event: event, listeners: listeners });\n}\nvar NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g,\n  NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\nfunction normalizeMarkupForTextOrAttribute(markup) {\n  return (\"string\" === typeof markup ? markup : \"\" + markup)\n    .replace(NORMALIZE_NEWLINES_REGEX, \"\\n\")\n    .replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, \"\");\n}\nfunction checkForUnmatchedText(serverText, clientText) {\n  clientText = normalizeMarkupForTextOrAttribute(clientText);\n  return normalizeMarkupForTextOrAttribute(serverText) === clientText ? !0 : !1;\n}\nfunction noop$1() {}\nfunction setProp(domElement, tag, key, value, props, prevValue) {\n  switch (key) {\n    case \"children\":\n      \"string\" === typeof value\n        ? \"body\" === tag ||\n          (\"textarea\" === tag && \"\" === value) ||\n          setTextContent(domElement, value)\n        : (\"number\" === typeof value || \"bigint\" === typeof value) &&\n          \"body\" !== tag &&\n          setTextContent(domElement, \"\" + value);\n      break;\n    case \"className\":\n      setValueForKnownAttribute(domElement, \"class\", value);\n      break;\n    case \"tabIndex\":\n      setValueForKnownAttribute(domElement, \"tabindex\", value);\n      break;\n    case \"dir\":\n    case \"role\":\n    case \"viewBox\":\n    case \"width\":\n    case \"height\":\n      setValueForKnownAttribute(domElement, key, value);\n      break;\n    case \"style\":\n      setValueForStyles(domElement, value, prevValue);\n      break;\n    case \"data\":\n      if (\"object\" !== tag) {\n        setValueForKnownAttribute(domElement, \"data\", value);\n        break;\n      }\n    case \"src\":\n    case \"href\":\n      if (\"\" === value && (\"a\" !== tag || \"href\" !== key)) {\n        domElement.removeAttribute(key);\n        break;\n      }\n      if (\n        null == value ||\n        \"function\" === typeof value ||\n        \"symbol\" === typeof value ||\n        \"boolean\" === typeof value\n      ) {\n        domElement.removeAttribute(key);\n        break;\n      }\n      value = sanitizeURL(\"\" + value);\n      domElement.setAttribute(key, value);\n      break;\n    case \"action\":\n    case \"formAction\":\n      if (\"function\" === typeof value) {\n        domElement.setAttribute(\n          key,\n          \"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')\"\n        );\n        break;\n      } else\n        \"function\" === typeof prevValue &&\n          (\"formAction\" === key\n            ? (\"input\" !== tag &&\n                setProp(domElement, tag, \"name\", props.name, props, null),\n              setProp(\n                domElement,\n                tag,\n                \"formEncType\",\n                props.formEncType,\n                props,\n                null\n              ),\n              setProp(\n                domElement,\n                tag,\n                \"formMethod\",\n                props.formMethod,\n                props,\n                null\n              ),\n              setProp(\n                domElement,\n                tag,\n                \"formTarget\",\n                props.formTarget,\n                props,\n                null\n              ))\n            : (setProp(domElement, tag, \"encType\", props.encType, props, null),\n              setProp(domElement, tag, \"method\", props.method, props, null),\n              setProp(domElement, tag, \"target\", props.target, props, null)));\n      if (\n        null == value ||\n        \"symbol\" === typeof value ||\n        \"boolean\" === typeof value\n      ) {\n        domElement.removeAttribute(key);\n        break;\n      }\n      value = sanitizeURL(\"\" + value);\n      domElement.setAttribute(key, value);\n      break;\n    case \"onClick\":\n      null != value && (domElement.onclick = noop$1);\n      break;\n    case \"onScroll\":\n      null != value && listenToNonDelegatedEvent(\"scroll\", domElement);\n      break;\n    case \"onScrollEnd\":\n      null != value && listenToNonDelegatedEvent(\"scrollend\", domElement);\n      break;\n    case \"dangerouslySetInnerHTML\":\n      if (null != value) {\n        if (\"object\" !== typeof value || !(\"__html\" in value))\n          throw Error(formatProdErrorMessage(61));\n        key = value.__html;\n        if (null != key) {\n          if (null != props.children) throw Error(formatProdErrorMessage(60));\n          domElement.innerHTML = key;\n        }\n      }\n      break;\n    case \"multiple\":\n      domElement.multiple =\n        value && \"function\" !== typeof value && \"symbol\" !== typeof value;\n      break;\n    case \"muted\":\n      domElement.muted =\n        value && \"function\" !== typeof value && \"symbol\" !== typeof value;\n      break;\n    case \"suppressContentEditableWarning\":\n    case \"suppressHydrationWarning\":\n    case \"defaultValue\":\n    case \"defaultChecked\":\n    case \"innerHTML\":\n    case \"ref\":\n      break;\n    case \"autoFocus\":\n      break;\n    case \"xlinkHref\":\n      if (\n        null == value ||\n        \"function\" === typeof value ||\n        \"boolean\" === typeof value ||\n        \"symbol\" === typeof value\n      ) {\n        domElement.removeAttribute(\"xlink:href\");\n        break;\n      }\n      key = sanitizeURL(\"\" + value);\n      domElement.setAttributeNS(\n        \"http://www.w3.org/1999/xlink\",\n        \"xlink:href\",\n        key\n      );\n      break;\n    case \"contentEditable\":\n    case \"spellCheck\":\n    case \"draggable\":\n    case \"value\":\n    case \"autoReverse\":\n    case \"externalResourcesRequired\":\n    case \"focusable\":\n    case \"preserveAlpha\":\n      null != value && \"function\" !== typeof value && \"symbol\" !== typeof value\n        ? domElement.setAttribute(key, \"\" + value)\n        : domElement.removeAttribute(key);\n      break;\n    case \"inert\":\n    case \"allowFullScreen\":\n    case \"async\":\n    case \"autoPlay\":\n    case \"controls\":\n    case \"default\":\n    case \"defer\":\n    case \"disabled\":\n    case \"disablePictureInPicture\":\n    case \"disableRemotePlayback\":\n    case \"formNoValidate\":\n    case \"hidden\":\n    case \"loop\":\n    case \"noModule\":\n    case \"noValidate\":\n    case \"open\":\n    case \"playsInline\":\n    case \"readOnly\":\n    case \"required\":\n    case \"reversed\":\n    case \"scoped\":\n    case \"seamless\":\n    case \"itemScope\":\n      value && \"function\" !== typeof value && \"symbol\" !== typeof value\n        ? domElement.setAttribute(key, \"\")\n        : domElement.removeAttribute(key);\n      break;\n    case \"capture\":\n    case \"download\":\n      !0 === value\n        ? domElement.setAttribute(key, \"\")\n        : !1 !== value &&\n            null != value &&\n            \"function\" !== typeof value &&\n            \"symbol\" !== typeof value\n          ? domElement.setAttribute(key, value)\n          : domElement.removeAttribute(key);\n      break;\n    case \"cols\":\n    case \"rows\":\n    case \"size\":\n    case \"span\":\n      null != value &&\n      \"function\" !== typeof value &&\n      \"symbol\" !== typeof value &&\n      !isNaN(value) &&\n      1 <= value\n        ? domElement.setAttribute(key, value)\n        : domElement.removeAttribute(key);\n      break;\n    case \"rowSpan\":\n    case \"start\":\n      null == value ||\n      \"function\" === typeof value ||\n      \"symbol\" === typeof value ||\n      isNaN(value)\n        ? domElement.removeAttribute(key)\n        : domElement.setAttribute(key, value);\n      break;\n    case \"popover\":\n      listenToNonDelegatedEvent(\"beforetoggle\", domElement);\n      listenToNonDelegatedEvent(\"toggle\", domElement);\n      setValueForAttribute(domElement, \"popover\", value);\n      break;\n    case \"xlinkActuate\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/1999/xlink\",\n        \"xlink:actuate\",\n        value\n      );\n      break;\n    case \"xlinkArcrole\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/1999/xlink\",\n        \"xlink:arcrole\",\n        value\n      );\n      break;\n    case \"xlinkRole\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/1999/xlink\",\n        \"xlink:role\",\n        value\n      );\n      break;\n    case \"xlinkShow\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/1999/xlink\",\n        \"xlink:show\",\n        value\n      );\n      break;\n    case \"xlinkTitle\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/1999/xlink\",\n        \"xlink:title\",\n        value\n      );\n      break;\n    case \"xlinkType\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/1999/xlink\",\n        \"xlink:type\",\n        value\n      );\n      break;\n    case \"xmlBase\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/XML/1998/namespace\",\n        \"xml:base\",\n        value\n      );\n      break;\n    case \"xmlLang\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/XML/1998/namespace\",\n        \"xml:lang\",\n        value\n      );\n      break;\n    case \"xmlSpace\":\n      setValueForNamespacedAttribute(\n        domElement,\n        \"http://www.w3.org/XML/1998/namespace\",\n        \"xml:space\",\n        value\n      );\n      break;\n    case \"is\":\n      setValueForAttribute(domElement, \"is\", value);\n      break;\n    case \"innerText\":\n    case \"textContent\":\n      break;\n    default:\n      if (\n        !(2 < key.length) ||\n        (\"o\" !== key[0] && \"O\" !== key[0]) ||\n        (\"n\" !== key[1] && \"N\" !== key[1])\n      )\n        (key = aliases.get(key) || key),\n          setValueForAttribute(domElement, key, value);\n  }\n}\nfunction setPropOnCustomElement(domElement, tag, key, value, props, prevValue) {\n  switch (key) {\n    case \"style\":\n      setValueForStyles(domElement, value, prevValue);\n      break;\n    case \"dangerouslySetInnerHTML\":\n      if (null != value) {\n        if (\"object\" !== typeof value || !(\"__html\" in value))\n          throw Error(formatProdErrorMessage(61));\n        key = value.__html;\n        if (null != key) {\n          if (null != props.children) throw Error(formatProdErrorMessage(60));\n          domElement.innerHTML = key;\n        }\n      }\n      break;\n    case \"children\":\n      \"string\" === typeof value\n        ? setTextContent(domElement, value)\n        : (\"number\" === typeof value || \"bigint\" === typeof value) &&\n          setTextContent(domElement, \"\" + value);\n      break;\n    case \"onScroll\":\n      null != value && listenToNonDelegatedEvent(\"scroll\", domElement);\n      break;\n    case \"onScrollEnd\":\n      null != value && listenToNonDelegatedEvent(\"scrollend\", domElement);\n      break;\n    case \"onClick\":\n      null != value && (domElement.onclick = noop$1);\n      break;\n    case \"suppressContentEditableWarning\":\n    case \"suppressHydrationWarning\":\n    case \"innerHTML\":\n    case \"ref\":\n      break;\n    case \"innerText\":\n    case \"textContent\":\n      break;\n    default:\n      if (!registrationNameDependencies.hasOwnProperty(key))\n        a: {\n          if (\n            \"o\" === key[0] &&\n            \"n\" === key[1] &&\n            ((props = key.endsWith(\"Capture\")),\n            (tag = key.slice(2, props ? key.length - 7 : void 0)),\n            (prevValue = domElement[internalPropsKey] || null),\n            (prevValue = null != prevValue ? prevValue[key] : null),\n            \"function\" === typeof prevValue &&\n              domElement.removeEventListener(tag, prevValue, props),\n            \"function\" === typeof value)\n          ) {\n            \"function\" !== typeof prevValue &&\n              null !== prevValue &&\n              (key in domElement\n                ? (domElement[key] = null)\n                : domElement.hasAttribute(key) &&\n                  domElement.removeAttribute(key));\n            domElement.addEventListener(tag, value, props);\n            break a;\n          }\n          key in domElement\n            ? (domElement[key] = value)\n            : !0 === value\n              ? domElement.setAttribute(key, \"\")\n              : setValueForAttribute(domElement, key, value);\n        }\n  }\n}\nfunction setInitialProperties(domElement, tag, props) {\n  switch (tag) {\n    case \"div\":\n    case \"span\":\n    case \"svg\":\n    case \"path\":\n    case \"a\":\n    case \"g\":\n    case \"p\":\n    case \"li\":\n      break;\n    case \"img\":\n      listenToNonDelegatedEvent(\"error\", domElement);\n      listenToNonDelegatedEvent(\"load\", domElement);\n      var hasSrc = !1,\n        hasSrcSet = !1,\n        propKey;\n      for (propKey in props)\n        if (props.hasOwnProperty(propKey)) {\n          var propValue = props[propKey];\n          if (null != propValue)\n            switch (propKey) {\n              case \"src\":\n                hasSrc = !0;\n                break;\n              case \"srcSet\":\n                hasSrcSet = !0;\n                break;\n              case \"children\":\n              case \"dangerouslySetInnerHTML\":\n                throw Error(formatProdErrorMessage(137, tag));\n              default:\n                setProp(domElement, tag, propKey, propValue, props, null);\n            }\n        }\n      hasSrcSet &&\n        setProp(domElement, tag, \"srcSet\", props.srcSet, props, null);\n      hasSrc && setProp(domElement, tag, \"src\", props.src, props, null);\n      return;\n    case \"input\":\n      listenToNonDelegatedEvent(\"invalid\", domElement);\n      var defaultValue = (propKey = propValue = hasSrcSet = null),\n        checked = null,\n        defaultChecked = null;\n      for (hasSrc in props)\n        if (props.hasOwnProperty(hasSrc)) {\n          var propValue$188 = props[hasSrc];\n          if (null != propValue$188)\n            switch (hasSrc) {\n              case \"name\":\n                hasSrcSet = propValue$188;\n                break;\n              case \"type\":\n                propValue = propValue$188;\n                break;\n              case \"checked\":\n                checked = propValue$188;\n                break;\n              case \"defaultChecked\":\n                defaultChecked = propValue$188;\n                break;\n              case \"value\":\n                propKey = propValue$188;\n                break;\n              case \"defaultValue\":\n                defaultValue = propValue$188;\n                break;\n              case \"children\":\n              case \"dangerouslySetInnerHTML\":\n                if (null != propValue$188)\n                  throw Error(formatProdErrorMessage(137, tag));\n                break;\n              default:\n                setProp(domElement, tag, hasSrc, propValue$188, props, null);\n            }\n        }\n      initInput(\n        domElement,\n        propKey,\n        defaultValue,\n        checked,\n        defaultChecked,\n        propValue,\n        hasSrcSet,\n        !1\n      );\n      track(domElement);\n      return;\n    case \"select\":\n      listenToNonDelegatedEvent(\"invalid\", domElement);\n      hasSrc = propValue = propKey = null;\n      for (hasSrcSet in props)\n        if (\n          props.hasOwnProperty(hasSrcSet) &&\n          ((defaultValue = props[hasSrcSet]), null != defaultValue)\n        )\n          switch (hasSrcSet) {\n            case \"value\":\n              propKey = defaultValue;\n              break;\n            case \"defaultValue\":\n              propValue = defaultValue;\n              break;\n            case \"multiple\":\n              hasSrc = defaultValue;\n            default:\n              setProp(domElement, tag, hasSrcSet, defaultValue, props, null);\n          }\n      tag = propKey;\n      props = propValue;\n      domElement.multiple = !!hasSrc;\n      null != tag\n        ? updateOptions(domElement, !!hasSrc, tag, !1)\n        : null != props && updateOptions(domElement, !!hasSrc, props, !0);\n      return;\n    case \"textarea\":\n      listenToNonDelegatedEvent(\"invalid\", domElement);\n      propKey = hasSrcSet = hasSrc = null;\n      for (propValue in props)\n        if (\n          props.hasOwnProperty(propValue) &&\n          ((defaultValue = props[propValue]), null != defaultValue)\n        )\n          switch (propValue) {\n            case \"value\":\n              hasSrc = defaultValue;\n              break;\n            case \"defaultValue\":\n              hasSrcSet = defaultValue;\n              break;\n            case \"children\":\n              propKey = defaultValue;\n              break;\n            case \"dangerouslySetInnerHTML\":\n              if (null != defaultValue) throw Error(formatProdErrorMessage(91));\n              break;\n            default:\n              setProp(domElement, tag, propValue, defaultValue, props, null);\n          }\n      initTextarea(domElement, hasSrc, hasSrcSet, propKey);\n      track(domElement);\n      return;\n    case \"option\":\n      for (checked in props)\n        if (\n          props.hasOwnProperty(checked) &&\n          ((hasSrc = props[checked]), null != hasSrc)\n        )\n          switch (checked) {\n            case \"selected\":\n              domElement.selected =\n                hasSrc &&\n                \"function\" !== typeof hasSrc &&\n                \"symbol\" !== typeof hasSrc;\n              break;\n            default:\n              setProp(domElement, tag, checked, hasSrc, props, null);\n          }\n      return;\n    case \"dialog\":\n      listenToNonDelegatedEvent(\"beforetoggle\", domElement);\n      listenToNonDelegatedEvent(\"toggle\", domElement);\n      listenToNonDelegatedEvent(\"cancel\", domElement);\n      listenToNonDelegatedEvent(\"close\", domElement);\n      break;\n    case \"iframe\":\n    case \"object\":\n      listenToNonDelegatedEvent(\"load\", domElement);\n      break;\n    case \"video\":\n    case \"audio\":\n      for (hasSrc = 0; hasSrc < mediaEventTypes.length; hasSrc++)\n        listenToNonDelegatedEvent(mediaEventTypes[hasSrc], domElement);\n      break;\n    case \"image\":\n      listenToNonDelegatedEvent(\"error\", domElement);\n      listenToNonDelegatedEvent(\"load\", domElement);\n      break;\n    case \"details\":\n      listenToNonDelegatedEvent(\"toggle\", domElement);\n      break;\n    case \"embed\":\n    case \"source\":\n    case \"link\":\n      listenToNonDelegatedEvent(\"error\", domElement),\n        listenToNonDelegatedEvent(\"load\", domElement);\n    case \"area\":\n    case \"base\":\n    case \"br\":\n    case \"col\":\n    case \"hr\":\n    case \"keygen\":\n    case \"meta\":\n    case \"param\":\n    case \"track\":\n    case \"wbr\":\n    case \"menuitem\":\n      for (defaultChecked in props)\n        if (\n          props.hasOwnProperty(defaultChecked) &&\n          ((hasSrc = props[defaultChecked]), null != hasSrc)\n        )\n          switch (defaultChecked) {\n            case \"children\":\n            case \"dangerouslySetInnerHTML\":\n              throw Error(formatProdErrorMessage(137, tag));\n            default:\n              setProp(domElement, tag, defaultChecked, hasSrc, props, null);\n          }\n      return;\n    default:\n      if (isCustomElement(tag)) {\n        for (propValue$188 in props)\n          props.hasOwnProperty(propValue$188) &&\n            ((hasSrc = props[propValue$188]),\n            void 0 !== hasSrc &&\n              setPropOnCustomElement(\n                domElement,\n                tag,\n                propValue$188,\n                hasSrc,\n                props,\n                void 0\n              ));\n        return;\n      }\n  }\n  for (defaultValue in props)\n    props.hasOwnProperty(defaultValue) &&\n      ((hasSrc = props[defaultValue]),\n      null != hasSrc &&\n        setProp(domElement, tag, defaultValue, hasSrc, props, null));\n}\nfunction updateProperties(domElement, tag, lastProps, nextProps) {\n  switch (tag) {\n    case \"div\":\n    case \"span\":\n    case \"svg\":\n    case \"path\":\n    case \"a\":\n    case \"g\":\n    case \"p\":\n    case \"li\":\n      break;\n    case \"input\":\n      var name = null,\n        type = null,\n        value = null,\n        defaultValue = null,\n        lastDefaultValue = null,\n        checked = null,\n        defaultChecked = null;\n      for (propKey in lastProps) {\n        var lastProp = lastProps[propKey];\n        if (lastProps.hasOwnProperty(propKey) && null != lastProp)\n          switch (propKey) {\n            case \"checked\":\n              break;\n            case \"value\":\n              break;\n            case \"defaultValue\":\n              lastDefaultValue = lastProp;\n            default:\n              nextProps.hasOwnProperty(propKey) ||\n                setProp(domElement, tag, propKey, null, nextProps, lastProp);\n          }\n      }\n      for (var propKey$205 in nextProps) {\n        var propKey = nextProps[propKey$205];\n        lastProp = lastProps[propKey$205];\n        if (\n          nextProps.hasOwnProperty(propKey$205) &&\n          (null != propKey || null != lastProp)\n        )\n          switch (propKey$205) {\n            case \"type\":\n              type = propKey;\n              break;\n            case \"name\":\n              name = propKey;\n              break;\n            case \"checked\":\n              checked = propKey;\n              break;\n            case \"defaultChecked\":\n              defaultChecked = propKey;\n              break;\n            case \"value\":\n              value = propKey;\n              break;\n            case \"defaultValue\":\n              defaultValue = propKey;\n              break;\n            case \"children\":\n            case \"dangerouslySetInnerHTML\":\n              if (null != propKey)\n                throw Error(formatProdErrorMessage(137, tag));\n              break;\n            default:\n              propKey !== lastProp &&\n                setProp(\n                  domElement,\n                  tag,\n                  propKey$205,\n                  propKey,\n                  nextProps,\n                  lastProp\n                );\n          }\n      }\n      updateInput(\n        domElement,\n        value,\n        defaultValue,\n        lastDefaultValue,\n        checked,\n        defaultChecked,\n        type,\n        name\n      );\n      return;\n    case \"select\":\n      propKey = value = defaultValue = propKey$205 = null;\n      for (type in lastProps)\n        if (\n          ((lastDefaultValue = lastProps[type]),\n          lastProps.hasOwnProperty(type) && null != lastDefaultValue)\n        )\n          switch (type) {\n            case \"value\":\n              break;\n            case \"multiple\":\n              propKey = lastDefaultValue;\n            default:\n              nextProps.hasOwnProperty(type) ||\n                setProp(\n                  domElement,\n                  tag,\n                  type,\n                  null,\n                  nextProps,\n                  lastDefaultValue\n                );\n          }\n      for (name in nextProps)\n        if (\n          ((type = nextProps[name]),\n          (lastDefaultValue = lastProps[name]),\n          nextProps.hasOwnProperty(name) &&\n            (null != type || null != lastDefaultValue))\n        )\n          switch (name) {\n            case \"value\":\n              propKey$205 = type;\n              break;\n            case \"defaultValue\":\n              defaultValue = type;\n              break;\n            case \"multiple\":\n              value = type;\n            default:\n              type !== lastDefaultValue &&\n                setProp(\n                  domElement,\n                  tag,\n                  name,\n                  type,\n                  nextProps,\n                  lastDefaultValue\n                );\n          }\n      tag = defaultValue;\n      lastProps = value;\n      nextProps = propKey;\n      null != propKey$205\n        ? updateOptions(domElement, !!lastProps, propKey$205, !1)\n        : !!nextProps !== !!lastProps &&\n          (null != tag\n            ? updateOptions(domElement, !!lastProps, tag, !0)\n            : updateOptions(domElement, !!lastProps, lastProps ? [] : \"\", !1));\n      return;\n    case \"textarea\":\n      propKey = propKey$205 = null;\n      for (defaultValue in lastProps)\n        if (\n          ((name = lastProps[defaultValue]),\n          lastProps.hasOwnProperty(defaultValue) &&\n            null != name &&\n            !nextProps.hasOwnProperty(defaultValue))\n        )\n          switch (defaultValue) {\n            case \"value\":\n              break;\n            case \"children\":\n              break;\n            default:\n              setProp(domElement, tag, defaultValue, null, nextProps, name);\n          }\n      for (value in nextProps)\n        if (\n          ((name = nextProps[value]),\n          (type = lastProps[value]),\n          nextProps.hasOwnProperty(value) && (null != name || null != type))\n        )\n          switch (value) {\n            case \"value\":\n              propKey$205 = name;\n              break;\n            case \"defaultValue\":\n              propKey = name;\n              break;\n            case \"children\":\n              break;\n            case \"dangerouslySetInnerHTML\":\n              if (null != name) throw Error(formatProdErrorMessage(91));\n              break;\n            default:\n              name !== type &&\n                setProp(domElement, tag, value, name, nextProps, type);\n          }\n      updateTextarea(domElement, propKey$205, propKey);\n      return;\n    case \"option\":\n      for (var propKey$221 in lastProps)\n        if (\n          ((propKey$205 = lastProps[propKey$221]),\n          lastProps.hasOwnProperty(propKey$221) &&\n            null != propKey$205 &&\n            !nextProps.hasOwnProperty(propKey$221))\n        )\n          switch (propKey$221) {\n            case \"selected\":\n              domElement.selected = !1;\n              break;\n            default:\n              setProp(\n                domElement,\n                tag,\n                propKey$221,\n                null,\n                nextProps,\n                propKey$205\n              );\n          }\n      for (lastDefaultValue in nextProps)\n        if (\n          ((propKey$205 = nextProps[lastDefaultValue]),\n          (propKey = lastProps[lastDefaultValue]),\n          nextProps.hasOwnProperty(lastDefaultValue) &&\n            propKey$205 !== propKey &&\n            (null != propKey$205 || null != propKey))\n        )\n          switch (lastDefaultValue) {\n            case \"selected\":\n              domElement.selected =\n                propKey$205 &&\n                \"function\" !== typeof propKey$205 &&\n                \"symbol\" !== typeof propKey$205;\n              break;\n            default:\n              setProp(\n                domElement,\n                tag,\n                lastDefaultValue,\n                propKey$205,\n                nextProps,\n                propKey\n              );\n          }\n      return;\n    case \"img\":\n    case \"link\":\n    case \"area\":\n    case \"base\":\n    case \"br\":\n    case \"col\":\n    case \"embed\":\n    case \"hr\":\n    case \"keygen\":\n    case \"meta\":\n    case \"param\":\n    case \"source\":\n    case \"track\":\n    case \"wbr\":\n    case \"menuitem\":\n      for (var propKey$226 in lastProps)\n        (propKey$205 = lastProps[propKey$226]),\n          lastProps.hasOwnProperty(propKey$226) &&\n            null != propKey$205 &&\n            !nextProps.hasOwnProperty(propKey$226) &&\n            setProp(domElement, tag, propKey$226, null, nextProps, propKey$205);\n      for (checked in nextProps)\n        if (\n          ((propKey$205 = nextProps[checked]),\n          (propKey = lastProps[checked]),\n          nextProps.hasOwnProperty(checked) &&\n            propKey$205 !== propKey &&\n            (null != propKey$205 || null != propKey))\n        )\n          switch (checked) {\n            case \"children\":\n            case \"dangerouslySetInnerHTML\":\n              if (null != propKey$205)\n                throw Error(formatProdErrorMessage(137, tag));\n              break;\n            default:\n              setProp(\n                domElement,\n                tag,\n                checked,\n                propKey$205,\n                nextProps,\n                propKey\n              );\n          }\n      return;\n    default:\n      if (isCustomElement(tag)) {\n        for (var propKey$231 in lastProps)\n          (propKey$205 = lastProps[propKey$231]),\n            lastProps.hasOwnProperty(propKey$231) &&\n              void 0 !== propKey$205 &&\n              !nextProps.hasOwnProperty(propKey$231) &&\n              setPropOnCustomElement(\n                domElement,\n                tag,\n                propKey$231,\n                void 0,\n                nextProps,\n                propKey$205\n              );\n        for (defaultChecked in nextProps)\n          (propKey$205 = nextProps[defaultChecked]),\n            (propKey = lastProps[defaultChecked]),\n            !nextProps.hasOwnProperty(defaultChecked) ||\n              propKey$205 === propKey ||\n              (void 0 === propKey$205 && void 0 === propKey) ||\n              setPropOnCustomElement(\n                domElement,\n                tag,\n                defaultChecked,\n                propKey$205,\n                nextProps,\n                propKey\n              );\n        return;\n      }\n  }\n  for (var propKey$236 in lastProps)\n    (propKey$205 = lastProps[propKey$236]),\n      lastProps.hasOwnProperty(propKey$236) &&\n        null != propKey$205 &&\n        !nextProps.hasOwnProperty(propKey$236) &&\n        setProp(domElement, tag, propKey$236, null, nextProps, propKey$205);\n  for (lastProp in nextProps)\n    (propKey$205 = nextProps[lastProp]),\n      (propKey = lastProps[lastProp]),\n      !nextProps.hasOwnProperty(lastProp) ||\n        propKey$205 === propKey ||\n        (null == propKey$205 && null == propKey) ||\n        setProp(domElement, tag, lastProp, propKey$205, nextProps, propKey);\n}\nvar eventsEnabled = null,\n  selectionInformation = null;\nfunction getOwnerDocumentFromRootContainer(rootContainerElement) {\n  return 9 === rootContainerElement.nodeType\n    ? rootContainerElement\n    : rootContainerElement.ownerDocument;\n}\nfunction getOwnHostContext(namespaceURI) {\n  switch (namespaceURI) {\n    case \"http://www.w3.org/2000/svg\":\n      return 1;\n    case \"http://www.w3.org/1998/Math/MathML\":\n      return 2;\n    default:\n      return 0;\n  }\n}\nfunction getChildHostContextProd(parentNamespace, type) {\n  if (0 === parentNamespace)\n    switch (type) {\n      case \"svg\":\n        return 1;\n      case \"math\":\n        return 2;\n      default:\n        return 0;\n    }\n  return 1 === parentNamespace && \"foreignObject\" === type\n    ? 0\n    : parentNamespace;\n}\nfunction shouldSetTextContent(type, props) {\n  return (\n    \"textarea\" === type ||\n    \"noscript\" === type ||\n    \"string\" === typeof props.children ||\n    \"number\" === typeof props.children ||\n    \"bigint\" === typeof props.children ||\n    (\"object\" === typeof props.dangerouslySetInnerHTML &&\n      null !== props.dangerouslySetInnerHTML &&\n      null != props.dangerouslySetInnerHTML.__html)\n  );\n}\nvar currentPopstateTransitionEvent = null;\nfunction shouldAttemptEagerTransition() {\n  var event = window.event;\n  if (event && \"popstate\" === event.type) {\n    if (event === currentPopstateTransitionEvent) return !1;\n    currentPopstateTransitionEvent = event;\n    return !0;\n  }\n  currentPopstateTransitionEvent = null;\n  return !1;\n}\nvar scheduleTimeout = \"function\" === typeof setTimeout ? setTimeout : void 0,\n  cancelTimeout = \"function\" === typeof clearTimeout ? clearTimeout : void 0,\n  localPromise = \"function\" === typeof Promise ? Promise : void 0,\n  scheduleMicrotask =\n    \"function\" === typeof queueMicrotask\n      ? queueMicrotask\n      : \"undefined\" !== typeof localPromise\n        ? function (callback) {\n            return localPromise\n              .resolve(null)\n              .then(callback)\n              .catch(handleErrorInNextTick);\n          }\n        : scheduleTimeout;\nfunction handleErrorInNextTick(error) {\n  setTimeout(function () {\n    throw error;\n  });\n}\nfunction isSingletonScope(type) {\n  return \"head\" === type;\n}\nfunction clearSuspenseBoundary(parentInstance, suspenseInstance) {\n  var node = suspenseInstance,\n    possiblePreambleContribution = 0,\n    depth = 0;\n  do {\n    var nextNode = node.nextSibling;\n    parentInstance.removeChild(node);\n    if (nextNode && 8 === nextNode.nodeType)\n      if (((node = nextNode.data), \"/$\" === node)) {\n        if (\n          0 < possiblePreambleContribution &&\n          8 > possiblePreambleContribution\n        ) {\n          node = possiblePreambleContribution;\n          var ownerDocument = parentInstance.ownerDocument;\n          node & 1 && releaseSingletonInstance(ownerDocument.documentElement);\n          node & 2 && releaseSingletonInstance(ownerDocument.body);\n          if (node & 4)\n            for (\n              node = ownerDocument.head,\n                releaseSingletonInstance(node),\n                ownerDocument = node.firstChild;\n              ownerDocument;\n\n            ) {\n              var nextNode$jscomp$0 = ownerDocument.nextSibling,\n                nodeName = ownerDocument.nodeName;\n              ownerDocument[internalHoistableMarker] ||\n                \"SCRIPT\" === nodeName ||\n                \"STYLE\" === nodeName ||\n                (\"LINK\" === nodeName &&\n                  \"stylesheet\" === ownerDocument.rel.toLowerCase()) ||\n                node.removeChild(ownerDocument);\n              ownerDocument = nextNode$jscomp$0;\n            }\n        }\n        if (0 === depth) {\n          parentInstance.removeChild(nextNode);\n          retryIfBlockedOn(suspenseInstance);\n          return;\n        }\n        depth--;\n      } else\n        \"$\" === node || \"$?\" === node || \"$!\" === node\n          ? depth++\n          : (possiblePreambleContribution = node.charCodeAt(0) - 48);\n    else possiblePreambleContribution = 0;\n    node = nextNode;\n  } while (node);\n  retryIfBlockedOn(suspenseInstance);\n}\nfunction clearContainerSparingly(container) {\n  var nextNode = container.firstChild;\n  nextNode && 10 === nextNode.nodeType && (nextNode = nextNode.nextSibling);\n  for (; nextNode; ) {\n    var node = nextNode;\n    nextNode = nextNode.nextSibling;\n    switch (node.nodeName) {\n      case \"HTML\":\n      case \"HEAD\":\n      case \"BODY\":\n        clearContainerSparingly(node);\n        detachDeletedInstance(node);\n        continue;\n      case \"SCRIPT\":\n      case \"STYLE\":\n        continue;\n      case \"LINK\":\n        if (\"stylesheet\" === node.rel.toLowerCase()) continue;\n    }\n    container.removeChild(node);\n  }\n}\nfunction canHydrateInstance(instance, type, props, inRootOrSingleton) {\n  for (; 1 === instance.nodeType; ) {\n    var anyProps = props;\n    if (instance.nodeName.toLowerCase() !== type.toLowerCase()) {\n      if (\n        !inRootOrSingleton &&\n        (\"INPUT\" !== instance.nodeName || \"hidden\" !== instance.type)\n      )\n        break;\n    } else if (!inRootOrSingleton)\n      if (\"input\" === type && \"hidden\" === instance.type) {\n        var name = null == anyProps.name ? null : \"\" + anyProps.name;\n        if (\n          \"hidden\" === anyProps.type &&\n          instance.getAttribute(\"name\") === name\n        )\n          return instance;\n      } else return instance;\n    else if (!instance[internalHoistableMarker])\n      switch (type) {\n        case \"meta\":\n          if (!instance.hasAttribute(\"itemprop\")) break;\n          return instance;\n        case \"link\":\n          name = instance.getAttribute(\"rel\");\n          if (\"stylesheet\" === name && instance.hasAttribute(\"data-precedence\"))\n            break;\n          else if (\n            name !== anyProps.rel ||\n            instance.getAttribute(\"href\") !==\n              (null == anyProps.href || \"\" === anyProps.href\n                ? null\n                : anyProps.href) ||\n            instance.getAttribute(\"crossorigin\") !==\n              (null == anyProps.crossOrigin ? null : anyProps.crossOrigin) ||\n            instance.getAttribute(\"title\") !==\n              (null == anyProps.title ? null : anyProps.title)\n          )\n            break;\n          return instance;\n        case \"style\":\n          if (instance.hasAttribute(\"data-precedence\")) break;\n          return instance;\n        case \"script\":\n          name = instance.getAttribute(\"src\");\n          if (\n            (name !== (null == anyProps.src ? null : anyProps.src) ||\n              instance.getAttribute(\"type\") !==\n                (null == anyProps.type ? null : anyProps.type) ||\n              instance.getAttribute(\"crossorigin\") !==\n                (null == anyProps.crossOrigin ? null : anyProps.crossOrigin)) &&\n            name &&\n            instance.hasAttribute(\"async\") &&\n            !instance.hasAttribute(\"itemprop\")\n          )\n            break;\n          return instance;\n        default:\n          return instance;\n      }\n    instance = getNextHydratable(instance.nextSibling);\n    if (null === instance) break;\n  }\n  return null;\n}\nfunction canHydrateTextInstance(instance, text, inRootOrSingleton) {\n  if (\"\" === text) return null;\n  for (; 3 !== instance.nodeType; ) {\n    if (\n      (1 !== instance.nodeType ||\n        \"INPUT\" !== instance.nodeName ||\n        \"hidden\" !== instance.type) &&\n      !inRootOrSingleton\n    )\n      return null;\n    instance = getNextHydratable(instance.nextSibling);\n    if (null === instance) return null;\n  }\n  return instance;\n}\nfunction isSuspenseInstanceFallback(instance) {\n  return (\n    \"$!\" === instance.data ||\n    (\"$?\" === instance.data && \"complete\" === instance.ownerDocument.readyState)\n  );\n}\nfunction registerSuspenseInstanceRetry(instance, callback) {\n  var ownerDocument = instance.ownerDocument;\n  if (\"$?\" !== instance.data || \"complete\" === ownerDocument.readyState)\n    callback();\n  else {\n    var listener = function () {\n      callback();\n      ownerDocument.removeEventListener(\"DOMContentLoaded\", listener);\n    };\n    ownerDocument.addEventListener(\"DOMContentLoaded\", listener);\n    instance._reactRetry = listener;\n  }\n}\nfunction getNextHydratable(node) {\n  for (; null != node; node = node.nextSibling) {\n    var nodeType = node.nodeType;\n    if (1 === nodeType || 3 === nodeType) break;\n    if (8 === nodeType) {\n      nodeType = node.data;\n      if (\n        \"$\" === nodeType ||\n        \"$!\" === nodeType ||\n        \"$?\" === nodeType ||\n        \"F!\" === nodeType ||\n        \"F\" === nodeType\n      )\n        break;\n      if (\"/$\" === nodeType) return null;\n    }\n  }\n  return node;\n}\nvar previousHydratableOnEnteringScopedSingleton = null;\nfunction getParentSuspenseInstance(targetInstance) {\n  targetInstance = targetInstance.previousSibling;\n  for (var depth = 0; targetInstance; ) {\n    if (8 === targetInstance.nodeType) {\n      var data = targetInstance.data;\n      if (\"$\" === data || \"$!\" === data || \"$?\" === data) {\n        if (0 === depth) return targetInstance;\n        depth--;\n      } else \"/$\" === data && depth++;\n    }\n    targetInstance = targetInstance.previousSibling;\n  }\n  return null;\n}\nfunction resolveSingletonInstance(type, props, rootContainerInstance) {\n  props = getOwnerDocumentFromRootContainer(rootContainerInstance);\n  switch (type) {\n    case \"html\":\n      type = props.documentElement;\n      if (!type) throw Error(formatProdErrorMessage(452));\n      return type;\n    case \"head\":\n      type = props.head;\n      if (!type) throw Error(formatProdErrorMessage(453));\n      return type;\n    case \"body\":\n      type = props.body;\n      if (!type) throw Error(formatProdErrorMessage(454));\n      return type;\n    default:\n      throw Error(formatProdErrorMessage(451));\n  }\n}\nfunction releaseSingletonInstance(instance) {\n  for (var attributes = instance.attributes; attributes.length; )\n    instance.removeAttributeNode(attributes[0]);\n  detachDeletedInstance(instance);\n}\nvar preloadPropsMap = new Map(),\n  preconnectsSet = new Set();\nfunction getHoistableRoot(container) {\n  return \"function\" === typeof container.getRootNode\n    ? container.getRootNode()\n    : 9 === container.nodeType\n      ? container\n      : container.ownerDocument;\n}\nvar previousDispatcher = ReactDOMSharedInternals.d;\nReactDOMSharedInternals.d = {\n  f: flushSyncWork,\n  r: requestFormReset,\n  D: prefetchDNS,\n  C: preconnect,\n  L: preload,\n  m: preloadModule,\n  X: preinitScript,\n  S: preinitStyle,\n  M: preinitModuleScript\n};\nfunction flushSyncWork() {\n  var previousWasRendering = previousDispatcher.f(),\n    wasRendering = flushSyncWork$1();\n  return previousWasRendering || wasRendering;\n}\nfunction requestFormReset(form) {\n  var formInst = getInstanceFromNode(form);\n  null !== formInst && 5 === formInst.tag && \"form\" === formInst.type\n    ? requestFormReset$1(formInst)\n    : previousDispatcher.r(form);\n}\nvar globalDocument = \"undefined\" === typeof document ? null : document;\nfunction preconnectAs(rel, href, crossOrigin) {\n  var ownerDocument = globalDocument;\n  if (ownerDocument && \"string\" === typeof href && href) {\n    var limitedEscapedHref =\n      escapeSelectorAttributeValueInsideDoubleQuotes(href);\n    limitedEscapedHref =\n      'link[rel=\"' + rel + '\"][href=\"' + limitedEscapedHref + '\"]';\n    \"string\" === typeof crossOrigin &&\n      (limitedEscapedHref += '[crossorigin=\"' + crossOrigin + '\"]');\n    preconnectsSet.has(limitedEscapedHref) ||\n      (preconnectsSet.add(limitedEscapedHref),\n      (rel = { rel: rel, crossOrigin: crossOrigin, href: href }),\n      null === ownerDocument.querySelector(limitedEscapedHref) &&\n        ((href = ownerDocument.createElement(\"link\")),\n        setInitialProperties(href, \"link\", rel),\n        markNodeAsHoistable(href),\n        ownerDocument.head.appendChild(href)));\n  }\n}\nfunction prefetchDNS(href) {\n  previousDispatcher.D(href);\n  preconnectAs(\"dns-prefetch\", href, null);\n}\nfunction preconnect(href, crossOrigin) {\n  previousDispatcher.C(href, crossOrigin);\n  preconnectAs(\"preconnect\", href, crossOrigin);\n}\nfunction preload(href, as, options) {\n  previousDispatcher.L(href, as, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && href && as) {\n    var preloadSelector =\n      'link[rel=\"preload\"][as=\"' +\n      escapeSelectorAttributeValueInsideDoubleQuotes(as) +\n      '\"]';\n    \"image\" === as\n      ? options && options.imageSrcSet\n        ? ((preloadSelector +=\n            '[imagesrcset=\"' +\n            escapeSelectorAttributeValueInsideDoubleQuotes(\n              options.imageSrcSet\n            ) +\n            '\"]'),\n          \"string\" === typeof options.imageSizes &&\n            (preloadSelector +=\n              '[imagesizes=\"' +\n              escapeSelectorAttributeValueInsideDoubleQuotes(\n                options.imageSizes\n              ) +\n              '\"]'))\n        : (preloadSelector +=\n            '[href=\"' +\n            escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n            '\"]')\n      : (preloadSelector +=\n          '[href=\"' +\n          escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n          '\"]');\n    var key = preloadSelector;\n    switch (as) {\n      case \"style\":\n        key = getStyleKey(href);\n        break;\n      case \"script\":\n        key = getScriptKey(href);\n    }\n    preloadPropsMap.has(key) ||\n      ((href = assign(\n        {\n          rel: \"preload\",\n          href:\n            \"image\" === as && options && options.imageSrcSet ? void 0 : href,\n          as: as\n        },\n        options\n      )),\n      preloadPropsMap.set(key, href),\n      null !== ownerDocument.querySelector(preloadSelector) ||\n        (\"style\" === as &&\n          ownerDocument.querySelector(getStylesheetSelectorFromKey(key))) ||\n        (\"script\" === as &&\n          ownerDocument.querySelector(getScriptSelectorFromKey(key))) ||\n        ((as = ownerDocument.createElement(\"link\")),\n        setInitialProperties(as, \"link\", href),\n        markNodeAsHoistable(as),\n        ownerDocument.head.appendChild(as)));\n  }\n}\nfunction preloadModule(href, options) {\n  previousDispatcher.m(href, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && href) {\n    var as = options && \"string\" === typeof options.as ? options.as : \"script\",\n      preloadSelector =\n        'link[rel=\"modulepreload\"][as=\"' +\n        escapeSelectorAttributeValueInsideDoubleQuotes(as) +\n        '\"][href=\"' +\n        escapeSelectorAttributeValueInsideDoubleQuotes(href) +\n        '\"]',\n      key = preloadSelector;\n    switch (as) {\n      case \"audioworklet\":\n      case \"paintworklet\":\n      case \"serviceworker\":\n      case \"sharedworker\":\n      case \"worker\":\n      case \"script\":\n        key = getScriptKey(href);\n    }\n    if (\n      !preloadPropsMap.has(key) &&\n      ((href = assign({ rel: \"modulepreload\", href: href }, options)),\n      preloadPropsMap.set(key, href),\n      null === ownerDocument.querySelector(preloadSelector))\n    ) {\n      switch (as) {\n        case \"audioworklet\":\n        case \"paintworklet\":\n        case \"serviceworker\":\n        case \"sharedworker\":\n        case \"worker\":\n        case \"script\":\n          if (ownerDocument.querySelector(getScriptSelectorFromKey(key)))\n            return;\n      }\n      as = ownerDocument.createElement(\"link\");\n      setInitialProperties(as, \"link\", href);\n      markNodeAsHoistable(as);\n      ownerDocument.head.appendChild(as);\n    }\n  }\n}\nfunction preinitStyle(href, precedence, options) {\n  previousDispatcher.S(href, precedence, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && href) {\n    var styles = getResourcesFromRoot(ownerDocument).hoistableStyles,\n      key = getStyleKey(href);\n    precedence = precedence || \"default\";\n    var resource = styles.get(key);\n    if (!resource) {\n      var state = { loading: 0, preload: null };\n      if (\n        (resource = ownerDocument.querySelector(\n          getStylesheetSelectorFromKey(key)\n        ))\n      )\n        state.loading = 5;\n      else {\n        href = assign(\n          { rel: \"stylesheet\", href: href, \"data-precedence\": precedence },\n          options\n        );\n        (options = preloadPropsMap.get(key)) &&\n          adoptPreloadPropsForStylesheet(href, options);\n        var link = (resource = ownerDocument.createElement(\"link\"));\n        markNodeAsHoistable(link);\n        setInitialProperties(link, \"link\", href);\n        link._p = new Promise(function (resolve, reject) {\n          link.onload = resolve;\n          link.onerror = reject;\n        });\n        link.addEventListener(\"load\", function () {\n          state.loading |= 1;\n        });\n        link.addEventListener(\"error\", function () {\n          state.loading |= 2;\n        });\n        state.loading |= 4;\n        insertStylesheet(resource, precedence, ownerDocument);\n      }\n      resource = {\n        type: \"stylesheet\",\n        instance: resource,\n        count: 1,\n        state: state\n      };\n      styles.set(key, resource);\n    }\n  }\n}\nfunction preinitScript(src, options) {\n  previousDispatcher.X(src, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && src) {\n    var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts,\n      key = getScriptKey(src),\n      resource = scripts.get(key);\n    resource ||\n      ((resource = ownerDocument.querySelector(getScriptSelectorFromKey(key))),\n      resource ||\n        ((src = assign({ src: src, async: !0 }, options)),\n        (options = preloadPropsMap.get(key)) &&\n          adoptPreloadPropsForScript(src, options),\n        (resource = ownerDocument.createElement(\"script\")),\n        markNodeAsHoistable(resource),\n        setInitialProperties(resource, \"link\", src),\n        ownerDocument.head.appendChild(resource)),\n      (resource = {\n        type: \"script\",\n        instance: resource,\n        count: 1,\n        state: null\n      }),\n      scripts.set(key, resource));\n  }\n}\nfunction preinitModuleScript(src, options) {\n  previousDispatcher.M(src, options);\n  var ownerDocument = globalDocument;\n  if (ownerDocument && src) {\n    var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts,\n      key = getScriptKey(src),\n      resource = scripts.get(key);\n    resource ||\n      ((resource = ownerDocument.querySelector(getScriptSelectorFromKey(key))),\n      resource ||\n        ((src = assign({ src: src, async: !0, type: \"module\" }, options)),\n        (options = preloadPropsMap.get(key)) &&\n          adoptPreloadPropsForScript(src, options),\n        (resource = ownerDocument.createElement(\"script\")),\n        markNodeAsHoistable(resource),\n        setInitialProperties(resource, \"link\", src),\n        ownerDocument.head.appendChild(resource)),\n      (resource = {\n        type: \"script\",\n        instance: resource,\n        count: 1,\n        state: null\n      }),\n      scripts.set(key, resource));\n  }\n}\nfunction getResource(type, currentProps, pendingProps, currentResource) {\n  var JSCompiler_inline_result = (JSCompiler_inline_result =\n    rootInstanceStackCursor.current)\n    ? getHoistableRoot(JSCompiler_inline_result)\n    : null;\n  if (!JSCompiler_inline_result) throw Error(formatProdErrorMessage(446));\n  switch (type) {\n    case \"meta\":\n    case \"title\":\n      return null;\n    case \"style\":\n      return \"string\" === typeof pendingProps.precedence &&\n        \"string\" === typeof pendingProps.href\n        ? ((currentProps = getStyleKey(pendingProps.href)),\n          (pendingProps = getResourcesFromRoot(\n            JSCompiler_inline_result\n          ).hoistableStyles),\n          (currentResource = pendingProps.get(currentProps)),\n          currentResource ||\n            ((currentResource = {\n              type: \"style\",\n              instance: null,\n              count: 0,\n              state: null\n            }),\n            pendingProps.set(currentProps, currentResource)),\n          currentResource)\n        : { type: \"void\", instance: null, count: 0, state: null };\n    case \"link\":\n      if (\n        \"stylesheet\" === pendingProps.rel &&\n        \"string\" === typeof pendingProps.href &&\n        \"string\" === typeof pendingProps.precedence\n      ) {\n        type = getStyleKey(pendingProps.href);\n        var styles$244 = getResourcesFromRoot(\n            JSCompiler_inline_result\n          ).hoistableStyles,\n          resource$245 = styles$244.get(type);\n        resource$245 ||\n          ((JSCompiler_inline_result =\n            JSCompiler_inline_result.ownerDocument || JSCompiler_inline_result),\n          (resource$245 = {\n            type: \"stylesheet\",\n            instance: null,\n            count: 0,\n            state: { loading: 0, preload: null }\n          }),\n          styles$244.set(type, resource$245),\n          (styles$244 = JSCompiler_inline_result.querySelector(\n            getStylesheetSelectorFromKey(type)\n          )) &&\n            !styles$244._p &&\n            ((resource$245.instance = styles$244),\n            (resource$245.state.loading = 5)),\n          preloadPropsMap.has(type) ||\n            ((pendingProps = {\n              rel: \"preload\",\n              as: \"style\",\n              href: pendingProps.href,\n              crossOrigin: pendingProps.crossOrigin,\n              integrity: pendingProps.integrity,\n              media: pendingProps.media,\n              hrefLang: pendingProps.hrefLang,\n              referrerPolicy: pendingProps.referrerPolicy\n            }),\n            preloadPropsMap.set(type, pendingProps),\n            styles$244 ||\n              preloadStylesheet(\n                JSCompiler_inline_result,\n                type,\n                pendingProps,\n                resource$245.state\n              )));\n        if (currentProps && null === currentResource)\n          throw Error(formatProdErrorMessage(528, \"\"));\n        return resource$245;\n      }\n      if (currentProps && null !== currentResource)\n        throw Error(formatProdErrorMessage(529, \"\"));\n      return null;\n    case \"script\":\n      return (\n        (currentProps = pendingProps.async),\n        (pendingProps = pendingProps.src),\n        \"string\" === typeof pendingProps &&\n        currentProps &&\n        \"function\" !== typeof currentProps &&\n        \"symbol\" !== typeof currentProps\n          ? ((currentProps = getScriptKey(pendingProps)),\n            (pendingProps = getResourcesFromRoot(\n              JSCompiler_inline_result\n            ).hoistableScripts),\n            (currentResource = pendingProps.get(currentProps)),\n            currentResource ||\n              ((currentResource = {\n                type: \"script\",\n                instance: null,\n                count: 0,\n                state: null\n              }),\n              pendingProps.set(currentProps, currentResource)),\n            currentResource)\n          : { type: \"void\", instance: null, count: 0, state: null }\n      );\n    default:\n      throw Error(formatProdErrorMessage(444, type));\n  }\n}\nfunction getStyleKey(href) {\n  return 'href=\"' + escapeSelectorAttributeValueInsideDoubleQuotes(href) + '\"';\n}\nfunction getStylesheetSelectorFromKey(key) {\n  return 'link[rel=\"stylesheet\"][' + key + \"]\";\n}\nfunction stylesheetPropsFromRawProps(rawProps) {\n  return assign({}, rawProps, {\n    \"data-precedence\": rawProps.precedence,\n    precedence: null\n  });\n}\nfunction preloadStylesheet(ownerDocument, key, preloadProps, state) {\n  ownerDocument.querySelector('link[rel=\"preload\"][as=\"style\"][' + key + \"]\")\n    ? (state.loading = 1)\n    : ((key = ownerDocument.createElement(\"link\")),\n      (state.preload = key),\n      key.addEventListener(\"load\", function () {\n        return (state.loading |= 1);\n      }),\n      key.addEventListener(\"error\", function () {\n        return (state.loading |= 2);\n      }),\n      setInitialProperties(key, \"link\", preloadProps),\n      markNodeAsHoistable(key),\n      ownerDocument.head.appendChild(key));\n}\nfunction getScriptKey(src) {\n  return '[src=\"' + escapeSelectorAttributeValueInsideDoubleQuotes(src) + '\"]';\n}\nfunction getScriptSelectorFromKey(key) {\n  return \"script[async]\" + key;\n}\nfunction acquireResource(hoistableRoot, resource, props) {\n  resource.count++;\n  if (null === resource.instance)\n    switch (resource.type) {\n      case \"style\":\n        var instance = hoistableRoot.querySelector(\n          'style[data-href~=\"' +\n            escapeSelectorAttributeValueInsideDoubleQuotes(props.href) +\n            '\"]'\n        );\n        if (instance)\n          return (\n            (resource.instance = instance),\n            markNodeAsHoistable(instance),\n            instance\n          );\n        var styleProps = assign({}, props, {\n          \"data-href\": props.href,\n          \"data-precedence\": props.precedence,\n          href: null,\n          precedence: null\n        });\n        instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement(\n          \"style\"\n        );\n        markNodeAsHoistable(instance);\n        setInitialProperties(instance, \"style\", styleProps);\n        insertStylesheet(instance, props.precedence, hoistableRoot);\n        return (resource.instance = instance);\n      case \"stylesheet\":\n        styleProps = getStyleKey(props.href);\n        var instance$250 = hoistableRoot.querySelector(\n          getStylesheetSelectorFromKey(styleProps)\n        );\n        if (instance$250)\n          return (\n            (resource.state.loading |= 4),\n            (resource.instance = instance$250),\n            markNodeAsHoistable(instance$250),\n            instance$250\n          );\n        instance = stylesheetPropsFromRawProps(props);\n        (styleProps = preloadPropsMap.get(styleProps)) &&\n          adoptPreloadPropsForStylesheet(instance, styleProps);\n        instance$250 = (\n          hoistableRoot.ownerDocument || hoistableRoot\n        ).createElement(\"link\");\n        markNodeAsHoistable(instance$250);\n        var linkInstance = instance$250;\n        linkInstance._p = new Promise(function (resolve, reject) {\n          linkInstance.onload = resolve;\n          linkInstance.onerror = reject;\n        });\n        setInitialProperties(instance$250, \"link\", instance);\n        resource.state.loading |= 4;\n        insertStylesheet(instance$250, props.precedence, hoistableRoot);\n        return (resource.instance = instance$250);\n      case \"script\":\n        instance$250 = getScriptKey(props.src);\n        if (\n          (styleProps = hoistableRoot.querySelector(\n            getScriptSelectorFromKey(instance$250)\n          ))\n        )\n          return (\n            (resource.instance = styleProps),\n            markNodeAsHoistable(styleProps),\n            styleProps\n          );\n        instance = props;\n        if ((styleProps = preloadPropsMap.get(instance$250)))\n          (instance = assign({}, props)),\n            adoptPreloadPropsForScript(instance, styleProps);\n        hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n        styleProps = hoistableRoot.createElement(\"script\");\n        markNodeAsHoistable(styleProps);\n        setInitialProperties(styleProps, \"link\", instance);\n        hoistableRoot.head.appendChild(styleProps);\n        return (resource.instance = styleProps);\n      case \"void\":\n        return null;\n      default:\n        throw Error(formatProdErrorMessage(443, resource.type));\n    }\n  else\n    \"stylesheet\" === resource.type &&\n      0 === (resource.state.loading & 4) &&\n      ((instance = resource.instance),\n      (resource.state.loading |= 4),\n      insertStylesheet(instance, props.precedence, hoistableRoot));\n  return resource.instance;\n}\nfunction insertStylesheet(instance, precedence, root) {\n  for (\n    var nodes = root.querySelectorAll(\n        'link[rel=\"stylesheet\"][data-precedence],style[data-precedence]'\n      ),\n      last = nodes.length ? nodes[nodes.length - 1] : null,\n      prior = last,\n      i = 0;\n    i < nodes.length;\n    i++\n  ) {\n    var node = nodes[i];\n    if (node.dataset.precedence === precedence) prior = node;\n    else if (prior !== last) break;\n  }\n  prior\n    ? prior.parentNode.insertBefore(instance, prior.nextSibling)\n    : ((precedence = 9 === root.nodeType ? root.head : root),\n      precedence.insertBefore(instance, precedence.firstChild));\n}\nfunction adoptPreloadPropsForStylesheet(stylesheetProps, preloadProps) {\n  null == stylesheetProps.crossOrigin &&\n    (stylesheetProps.crossOrigin = preloadProps.crossOrigin);\n  null == stylesheetProps.referrerPolicy &&\n    (stylesheetProps.referrerPolicy = preloadProps.referrerPolicy);\n  null == stylesheetProps.title && (stylesheetProps.title = preloadProps.title);\n}\nfunction adoptPreloadPropsForScript(scriptProps, preloadProps) {\n  null == scriptProps.crossOrigin &&\n    (scriptProps.crossOrigin = preloadProps.crossOrigin);\n  null == scriptProps.referrerPolicy &&\n    (scriptProps.referrerPolicy = preloadProps.referrerPolicy);\n  null == scriptProps.integrity &&\n    (scriptProps.integrity = preloadProps.integrity);\n}\nvar tagCaches = null;\nfunction getHydratableHoistableCache(type, keyAttribute, ownerDocument) {\n  if (null === tagCaches) {\n    var cache = new Map();\n    var caches = (tagCaches = new Map());\n    caches.set(ownerDocument, cache);\n  } else\n    (caches = tagCaches),\n      (cache = caches.get(ownerDocument)),\n      cache || ((cache = new Map()), caches.set(ownerDocument, cache));\n  if (cache.has(type)) return cache;\n  cache.set(type, null);\n  ownerDocument = ownerDocument.getElementsByTagName(type);\n  for (caches = 0; caches < ownerDocument.length; caches++) {\n    var node = ownerDocument[caches];\n    if (\n      !(\n        node[internalHoistableMarker] ||\n        node[internalInstanceKey] ||\n        (\"link\" === type && \"stylesheet\" === node.getAttribute(\"rel\"))\n      ) &&\n      \"http://www.w3.org/2000/svg\" !== node.namespaceURI\n    ) {\n      var nodeKey = node.getAttribute(keyAttribute) || \"\";\n      nodeKey = type + nodeKey;\n      var existing = cache.get(nodeKey);\n      existing ? existing.push(node) : cache.set(nodeKey, [node]);\n    }\n  }\n  return cache;\n}\nfunction mountHoistable(hoistableRoot, type, instance) {\n  hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;\n  hoistableRoot.head.insertBefore(\n    instance,\n    \"title\" === type ? hoistableRoot.querySelector(\"head > title\") : null\n  );\n}\nfunction isHostHoistableType(type, props, hostContext) {\n  if (1 === hostContext || null != props.itemProp) return !1;\n  switch (type) {\n    case \"meta\":\n    case \"title\":\n      return !0;\n    case \"style\":\n      if (\n        \"string\" !== typeof props.precedence ||\n        \"string\" !== typeof props.href ||\n        \"\" === props.href\n      )\n        break;\n      return !0;\n    case \"link\":\n      if (\n        \"string\" !== typeof props.rel ||\n        \"string\" !== typeof props.href ||\n        \"\" === props.href ||\n        props.onLoad ||\n        props.onError\n      )\n        break;\n      switch (props.rel) {\n        case \"stylesheet\":\n          return (\n            (type = props.disabled),\n            \"string\" === typeof props.precedence && null == type\n          );\n        default:\n          return !0;\n      }\n    case \"script\":\n      if (\n        props.async &&\n        \"function\" !== typeof props.async &&\n        \"symbol\" !== typeof props.async &&\n        !props.onLoad &&\n        !props.onError &&\n        props.src &&\n        \"string\" === typeof props.src\n      )\n        return !0;\n  }\n  return !1;\n}\nfunction preloadResource(resource) {\n  return \"stylesheet\" === resource.type && 0 === (resource.state.loading & 3)\n    ? !1\n    : !0;\n}\nvar suspendedState = null;\nfunction noop() {}\nfunction suspendResource(hoistableRoot, resource, props) {\n  if (null === suspendedState) throw Error(formatProdErrorMessage(475));\n  var state = suspendedState;\n  if (\n    \"stylesheet\" === resource.type &&\n    (\"string\" !== typeof props.media ||\n      !1 !== matchMedia(props.media).matches) &&\n    0 === (resource.state.loading & 4)\n  ) {\n    if (null === resource.instance) {\n      var key = getStyleKey(props.href),\n        instance = hoistableRoot.querySelector(\n          getStylesheetSelectorFromKey(key)\n        );\n      if (instance) {\n        hoistableRoot = instance._p;\n        null !== hoistableRoot &&\n          \"object\" === typeof hoistableRoot &&\n          \"function\" === typeof hoistableRoot.then &&\n          (state.count++,\n          (state = onUnsuspend.bind(state)),\n          hoistableRoot.then(state, state));\n        resource.state.loading |= 4;\n        resource.instance = instance;\n        markNodeAsHoistable(instance);\n        return;\n      }\n      instance = hoistableRoot.ownerDocument || hoistableRoot;\n      props = stylesheetPropsFromRawProps(props);\n      (key = preloadPropsMap.get(key)) &&\n        adoptPreloadPropsForStylesheet(props, key);\n      instance = instance.createElement(\"link\");\n      markNodeAsHoistable(instance);\n      var linkInstance = instance;\n      linkInstance._p = new Promise(function (resolve, reject) {\n        linkInstance.onload = resolve;\n        linkInstance.onerror = reject;\n      });\n      setInitialProperties(instance, \"link\", props);\n      resource.instance = instance;\n    }\n    null === state.stylesheets && (state.stylesheets = new Map());\n    state.stylesheets.set(resource, hoistableRoot);\n    (hoistableRoot = resource.state.preload) &&\n      0 === (resource.state.loading & 3) &&\n      (state.count++,\n      (resource = onUnsuspend.bind(state)),\n      hoistableRoot.addEventListener(\"load\", resource),\n      hoistableRoot.addEventListener(\"error\", resource));\n  }\n}\nfunction waitForCommitToBeReady() {\n  if (null === suspendedState) throw Error(formatProdErrorMessage(475));\n  var state = suspendedState;\n  state.stylesheets &&\n    0 === state.count &&\n    insertSuspendedStylesheets(state, state.stylesheets);\n  return 0 < state.count\n    ? function (commit) {\n        var stylesheetTimer = setTimeout(function () {\n          state.stylesheets &&\n            insertSuspendedStylesheets(state, state.stylesheets);\n          if (state.unsuspend) {\n            var unsuspend = state.unsuspend;\n            state.unsuspend = null;\n            unsuspend();\n          }\n        }, 6e4);\n        state.unsuspend = commit;\n        return function () {\n          state.unsuspend = null;\n          clearTimeout(stylesheetTimer);\n        };\n      }\n    : null;\n}\nfunction onUnsuspend() {\n  this.count--;\n  if (0 === this.count)\n    if (this.stylesheets) insertSuspendedStylesheets(this, this.stylesheets);\n    else if (this.unsuspend) {\n      var unsuspend = this.unsuspend;\n      this.unsuspend = null;\n      unsuspend();\n    }\n}\nvar precedencesByRoot = null;\nfunction insertSuspendedStylesheets(state, resources) {\n  state.stylesheets = null;\n  null !== state.unsuspend &&\n    (state.count++,\n    (precedencesByRoot = new Map()),\n    resources.forEach(insertStylesheetIntoRoot, state),\n    (precedencesByRoot = null),\n    onUnsuspend.call(state));\n}\nfunction insertStylesheetIntoRoot(root, resource) {\n  if (!(resource.state.loading & 4)) {\n    var precedences = precedencesByRoot.get(root);\n    if (precedences) var last = precedences.get(null);\n    else {\n      precedences = new Map();\n      precedencesByRoot.set(root, precedences);\n      for (\n        var nodes = root.querySelectorAll(\n            \"link[data-precedence],style[data-precedence]\"\n          ),\n          i = 0;\n        i < nodes.length;\n        i++\n      ) {\n        var node = nodes[i];\n        if (\n          \"LINK\" === node.nodeName ||\n          \"not all\" !== node.getAttribute(\"media\")\n        )\n          precedences.set(node.dataset.precedence, node), (last = node);\n      }\n      last && precedences.set(null, last);\n    }\n    nodes = resource.instance;\n    node = nodes.getAttribute(\"data-precedence\");\n    i = precedences.get(node) || last;\n    i === last && precedences.set(null, nodes);\n    precedences.set(node, nodes);\n    this.count++;\n    last = onUnsuspend.bind(this);\n    nodes.addEventListener(\"load\", last);\n    nodes.addEventListener(\"error\", last);\n    i\n      ? i.parentNode.insertBefore(nodes, i.nextSibling)\n      : ((root = 9 === root.nodeType ? root.head : root),\n        root.insertBefore(nodes, root.firstChild));\n    resource.state.loading |= 4;\n  }\n}\nvar HostTransitionContext = {\n  $$typeof: REACT_CONTEXT_TYPE,\n  Provider: null,\n  Consumer: null,\n  _currentValue: sharedNotPendingObject,\n  _currentValue2: sharedNotPendingObject,\n  _threadCount: 0\n};\nfunction FiberRootNode(\n  containerInfo,\n  tag,\n  hydrate,\n  identifierPrefix,\n  onUncaughtError,\n  onCaughtError,\n  onRecoverableError,\n  formState\n) {\n  this.tag = 1;\n  this.containerInfo = containerInfo;\n  this.pingCache = this.current = this.pendingChildren = null;\n  this.timeoutHandle = -1;\n  this.callbackNode =\n    this.next =\n    this.pendingContext =\n    this.context =\n    this.cancelPendingCommit =\n      null;\n  this.callbackPriority = 0;\n  this.expirationTimes = createLaneMap(-1);\n  this.entangledLanes =\n    this.shellSuspendCounter =\n    this.errorRecoveryDisabledLanes =\n    this.expiredLanes =\n    this.warmLanes =\n    this.pingedLanes =\n    this.suspendedLanes =\n    this.pendingLanes =\n      0;\n  this.entanglements = createLaneMap(0);\n  this.hiddenUpdates = createLaneMap(null);\n  this.identifierPrefix = identifierPrefix;\n  this.onUncaughtError = onUncaughtError;\n  this.onCaughtError = onCaughtError;\n  this.onRecoverableError = onRecoverableError;\n  this.pooledCache = null;\n  this.pooledCacheLanes = 0;\n  this.formState = formState;\n  this.incompleteTransitions = new Map();\n}\nfunction createFiberRoot(\n  containerInfo,\n  tag,\n  hydrate,\n  initialChildren,\n  hydrationCallbacks,\n  isStrictMode,\n  identifierPrefix,\n  onUncaughtError,\n  onCaughtError,\n  onRecoverableError,\n  transitionCallbacks,\n  formState\n) {\n  containerInfo = new FiberRootNode(\n    containerInfo,\n    tag,\n    hydrate,\n    identifierPrefix,\n    onUncaughtError,\n    onCaughtError,\n    onRecoverableError,\n    formState\n  );\n  tag = 1;\n  !0 === isStrictMode && (tag |= 24);\n  isStrictMode = createFiberImplClass(3, null, null, tag);\n  containerInfo.current = isStrictMode;\n  isStrictMode.stateNode = containerInfo;\n  tag = createCache();\n  tag.refCount++;\n  containerInfo.pooledCache = tag;\n  tag.refCount++;\n  isStrictMode.memoizedState = {\n    element: initialChildren,\n    isDehydrated: hydrate,\n    cache: tag\n  };\n  initializeUpdateQueue(isStrictMode);\n  return containerInfo;\n}\nfunction getContextForSubtree(parentComponent) {\n  if (!parentComponent) return emptyContextObject;\n  parentComponent = emptyContextObject;\n  return parentComponent;\n}\nfunction updateContainerImpl(\n  rootFiber,\n  lane,\n  element,\n  container,\n  parentComponent,\n  callback\n) {\n  parentComponent = getContextForSubtree(parentComponent);\n  null === container.context\n    ? (container.context = parentComponent)\n    : (container.pendingContext = parentComponent);\n  container = createUpdate(lane);\n  container.payload = { element: element };\n  callback = void 0 === callback ? null : callback;\n  null !== callback && (container.callback = callback);\n  element = enqueueUpdate(rootFiber, container, lane);\n  null !== element &&\n    (scheduleUpdateOnFiber(element, rootFiber, lane),\n    entangleTransitions(element, rootFiber, lane));\n}\nfunction markRetryLaneImpl(fiber, retryLane) {\n  fiber = fiber.memoizedState;\n  if (null !== fiber && null !== fiber.dehydrated) {\n    var a = fiber.retryLane;\n    fiber.retryLane = 0 !== a && a < retryLane ? a : retryLane;\n  }\n}\nfunction markRetryLaneIfNotHydrated(fiber, retryLane) {\n  markRetryLaneImpl(fiber, retryLane);\n  (fiber = fiber.alternate) && markRetryLaneImpl(fiber, retryLane);\n}\nfunction attemptContinuousHydration(fiber) {\n  if (13 === fiber.tag) {\n    var root = enqueueConcurrentRenderForLane(fiber, 67108864);\n    null !== root && scheduleUpdateOnFiber(root, fiber, 67108864);\n    markRetryLaneIfNotHydrated(fiber, 67108864);\n  }\n}\nvar _enabled = !0;\nfunction dispatchDiscreteEvent(\n  domEventName,\n  eventSystemFlags,\n  container,\n  nativeEvent\n) {\n  var prevTransition = ReactSharedInternals.T;\n  ReactSharedInternals.T = null;\n  var previousPriority = ReactDOMSharedInternals.p;\n  try {\n    (ReactDOMSharedInternals.p = 2),\n      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition);\n  }\n}\nfunction dispatchContinuousEvent(\n  domEventName,\n  eventSystemFlags,\n  container,\n  nativeEvent\n) {\n  var prevTransition = ReactSharedInternals.T;\n  ReactSharedInternals.T = null;\n  var previousPriority = ReactDOMSharedInternals.p;\n  try {\n    (ReactDOMSharedInternals.p = 8),\n      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);\n  } finally {\n    (ReactDOMSharedInternals.p = previousPriority),\n      (ReactSharedInternals.T = prevTransition);\n  }\n}\nfunction dispatchEvent(\n  domEventName,\n  eventSystemFlags,\n  targetContainer,\n  nativeEvent\n) {\n  if (_enabled) {\n    var blockedOn = findInstanceBlockingEvent(nativeEvent);\n    if (null === blockedOn)\n      dispatchEventForPluginEventSystem(\n        domEventName,\n        eventSystemFlags,\n        nativeEvent,\n        return_targetInst,\n        targetContainer\n      ),\n        clearIfContinuousEvent(domEventName, nativeEvent);\n    else if (\n      queueIfContinuousEvent(\n        blockedOn,\n        domEventName,\n        eventSystemFlags,\n        targetContainer,\n        nativeEvent\n      )\n    )\n      nativeEvent.stopPropagation();\n    else if (\n      (clearIfContinuousEvent(domEventName, nativeEvent),\n      eventSystemFlags & 4 &&\n        -1 < discreteReplayableEvents.indexOf(domEventName))\n    ) {\n      for (; null !== blockedOn; ) {\n        var fiber = getInstanceFromNode(blockedOn);\n        if (null !== fiber)\n          switch (fiber.tag) {\n            case 3:\n              fiber = fiber.stateNode;\n              if (fiber.current.memoizedState.isDehydrated) {\n                var lanes = getHighestPriorityLanes(fiber.pendingLanes);\n                if (0 !== lanes) {\n                  var root = fiber;\n                  root.pendingLanes |= 2;\n                  for (root.entangledLanes |= 2; lanes; ) {\n                    var lane = 1 << (31 - clz32(lanes));\n                    root.entanglements[1] |= lane;\n                    lanes &= ~lane;\n                  }\n                  ensureRootIsScheduled(fiber);\n                  0 === (executionContext & 6) &&\n                    ((workInProgressRootRenderTargetTime = now() + 500),\n                    flushSyncWorkAcrossRoots_impl(0, !1));\n                }\n              }\n              break;\n            case 13:\n              (root = enqueueConcurrentRenderForLane(fiber, 2)),\n                null !== root && scheduleUpdateOnFiber(root, fiber, 2),\n                flushSyncWork$1(),\n                markRetryLaneIfNotHydrated(fiber, 2);\n          }\n        fiber = findInstanceBlockingEvent(nativeEvent);\n        null === fiber &&\n          dispatchEventForPluginEventSystem(\n            domEventName,\n            eventSystemFlags,\n            nativeEvent,\n            return_targetInst,\n            targetContainer\n          );\n        if (fiber === blockedOn) break;\n        blockedOn = fiber;\n      }\n      null !== blockedOn && nativeEvent.stopPropagation();\n    } else\n      dispatchEventForPluginEventSystem(\n        domEventName,\n        eventSystemFlags,\n        nativeEvent,\n        null,\n        targetContainer\n      );\n  }\n}\nfunction findInstanceBlockingEvent(nativeEvent) {\n  nativeEvent = getEventTarget(nativeEvent);\n  return findInstanceBlockingTarget(nativeEvent);\n}\nvar return_targetInst = null;\nfunction findInstanceBlockingTarget(targetNode) {\n  return_targetInst = null;\n  targetNode = getClosestInstanceFromNode(targetNode);\n  if (null !== targetNode) {\n    var nearestMounted = getNearestMountedFiber(targetNode);\n    if (null === nearestMounted) targetNode = null;\n    else {\n      var tag = nearestMounted.tag;\n      if (13 === tag) {\n        targetNode = getSuspenseInstanceFromFiber(nearestMounted);\n        if (null !== targetNode) return targetNode;\n        targetNode = null;\n      } else if (3 === tag) {\n        if (nearestMounted.stateNode.current.memoizedState.isDehydrated)\n          return 3 === nearestMounted.tag\n            ? nearestMounted.stateNode.containerInfo\n            : null;\n        targetNode = null;\n      } else nearestMounted !== targetNode && (targetNode = null);\n    }\n  }\n  return_targetInst = targetNode;\n  return null;\n}\nfunction getEventPriority(domEventName) {\n  switch (domEventName) {\n    case \"beforetoggle\":\n    case \"cancel\":\n    case \"click\":\n    case \"close\":\n    case \"contextmenu\":\n    case \"copy\":\n    case \"cut\":\n    case \"auxclick\":\n    case \"dblclick\":\n    case \"dragend\":\n    case \"dragstart\":\n    case \"drop\":\n    case \"focusin\":\n    case \"focusout\":\n    case \"input\":\n    case \"invalid\":\n    case \"keydown\":\n    case \"keypress\":\n    case \"keyup\":\n    case \"mousedown\":\n    case \"mouseup\":\n    case \"paste\":\n    case \"pause\":\n    case \"play\":\n    case \"pointercancel\":\n    case \"pointerdown\":\n    case \"pointerup\":\n    case \"ratechange\":\n    case \"reset\":\n    case \"resize\":\n    case \"seeked\":\n    case \"submit\":\n    case \"toggle\":\n    case \"touchcancel\":\n    case \"touchend\":\n    case \"touchstart\":\n    case \"volumechange\":\n    case \"change\":\n    case \"selectionchange\":\n    case \"textInput\":\n    case \"compositionstart\":\n    case \"compositionend\":\n    case \"compositionupdate\":\n    case \"beforeblur\":\n    case \"afterblur\":\n    case \"beforeinput\":\n    case \"blur\":\n    case \"fullscreenchange\":\n    case \"focus\":\n    case \"hashchange\":\n    case \"popstate\":\n    case \"select\":\n    case \"selectstart\":\n      return 2;\n    case \"drag\":\n    case \"dragenter\":\n    case \"dragexit\":\n    case \"dragleave\":\n    case \"dragover\":\n    case \"mousemove\":\n    case \"mouseout\":\n    case \"mouseover\":\n    case \"pointermove\":\n    case \"pointerout\":\n    case \"pointerover\":\n    case \"scroll\":\n    case \"touchmove\":\n    case \"wheel\":\n    case \"mouseenter\":\n    case \"mouseleave\":\n    case \"pointerenter\":\n    case \"pointerleave\":\n      return 8;\n    case \"message\":\n      switch (getCurrentPriorityLevel()) {\n        case ImmediatePriority:\n          return 2;\n        case UserBlockingPriority:\n          return 8;\n        case NormalPriority$1:\n        case LowPriority:\n          return 32;\n        case IdlePriority:\n          return 268435456;\n        default:\n          return 32;\n      }\n    default:\n      return 32;\n  }\n}\nvar hasScheduledReplayAttempt = !1,\n  queuedFocus = null,\n  queuedDrag = null,\n  queuedMouse = null,\n  queuedPointers = new Map(),\n  queuedPointerCaptures = new Map(),\n  queuedExplicitHydrationTargets = [],\n  discreteReplayableEvents =\n    \"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset\".split(\n      \" \"\n    );\nfunction clearIfContinuousEvent(domEventName, nativeEvent) {\n  switch (domEventName) {\n    case \"focusin\":\n    case \"focusout\":\n      queuedFocus = null;\n      break;\n    case \"dragenter\":\n    case \"dragleave\":\n      queuedDrag = null;\n      break;\n    case \"mouseover\":\n    case \"mouseout\":\n      queuedMouse = null;\n      break;\n    case \"pointerover\":\n    case \"pointerout\":\n      queuedPointers.delete(nativeEvent.pointerId);\n      break;\n    case \"gotpointercapture\":\n    case \"lostpointercapture\":\n      queuedPointerCaptures.delete(nativeEvent.pointerId);\n  }\n}\nfunction accumulateOrCreateContinuousQueuedReplayableEvent(\n  existingQueuedEvent,\n  blockedOn,\n  domEventName,\n  eventSystemFlags,\n  targetContainer,\n  nativeEvent\n) {\n  if (\n    null === existingQueuedEvent ||\n    existingQueuedEvent.nativeEvent !== nativeEvent\n  )\n    return (\n      (existingQueuedEvent = {\n        blockedOn: blockedOn,\n        domEventName: domEventName,\n        eventSystemFlags: eventSystemFlags,\n        nativeEvent: nativeEvent,\n        targetContainers: [targetContainer]\n      }),\n      null !== blockedOn &&\n        ((blockedOn = getInstanceFromNode(blockedOn)),\n        null !== blockedOn && attemptContinuousHydration(blockedOn)),\n      existingQueuedEvent\n    );\n  existingQueuedEvent.eventSystemFlags |= eventSystemFlags;\n  blockedOn = existingQueuedEvent.targetContainers;\n  null !== targetContainer &&\n    -1 === blockedOn.indexOf(targetContainer) &&\n    blockedOn.push(targetContainer);\n  return existingQueuedEvent;\n}\nfunction queueIfContinuousEvent(\n  blockedOn,\n  domEventName,\n  eventSystemFlags,\n  targetContainer,\n  nativeEvent\n) {\n  switch (domEventName) {\n    case \"focusin\":\n      return (\n        (queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedFocus,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )),\n        !0\n      );\n    case \"dragenter\":\n      return (\n        (queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedDrag,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )),\n        !0\n      );\n    case \"mouseover\":\n      return (\n        (queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedMouse,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )),\n        !0\n      );\n    case \"pointerover\":\n      var pointerId = nativeEvent.pointerId;\n      queuedPointers.set(\n        pointerId,\n        accumulateOrCreateContinuousQueuedReplayableEvent(\n          queuedPointers.get(pointerId) || null,\n          blockedOn,\n          domEventName,\n          eventSystemFlags,\n          targetContainer,\n          nativeEvent\n        )\n      );\n      return !0;\n    case \"gotpointercapture\":\n      return (\n        (pointerId = nativeEvent.pointerId),\n        queuedPointerCaptures.set(\n          pointerId,\n          accumulateOrCreateContinuousQueuedReplayableEvent(\n            queuedPointerCaptures.get(pointerId) || null,\n            blockedOn,\n            domEventName,\n            eventSystemFlags,\n            targetContainer,\n            nativeEvent\n          )\n        ),\n        !0\n      );\n  }\n  return !1;\n}\nfunction attemptExplicitHydrationTarget(queuedTarget) {\n  var targetInst = getClosestInstanceFromNode(queuedTarget.target);\n  if (null !== targetInst) {\n    var nearestMounted = getNearestMountedFiber(targetInst);\n    if (null !== nearestMounted)\n      if (((targetInst = nearestMounted.tag), 13 === targetInst)) {\n        if (\n          ((targetInst = getSuspenseInstanceFromFiber(nearestMounted)),\n          null !== targetInst)\n        ) {\n          queuedTarget.blockedOn = targetInst;\n          runWithPriority(queuedTarget.priority, function () {\n            if (13 === nearestMounted.tag) {\n              var lane = requestUpdateLane();\n              lane = getBumpedLaneForHydrationByLane(lane);\n              var root = enqueueConcurrentRenderForLane(nearestMounted, lane);\n              null !== root &&\n                scheduleUpdateOnFiber(root, nearestMounted, lane);\n              markRetryLaneIfNotHydrated(nearestMounted, lane);\n            }\n          });\n          return;\n        }\n      } else if (\n        3 === targetInst &&\n        nearestMounted.stateNode.current.memoizedState.isDehydrated\n      ) {\n        queuedTarget.blockedOn =\n          3 === nearestMounted.tag\n            ? nearestMounted.stateNode.containerInfo\n            : null;\n        return;\n      }\n  }\n  queuedTarget.blockedOn = null;\n}\nfunction attemptReplayContinuousQueuedEvent(queuedEvent) {\n  if (null !== queuedEvent.blockedOn) return !1;\n  for (\n    var targetContainers = queuedEvent.targetContainers;\n    0 < targetContainers.length;\n\n  ) {\n    var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.nativeEvent);\n    if (null === nextBlockedOn) {\n      nextBlockedOn = queuedEvent.nativeEvent;\n      var nativeEventClone = new nextBlockedOn.constructor(\n        nextBlockedOn.type,\n        nextBlockedOn\n      );\n      currentReplayingEvent = nativeEventClone;\n      nextBlockedOn.target.dispatchEvent(nativeEventClone);\n      currentReplayingEvent = null;\n    } else\n      return (\n        (targetContainers = getInstanceFromNode(nextBlockedOn)),\n        null !== targetContainers &&\n          attemptContinuousHydration(targetContainers),\n        (queuedEvent.blockedOn = nextBlockedOn),\n        !1\n      );\n    targetContainers.shift();\n  }\n  return !0;\n}\nfunction attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {\n  attemptReplayContinuousQueuedEvent(queuedEvent) && map.delete(key);\n}\nfunction replayUnblockedEvents() {\n  hasScheduledReplayAttempt = !1;\n  null !== queuedFocus &&\n    attemptReplayContinuousQueuedEvent(queuedFocus) &&\n    (queuedFocus = null);\n  null !== queuedDrag &&\n    attemptReplayContinuousQueuedEvent(queuedDrag) &&\n    (queuedDrag = null);\n  null !== queuedMouse &&\n    attemptReplayContinuousQueuedEvent(queuedMouse) &&\n    (queuedMouse = null);\n  queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);\n  queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);\n}\nfunction scheduleCallbackIfUnblocked(queuedEvent, unblocked) {\n  queuedEvent.blockedOn === unblocked &&\n    ((queuedEvent.blockedOn = null),\n    hasScheduledReplayAttempt ||\n      ((hasScheduledReplayAttempt = !0),\n      Scheduler.unstable_scheduleCallback(\n        Scheduler.unstable_NormalPriority,\n        replayUnblockedEvents\n      )));\n}\nvar lastScheduledReplayQueue = null;\nfunction scheduleReplayQueueIfNeeded(formReplayingQueue) {\n  lastScheduledReplayQueue !== formReplayingQueue &&\n    ((lastScheduledReplayQueue = formReplayingQueue),\n    Scheduler.unstable_scheduleCallback(\n      Scheduler.unstable_NormalPriority,\n      function () {\n        lastScheduledReplayQueue === formReplayingQueue &&\n          (lastScheduledReplayQueue = null);\n        for (var i = 0; i < formReplayingQueue.length; i += 3) {\n          var form = formReplayingQueue[i],\n            submitterOrAction = formReplayingQueue[i + 1],\n            formData = formReplayingQueue[i + 2];\n          if (\"function\" !== typeof submitterOrAction)\n            if (null === findInstanceBlockingTarget(submitterOrAction || form))\n              continue;\n            else break;\n          var formInst = getInstanceFromNode(form);\n          null !== formInst &&\n            (formReplayingQueue.splice(i, 3),\n            (i -= 3),\n            startHostTransition(\n              formInst,\n              {\n                pending: !0,\n                data: formData,\n                method: form.method,\n                action: submitterOrAction\n              },\n              submitterOrAction,\n              formData\n            ));\n        }\n      }\n    ));\n}\nfunction retryIfBlockedOn(unblocked) {\n  function unblock(queuedEvent) {\n    return scheduleCallbackIfUnblocked(queuedEvent, unblocked);\n  }\n  null !== queuedFocus && scheduleCallbackIfUnblocked(queuedFocus, unblocked);\n  null !== queuedDrag && scheduleCallbackIfUnblocked(queuedDrag, unblocked);\n  null !== queuedMouse && scheduleCallbackIfUnblocked(queuedMouse, unblocked);\n  queuedPointers.forEach(unblock);\n  queuedPointerCaptures.forEach(unblock);\n  for (var i = 0; i < queuedExplicitHydrationTargets.length; i++) {\n    var queuedTarget = queuedExplicitHydrationTargets[i];\n    queuedTarget.blockedOn === unblocked && (queuedTarget.blockedOn = null);\n  }\n  for (\n    ;\n    0 < queuedExplicitHydrationTargets.length &&\n    ((i = queuedExplicitHydrationTargets[0]), null === i.blockedOn);\n\n  )\n    attemptExplicitHydrationTarget(i),\n      null === i.blockedOn && queuedExplicitHydrationTargets.shift();\n  i = (unblocked.ownerDocument || unblocked).$$reactFormReplay;\n  if (null != i)\n    for (queuedTarget = 0; queuedTarget < i.length; queuedTarget += 3) {\n      var form = i[queuedTarget],\n        submitterOrAction = i[queuedTarget + 1],\n        formProps = form[internalPropsKey] || null;\n      if (\"function\" === typeof submitterOrAction)\n        formProps || scheduleReplayQueueIfNeeded(i);\n      else if (formProps) {\n        var action = null;\n        if (submitterOrAction && submitterOrAction.hasAttribute(\"formAction\"))\n          if (\n            ((form = submitterOrAction),\n            (formProps = submitterOrAction[internalPropsKey] || null))\n          )\n            action = formProps.formAction;\n          else {\n            if (null !== findInstanceBlockingTarget(form)) continue;\n          }\n        else action = formProps.action;\n        \"function\" === typeof action\n          ? (i[queuedTarget + 1] = action)\n          : (i.splice(queuedTarget, 3), (queuedTarget -= 3));\n        scheduleReplayQueueIfNeeded(i);\n      }\n    }\n}\nfunction ReactDOMRoot(internalRoot) {\n  this._internalRoot = internalRoot;\n}\nReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render =\n  function (children) {\n    var root = this._internalRoot;\n    if (null === root) throw Error(formatProdErrorMessage(409));\n    var current = root.current,\n      lane = requestUpdateLane();\n    updateContainerImpl(current, lane, children, root, null, null);\n  };\nReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount =\n  function () {\n    var root = this._internalRoot;\n    if (null !== root) {\n      this._internalRoot = null;\n      var container = root.containerInfo;\n      updateContainerImpl(root.current, 2, null, root, null, null);\n      flushSyncWork$1();\n      container[internalContainerInstanceKey] = null;\n    }\n  };\nfunction ReactDOMHydrationRoot(internalRoot) {\n  this._internalRoot = internalRoot;\n}\nReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function (target) {\n  if (target) {\n    var updatePriority = resolveUpdatePriority();\n    target = { blockedOn: null, target: target, priority: updatePriority };\n    for (\n      var i = 0;\n      i < queuedExplicitHydrationTargets.length &&\n      0 !== updatePriority &&\n      updatePriority < queuedExplicitHydrationTargets[i].priority;\n      i++\n    );\n    queuedExplicitHydrationTargets.splice(i, 0, target);\n    0 === i && attemptExplicitHydrationTarget(target);\n  }\n};\nvar isomorphicReactPackageVersion$jscomp$inline_1785 = React.version;\nif (\n  \"19.1.0\" !==\n  isomorphicReactPackageVersion$jscomp$inline_1785\n)\n  throw Error(\n    formatProdErrorMessage(\n      527,\n      isomorphicReactPackageVersion$jscomp$inline_1785,\n      \"19.1.0\"\n    )\n  );\nReactDOMSharedInternals.findDOMNode = function (componentOrElement) {\n  var fiber = componentOrElement._reactInternals;\n  if (void 0 === fiber) {\n    if (\"function\" === typeof componentOrElement.render)\n      throw Error(formatProdErrorMessage(188));\n    componentOrElement = Object.keys(componentOrElement).join(\",\");\n    throw Error(formatProdErrorMessage(268, componentOrElement));\n  }\n  componentOrElement = findCurrentFiberUsingSlowPath(fiber);\n  componentOrElement =\n    null !== componentOrElement\n      ? findCurrentHostFiberImpl(componentOrElement)\n      : null;\n  componentOrElement =\n    null === componentOrElement ? null : componentOrElement.stateNode;\n  return componentOrElement;\n};\nvar internals$jscomp$inline_2256 = {\n  bundleType: 0,\n  version: \"19.1.0\",\n  rendererPackageName: \"react-dom\",\n  currentDispatcherRef: ReactSharedInternals,\n  reconcilerVersion: \"19.1.0\"\n};\nif (\"undefined\" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) {\n  var hook$jscomp$inline_2257 = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n  if (\n    !hook$jscomp$inline_2257.isDisabled &&\n    hook$jscomp$inline_2257.supportsFiber\n  )\n    try {\n      (rendererID = hook$jscomp$inline_2257.inject(\n        internals$jscomp$inline_2256\n      )),\n        (injectedHook = hook$jscomp$inline_2257);\n    } catch (err) {}\n}\nexports.createRoot = function (container, options) {\n  if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299));\n  var isStrictMode = !1,\n    identifierPrefix = \"\",\n    onUncaughtError = defaultOnUncaughtError,\n    onCaughtError = defaultOnCaughtError,\n    onRecoverableError = defaultOnRecoverableError,\n    transitionCallbacks = null;\n  null !== options &&\n    void 0 !== options &&\n    (!0 === options.unstable_strictMode && (isStrictMode = !0),\n    void 0 !== options.identifierPrefix &&\n      (identifierPrefix = options.identifierPrefix),\n    void 0 !== options.onUncaughtError &&\n      (onUncaughtError = options.onUncaughtError),\n    void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError),\n    void 0 !== options.onRecoverableError &&\n      (onRecoverableError = options.onRecoverableError),\n    void 0 !== options.unstable_transitionCallbacks &&\n      (transitionCallbacks = options.unstable_transitionCallbacks));\n  options = createFiberRoot(\n    container,\n    1,\n    !1,\n    null,\n    null,\n    isStrictMode,\n    identifierPrefix,\n    onUncaughtError,\n    onCaughtError,\n    onRecoverableError,\n    transitionCallbacks,\n    null\n  );\n  container[internalContainerInstanceKey] = options.current;\n  listenToAllSupportedEvents(container);\n  return new ReactDOMRoot(options);\n};\nexports.hydrateRoot = function (container, initialChildren, options) {\n  if (!isValidContainer(container)) throw Error(formatProdErrorMessage(299));\n  var isStrictMode = !1,\n    identifierPrefix = \"\",\n    onUncaughtError = defaultOnUncaughtError,\n    onCaughtError = defaultOnCaughtError,\n    onRecoverableError = defaultOnRecoverableError,\n    transitionCallbacks = null,\n    formState = null;\n  null !== options &&\n    void 0 !== options &&\n    (!0 === options.unstable_strictMode && (isStrictMode = !0),\n    void 0 !== options.identifierPrefix &&\n      (identifierPrefix = options.identifierPrefix),\n    void 0 !== options.onUncaughtError &&\n      (onUncaughtError = options.onUncaughtError),\n    void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError),\n    void 0 !== options.onRecoverableError &&\n      (onRecoverableError = options.onRecoverableError),\n    void 0 !== options.unstable_transitionCallbacks &&\n      (transitionCallbacks = options.unstable_transitionCallbacks),\n    void 0 !== options.formState && (formState = options.formState));\n  initialChildren = createFiberRoot(\n    container,\n    1,\n    !0,\n    initialChildren,\n    null != options ? options : null,\n    isStrictMode,\n    identifierPrefix,\n    onUncaughtError,\n    onCaughtError,\n    onRecoverableError,\n    transitionCallbacks,\n    formState\n  );\n  initialChildren.context = getContextForSubtree(null);\n  options = initialChildren.current;\n  isStrictMode = requestUpdateLane();\n  isStrictMode = getBumpedLaneForHydrationByLane(isStrictMode);\n  identifierPrefix = createUpdate(isStrictMode);\n  identifierPrefix.callback = null;\n  enqueueUpdate(options, identifierPrefix, isStrictMode);\n  options = isStrictMode;\n  initialChildren.current.lanes = options;\n  markRootUpdated$1(initialChildren, options);\n  ensureRootIsScheduled(initialChildren);\n  container[internalContainerInstanceKey] = initialChildren.current;\n  listenToAllSupportedEvents(container);\n  return new ReactDOMHydrationRoot(initialChildren);\n};\nexports.version = \"19.1.0\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/scheduler.production.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * @license React\n * react.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n  REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n  REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n  REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n  REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n  REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n  REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n  REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n  REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n  REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n  REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n  MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n  if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n  maybeIterable =\n    (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n    maybeIterable[\"@@iterator\"];\n  return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar ReactNoopUpdateQueue = {\n    isMounted: function () {\n      return !1;\n    },\n    enqueueForceUpdate: function () {},\n    enqueueReplaceState: function () {},\n    enqueueSetState: function () {}\n  },\n  assign = Object.assign,\n  emptyObject = {};\nfunction Component(props, context, updater) {\n  this.props = props;\n  this.context = context;\n  this.refs = emptyObject;\n  this.updater = updater || ReactNoopUpdateQueue;\n}\nComponent.prototype.isReactComponent = {};\nComponent.prototype.setState = function (partialState, callback) {\n  if (\n    \"object\" !== typeof partialState &&\n    \"function\" !== typeof partialState &&\n    null != partialState\n  )\n    throw Error(\n      \"takes an object of state variables to update or a function which returns an object of state variables.\"\n    );\n  this.updater.enqueueSetState(this, partialState, callback, \"setState\");\n};\nComponent.prototype.forceUpdate = function (callback) {\n  this.updater.enqueueForceUpdate(this, callback, \"forceUpdate\");\n};\nfunction ComponentDummy() {}\nComponentDummy.prototype = Component.prototype;\nfunction PureComponent(props, context, updater) {\n  this.props = props;\n  this.context = context;\n  this.refs = emptyObject;\n  this.updater = updater || ReactNoopUpdateQueue;\n}\nvar pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());\npureComponentPrototype.constructor = PureComponent;\nassign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = !0;\nvar isArrayImpl = Array.isArray,\n  ReactSharedInternals = { H: null, A: null, T: null, S: null, V: null },\n  hasOwnProperty = Object.prototype.hasOwnProperty;\nfunction ReactElement(type, key, self, source, owner, props) {\n  self = props.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== self ? self : null,\n    props: props\n  };\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n  return ReactElement(\n    oldElement.type,\n    newKey,\n    void 0,\n    void 0,\n    void 0,\n    oldElement.props\n  );\n}\nfunction isValidElement(object) {\n  return (\n    \"object\" === typeof object &&\n    null !== object &&\n    object.$$typeof === REACT_ELEMENT_TYPE\n  );\n}\nfunction escape(key) {\n  var escaperLookup = { \"=\": \"=0\", \":\": \"=2\" };\n  return (\n    \"$\" +\n    key.replace(/[=:]/g, function (match) {\n      return escaperLookup[match];\n    })\n  );\n}\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction getElementKey(element, index) {\n  return \"object\" === typeof element && null !== element && null != element.key\n    ? escape(\"\" + element.key)\n    : index.toString(36);\n}\nfunction noop$1() {}\nfunction resolveThenable(thenable) {\n  switch (thenable.status) {\n    case \"fulfilled\":\n      return thenable.value;\n    case \"rejected\":\n      throw thenable.reason;\n    default:\n      switch (\n        (\"string\" === typeof thenable.status\n          ? thenable.then(noop$1, noop$1)\n          : ((thenable.status = \"pending\"),\n            thenable.then(\n              function (fulfilledValue) {\n                \"pending\" === thenable.status &&\n                  ((thenable.status = \"fulfilled\"),\n                  (thenable.value = fulfilledValue));\n              },\n              function (error) {\n                \"pending\" === thenable.status &&\n                  ((thenable.status = \"rejected\"), (thenable.reason = error));\n              }\n            )),\n        thenable.status)\n      ) {\n        case \"fulfilled\":\n          return thenable.value;\n        case \"rejected\":\n          throw thenable.reason;\n      }\n  }\n  throw thenable;\n}\nfunction mapIntoArray(children, array, escapedPrefix, nameSoFar, callback) {\n  var type = typeof children;\n  if (\"undefined\" === type || \"boolean\" === type) children = null;\n  var invokeCallback = !1;\n  if (null === children) invokeCallback = !0;\n  else\n    switch (type) {\n      case \"bigint\":\n      case \"string\":\n      case \"number\":\n        invokeCallback = !0;\n        break;\n      case \"object\":\n        switch (children.$$typeof) {\n          case REACT_ELEMENT_TYPE:\n          case REACT_PORTAL_TYPE:\n            invokeCallback = !0;\n            break;\n          case REACT_LAZY_TYPE:\n            return (\n              (invokeCallback = children._init),\n              mapIntoArray(\n                invokeCallback(children._payload),\n                array,\n                escapedPrefix,\n                nameSoFar,\n                callback\n              )\n            );\n        }\n    }\n  if (invokeCallback)\n    return (\n      (callback = callback(children)),\n      (invokeCallback =\n        \"\" === nameSoFar ? \".\" + getElementKey(children, 0) : nameSoFar),\n      isArrayImpl(callback)\n        ? ((escapedPrefix = \"\"),\n          null != invokeCallback &&\n            (escapedPrefix =\n              invokeCallback.replace(userProvidedKeyEscapeRegex, \"$&/\") + \"/\"),\n          mapIntoArray(callback, array, escapedPrefix, \"\", function (c) {\n            return c;\n          }))\n        : null != callback &&\n          (isValidElement(callback) &&\n            (callback = cloneAndReplaceKey(\n              callback,\n              escapedPrefix +\n                (null == callback.key ||\n                (children && children.key === callback.key)\n                  ? \"\"\n                  : (\"\" + callback.key).replace(\n                      userProvidedKeyEscapeRegex,\n                      \"$&/\"\n                    ) + \"/\") +\n                invokeCallback\n            )),\n          array.push(callback)),\n      1\n    );\n  invokeCallback = 0;\n  var nextNamePrefix = \"\" === nameSoFar ? \".\" : nameSoFar + \":\";\n  if (isArrayImpl(children))\n    for (var i = 0; i < children.length; i++)\n      (nameSoFar = children[i]),\n        (type = nextNamePrefix + getElementKey(nameSoFar, i)),\n        (invokeCallback += mapIntoArray(\n          nameSoFar,\n          array,\n          escapedPrefix,\n          type,\n          callback\n        ));\n  else if (((i = getIteratorFn(children)), \"function\" === typeof i))\n    for (\n      children = i.call(children), i = 0;\n      !(nameSoFar = children.next()).done;\n\n    )\n      (nameSoFar = nameSoFar.value),\n        (type = nextNamePrefix + getElementKey(nameSoFar, i++)),\n        (invokeCallback += mapIntoArray(\n          nameSoFar,\n          array,\n          escapedPrefix,\n          type,\n          callback\n        ));\n  else if (\"object\" === type) {\n    if (\"function\" === typeof children.then)\n      return mapIntoArray(\n        resolveThenable(children),\n        array,\n        escapedPrefix,\n        nameSoFar,\n        callback\n      );\n    array = String(children);\n    throw Error(\n      \"Objects are not valid as a React child (found: \" +\n        (\"[object Object]\" === array\n          ? \"object with keys {\" + Object.keys(children).join(\", \") + \"}\"\n          : array) +\n        \"). If you meant to render a collection of children, use an array instead.\"\n    );\n  }\n  return invokeCallback;\n}\nfunction mapChildren(children, func, context) {\n  if (null == children) return children;\n  var result = [],\n    count = 0;\n  mapIntoArray(children, result, \"\", \"\", function (child) {\n    return func.call(context, child, count++);\n  });\n  return result;\n}\nfunction lazyInitializer(payload) {\n  if (-1 === payload._status) {\n    var ctor = payload._result;\n    ctor = ctor();\n    ctor.then(\n      function (moduleObject) {\n        if (0 === payload._status || -1 === payload._status)\n          (payload._status = 1), (payload._result = moduleObject);\n      },\n      function (error) {\n        if (0 === payload._status || -1 === payload._status)\n          (payload._status = 2), (payload._result = error);\n      }\n    );\n    -1 === payload._status && ((payload._status = 0), (payload._result = ctor));\n  }\n  if (1 === payload._status) return payload._result.default;\n  throw payload._result;\n}\nvar reportGlobalError =\n  \"function\" === typeof reportError\n    ? reportError\n    : function (error) {\n        if (\n          \"object\" === typeof window &&\n          \"function\" === typeof window.ErrorEvent\n        ) {\n          var event = new window.ErrorEvent(\"error\", {\n            bubbles: !0,\n            cancelable: !0,\n            message:\n              \"object\" === typeof error &&\n              null !== error &&\n              \"string\" === typeof error.message\n                ? String(error.message)\n                : String(error),\n            error: error\n          });\n          if (!window.dispatchEvent(event)) return;\n        } else if (\n          \"object\" === typeof process &&\n          \"function\" === typeof process.emit\n        ) {\n          process.emit(\"uncaughtException\", error);\n          return;\n        }\n        console.error(error);\n      };\nfunction noop() {}\nexports.Children = {\n  map: mapChildren,\n  forEach: function (children, forEachFunc, forEachContext) {\n    mapChildren(\n      children,\n      function () {\n        forEachFunc.apply(this, arguments);\n      },\n      forEachContext\n    );\n  },\n  count: function (children) {\n    var n = 0;\n    mapChildren(children, function () {\n      n++;\n    });\n    return n;\n  },\n  toArray: function (children) {\n    return (\n      mapChildren(children, function (child) {\n        return child;\n      }) || []\n    );\n  },\n  only: function (children) {\n    if (!isValidElement(children))\n      throw Error(\n        \"React.Children.only expected to receive a single React element child.\"\n      );\n    return children;\n  }\n};\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n  ReactSharedInternals;\nexports.__COMPILER_RUNTIME = {\n  __proto__: null,\n  c: function (size) {\n    return ReactSharedInternals.H.useMemoCache(size);\n  }\n};\nexports.cache = function (fn) {\n  return function () {\n    return fn.apply(null, arguments);\n  };\n};\nexports.cloneElement = function (element, config, children) {\n  if (null === element || void 0 === element)\n    throw Error(\n      \"The argument must be a React element, but you passed \" + element + \".\"\n    );\n  var props = assign({}, element.props),\n    key = element.key,\n    owner = void 0;\n  if (null != config)\n    for (propName in (void 0 !== config.ref && (owner = void 0),\n    void 0 !== config.key && (key = \"\" + config.key),\n    config))\n      !hasOwnProperty.call(config, propName) ||\n        \"key\" === propName ||\n        \"__self\" === propName ||\n        \"__source\" === propName ||\n        (\"ref\" === propName && void 0 === config.ref) ||\n        (props[propName] = config[propName]);\n  var propName = arguments.length - 2;\n  if (1 === propName) props.children = children;\n  else if (1 < propName) {\n    for (var childArray = Array(propName), i = 0; i < propName; i++)\n      childArray[i] = arguments[i + 2];\n    props.children = childArray;\n  }\n  return ReactElement(element.type, key, void 0, void 0, owner, props);\n};\nexports.createContext = function (defaultValue) {\n  defaultValue = {\n    $$typeof: REACT_CONTEXT_TYPE,\n    _currentValue: defaultValue,\n    _currentValue2: defaultValue,\n    _threadCount: 0,\n    Provider: null,\n    Consumer: null\n  };\n  defaultValue.Provider = defaultValue;\n  defaultValue.Consumer = {\n    $$typeof: REACT_CONSUMER_TYPE,\n    _context: defaultValue\n  };\n  return defaultValue;\n};\nexports.createElement = function (type, config, children) {\n  var propName,\n    props = {},\n    key = null;\n  if (null != config)\n    for (propName in (void 0 !== config.key && (key = \"\" + config.key), config))\n      hasOwnProperty.call(config, propName) &&\n        \"key\" !== propName &&\n        \"__self\" !== propName &&\n        \"__source\" !== propName &&\n        (props[propName] = config[propName]);\n  var childrenLength = arguments.length - 2;\n  if (1 === childrenLength) props.children = children;\n  else if (1 < childrenLength) {\n    for (var childArray = Array(childrenLength), i = 0; i < childrenLength; i++)\n      childArray[i] = arguments[i + 2];\n    props.children = childArray;\n  }\n  if (type && type.defaultProps)\n    for (propName in ((childrenLength = type.defaultProps), childrenLength))\n      void 0 === props[propName] &&\n        (props[propName] = childrenLength[propName]);\n  return ReactElement(type, key, void 0, void 0, null, props);\n};\nexports.createRef = function () {\n  return { current: null };\n};\nexports.forwardRef = function (render) {\n  return { $$typeof: REACT_FORWARD_REF_TYPE, render: render };\n};\nexports.isValidElement = isValidElement;\nexports.lazy = function (ctor) {\n  return {\n    $$typeof: REACT_LAZY_TYPE,\n    _payload: { _status: -1, _result: ctor },\n    _init: lazyInitializer\n  };\n};\nexports.memo = function (type, compare) {\n  return {\n    $$typeof: REACT_MEMO_TYPE,\n    type: type,\n    compare: void 0 === compare ? null : compare\n  };\n};\nexports.startTransition = function (scope) {\n  var prevTransition = ReactSharedInternals.T,\n    currentTransition = {};\n  ReactSharedInternals.T = currentTransition;\n  try {\n    var returnValue = scope(),\n      onStartTransitionFinish = ReactSharedInternals.S;\n    null !== onStartTransitionFinish &&\n      onStartTransitionFinish(currentTransition, returnValue);\n    \"object\" === typeof returnValue &&\n      null !== returnValue &&\n      \"function\" === typeof returnValue.then &&\n      returnValue.then(noop, reportGlobalError);\n  } catch (error) {\n    reportGlobalError(error);\n  } finally {\n    ReactSharedInternals.T = prevTransition;\n  }\n};\nexports.unstable_useCacheRefresh = function () {\n  return ReactSharedInternals.H.useCacheRefresh();\n};\nexports.use = function (usable) {\n  return ReactSharedInternals.H.use(usable);\n};\nexports.useActionState = function (action, initialState, permalink) {\n  return ReactSharedInternals.H.useActionState(action, initialState, permalink);\n};\nexports.useCallback = function (callback, deps) {\n  return ReactSharedInternals.H.useCallback(callback, deps);\n};\nexports.useContext = function (Context) {\n  return ReactSharedInternals.H.useContext(Context);\n};\nexports.useDebugValue = function () {};\nexports.useDeferredValue = function (value, initialValue) {\n  return ReactSharedInternals.H.useDeferredValue(value, initialValue);\n};\nexports.useEffect = function (create, createDeps, update) {\n  var dispatcher = ReactSharedInternals.H;\n  if (\"function\" === typeof update)\n    throw Error(\n      \"useEffect CRUD overload is not enabled in this build of React.\"\n    );\n  return dispatcher.useEffect(create, createDeps);\n};\nexports.useId = function () {\n  return ReactSharedInternals.H.useId();\n};\nexports.useImperativeHandle = function (ref, create, deps) {\n  return ReactSharedInternals.H.useImperativeHandle(ref, create, deps);\n};\nexports.useInsertionEffect = function (create, deps) {\n  return ReactSharedInternals.H.useInsertionEffect(create, deps);\n};\nexports.useLayoutEffect = function (create, deps) {\n  return ReactSharedInternals.H.useLayoutEffect(create, deps);\n};\nexports.useMemo = function (create, deps) {\n  return ReactSharedInternals.H.useMemo(create, deps);\n};\nexports.useOptimistic = function (passthrough, reducer) {\n  return ReactSharedInternals.H.useOptimistic(passthrough, reducer);\n};\nexports.useReducer = function (reducer, initialArg, init) {\n  return ReactSharedInternals.H.useReducer(reducer, initialArg, init);\n};\nexports.useRef = function (initialValue) {\n  return ReactSharedInternals.H.useRef(initialValue);\n};\nexports.useState = function (initialState) {\n  return ReactSharedInternals.H.useState(initialState);\n};\nexports.useSyncExternalStore = function (\n  subscribe,\n  getSnapshot,\n  getServerSnapshot\n) {\n  return ReactSharedInternals.H.useSyncExternalStore(\n    subscribe,\n    getSnapshot,\n    getServerSnapshot\n  );\n};\nexports.useTransition = function () {\n  return ReactSharedInternals.H.useTransition();\n};\nexports.version = \"19.1.0\";\n","/**\n * @license React\n * scheduler.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nfunction push(heap, node) {\n  var index = heap.length;\n  heap.push(node);\n  a: for (; 0 < index; ) {\n    var parentIndex = (index - 1) >>> 1,\n      parent = heap[parentIndex];\n    if (0 < compare(parent, node))\n      (heap[parentIndex] = node), (heap[index] = parent), (index = parentIndex);\n    else break a;\n  }\n}\nfunction peek(heap) {\n  return 0 === heap.length ? null : heap[0];\n}\nfunction pop(heap) {\n  if (0 === heap.length) return null;\n  var first = heap[0],\n    last = heap.pop();\n  if (last !== first) {\n    heap[0] = last;\n    a: for (\n      var index = 0, length = heap.length, halfLength = length >>> 1;\n      index < halfLength;\n\n    ) {\n      var leftIndex = 2 * (index + 1) - 1,\n        left = heap[leftIndex],\n        rightIndex = leftIndex + 1,\n        right = heap[rightIndex];\n      if (0 > compare(left, last))\n        rightIndex < length && 0 > compare(right, left)\n          ? ((heap[index] = right),\n            (heap[rightIndex] = last),\n            (index = rightIndex))\n          : ((heap[index] = left),\n            (heap[leftIndex] = last),\n            (index = leftIndex));\n      else if (rightIndex < length && 0 > compare(right, last))\n        (heap[index] = right), (heap[rightIndex] = last), (index = rightIndex);\n      else break a;\n    }\n  }\n  return first;\n}\nfunction compare(a, b) {\n  var diff = a.sortIndex - b.sortIndex;\n  return 0 !== diff ? diff : a.id - b.id;\n}\nexports.unstable_now = void 0;\nif (\"object\" === typeof performance && \"function\" === typeof performance.now) {\n  var localPerformance = performance;\n  exports.unstable_now = function () {\n    return localPerformance.now();\n  };\n} else {\n  var localDate = Date,\n    initialTime = localDate.now();\n  exports.unstable_now = function () {\n    return localDate.now() - initialTime;\n  };\n}\nvar taskQueue = [],\n  timerQueue = [],\n  taskIdCounter = 1,\n  currentTask = null,\n  currentPriorityLevel = 3,\n  isPerformingWork = !1,\n  isHostCallbackScheduled = !1,\n  isHostTimeoutScheduled = !1,\n  needsPaint = !1,\n  localSetTimeout = \"function\" === typeof setTimeout ? setTimeout : null,\n  localClearTimeout = \"function\" === typeof clearTimeout ? clearTimeout : null,\n  localSetImmediate = \"undefined\" !== typeof setImmediate ? setImmediate : null;\nfunction advanceTimers(currentTime) {\n  for (var timer = peek(timerQueue); null !== timer; ) {\n    if (null === timer.callback) pop(timerQueue);\n    else if (timer.startTime <= currentTime)\n      pop(timerQueue),\n        (timer.sortIndex = timer.expirationTime),\n        push(taskQueue, timer);\n    else break;\n    timer = peek(timerQueue);\n  }\n}\nfunction handleTimeout(currentTime) {\n  isHostTimeoutScheduled = !1;\n  advanceTimers(currentTime);\n  if (!isHostCallbackScheduled)\n    if (null !== peek(taskQueue))\n      (isHostCallbackScheduled = !0),\n        isMessageLoopRunning ||\n          ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline());\n    else {\n      var firstTimer = peek(timerQueue);\n      null !== firstTimer &&\n        requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);\n    }\n}\nvar isMessageLoopRunning = !1,\n  taskTimeoutID = -1,\n  frameInterval = 5,\n  startTime = -1;\nfunction shouldYieldToHost() {\n  return needsPaint\n    ? !0\n    : exports.unstable_now() - startTime < frameInterval\n      ? !1\n      : !0;\n}\nfunction performWorkUntilDeadline() {\n  needsPaint = !1;\n  if (isMessageLoopRunning) {\n    var currentTime = exports.unstable_now();\n    startTime = currentTime;\n    var hasMoreWork = !0;\n    try {\n      a: {\n        isHostCallbackScheduled = !1;\n        isHostTimeoutScheduled &&\n          ((isHostTimeoutScheduled = !1),\n          localClearTimeout(taskTimeoutID),\n          (taskTimeoutID = -1));\n        isPerformingWork = !0;\n        var previousPriorityLevel = currentPriorityLevel;\n        try {\n          b: {\n            advanceTimers(currentTime);\n            for (\n              currentTask = peek(taskQueue);\n              null !== currentTask &&\n              !(\n                currentTask.expirationTime > currentTime && shouldYieldToHost()\n              );\n\n            ) {\n              var callback = currentTask.callback;\n              if (\"function\" === typeof callback) {\n                currentTask.callback = null;\n                currentPriorityLevel = currentTask.priorityLevel;\n                var continuationCallback = callback(\n                  currentTask.expirationTime <= currentTime\n                );\n                currentTime = exports.unstable_now();\n                if (\"function\" === typeof continuationCallback) {\n                  currentTask.callback = continuationCallback;\n                  advanceTimers(currentTime);\n                  hasMoreWork = !0;\n                  break b;\n                }\n                currentTask === peek(taskQueue) && pop(taskQueue);\n                advanceTimers(currentTime);\n              } else pop(taskQueue);\n              currentTask = peek(taskQueue);\n            }\n            if (null !== currentTask) hasMoreWork = !0;\n            else {\n              var firstTimer = peek(timerQueue);\n              null !== firstTimer &&\n                requestHostTimeout(\n                  handleTimeout,\n                  firstTimer.startTime - currentTime\n                );\n              hasMoreWork = !1;\n            }\n          }\n          break a;\n        } finally {\n          (currentTask = null),\n            (currentPriorityLevel = previousPriorityLevel),\n            (isPerformingWork = !1);\n        }\n        hasMoreWork = void 0;\n      }\n    } finally {\n      hasMoreWork\n        ? schedulePerformWorkUntilDeadline()\n        : (isMessageLoopRunning = !1);\n    }\n  }\n}\nvar schedulePerformWorkUntilDeadline;\nif (\"function\" === typeof localSetImmediate)\n  schedulePerformWorkUntilDeadline = function () {\n    localSetImmediate(performWorkUntilDeadline);\n  };\nelse if (\"undefined\" !== typeof MessageChannel) {\n  var channel = new MessageChannel(),\n    port = channel.port2;\n  channel.port1.onmessage = performWorkUntilDeadline;\n  schedulePerformWorkUntilDeadline = function () {\n    port.postMessage(null);\n  };\n} else\n  schedulePerformWorkUntilDeadline = function () {\n    localSetTimeout(performWorkUntilDeadline, 0);\n  };\nfunction requestHostTimeout(callback, ms) {\n  taskTimeoutID = localSetTimeout(function () {\n    callback(exports.unstable_now());\n  }, ms);\n}\nexports.unstable_IdlePriority = 5;\nexports.unstable_ImmediatePriority = 1;\nexports.unstable_LowPriority = 4;\nexports.unstable_NormalPriority = 3;\nexports.unstable_Profiling = null;\nexports.unstable_UserBlockingPriority = 2;\nexports.unstable_cancelCallback = function (task) {\n  task.callback = null;\n};\nexports.unstable_forceFrameRate = function (fps) {\n  0 > fps || 125 < fps\n    ? console.error(\n        \"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"\n      )\n    : (frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5);\n};\nexports.unstable_getCurrentPriorityLevel = function () {\n  return currentPriorityLevel;\n};\nexports.unstable_next = function (eventHandler) {\n  switch (currentPriorityLevel) {\n    case 1:\n    case 2:\n    case 3:\n      var priorityLevel = 3;\n      break;\n    default:\n      priorityLevel = currentPriorityLevel;\n  }\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n};\nexports.unstable_requestPaint = function () {\n  needsPaint = !0;\n};\nexports.unstable_runWithPriority = function (priorityLevel, eventHandler) {\n  switch (priorityLevel) {\n    case 1:\n    case 2:\n    case 3:\n    case 4:\n    case 5:\n      break;\n    default:\n      priorityLevel = 3;\n  }\n  var previousPriorityLevel = currentPriorityLevel;\n  currentPriorityLevel = priorityLevel;\n  try {\n    return eventHandler();\n  } finally {\n    currentPriorityLevel = previousPriorityLevel;\n  }\n};\nexports.unstable_scheduleCallback = function (\n  priorityLevel,\n  callback,\n  options\n) {\n  var currentTime = exports.unstable_now();\n  \"object\" === typeof options && null !== options\n    ? ((options = options.delay),\n      (options =\n        \"number\" === typeof options && 0 < options\n          ? currentTime + options\n          : currentTime))\n    : (options = currentTime);\n  switch (priorityLevel) {\n    case 1:\n      var timeout = -1;\n      break;\n    case 2:\n      timeout = 250;\n      break;\n    case 5:\n      timeout = 1073741823;\n      break;\n    case 4:\n      timeout = 1e4;\n      break;\n    default:\n      timeout = 5e3;\n  }\n  timeout = options + timeout;\n  priorityLevel = {\n    id: taskIdCounter++,\n    callback: callback,\n    priorityLevel: priorityLevel,\n    startTime: options,\n    expirationTime: timeout,\n    sortIndex: -1\n  };\n  options > currentTime\n    ? ((priorityLevel.sortIndex = options),\n      push(timerQueue, priorityLevel),\n      null === peek(taskQueue) &&\n        priorityLevel === peek(timerQueue) &&\n        (isHostTimeoutScheduled\n          ? (localClearTimeout(taskTimeoutID), (taskTimeoutID = -1))\n          : (isHostTimeoutScheduled = !0),\n        requestHostTimeout(handleTimeout, options - currentTime)))\n    : ((priorityLevel.sortIndex = timeout),\n      push(taskQueue, priorityLevel),\n      isHostCallbackScheduled ||\n        isPerformingWork ||\n        ((isHostCallbackScheduled = !0),\n        isMessageLoopRunning ||\n          ((isMessageLoopRunning = !0), schedulePerformWorkUntilDeadline())));\n  return priorityLevel;\n};\nexports.unstable_shouldYield = shouldYieldToHost;\nexports.unstable_wrapCallback = function (callback) {\n  var parentPriorityLevel = currentPriorityLevel;\n  return function () {\n    var previousPriorityLevel = currentPriorityLevel;\n    currentPriorityLevel = parentPriorityLevel;\n    try {\n      return callback.apply(this, arguments);\n    } finally {\n      currentPriorityLevel = previousPriorityLevel;\n    }\n  };\n};\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n  REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n  var key = null;\n  void 0 !== maybeKey && (key = \"\" + maybeKey);\n  void 0 !== config.key && (key = \"\" + config.key);\n  if (\"key\" in config) {\n    maybeKey = {};\n    for (var propName in config)\n      \"key\" !== propName && (maybeKey[propName] = config[propName]);\n  } else maybeKey = config;\n  config = maybeKey.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== config ? config : null,\n    props: maybeKey\n  };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (process.env.NODE_ENV === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom-client.production.js');\n} else {\n  module.exports = require('./cjs/react-dom-client.development.js');\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-is.production.min.js');\n} else {\n  module.exports = require('./cjs/react-is.development.js');\n}\n","/**\n * @license React\n * react-dom.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar React = require(\"react\");\nfunction formatProdErrorMessage(code) {\n  var url = \"https://react.dev/errors/\" + code;\n  if (1 < arguments.length) {\n    url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n    for (var i = 2; i < arguments.length; i++)\n      url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n  }\n  return (\n    \"Minified React error #\" +\n    code +\n    \"; visit \" +\n    url +\n    \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n  );\n}\nfunction noop() {}\nvar Internals = {\n    d: {\n      f: noop,\n      r: function () {\n        throw Error(formatProdErrorMessage(522));\n      },\n      D: noop,\n      C: noop,\n      L: noop,\n      m: noop,\n      X: noop,\n      S: noop,\n      M: noop\n    },\n    p: 0,\n    findDOMNode: null\n  },\n  REACT_PORTAL_TYPE = Symbol.for(\"react.portal\");\nfunction createPortal$1(children, containerInfo, implementation) {\n  var key =\n    3 < arguments.length && void 0 !== arguments[3] ? arguments[3] : null;\n  return {\n    $$typeof: REACT_PORTAL_TYPE,\n    key: null == key ? null : \"\" + key,\n    children: children,\n    containerInfo: containerInfo,\n    implementation: implementation\n  };\n}\nvar ReactSharedInternals =\n  React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;\nfunction getCrossOriginStringAs(as, input) {\n  if (\"font\" === as) return \"\";\n  if (\"string\" === typeof input)\n    return \"use-credentials\" === input ? input : \"\";\n}\nexports.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE =\n  Internals;\nexports.createPortal = function (children, container) {\n  var key =\n    2 < arguments.length && void 0 !== arguments[2] ? arguments[2] : null;\n  if (\n    !container ||\n    (1 !== container.nodeType &&\n      9 !== container.nodeType &&\n      11 !== container.nodeType)\n  )\n    throw Error(formatProdErrorMessage(299));\n  return createPortal$1(children, container, null, key);\n};\nexports.flushSync = function (fn) {\n  var previousTransition = ReactSharedInternals.T,\n    previousUpdatePriority = Internals.p;\n  try {\n    if (((ReactSharedInternals.T = null), (Internals.p = 2), fn)) return fn();\n  } finally {\n    (ReactSharedInternals.T = previousTransition),\n      (Internals.p = previousUpdatePriority),\n      Internals.d.f();\n  }\n};\nexports.preconnect = function (href, options) {\n  \"string\" === typeof href &&\n    (options\n      ? ((options = options.crossOrigin),\n        (options =\n          \"string\" === typeof options\n            ? \"use-credentials\" === options\n              ? options\n              : \"\"\n            : void 0))\n      : (options = null),\n    Internals.d.C(href, options));\n};\nexports.prefetchDNS = function (href) {\n  \"string\" === typeof href && Internals.d.D(href);\n};\nexports.preinit = function (href, options) {\n  if (\"string\" === typeof href && options && \"string\" === typeof options.as) {\n    var as = options.as,\n      crossOrigin = getCrossOriginStringAs(as, options.crossOrigin),\n      integrity =\n        \"string\" === typeof options.integrity ? options.integrity : void 0,\n      fetchPriority =\n        \"string\" === typeof options.fetchPriority\n          ? options.fetchPriority\n          : void 0;\n    \"style\" === as\n      ? Internals.d.S(\n          href,\n          \"string\" === typeof options.precedence ? options.precedence : void 0,\n          {\n            crossOrigin: crossOrigin,\n            integrity: integrity,\n            fetchPriority: fetchPriority\n          }\n        )\n      : \"script\" === as &&\n        Internals.d.X(href, {\n          crossOrigin: crossOrigin,\n          integrity: integrity,\n          fetchPriority: fetchPriority,\n          nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n        });\n  }\n};\nexports.preinitModule = function (href, options) {\n  if (\"string\" === typeof href)\n    if (\"object\" === typeof options && null !== options) {\n      if (null == options.as || \"script\" === options.as) {\n        var crossOrigin = getCrossOriginStringAs(\n          options.as,\n          options.crossOrigin\n        );\n        Internals.d.M(href, {\n          crossOrigin: crossOrigin,\n          integrity:\n            \"string\" === typeof options.integrity ? options.integrity : void 0,\n          nonce: \"string\" === typeof options.nonce ? options.nonce : void 0\n        });\n      }\n    } else null == options && Internals.d.M(href);\n};\nexports.preload = function (href, options) {\n  if (\n    \"string\" === typeof href &&\n    \"object\" === typeof options &&\n    null !== options &&\n    \"string\" === typeof options.as\n  ) {\n    var as = options.as,\n      crossOrigin = getCrossOriginStringAs(as, options.crossOrigin);\n    Internals.d.L(href, as, {\n      crossOrigin: crossOrigin,\n      integrity:\n        \"string\" === typeof options.integrity ? options.integrity : void 0,\n      nonce: \"string\" === typeof options.nonce ? options.nonce : void 0,\n      type: \"string\" === typeof options.type ? options.type : void 0,\n      fetchPriority:\n        \"string\" === typeof options.fetchPriority\n          ? options.fetchPriority\n          : void 0,\n      referrerPolicy:\n        \"string\" === typeof options.referrerPolicy\n          ? options.referrerPolicy\n          : void 0,\n      imageSrcSet:\n        \"string\" === typeof options.imageSrcSet ? options.imageSrcSet : void 0,\n      imageSizes:\n        \"string\" === typeof options.imageSizes ? options.imageSizes : void 0,\n      media: \"string\" === typeof options.media ? options.media : void 0\n    });\n  }\n};\nexports.preloadModule = function (href, options) {\n  if (\"string\" === typeof href)\n    if (options) {\n      var crossOrigin = getCrossOriginStringAs(options.as, options.crossOrigin);\n      Internals.d.m(href, {\n        as:\n          \"string\" === typeof options.as && \"script\" !== options.as\n            ? options.as\n            : void 0,\n        crossOrigin: crossOrigin,\n        integrity:\n          \"string\" === typeof options.integrity ? options.integrity : void 0\n      });\n    } else Internals.d.m(href);\n};\nexports.requestFormReset = function (form) {\n  Internals.d.r(form);\n};\nexports.unstable_batchedUpdates = function (fn, a) {\n  return fn(a);\n};\nexports.useFormState = function (action, initialState, permalink) {\n  return ReactSharedInternals.H.useFormState(action, initialState, permalink);\n};\nexports.useFormStatus = function () {\n  return ReactSharedInternals.H.useHostTransitionStatus();\n};\nexports.version = \"19.1.0\";\n","/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n","'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (process.env.NODE_ENV === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"116b9008\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"frontend:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkfrontend\"] = self[\"webpackChunkfrontend\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nexport enum Action {\n  /**\n   * A POP indicates a change to an arbitrary index in the history stack, such\n   * as a back or forward navigation. It does not describe the direction of the\n   * navigation, only that the current index changed.\n   *\n   * Note: This is the default action for newly created history objects.\n   */\n  Pop = \"POP\",\n\n  /**\n   * A PUSH indicates a new entry being added to the history stack, such as when\n   * a link is clicked and a new page loads. When this happens, all subsequent\n   * entries in the stack are lost.\n   */\n  Push = \"PUSH\",\n\n  /**\n   * A REPLACE indicates the entry at the current index in the history stack\n   * being replaced by a new one.\n   */\n  Replace = \"REPLACE\",\n}\n\n/**\n * The pathname, search, and hash values of a URL.\n */\nexport interface Path {\n  /**\n   * A URL pathname, beginning with a /.\n   */\n  pathname: string;\n\n  /**\n   * A URL search string, beginning with a ?.\n   */\n  search: string;\n\n  /**\n   * A URL fragment identifier, beginning with a #.\n   */\n  hash: string;\n}\n\n// TODO: (v7) Change the Location generic default from `any` to `unknown` and\n// remove Remix `useLocation` wrapper.\n\n/**\n * An entry in a history stack. A location contains information about the\n * URL path, as well as possibly some arbitrary state and a key.\n */\nexport interface Location<State = any> extends Path {\n  /**\n   * A value of arbitrary data associated with this location.\n   */\n  state: State;\n\n  /**\n   * A unique string associated with this location. May be used to safely store\n   * and retrieve data in some other storage API, like `localStorage`.\n   *\n   * Note: This value is always \"default\" on the initial location.\n   */\n  key: string;\n}\n\n/**\n * A change to the current location.\n */\nexport interface Update {\n  /**\n   * The action that triggered the change.\n   */\n  action: Action;\n\n  /**\n   * The new location.\n   */\n  location: Location;\n\n  /**\n   * The delta between this location and the former location in the history stack\n   */\n  delta: number | null;\n}\n\n/**\n * A function that receives notifications about location changes.\n */\nexport interface Listener {\n  (update: Update): void;\n}\n\n/**\n * Describes a location that is the destination of some navigation, either via\n * `history.push` or `history.replace`. This may be either a URL or the pieces\n * of a URL path.\n */\nexport type To = string | Partial<Path>;\n\n/**\n * A history is an interface to the navigation stack. The history serves as the\n * source of truth for the current location, as well as provides a set of\n * methods that may be used to change it.\n *\n * It is similar to the DOM's `window.history` object, but with a smaller, more\n * focused API.\n */\nexport interface History {\n  /**\n   * The last action that modified the current location. This will always be\n   * Action.Pop when a history instance is first created. This value is mutable.\n   */\n  readonly action: Action;\n\n  /**\n   * The current location. This value is mutable.\n   */\n  readonly location: Location;\n\n  /**\n   * Returns a valid href for the given `to` value that may be used as\n   * the value of an <a href> attribute.\n   *\n   * @param to - The destination URL\n   */\n  createHref(to: To): string;\n\n  /**\n   * Returns a URL for the given `to` value\n   *\n   * @param to - The destination URL\n   */\n  createURL(to: To): URL;\n\n  /**\n   * Encode a location the same way window.history would do (no-op for memory\n   * history) so we ensure our PUSH/REPLACE navigations for data routers\n   * behave the same as POP\n   *\n   * @param to Unencoded path\n   */\n  encodeLocation(to: To): Path;\n\n  /**\n   * Pushes a new location onto the history stack, increasing its length by one.\n   * If there were any entries in the stack after the current one, they are\n   * lost.\n   *\n   * @param to - The new URL\n   * @param state - Data to associate with the new location\n   */\n  push(to: To, state?: any): void;\n\n  /**\n   * Replaces the current location in the history stack with a new one.  The\n   * location that was replaced will no longer be available.\n   *\n   * @param to - The new URL\n   * @param state - Data to associate with the new location\n   */\n  replace(to: To, state?: any): void;\n\n  /**\n   * Navigates `n` entries backward/forward in the history stack relative to the\n   * current index. For example, a \"back\" navigation would use go(-1).\n   *\n   * @param delta - The delta in the stack index\n   */\n  go(delta: number): void;\n\n  /**\n   * Sets up a listener that will be called whenever the current location\n   * changes.\n   *\n   * @param listener - A function that will be called when the location changes\n   * @returns unlisten - A function that may be used to stop listening\n   */\n  listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n  usr: any;\n  key?: string;\n  idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial<Location>;\n\nexport type MemoryHistoryOptions = {\n  initialEntries?: InitialEntry[];\n  initialIndex?: number;\n  v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n  /**\n   * The current index in the history stack.\n   */\n  readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n  options: MemoryHistoryOptions = {}\n): MemoryHistory {\n  let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n  let entries: Location[]; // Declare so we can access from createMemoryLocation\n  entries = initialEntries.map((entry, index) =>\n    createMemoryLocation(\n      entry,\n      typeof entry === \"string\" ? null : entry.state,\n      index === 0 ? \"default\" : undefined\n    )\n  );\n  let index = clampIndex(\n    initialIndex == null ? entries.length - 1 : initialIndex\n  );\n  let action = Action.Pop;\n  let listener: Listener | null = null;\n\n  function clampIndex(n: number): number {\n    return Math.min(Math.max(n, 0), entries.length - 1);\n  }\n  function getCurrentLocation(): Location {\n    return entries[index];\n  }\n  function createMemoryLocation(\n    to: To,\n    state: any = null,\n    key?: string\n  ): Location {\n    let location = createLocation(\n      entries ? getCurrentLocation().pathname : \"/\",\n      to,\n      state,\n      key\n    );\n    warning(\n      location.pathname.charAt(0) === \"/\",\n      `relative pathnames are not supported in memory history: ${JSON.stringify(\n        to\n      )}`\n    );\n    return location;\n  }\n\n  function createHref(to: To) {\n    return typeof to === \"string\" ? to : createPath(to);\n  }\n\n  let history: MemoryHistory = {\n    get index() {\n      return index;\n    },\n    get action() {\n      return action;\n    },\n    get location() {\n      return getCurrentLocation();\n    },\n    createHref,\n    createURL(to) {\n      return new URL(createHref(to), \"http://localhost\");\n    },\n    encodeLocation(to: To) {\n      let path = typeof to === \"string\" ? parsePath(to) : to;\n      return {\n        pathname: path.pathname || \"\",\n        search: path.search || \"\",\n        hash: path.hash || \"\",\n      };\n    },\n    push(to, state) {\n      action = Action.Push;\n      let nextLocation = createMemoryLocation(to, state);\n      index += 1;\n      entries.splice(index, entries.length, nextLocation);\n      if (v5Compat && listener) {\n        listener({ action, location: nextLocation, delta: 1 });\n      }\n    },\n    replace(to, state) {\n      action = Action.Replace;\n      let nextLocation = createMemoryLocation(to, state);\n      entries[index] = nextLocation;\n      if (v5Compat && listener) {\n        listener({ action, location: nextLocation, delta: 0 });\n      }\n    },\n    go(delta) {\n      action = Action.Pop;\n      let nextIndex = clampIndex(index + delta);\n      let nextLocation = entries[nextIndex];\n      index = nextIndex;\n      if (listener) {\n        listener({ action, location: nextLocation, delta });\n      }\n    },\n    listen(fn: Listener) {\n      listener = fn;\n      return () => {\n        listener = null;\n      };\n    },\n  };\n\n  return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n  options: BrowserHistoryOptions = {}\n): BrowserHistory {\n  function createBrowserLocation(\n    window: Window,\n    globalHistory: Window[\"history\"]\n  ) {\n    let { pathname, search, hash } = window.location;\n    return createLocation(\n      \"\",\n      { pathname, search, hash },\n      // state defaults to `null` because `window.history.state` does\n      (globalHistory.state && globalHistory.state.usr) || null,\n      (globalHistory.state && globalHistory.state.key) || \"default\"\n    );\n  }\n\n  function createBrowserHref(window: Window, to: To) {\n    return typeof to === \"string\" ? to : createPath(to);\n  }\n\n  return getUrlBasedHistory(\n    createBrowserLocation,\n    createBrowserHref,\n    null,\n    options\n  );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n  options: HashHistoryOptions = {}\n): HashHistory {\n  function createHashLocation(\n    window: Window,\n    globalHistory: Window[\"history\"]\n  ) {\n    let {\n      pathname = \"/\",\n      search = \"\",\n      hash = \"\",\n    } = parsePath(window.location.hash.substr(1));\n\n    // Hash URL should always have a leading / just like window.location.pathname\n    // does, so if an app ends up at a route like /#something then we add a\n    // leading slash so all of our path-matching behaves the same as if it would\n    // in a browser router.  This is particularly important when there exists a\n    // root splat route (<Route path=\"*\">) since that matches internally against\n    // \"/*\" and we'd expect /#something to 404 in a hash router app.\n    if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n      pathname = \"/\" + pathname;\n    }\n\n    return createLocation(\n      \"\",\n      { pathname, search, hash },\n      // state defaults to `null` because `window.history.state` does\n      (globalHistory.state && globalHistory.state.usr) || null,\n      (globalHistory.state && globalHistory.state.key) || \"default\"\n    );\n  }\n\n  function createHashHref(window: Window, to: To) {\n    let base = window.document.querySelector(\"base\");\n    let href = \"\";\n\n    if (base && base.getAttribute(\"href\")) {\n      let url = window.location.href;\n      let hashIndex = url.indexOf(\"#\");\n      href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n    }\n\n    return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n  }\n\n  function validateHashLocation(location: Location, to: To) {\n    warning(\n      location.pathname.charAt(0) === \"/\",\n      `relative pathnames are not supported in hash history.push(${JSON.stringify(\n        to\n      )})`\n    );\n  }\n\n  return getUrlBasedHistory(\n    createHashLocation,\n    createHashHref,\n    validateHashLocation,\n    options\n  );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant<T>(\n  value: T | null | undefined,\n  message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n  if (value === false || value === null || typeof value === \"undefined\") {\n    throw new Error(message);\n  }\n}\n\nexport function warning(cond: any, message: string) {\n  if (!cond) {\n    // eslint-disable-next-line no-console\n    if (typeof console !== \"undefined\") console.warn(message);\n\n    try {\n      // Welcome to debugging history!\n      //\n      // This error is thrown as a convenience, so you can more easily\n      // find the source for a warning that appears in the console by\n      // enabling \"pause on exceptions\" in your JavaScript debugger.\n      throw new Error(message);\n      // eslint-disable-next-line no-empty\n    } catch (e) {}\n  }\n}\n\nfunction createKey() {\n  return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n  return {\n    usr: location.state,\n    key: location.key,\n    idx: index,\n  };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n  current: string | Location,\n  to: To,\n  state: any = null,\n  key?: string\n): Readonly<Location> {\n  let location: Readonly<Location> = {\n    pathname: typeof current === \"string\" ? current : current.pathname,\n    search: \"\",\n    hash: \"\",\n    ...(typeof to === \"string\" ? parsePath(to) : to),\n    state,\n    // TODO: This could be cleaned up.  push/replace should probably just take\n    // full Locations now and avoid the need to run through this flow at all\n    // But that's a pretty big refactor to the current test suite so going to\n    // keep as is for the time being and just let any incoming keys take precedence\n    key: (to && (to as Location).key) || key || createKey(),\n  };\n  return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n  pathname = \"/\",\n  search = \"\",\n  hash = \"\",\n}: Partial<Path>) {\n  if (search && search !== \"?\")\n    pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n  if (hash && hash !== \"#\")\n    pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n  return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial<Path> {\n  let parsedPath: Partial<Path> = {};\n\n  if (path) {\n    let hashIndex = path.indexOf(\"#\");\n    if (hashIndex >= 0) {\n      parsedPath.hash = path.substr(hashIndex);\n      path = path.substr(0, hashIndex);\n    }\n\n    let searchIndex = path.indexOf(\"?\");\n    if (searchIndex >= 0) {\n      parsedPath.search = path.substr(searchIndex);\n      path = path.substr(0, searchIndex);\n    }\n\n    if (path) {\n      parsedPath.pathname = path;\n    }\n  }\n\n  return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n  window?: Window;\n  v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n  getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n  createHref: (window: Window, to: To) => string,\n  validateLocation: ((location: Location, to: To) => void) | null,\n  options: UrlHistoryOptions = {}\n): UrlHistory {\n  let { window = document.defaultView!, v5Compat = false } = options;\n  let globalHistory = window.history;\n  let action = Action.Pop;\n  let listener: Listener | null = null;\n\n  let index = getIndex()!;\n  // Index should only be null when we initialize. If not, it's because the\n  // user called history.pushState or history.replaceState directly, in which\n  // case we should log a warning as it will result in bugs.\n  if (index == null) {\n    index = 0;\n    globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n  }\n\n  function getIndex(): number {\n    let state = globalHistory.state || { idx: null };\n    return state.idx;\n  }\n\n  function handlePop() {\n    action = Action.Pop;\n    let nextIndex = getIndex();\n    let delta = nextIndex == null ? null : nextIndex - index;\n    index = nextIndex;\n    if (listener) {\n      listener({ action, location: history.location, delta });\n    }\n  }\n\n  function push(to: To, state?: any) {\n    action = Action.Push;\n    let location = createLocation(history.location, to, state);\n    if (validateLocation) validateLocation(location, to);\n\n    index = getIndex() + 1;\n    let historyState = getHistoryState(location, index);\n    let url = history.createHref(location);\n\n    // try...catch because iOS limits us to 100 pushState calls :/\n    try {\n      globalHistory.pushState(historyState, \"\", url);\n    } catch (error) {\n      // If the exception is because `state` can't be serialized, let that throw\n      // outwards just like a replace call would so the dev knows the cause\n      // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n      // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n      if (error instanceof DOMException && error.name === \"DataCloneError\") {\n        throw error;\n      }\n      // They are going to lose state here, but there is no real\n      // way to warn them about it since the page will refresh...\n      window.location.assign(url);\n    }\n\n    if (v5Compat && listener) {\n      listener({ action, location: history.location, delta: 1 });\n    }\n  }\n\n  function replace(to: To, state?: any) {\n    action = Action.Replace;\n    let location = createLocation(history.location, to, state);\n    if (validateLocation) validateLocation(location, to);\n\n    index = getIndex();\n    let historyState = getHistoryState(location, index);\n    let url = history.createHref(location);\n    globalHistory.replaceState(historyState, \"\", url);\n\n    if (v5Compat && listener) {\n      listener({ action, location: history.location, delta: 0 });\n    }\n  }\n\n  function createURL(to: To): URL {\n    // window.location.origin is \"null\" (the literal string value) in Firefox\n    // under certain conditions, notably when serving from a local HTML file\n    // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n    let base =\n      window.location.origin !== \"null\"\n        ? window.location.origin\n        : window.location.href;\n\n    let href = typeof to === \"string\" ? to : createPath(to);\n    // Treating this as a full URL will strip any trailing spaces so we need to\n    // pre-encode them since they might be part of a matching splat param from\n    // an ancestor route\n    href = href.replace(/ $/, \"%20\");\n    invariant(\n      base,\n      `No window.location.(origin|href) available to create URL for href: ${href}`\n    );\n    return new URL(href, base);\n  }\n\n  let history: History = {\n    get action() {\n      return action;\n    },\n    get location() {\n      return getLocation(window, globalHistory);\n    },\n    listen(fn: Listener) {\n      if (listener) {\n        throw new Error(\"A history only accepts one active listener\");\n      }\n      window.addEventListener(PopStateEventType, handlePop);\n      listener = fn;\n\n      return () => {\n        window.removeEventListener(PopStateEventType, handlePop);\n        listener = null;\n      };\n    },\n    createHref(to) {\n      return createHref(window, to);\n    },\n    createURL,\n    encodeLocation(to) {\n      // Encode a Location the same way window.location would\n      let url = createURL(to);\n      return {\n        pathname: url.pathname,\n        search: url.search,\n        hash: url.hash,\n      };\n    },\n    push,\n    replace,\n    go(n) {\n      return globalHistory.go(n);\n    },\n  };\n\n  return history;\n}\n\n//#endregion\n","import type { Location, Path, To } from \"./history\";\nimport { invariant, parsePath, warning } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n  [routeId: string]: any;\n}\n\nexport enum ResultType {\n  data = \"data\",\n  deferred = \"deferred\",\n  redirect = \"redirect\",\n  error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n  type: ResultType.data;\n  data: unknown;\n  statusCode?: number;\n  headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n  type: ResultType.deferred;\n  deferredData: DeferredData;\n  statusCode?: number;\n  headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n  type: ResultType.redirect;\n  // We keep the raw Response for redirects so we can return it verbatim\n  response: Response;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n  type: ResultType.error;\n  error: unknown;\n  statusCode?: number;\n  headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n  | SuccessResult\n  | DeferredResult\n  | RedirectResult\n  | ErrorResult;\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase<LowerCaseFormMethod>;\n\n/**\n * Users can specify either lowercase or uppercase form methods on `<Form>`,\n * useSubmit(), `<fetcher.Form>`, etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude<FormMethod, \"get\">;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState.  This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude<V7_FormMethod, \"GET\">;\n\nexport type FormEncType =\n  | \"application/x-www-form-urlencoded\"\n  | \"multipart/form-data\"\n  | \"application/json\"\n  | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n  [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n  | {\n      formMethod: FormMethod | V7_FormMethod;\n      formAction: string;\n      formEncType: FormEncType;\n      formData: FormData;\n      json: undefined;\n      text: undefined;\n    }\n  | {\n      formMethod: FormMethod | V7_FormMethod;\n      formAction: string;\n      formEncType: FormEncType;\n      formData: undefined;\n      json: JsonValue;\n      text: undefined;\n    }\n  | {\n      formMethod: FormMethod | V7_FormMethod;\n      formAction: string;\n      formEncType: FormEncType;\n      formData: undefined;\n      json: undefined;\n      text: string;\n    };\n\n/**\n * @private\n * Arguments passed to route loader/action functions.  Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs<Context> {\n  request: Request;\n  params: Params;\n  context?: Context;\n}\n\n// TODO: (v7) Change the defaults from any to unknown in and remove Remix wrappers:\n//   ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs\n//   Also, make them a type alias instead of an interface\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs<Context = any>\n  extends DataFunctionArgs<Context> {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs<Context = any>\n  extends DataFunctionArgs<Context> {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return).  Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable<unknown> | null;\n\ntype DataFunctionReturnValue = Promise<DataFunctionValue> | DataFunctionValue;\n\n/**\n * Route loader function signature\n */\nexport type LoaderFunction<Context = any> = {\n  (\n    args: LoaderFunctionArgs<Context>,\n    handlerCtx?: unknown\n  ): DataFunctionReturnValue;\n} & { hydrate?: boolean };\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction<Context = any> {\n  (\n    args: ActionFunctionArgs<Context>,\n    handlerCtx?: unknown\n  ): DataFunctionReturnValue;\n}\n\n/**\n * Arguments passed to shouldRevalidate function\n */\nexport interface ShouldRevalidateFunctionArgs {\n  currentUrl: URL;\n  currentParams: AgnosticDataRouteMatch[\"params\"];\n  nextUrl: URL;\n  nextParams: AgnosticDataRouteMatch[\"params\"];\n  formMethod?: Submission[\"formMethod\"];\n  formAction?: Submission[\"formAction\"];\n  formEncType?: Submission[\"formEncType\"];\n  text?: Submission[\"text\"];\n  formData?: Submission[\"formData\"];\n  json?: Submission[\"json\"];\n  actionStatus?: number;\n  actionResult?: any;\n  defaultShouldRevalidate: boolean;\n}\n\n/**\n * Route shouldRevalidate function signature.  This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments.  It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n  (args: ShouldRevalidateFunctionArgs): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n  (route: AgnosticRouteObject): boolean;\n}\n\nexport interface DataStrategyMatch\n  extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {\n  shouldLoad: boolean;\n  resolve: (\n    handlerOverride?: (\n      handler: (ctx?: unknown) => DataFunctionReturnValue\n    ) => DataFunctionReturnValue\n  ) => Promise<DataStrategyResult>;\n}\n\nexport interface DataStrategyFunctionArgs<Context = any>\n  extends DataFunctionArgs<Context> {\n  matches: DataStrategyMatch[];\n  fetcherKey: string | null;\n}\n\n/**\n * Result from a loader or action called via dataStrategy\n */\nexport interface DataStrategyResult {\n  type: \"data\" | \"error\";\n  result: unknown; // data, Error, Response, DeferredData, DataWithResponseInit\n}\n\nexport interface DataStrategyFunction {\n  (args: DataStrategyFunctionArgs): Promise<Record<string, DataStrategyResult>>;\n}\n\nexport type AgnosticPatchRoutesOnNavigationFunctionArgs<\n  O extends AgnosticRouteObject = AgnosticRouteObject,\n  M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = {\n  signal: AbortSignal;\n  path: string;\n  matches: M[];\n  fetcherKey: string | undefined;\n  patch: (routeId: string | null, children: O[]) => void;\n};\n\nexport type AgnosticPatchRoutesOnNavigationFunction<\n  O extends AgnosticRouteObject = AgnosticRouteObject,\n  M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = (\n  opts: AgnosticPatchRoutesOnNavigationFunctionArgs<O, M>\n) => void | Promise<void>;\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n  (route: AgnosticRouteObject): {\n    hasErrorBoundary: boolean;\n  } & Record<string, any>;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n  | \"lazy\"\n  | \"caseSensitive\"\n  | \"path\"\n  | \"id\"\n  | \"index\"\n  | \"children\";\n\nexport const immutableRouteKeys = new Set<ImmutableRouteKey>([\n  \"lazy\",\n  \"caseSensitive\",\n  \"path\",\n  \"id\",\n  \"index\",\n  \"children\",\n]);\n\ntype RequireOne<T, Key = keyof T> = Exclude<\n  {\n    [K in keyof T]: K extends Key ? Omit<T, K> & Required<Pick<T, K>> : never;\n  }[keyof T],\n  undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction<R extends AgnosticRouteObject> {\n  (): Promise<RequireOne<Omit<R, ImmutableRouteKey>>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n  caseSensitive?: boolean;\n  path?: string;\n  id?: string;\n  loader?: LoaderFunction | boolean;\n  action?: ActionFunction | boolean;\n  hasErrorBoundary?: boolean;\n  shouldRevalidate?: ShouldRevalidateFunction;\n  handle?: any;\n  lazy?: LazyRouteFunction<AgnosticBaseRouteObject>;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n  children?: undefined;\n  index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n  children?: AgnosticRouteObject[];\n  index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n  | AgnosticIndexRouteObject\n  | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n  id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n  children?: AgnosticDataRouteObject[];\n  id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n  | AgnosticDataIndexRouteObject\n  | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record<string, AgnosticDataRouteObject | undefined>;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam<Path extends string> =\n  // split path into individual path segments\n  Path extends `${infer L}/${infer R}`\n    ? _PathParam<L> | _PathParam<R>\n    : // find params after `:`\n    Path extends `:${infer Param}`\n    ? Param extends `${infer Optional}?`\n      ? Optional\n      : Param\n    : // otherwise, there aren't any params present\n      never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\nexport type PathParam<Path extends string> =\n  // check if path is just a wildcard\n  Path extends \"*\" | \"/*\"\n    ? \"*\"\n    : // look for wildcard at the end of the path\n    Path extends `${infer Rest}/*`\n    ? \"*\" | _PathParam<Rest>\n    : // look for params in the absence of wildcards\n      _PathParam<Path>;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise, return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey<Segment extends string> =\n  // if you could not find path params, fallback to `string`\n  [PathParam<Segment>] extends [never] ? string : PathParam<Segment>;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params<Key extends string = string> = {\n  readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n  ParamKey extends string = string,\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n  /**\n   * The names and values of dynamic parameters in the URL.\n   */\n  params: Params<ParamKey>;\n  /**\n   * The portion of the URL pathname that was matched.\n   */\n  pathname: string;\n  /**\n   * The portion of the URL pathname that was matched before child routes.\n   */\n  pathnameBase: string;\n  /**\n   * The route object that was used to match.\n   */\n  route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n  extends AgnosticRouteMatch<string, AgnosticDataRouteObject> {}\n\nfunction isIndexRoute(\n  route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n  return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n  routes: AgnosticRouteObject[],\n  mapRouteProperties: MapRoutePropertiesFunction,\n  parentPath: string[] = [],\n  manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n  return routes.map((route, index) => {\n    let treePath = [...parentPath, String(index)];\n    let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n    invariant(\n      route.index !== true || !route.children,\n      `Cannot specify children on an index route`\n    );\n    invariant(\n      !manifest[id],\n      `Found a route id collision on id \"${id}\".  Route ` +\n        \"id's must be globally unique within Data Router usages\"\n    );\n\n    if (isIndexRoute(route)) {\n      let indexRoute: AgnosticDataIndexRouteObject = {\n        ...route,\n        ...mapRouteProperties(route),\n        id,\n      };\n      manifest[id] = indexRoute;\n      return indexRoute;\n    } else {\n      let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n        ...route,\n        ...mapRouteProperties(route),\n        id,\n        children: undefined,\n      };\n      manifest[id] = pathOrLayoutRoute;\n\n      if (route.children) {\n        pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n          route.children,\n          mapRouteProperties,\n          treePath,\n          manifest\n        );\n      }\n\n      return pathOrLayoutRoute;\n    }\n  });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/v6/utils/match-routes\n */\nexport function matchRoutes<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n  routes: RouteObjectType[],\n  locationArg: Partial<Location> | string,\n  basename = \"/\"\n): AgnosticRouteMatch<string, RouteObjectType>[] | null {\n  return matchRoutesImpl(routes, locationArg, basename, false);\n}\n\nexport function matchRoutesImpl<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n  routes: RouteObjectType[],\n  locationArg: Partial<Location> | string,\n  basename: string,\n  allowPartial: boolean\n): AgnosticRouteMatch<string, RouteObjectType>[] | null {\n  let location =\n    typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n  let pathname = stripBasename(location.pathname || \"/\", basename);\n\n  if (pathname == null) {\n    return null;\n  }\n\n  let branches = flattenRoutes(routes);\n  rankRouteBranches(branches);\n\n  let matches = null;\n  for (let i = 0; matches == null && i < branches.length; ++i) {\n    // Incoming pathnames are generally encoded from either window.location\n    // or from router.navigate, but we want to match against the unencoded\n    // paths in the route definitions.  Memory router locations won't be\n    // encoded here but there also shouldn't be anything to decode so this\n    // should be a safe operation.  This avoids needing matchRoutes to be\n    // history-aware.\n    let decoded = decodePath(pathname);\n    matches = matchRouteBranch<string, RouteObjectType>(\n      branches[i],\n      decoded,\n      allowPartial\n    );\n  }\n\n  return matches;\n}\n\nexport interface UIMatch<Data = unknown, Handle = unknown> {\n  id: string;\n  pathname: string;\n  params: AgnosticRouteMatch[\"params\"];\n  data: Data;\n  handle: Handle;\n}\n\nexport function convertRouteMatchToUiMatch(\n  match: AgnosticDataRouteMatch,\n  loaderData: RouteData\n): UIMatch {\n  let { route, pathname, params } = match;\n  return {\n    id: route.id,\n    pathname,\n    params,\n    data: loaderData[route.id],\n    handle: route.handle,\n  };\n}\n\ninterface RouteMeta<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n  relativePath: string;\n  caseSensitive: boolean;\n  childrenIndex: number;\n  route: RouteObjectType;\n}\n\ninterface RouteBranch<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n  path: string;\n  score: number;\n  routesMeta: RouteMeta<RouteObjectType>[];\n}\n\nfunction flattenRoutes<\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n  routes: RouteObjectType[],\n  branches: RouteBranch<RouteObjectType>[] = [],\n  parentsMeta: RouteMeta<RouteObjectType>[] = [],\n  parentPath = \"\"\n): RouteBranch<RouteObjectType>[] {\n  let flattenRoute = (\n    route: RouteObjectType,\n    index: number,\n    relativePath?: string\n  ) => {\n    let meta: RouteMeta<RouteObjectType> = {\n      relativePath:\n        relativePath === undefined ? route.path || \"\" : relativePath,\n      caseSensitive: route.caseSensitive === true,\n      childrenIndex: index,\n      route,\n    };\n\n    if (meta.relativePath.startsWith(\"/\")) {\n      invariant(\n        meta.relativePath.startsWith(parentPath),\n        `Absolute route path \"${meta.relativePath}\" nested under path ` +\n          `\"${parentPath}\" is not valid. An absolute child route path ` +\n          `must start with the combined path of all its parent routes.`\n      );\n\n      meta.relativePath = meta.relativePath.slice(parentPath.length);\n    }\n\n    let path = joinPaths([parentPath, meta.relativePath]);\n    let routesMeta = parentsMeta.concat(meta);\n\n    // Add the children before adding this route to the array, so we traverse the\n    // route tree depth-first and child routes appear before their parents in\n    // the \"flattened\" version.\n    if (route.children && route.children.length > 0) {\n      invariant(\n        // Our types know better, but runtime JS may not!\n        // @ts-expect-error\n        route.index !== true,\n        `Index routes must not have child routes. Please remove ` +\n          `all child routes from route path \"${path}\".`\n      );\n      flattenRoutes(route.children, branches, routesMeta, path);\n    }\n\n    // Routes without a path shouldn't ever match by themselves unless they are\n    // index routes, so don't add them to the list of possible branches.\n    if (route.path == null && !route.index) {\n      return;\n    }\n\n    branches.push({\n      path,\n      score: computeScore(path, route.index),\n      routesMeta,\n    });\n  };\n  routes.forEach((route, index) => {\n    // coarse-grain check for optional params\n    if (route.path === \"\" || !route.path?.includes(\"?\")) {\n      flattenRoute(route, index);\n    } else {\n      for (let exploded of explodeOptionalSegments(route.path)) {\n        flattenRoute(route, index, exploded);\n      }\n    }\n  });\n\n  return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n  let segments = path.split(\"/\");\n  if (segments.length === 0) return [];\n\n  let [first, ...rest] = segments;\n\n  // Optional path segments are denoted by a trailing `?`\n  let isOptional = first.endsWith(\"?\");\n  // Compute the corresponding required segment: `foo?` -> `foo`\n  let required = first.replace(/\\?$/, \"\");\n\n  if (rest.length === 0) {\n    // Intepret empty string as omitting an optional segment\n    // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n    return isOptional ? [required, \"\"] : [required];\n  }\n\n  let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n  let result: string[] = [];\n\n  // All child paths with the prefix.  Do this for all children before the\n  // optional version for all children, so we get consistent ordering where the\n  // parent optional aspect is preferred as required.  Otherwise, we can get\n  // child sections interspersed where deeper optional segments are higher than\n  // parent optional segments, where for example, /:two would explode _earlier_\n  // then /:one.  By always including the parent as required _for all children_\n  // first, we avoid this issue\n  result.push(\n    ...restExploded.map((subpath) =>\n      subpath === \"\" ? required : [required, subpath].join(\"/\")\n    )\n  );\n\n  // Then, if this is an optional value, add all child versions without\n  if (isOptional) {\n    result.push(...restExploded);\n  }\n\n  // for absolute paths, ensure `/` instead of empty segment\n  return result.map((exploded) =>\n    path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n  );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n  branches.sort((a, b) =>\n    a.score !== b.score\n      ? b.score - a.score // Higher score first\n      : compareIndexes(\n          a.routesMeta.map((meta) => meta.childrenIndex),\n          b.routesMeta.map((meta) => meta.childrenIndex)\n        )\n  );\n}\n\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n  let segments = path.split(\"/\");\n  let initialScore = segments.length;\n  if (segments.some(isSplat)) {\n    initialScore += splatPenalty;\n  }\n\n  if (index) {\n    initialScore += indexRouteValue;\n  }\n\n  return segments\n    .filter((s) => !isSplat(s))\n    .reduce(\n      (score, segment) =>\n        score +\n        (paramRe.test(segment)\n          ? dynamicSegmentValue\n          : segment === \"\"\n          ? emptySegmentValue\n          : staticSegmentValue),\n      initialScore\n    );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n  let siblings =\n    a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n  return siblings\n    ? // If two routes are siblings, we should try to match the earlier sibling\n      // first. This allows people to have fine-grained control over the matching\n      // behavior by simply putting routes with identical paths in the order they\n      // want them tried.\n      a[a.length - 1] - b[b.length - 1]\n    : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n      // so they sort equally.\n      0;\n}\n\nfunction matchRouteBranch<\n  ParamKey extends string = string,\n  RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n  branch: RouteBranch<RouteObjectType>,\n  pathname: string,\n  allowPartial = false\n): AgnosticRouteMatch<ParamKey, RouteObjectType>[] | null {\n  let { routesMeta } = branch;\n\n  let matchedParams = {};\n  let matchedPathname = \"/\";\n  let matches: AgnosticRouteMatch<ParamKey, RouteObjectType>[] = [];\n  for (let i = 0; i < routesMeta.length; ++i) {\n    let meta = routesMeta[i];\n    let end = i === routesMeta.length - 1;\n    let remainingPathname =\n      matchedPathname === \"/\"\n        ? pathname\n        : pathname.slice(matchedPathname.length) || \"/\";\n    let match = matchPath(\n      { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n      remainingPathname\n    );\n\n    let route = meta.route;\n\n    if (\n      !match &&\n      end &&\n      allowPartial &&\n      !routesMeta[routesMeta.length - 1].route.index\n    ) {\n      match = matchPath(\n        {\n          path: meta.relativePath,\n          caseSensitive: meta.caseSensitive,\n          end: false,\n        },\n        remainingPathname\n      );\n    }\n\n    if (!match) {\n      return null;\n    }\n\n    Object.assign(matchedParams, match.params);\n\n    matches.push({\n      // TODO: Can this as be avoided?\n      params: matchedParams as Params<ParamKey>,\n      pathname: joinPaths([matchedPathname, match.pathname]),\n      pathnameBase: normalizePathname(\n        joinPaths([matchedPathname, match.pathnameBase])\n      ),\n      route,\n    });\n\n    if (match.pathnameBase !== \"/\") {\n      matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n    }\n  }\n\n  return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/v6/utils/generate-path\n */\nexport function generatePath<Path extends string>(\n  originalPath: Path,\n  params: {\n    [key in PathParam<Path>]: string | null;\n  } = {} as any\n): string {\n  let path: string = originalPath;\n  if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n    warning(\n      false,\n      `Route path \"${path}\" will be treated as if it were ` +\n        `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n        `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n        `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n    );\n    path = path.replace(/\\*$/, \"/*\") as Path;\n  }\n\n  // ensure `/` is added at the beginning if the path is absolute\n  const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n  const stringify = (p: any) =>\n    p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n  const segments = path\n    .split(/\\/+/)\n    .map((segment, index, array) => {\n      const isLastSegment = index === array.length - 1;\n\n      // only apply the splat if it's the last segment\n      if (isLastSegment && segment === \"*\") {\n        const star = \"*\" as PathParam<Path>;\n        // Apply the splat\n        return stringify(params[star]);\n      }\n\n      const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n      if (keyMatch) {\n        const [, key, optional] = keyMatch;\n        let param = params[key as PathParam<Path>];\n        invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n        return stringify(param);\n      }\n\n      // Remove any optional markers from optional static segments\n      return segment.replace(/\\?$/g, \"\");\n    })\n    // Remove empty segments\n    .filter((segment) => !!segment);\n\n  return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern<Path extends string = string> {\n  /**\n   * A string to match against a URL pathname. May contain `:id`-style segments\n   * to indicate placeholders for dynamic parameters. May also end with `/*` to\n   * indicate matching the rest of the URL pathname.\n   */\n  path: Path;\n  /**\n   * Should be `true` if the static portions of the `path` should be matched in\n   * the same case.\n   */\n  caseSensitive?: boolean;\n  /**\n   * Should be `true` if this pattern should match the entire URL pathname.\n   */\n  end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch<ParamKey extends string = string> {\n  /**\n   * The names and values of dynamic parameters in the URL.\n   */\n  params: Params<ParamKey>;\n  /**\n   * The portion of the URL pathname that was matched.\n   */\n  pathname: string;\n  /**\n   * The portion of the URL pathname that was matched before child routes.\n   */\n  pathnameBase: string;\n  /**\n   * The pattern that was used to match.\n   */\n  pattern: PathPattern;\n}\n\ntype Mutable<T> = {\n  -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/v6/utils/match-path\n */\nexport function matchPath<\n  ParamKey extends ParamParseKey<Path>,\n  Path extends string\n>(\n  pattern: PathPattern<Path> | Path,\n  pathname: string\n): PathMatch<ParamKey> | null {\n  if (typeof pattern === \"string\") {\n    pattern = { path: pattern, caseSensitive: false, end: true };\n  }\n\n  let [matcher, compiledParams] = compilePath(\n    pattern.path,\n    pattern.caseSensitive,\n    pattern.end\n  );\n\n  let match = pathname.match(matcher);\n  if (!match) return null;\n\n  let matchedPathname = match[0];\n  let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n  let captureGroups = match.slice(1);\n  let params: Params = compiledParams.reduce<Mutable<Params>>(\n    (memo, { paramName, isOptional }, index) => {\n      // We need to compute the pathnameBase here using the raw splat value\n      // instead of using params[\"*\"] later because it will be decoded then\n      if (paramName === \"*\") {\n        let splatValue = captureGroups[index] || \"\";\n        pathnameBase = matchedPathname\n          .slice(0, matchedPathname.length - splatValue.length)\n          .replace(/(.)\\/+$/, \"$1\");\n      }\n\n      const value = captureGroups[index];\n      if (isOptional && !value) {\n        memo[paramName] = undefined;\n      } else {\n        memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n      }\n      return memo;\n    },\n    {}\n  );\n\n  return {\n    params,\n    pathname: matchedPathname,\n    pathnameBase,\n    pattern,\n  };\n}\n\ntype CompiledPathParam = { paramName: string; isOptional?: boolean };\n\nfunction compilePath(\n  path: string,\n  caseSensitive = false,\n  end = true\n): [RegExp, CompiledPathParam[]] {\n  warning(\n    path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n    `Route path \"${path}\" will be treated as if it were ` +\n      `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n      `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n      `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n  );\n\n  let params: CompiledPathParam[] = [];\n  let regexpSource =\n    \"^\" +\n    path\n      .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n      .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n      .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n      .replace(\n        /\\/:([\\w-]+)(\\?)?/g,\n        (_: string, paramName: string, isOptional) => {\n          params.push({ paramName, isOptional: isOptional != null });\n          return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n        }\n      );\n\n  if (path.endsWith(\"*\")) {\n    params.push({ paramName: \"*\" });\n    regexpSource +=\n      path === \"*\" || path === \"/*\"\n        ? \"(.*)$\" // Already matched the initial /, just match the rest\n        : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n  } else if (end) {\n    // When matching to the end, ignore trailing slashes\n    regexpSource += \"\\\\/*$\";\n  } else if (path !== \"\" && path !== \"/\") {\n    // If our path is non-empty and contains anything beyond an initial slash,\n    // then we have _some_ form of path in our regex, so we should expect to\n    // match only if we find the end of this path segment.  Look for an optional\n    // non-captured trailing slash (to match a portion of the URL) or the end\n    // of the path (if we've matched to the end).  We used to do this with a\n    // word boundary but that gives false positives on routes like\n    // /user-preferences since `-` counts as a word boundary.\n    regexpSource += \"(?:(?=\\\\/|$))\";\n  } else {\n    // Nothing to match for \"\" or \"/\"\n  }\n\n  let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n  return [matcher, params];\n}\n\nexport function decodePath(value: string) {\n  try {\n    return value\n      .split(\"/\")\n      .map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\"))\n      .join(\"/\");\n  } catch (error) {\n    warning(\n      false,\n      `The URL path \"${value}\" could not be decoded because it is is a ` +\n        `malformed URL segment. This is probably due to a bad percent ` +\n        `encoding (${error}).`\n    );\n\n    return value;\n  }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n  pathname: string,\n  basename: string\n): string | null {\n  if (basename === \"/\") return pathname;\n\n  if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n    return null;\n  }\n\n  // We want to leave trailing slash behavior in the user's control, so if they\n  // specify a basename with a trailing slash, we should support it\n  let startIndex = basename.endsWith(\"/\")\n    ? basename.length - 1\n    : basename.length;\n  let nextChar = pathname.charAt(startIndex);\n  if (nextChar && nextChar !== \"/\") {\n    // pathname does not start with basename/\n    return null;\n  }\n\n  return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/v6/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n  let {\n    pathname: toPathname,\n    search = \"\",\n    hash = \"\",\n  } = typeof to === \"string\" ? parsePath(to) : to;\n\n  let pathname = toPathname\n    ? toPathname.startsWith(\"/\")\n      ? toPathname\n      : resolvePathname(toPathname, fromPathname)\n    : fromPathname;\n\n  return {\n    pathname,\n    search: normalizeSearch(search),\n    hash: normalizeHash(hash),\n  };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n  let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n  let relativeSegments = relativePath.split(\"/\");\n\n  relativeSegments.forEach((segment) => {\n    if (segment === \"..\") {\n      // Keep the root \"\" segment so the pathname starts at /\n      if (segments.length > 1) segments.pop();\n    } else if (segment !== \".\") {\n      segments.push(segment);\n    }\n  });\n\n  return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n  char: string,\n  field: string,\n  dest: string,\n  path: Partial<Path>\n) {\n  return (\n    `Cannot include a '${char}' character in a manually specified ` +\n    `\\`to.${field}\\` field [${JSON.stringify(\n      path\n    )}].  Please separate it out to the ` +\n    `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n    `a string in <Link to=\"...\"> and the router will parse it for you.`\n  );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same.  Both of the following examples should link back to the root:\n *\n *   <Route path=\"/\">\n *     <Route path=\"accounts\" element={<Link to=\"..\"}>\n *   </Route>\n *\n *   <Route path=\"/\">\n *     <Route path=\"accounts\">\n *       <Route element={<AccountsLayout />}>       // <-- Does not contribute\n *         <Route index element={<Link to=\"..\"} />  // <-- Does not contribute\n *       </Route\n *     </Route>\n *   </Route>\n */\nexport function getPathContributingMatches<\n  T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n  return matches.filter(\n    (match, index) =>\n      index === 0 || (match.route.path && match.route.path.length > 0)\n  );\n}\n\n// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nexport function getResolveToMatches<\n  T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[], v7_relativeSplatPath: boolean) {\n  let pathMatches = getPathContributingMatches(matches);\n\n  // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n  // match so we include splat values for \".\" links.  See:\n  // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n  if (v7_relativeSplatPath) {\n    return pathMatches.map((match, idx) =>\n      idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase\n    );\n  }\n\n  return pathMatches.map((match) => match.pathnameBase);\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n  toArg: To,\n  routePathnames: string[],\n  locationPathname: string,\n  isPathRelative = false\n): Path {\n  let to: Partial<Path>;\n  if (typeof toArg === \"string\") {\n    to = parsePath(toArg);\n  } else {\n    to = { ...toArg };\n\n    invariant(\n      !to.pathname || !to.pathname.includes(\"?\"),\n      getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n    );\n    invariant(\n      !to.pathname || !to.pathname.includes(\"#\"),\n      getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n    );\n    invariant(\n      !to.search || !to.search.includes(\"#\"),\n      getInvalidPathError(\"#\", \"search\", \"hash\", to)\n    );\n  }\n\n  let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n  let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n  let from: string;\n\n  // Routing is relative to the current pathname if explicitly requested.\n  //\n  // If a pathname is explicitly provided in `to`, it should be relative to the\n  // route context. This is explained in `Note on `<Link to>` values` in our\n  // migration guide from v5 as a means of disambiguation between `to` values\n  // that begin with `/` and those that do not. However, this is problematic for\n  // `to` values that do not provide a pathname. `to` can simply be a search or\n  // hash string, in which case we should assume that the navigation is relative\n  // to the current location's pathname and *not* the route pathname.\n  if (toPathname == null) {\n    from = locationPathname;\n  } else {\n    let routePathnameIndex = routePathnames.length - 1;\n\n    // With relative=\"route\" (the default), each leading .. segment means\n    // \"go up one route\" instead of \"go up one URL segment\".  This is a key\n    // difference from how <a href> works and a major reason we call this a\n    // \"to\" value instead of a \"href\".\n    if (!isPathRelative && toPathname.startsWith(\"..\")) {\n      let toSegments = toPathname.split(\"/\");\n\n      while (toSegments[0] === \"..\") {\n        toSegments.shift();\n        routePathnameIndex -= 1;\n      }\n\n      to.pathname = toSegments.join(\"/\");\n    }\n\n    from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n  }\n\n  let path = resolvePath(to, from);\n\n  // Ensure the pathname has a trailing slash if the original \"to\" had one\n  let hasExplicitTrailingSlash =\n    toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n  // Or if this was a link to the current path which has a trailing slash\n  let hasCurrentTrailingSlash =\n    (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n  if (\n    !path.pathname.endsWith(\"/\") &&\n    (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n  ) {\n    path.pathname += \"/\";\n  }\n\n  return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n  // Empty strings should be treated the same as / paths\n  return to === \"\" || (to as Path).pathname === \"\"\n    ? \"/\"\n    : typeof to === \"string\"\n    ? parsePath(to).pathname\n    : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n  paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n  pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n  !search || search === \"?\"\n    ? \"\"\n    : search.startsWith(\"?\")\n    ? search\n    : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n  !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = <Data>(\n  data: Data,\n  init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n *\n * @deprecated The `json` method is deprecated in favor of returning raw objects.\n * This method will be removed in v7.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n  let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n  let headers = new Headers(responseInit.headers);\n  if (!headers.has(\"Content-Type\")) {\n    headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n  }\n\n  return new Response(JSON.stringify(data), {\n    ...responseInit,\n    headers,\n  });\n};\n\nexport class DataWithResponseInit<D> {\n  type: string = \"DataWithResponseInit\";\n  data: D;\n  init: ResponseInit | null;\n\n  constructor(data: D, init?: ResponseInit) {\n    this.data = data;\n    this.init = init || null;\n  }\n}\n\n/**\n * Create \"responses\" that contain `status`/`headers` without forcing\n * serialization into an actual `Response` - used by Remix single fetch\n */\nexport function data<D>(data: D, init?: number | ResponseInit) {\n  return new DataWithResponseInit(\n    data,\n    typeof init === \"number\" ? { status: init } : init\n  );\n}\n\nexport interface TrackedPromise extends Promise<any> {\n  _tracked?: boolean;\n  _data?: any;\n  _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n  private pendingKeysSet: Set<string> = new Set<string>();\n  private controller: AbortController;\n  private abortPromise: Promise<void>;\n  private unlistenAbortSignal: () => void;\n  private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n    new Set();\n  data: Record<string, unknown>;\n  init?: ResponseInit;\n  deferredKeys: string[] = [];\n\n  constructor(data: Record<string, unknown>, responseInit?: ResponseInit) {\n    invariant(\n      data && typeof data === \"object\" && !Array.isArray(data),\n      \"defer() only accepts plain objects\"\n    );\n\n    // Set up an AbortController + Promise we can race against to exit early\n    // cancellation\n    let reject: (e: AbortedDeferredError) => void;\n    this.abortPromise = new Promise((_, r) => (reject = r));\n    this.controller = new AbortController();\n    let onAbort = () =>\n      reject(new AbortedDeferredError(\"Deferred data aborted\"));\n    this.unlistenAbortSignal = () =>\n      this.controller.signal.removeEventListener(\"abort\", onAbort);\n    this.controller.signal.addEventListener(\"abort\", onAbort);\n\n    this.data = Object.entries(data).reduce(\n      (acc, [key, value]) =>\n        Object.assign(acc, {\n          [key]: this.trackPromise(key, value),\n        }),\n      {}\n    );\n\n    if (this.done) {\n      // All incoming values were resolved\n      this.unlistenAbortSignal();\n    }\n\n    this.init = responseInit;\n  }\n\n  private trackPromise(\n    key: string,\n    value: Promise<unknown> | unknown\n  ): TrackedPromise | unknown {\n    if (!(value instanceof Promise)) {\n      return value;\n    }\n\n    this.deferredKeys.push(key);\n    this.pendingKeysSet.add(key);\n\n    // We store a little wrapper promise that will be extended with\n    // _data/_error props upon resolve/reject\n    let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n      (data) => this.onSettle(promise, key, undefined, data as unknown),\n      (error) => this.onSettle(promise, key, error as unknown)\n    );\n\n    // Register rejection listeners to avoid uncaught promise rejections on\n    // errors or aborted deferred values\n    promise.catch(() => {});\n\n    Object.defineProperty(promise, \"_tracked\", { get: () => true });\n    return promise;\n  }\n\n  private onSettle(\n    promise: TrackedPromise,\n    key: string,\n    error: unknown,\n    data?: unknown\n  ): unknown {\n    if (\n      this.controller.signal.aborted &&\n      error instanceof AbortedDeferredError\n    ) {\n      this.unlistenAbortSignal();\n      Object.defineProperty(promise, \"_error\", { get: () => error });\n      return Promise.reject(error);\n    }\n\n    this.pendingKeysSet.delete(key);\n\n    if (this.done) {\n      // Nothing left to abort!\n      this.unlistenAbortSignal();\n    }\n\n    // If the promise was resolved/rejected with undefined, we'll throw an error as you\n    // should always resolve with a value or null\n    if (error === undefined && data === undefined) {\n      let undefinedError = new Error(\n        `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n          `you must resolve/reject with a value or \\`null\\`.`\n      );\n      Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n      this.emit(false, key);\n      return Promise.reject(undefinedError);\n    }\n\n    if (data === undefined) {\n      Object.defineProperty(promise, \"_error\", { get: () => error });\n      this.emit(false, key);\n      return Promise.reject(error);\n    }\n\n    Object.defineProperty(promise, \"_data\", { get: () => data });\n    this.emit(false, key);\n    return data;\n  }\n\n  private emit(aborted: boolean, settledKey?: string) {\n    this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n  }\n\n  subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n    this.subscribers.add(fn);\n    return () => this.subscribers.delete(fn);\n  }\n\n  cancel() {\n    this.controller.abort();\n    this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n    this.emit(true);\n  }\n\n  async resolveData(signal: AbortSignal) {\n    let aborted = false;\n    if (!this.done) {\n      let onAbort = () => this.cancel();\n      signal.addEventListener(\"abort\", onAbort);\n      aborted = await new Promise((resolve) => {\n        this.subscribe((aborted) => {\n          signal.removeEventListener(\"abort\", onAbort);\n          if (aborted || this.done) {\n            resolve(aborted);\n          }\n        });\n      });\n    }\n    return aborted;\n  }\n\n  get done() {\n    return this.pendingKeysSet.size === 0;\n  }\n\n  get unwrappedData() {\n    invariant(\n      this.data !== null && this.done,\n      \"Can only unwrap data on initialized and settled deferreds\"\n    );\n\n    return Object.entries(this.data).reduce(\n      (acc, [key, value]) =>\n        Object.assign(acc, {\n          [key]: unwrapTrackedPromise(value),\n        }),\n      {}\n    );\n  }\n\n  get pendingKeys() {\n    return Array.from(this.pendingKeysSet);\n  }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n  return (\n    value instanceof Promise && (value as TrackedPromise)._tracked === true\n  );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n  if (!isTrackedPromise(value)) {\n    return value;\n  }\n\n  if (value._error) {\n    throw value._error;\n  }\n  return value._data;\n}\n\nexport type DeferFunction = (\n  data: Record<string, unknown>,\n  init?: number | ResponseInit\n) => DeferredData;\n\n/**\n * @deprecated The `defer` method is deprecated in favor of returning raw\n * objects. This method will be removed in v7.\n */\nexport const defer: DeferFunction = (data, init = {}) => {\n  let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n  return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n  url: string,\n  init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n  let responseInit = init;\n  if (typeof responseInit === \"number\") {\n    responseInit = { status: responseInit };\n  } else if (typeof responseInit.status === \"undefined\") {\n    responseInit.status = 302;\n  }\n\n  let headers = new Headers(responseInit.headers);\n  headers.set(\"Location\", url);\n\n  return new Response(null, {\n    ...responseInit,\n    headers,\n  });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n  let response = redirect(url, init);\n  response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n  return response;\n};\n\n/**\n * A redirect response that will perform a `history.replaceState` instead of a\n * `history.pushState` for client-side navigation redirects.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const replace: RedirectFunction = (url, init) => {\n  let response = redirect(url, init);\n  response.headers.set(\"X-Remix-Replace\", \"true\");\n  return response;\n};\n\nexport type ErrorResponse = {\n  status: number;\n  statusText: string;\n  data: any;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nexport class ErrorResponseImpl implements ErrorResponse {\n  status: number;\n  statusText: string;\n  data: any;\n  private error?: Error;\n  private internal: boolean;\n\n  constructor(\n    status: number,\n    statusText: string | undefined,\n    data: any,\n    internal = false\n  ) {\n    this.status = status;\n    this.statusText = statusText || \"\";\n    this.internal = internal;\n    if (data instanceof Error) {\n      this.data = data.toString();\n      this.error = data;\n    } else {\n      this.data = data;\n    }\n  }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n  return (\n    error != null &&\n    typeof error.status === \"number\" &&\n    typeof error.statusText === \"string\" &&\n    typeof error.internal === \"boolean\" &&\n    \"data\" in error\n  );\n}\n","import type { History, Location, Path, To } from \"./history\";\nimport {\n  Action as HistoryAction,\n  createLocation,\n  createPath,\n  invariant,\n  parsePath,\n  warning,\n} from \"./history\";\nimport type {\n  AgnosticDataRouteMatch,\n  AgnosticDataRouteObject,\n  DataStrategyMatch,\n  AgnosticRouteObject,\n  DataResult,\n  DataStrategyFunction,\n  DataStrategyFunctionArgs,\n  DeferredData,\n  DeferredResult,\n  DetectErrorBoundaryFunction,\n  ErrorResult,\n  FormEncType,\n  FormMethod,\n  HTMLFormMethod,\n  DataStrategyResult,\n  ImmutableRouteKey,\n  MapRoutePropertiesFunction,\n  MutationFormMethod,\n  RedirectResult,\n  RouteData,\n  RouteManifest,\n  ShouldRevalidateFunctionArgs,\n  Submission,\n  SuccessResult,\n  UIMatch,\n  V7_FormMethod,\n  V7_MutationFormMethod,\n  AgnosticPatchRoutesOnNavigationFunction,\n  DataWithResponseInit,\n} from \"./utils\";\nimport {\n  ErrorResponseImpl,\n  ResultType,\n  convertRouteMatchToUiMatch,\n  convertRoutesToDataRoutes,\n  getPathContributingMatches,\n  getResolveToMatches,\n  immutableRouteKeys,\n  isRouteErrorResponse,\n  joinPaths,\n  matchRoutes,\n  matchRoutesImpl,\n  resolveTo,\n  stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the basename for the router\n   */\n  get basename(): RouterInit[\"basename\"];\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the future config for the router\n   */\n  get future(): FutureConfig;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the current state of the router\n   */\n  get state(): RouterState;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the routes for this router instance\n   */\n  get routes(): AgnosticDataRouteObject[];\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Return the window associated with the router\n   */\n  get window(): RouterInit[\"window\"];\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Initialize the router, including adding history listeners and kicking off\n   * initial data fetches.  Returns a function to cleanup listeners and abort\n   * any in-progress loads\n   */\n  initialize(): Router;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Subscribe to router.state updates\n   *\n   * @param fn function to call with the new state\n   */\n  subscribe(fn: RouterSubscriber): () => void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Enable scroll restoration behavior in the router\n   *\n   * @param savedScrollPositions Object that will manage positions, in case\n   *                             it's being restored from sessionStorage\n   * @param getScrollPosition    Function to get the active Y scroll position\n   * @param getKey               Function to get the key to use for restoration\n   */\n  enableScrollRestoration(\n    savedScrollPositions: Record<string, number>,\n    getScrollPosition: GetScrollPositionFunction,\n    getKey?: GetScrollRestorationKeyFunction\n  ): () => void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Navigate forward/backward in the history stack\n   * @param to Delta to move in the history stack\n   */\n  navigate(to: number): Promise<void>;\n\n  /**\n   * Navigate to the given path\n   * @param to Path to navigate to\n   * @param opts Navigation options (method, submission, etc.)\n   */\n  navigate(to: To | null, opts?: RouterNavigateOptions): Promise<void>;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Trigger a fetcher load/submission\n   *\n   * @param key     Fetcher key\n   * @param routeId Route that owns the fetcher\n   * @param href    href to fetch\n   * @param opts    Fetcher options, (method, submission, etc.)\n   */\n  fetch(\n    key: string,\n    routeId: string,\n    href: string | null,\n    opts?: RouterFetchOptions\n  ): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Trigger a revalidation of all current route loaders and fetcher loads\n   */\n  revalidate(): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Utility function to create an href for the given location\n   * @param location\n   */\n  createHref(location: Location | URL): string;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Utility function to URL encode a destination path according to the internal\n   * history implementation\n   * @param to\n   */\n  encodeLocation(to: To): Path;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Get/create a fetcher for the given key\n   * @param key\n   */\n  getFetcher<TData = any>(key: string): Fetcher<TData>;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Delete the fetcher for a given key\n   * @param key\n   */\n  deleteFetcher(key: string): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Cleanup listeners and abort any in-progress loads\n   */\n  dispose(): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Get a navigation blocker\n   * @param key The identifier for the blocker\n   * @param fn The blocker function implementation\n   */\n  getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Delete a navigation blocker\n   * @param key The identifier for the blocker\n   */\n  deleteBlocker(key: string): void;\n\n  /**\n   * @internal\n   * PRIVATE DO NOT USE\n   *\n   * Patch additional children routes into an existing parent route\n   * @param routeId The parent route id or a callback function accepting `patch`\n   *                to perform batch patching\n   * @param children The additional children routes\n   */\n  patchRoutes(routeId: string | null, children: AgnosticRouteObject[]): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * HMR needs to pass in-flight route updates to React Router\n   * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n   */\n  _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Internal fetch AbortControllers accessed by unit tests\n   */\n  _internalFetchControllers: Map<string, AbortController>;\n\n  /**\n   * @internal\n   * PRIVATE - DO NOT USE\n   *\n   * Internal pending DeferredData instances accessed by unit tests\n   */\n  _internalActiveDeferreds: Map<string, DeferredData>;\n}\n\n/**\n * State maintained internally by the router.  During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n  /**\n   * The action of the most recent navigation\n   */\n  historyAction: HistoryAction;\n\n  /**\n   * The current location reflected by the router\n   */\n  location: Location;\n\n  /**\n   * The current set of route matches\n   */\n  matches: AgnosticDataRouteMatch[];\n\n  /**\n   * Tracks whether we've completed our initial data load\n   */\n  initialized: boolean;\n\n  /**\n   * Current scroll position we should start at for a new view\n   *  - number -> scroll position to restore to\n   *  - false -> do not restore scroll at all (used during submissions)\n   *  - null -> don't have a saved position, scroll to hash or top of page\n   */\n  restoreScrollPosition: number | false | null;\n\n  /**\n   * Indicate whether this navigation should skip resetting the scroll position\n   * if we are unable to restore the scroll position\n   */\n  preventScrollReset: boolean;\n\n  /**\n   * Tracks the state of the current navigation\n   */\n  navigation: Navigation;\n\n  /**\n   * Tracks any in-progress revalidations\n   */\n  revalidation: RevalidationState;\n\n  /**\n   * Data from the loaders for the current matches\n   */\n  loaderData: RouteData;\n\n  /**\n   * Data from the action for the current matches\n   */\n  actionData: RouteData | null;\n\n  /**\n   * Errors caught from loaders for the current matches\n   */\n  errors: RouteData | null;\n\n  /**\n   * Map of current fetchers\n   */\n  fetchers: Map<string, Fetcher>;\n\n  /**\n   * Map of current blockers\n   */\n  blockers: Map<string, Blocker>;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n  Pick<RouterState, \"loaderData\" | \"actionData\" | \"errors\">\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n  v7_fetcherPersist: boolean;\n  v7_normalizeFormMethod: boolean;\n  v7_partialHydration: boolean;\n  v7_prependBasename: boolean;\n  v7_relativeSplatPath: boolean;\n  v7_skipActionErrorRevalidation: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n  routes: AgnosticRouteObject[];\n  history: History;\n  basename?: string;\n  /**\n   * @deprecated Use `mapRouteProperties` instead\n   */\n  detectErrorBoundary?: DetectErrorBoundaryFunction;\n  mapRouteProperties?: MapRoutePropertiesFunction;\n  future?: Partial<FutureConfig>;\n  hydrationData?: HydrationState;\n  window?: Window;\n  dataStrategy?: DataStrategyFunction;\n  patchRoutesOnNavigation?: AgnosticPatchRoutesOnNavigationFunction;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n  basename: Router[\"basename\"];\n  location: RouterState[\"location\"];\n  matches: RouterState[\"matches\"];\n  loaderData: RouterState[\"loaderData\"];\n  actionData: RouterState[\"actionData\"];\n  errors: RouterState[\"errors\"];\n  statusCode: number;\n  loaderHeaders: Record<string, Headers>;\n  actionHeaders: Record<string, Headers>;\n  activeDeferreds: Record<string, DeferredData> | null;\n  _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n  dataRoutes: AgnosticDataRouteObject[];\n  query(\n    request: Request,\n    opts?: {\n      requestContext?: unknown;\n      skipLoaderErrorBubbling?: boolean;\n      dataStrategy?: DataStrategyFunction;\n    }\n  ): Promise<StaticHandlerContext | Response>;\n  queryRoute(\n    request: Request,\n    opts?: {\n      routeId?: string;\n      requestContext?: unknown;\n      dataStrategy?: DataStrategyFunction;\n    }\n  ): Promise<any>;\n}\n\ntype ViewTransitionOpts = {\n  currentLocation: Location;\n  nextLocation: Location;\n};\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n  (\n    state: RouterState,\n    opts: {\n      deletedFetchers: string[];\n      viewTransitionOpts?: ViewTransitionOpts;\n      flushSync: boolean;\n    }\n  ): void;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n  (location: Location, matches: UIMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n  (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n  preventScrollReset?: boolean;\n  relative?: RelativeRoutingType;\n  flushSync?: boolean;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n  replace?: boolean;\n  state?: any;\n  fromRouteId?: string;\n  viewTransition?: boolean;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n  formMethod?: HTMLFormMethod;\n  formEncType?: FormEncType;\n} & (\n  | { formData: FormData; body?: undefined }\n  | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n  | LinkNavigateOptions\n  | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n  Idle: {\n    state: \"idle\";\n    location: undefined;\n    formMethod: undefined;\n    formAction: undefined;\n    formEncType: undefined;\n    formData: undefined;\n    json: undefined;\n    text: undefined;\n  };\n  Loading: {\n    state: \"loading\";\n    location: Location;\n    formMethod: Submission[\"formMethod\"] | undefined;\n    formAction: Submission[\"formAction\"] | undefined;\n    formEncType: Submission[\"formEncType\"] | undefined;\n    formData: Submission[\"formData\"] | undefined;\n    json: Submission[\"json\"] | undefined;\n    text: Submission[\"text\"] | undefined;\n  };\n  Submitting: {\n    state: \"submitting\";\n    location: Location;\n    formMethod: Submission[\"formMethod\"];\n    formAction: Submission[\"formAction\"];\n    formEncType: Submission[\"formEncType\"];\n    formData: Submission[\"formData\"];\n    json: Submission[\"json\"];\n    text: Submission[\"text\"];\n  };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates<TData = any> = {\n  Idle: {\n    state: \"idle\";\n    formMethod: undefined;\n    formAction: undefined;\n    formEncType: undefined;\n    text: undefined;\n    formData: undefined;\n    json: undefined;\n    data: TData | undefined;\n  };\n  Loading: {\n    state: \"loading\";\n    formMethod: Submission[\"formMethod\"] | undefined;\n    formAction: Submission[\"formAction\"] | undefined;\n    formEncType: Submission[\"formEncType\"] | undefined;\n    text: Submission[\"text\"] | undefined;\n    formData: Submission[\"formData\"] | undefined;\n    json: Submission[\"json\"] | undefined;\n    data: TData | undefined;\n  };\n  Submitting: {\n    state: \"submitting\";\n    formMethod: Submission[\"formMethod\"];\n    formAction: Submission[\"formAction\"];\n    formEncType: Submission[\"formEncType\"];\n    text: Submission[\"text\"];\n    formData: Submission[\"formData\"];\n    json: Submission[\"json\"];\n    data: TData | undefined;\n  };\n};\n\nexport type Fetcher<TData = any> =\n  FetcherStates<TData>[keyof FetcherStates<TData>];\n\ninterface BlockerBlocked {\n  state: \"blocked\";\n  reset(): void;\n  proceed(): void;\n  location: Location;\n}\n\ninterface BlockerUnblocked {\n  state: \"unblocked\";\n  reset: undefined;\n  proceed: undefined;\n  location: undefined;\n}\n\ninterface BlockerProceeding {\n  state: \"proceeding\";\n  reset: undefined;\n  proceed: undefined;\n  location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n  currentLocation: Location;\n  nextLocation: Location;\n  historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n  /**\n   * startNavigation does not need to complete the navigation because we\n   * redirected or got interrupted\n   */\n  shortCircuited?: boolean;\n}\n\ntype PendingActionResult = [string, SuccessResult | ErrorResult];\n\ninterface HandleActionResult extends ShortCircuitable {\n  /**\n   * Route matches which may have been updated from fog of war discovery\n   */\n  matches?: RouterState[\"matches\"];\n  /**\n   * Tuple for the returned or thrown value from the current action.  The routeId\n   * is the action route for success and the bubbled boundary route for errors.\n   */\n  pendingActionResult?: PendingActionResult;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n  /**\n   * Route matches which may have been updated from fog of war discovery\n   */\n  matches?: RouterState[\"matches\"];\n  /**\n   * loaderData returned from the current set of loaders\n   */\n  loaderData?: RouterState[\"loaderData\"];\n  /**\n   * errors thrown from the current set of loaders\n   */\n  errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n  routeId: string;\n  path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n  key: string;\n  match: AgnosticDataRouteMatch | null;\n  matches: AgnosticDataRouteMatch[] | null;\n  controller: AbortController | null;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n  \"post\",\n  \"put\",\n  \"patch\",\n  \"delete\",\n];\nconst validMutationMethods = new Set<MutationFormMethod>(\n  validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n  \"get\",\n  ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set<FormMethod>(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n  state: \"idle\",\n  location: undefined,\n  formMethod: undefined,\n  formAction: undefined,\n  formEncType: undefined,\n  formData: undefined,\n  json: undefined,\n  text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n  state: \"idle\",\n  data: undefined,\n  formMethod: undefined,\n  formAction: undefined,\n  formEncType: undefined,\n  formData: undefined,\n  json: undefined,\n  text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n  state: \"unblocked\",\n  proceed: undefined,\n  reset: undefined,\n  location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n  hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n  const routerWindow = init.window\n    ? init.window\n    : typeof window !== \"undefined\"\n    ? window\n    : undefined;\n  const isBrowser =\n    typeof routerWindow !== \"undefined\" &&\n    typeof routerWindow.document !== \"undefined\" &&\n    typeof routerWindow.document.createElement !== \"undefined\";\n  const isServer = !isBrowser;\n\n  invariant(\n    init.routes.length > 0,\n    \"You must provide a non-empty routes array to createRouter\"\n  );\n\n  let mapRouteProperties: MapRoutePropertiesFunction;\n  if (init.mapRouteProperties) {\n    mapRouteProperties = init.mapRouteProperties;\n  } else if (init.detectErrorBoundary) {\n    // If they are still using the deprecated version, wrap it with the new API\n    let detectErrorBoundary = init.detectErrorBoundary;\n    mapRouteProperties = (route) => ({\n      hasErrorBoundary: detectErrorBoundary(route),\n    });\n  } else {\n    mapRouteProperties = defaultMapRouteProperties;\n  }\n\n  // Routes keyed by ID\n  let manifest: RouteManifest = {};\n  // Routes in tree format for matching\n  let dataRoutes = convertRoutesToDataRoutes(\n    init.routes,\n    mapRouteProperties,\n    undefined,\n    manifest\n  );\n  let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n  let basename = init.basename || \"/\";\n  let dataStrategyImpl = init.dataStrategy || defaultDataStrategy;\n  let patchRoutesOnNavigationImpl = init.patchRoutesOnNavigation;\n\n  // Config driven behavior flags\n  let future: FutureConfig = {\n    v7_fetcherPersist: false,\n    v7_normalizeFormMethod: false,\n    v7_partialHydration: false,\n    v7_prependBasename: false,\n    v7_relativeSplatPath: false,\n    v7_skipActionErrorRevalidation: false,\n    ...init.future,\n  };\n  // Cleanup function for history\n  let unlistenHistory: (() => void) | null = null;\n  // Externally-provided functions to call on all state changes\n  let subscribers = new Set<RouterSubscriber>();\n  // Externally-provided object to hold scroll restoration locations during routing\n  let savedScrollPositions: Record<string, number> | null = null;\n  // Externally-provided function to get scroll restoration keys\n  let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n  // Externally-provided function to get current scroll position\n  let getScrollPosition: GetScrollPositionFunction | null = null;\n  // One-time flag to control the initial hydration scroll restoration.  Because\n  // we don't get the saved positions from <ScrollRestoration /> until _after_\n  // the initial render, we need to manually trigger a separate updateState to\n  // send along the restoreScrollPosition\n  // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n  // SSR did the initial scroll restoration.\n  let initialScrollRestored = init.hydrationData != null;\n\n  let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n  let initialMatchesIsFOW = false;\n  let initialErrors: RouteData | null = null;\n\n  if (initialMatches == null && !patchRoutesOnNavigationImpl) {\n    // If we do not match a user-provided-route, fall back to the root\n    // to allow the error boundary to take over\n    let error = getInternalRouterError(404, {\n      pathname: init.history.location.pathname,\n    });\n    let { matches, route } = getShortCircuitMatches(dataRoutes);\n    initialMatches = matches;\n    initialErrors = { [route.id]: error };\n  }\n\n  // In SPA apps, if the user provided a patchRoutesOnNavigation implementation and\n  // our initial match is a splat route, clear them out so we run through lazy\n  // discovery on hydration in case there's a more accurate lazy route match.\n  // In SSR apps (with `hydrationData`), we expect that the server will send\n  // up the proper matched routes so we don't want to run lazy discovery on\n  // initial hydration and want to hydrate into the splat route.\n  if (initialMatches && !init.hydrationData) {\n    let fogOfWar = checkFogOfWar(\n      initialMatches,\n      dataRoutes,\n      init.history.location.pathname\n    );\n    if (fogOfWar.active) {\n      initialMatches = null;\n    }\n  }\n\n  let initialized: boolean;\n  if (!initialMatches) {\n    initialized = false;\n    initialMatches = [];\n\n    // If partial hydration and fog of war is enabled, we will be running\n    // `patchRoutesOnNavigation` during hydration so include any partial matches as\n    // the initial matches so we can properly render `HydrateFallback`'s\n    if (future.v7_partialHydration) {\n      let fogOfWar = checkFogOfWar(\n        null,\n        dataRoutes,\n        init.history.location.pathname\n      );\n      if (fogOfWar.active && fogOfWar.matches) {\n        initialMatchesIsFOW = true;\n        initialMatches = fogOfWar.matches;\n      }\n    }\n  } else if (initialMatches.some((m) => m.route.lazy)) {\n    // All initialMatches need to be loaded before we're ready.  If we have lazy\n    // functions around still then we'll need to run them in initialize()\n    initialized = false;\n  } else if (!initialMatches.some((m) => m.route.loader)) {\n    // If we've got no loaders to run, then we're good to go\n    initialized = true;\n  } else if (future.v7_partialHydration) {\n    // If partial hydration is enabled, we're initialized so long as we were\n    // provided with hydrationData for every route with a loader, and no loaders\n    // were marked for explicit hydration\n    let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n    let errors = init.hydrationData ? init.hydrationData.errors : null;\n    // If errors exist, don't consider routes below the boundary\n    if (errors) {\n      let idx = initialMatches.findIndex(\n        (m) => errors![m.route.id] !== undefined\n      );\n      initialized = initialMatches\n        .slice(0, idx + 1)\n        .every((m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n    } else {\n      initialized = initialMatches.every(\n        (m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors)\n      );\n    }\n  } else {\n    // Without partial hydration - we're initialized if we were provided any\n    // hydrationData - which is expected to be complete\n    initialized = init.hydrationData != null;\n  }\n\n  let router: Router;\n  let state: RouterState = {\n    historyAction: init.history.action,\n    location: init.history.location,\n    matches: initialMatches,\n    initialized,\n    navigation: IDLE_NAVIGATION,\n    // Don't restore on initial updateState() if we were SSR'd\n    restoreScrollPosition: init.hydrationData != null ? false : null,\n    preventScrollReset: false,\n    revalidation: \"idle\",\n    loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n    actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n    errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n    fetchers: new Map(),\n    blockers: new Map(),\n  };\n\n  // -- Stateful internal variables to manage navigations --\n  // Current navigation in progress (to be committed in completeNavigation)\n  let pendingAction: HistoryAction = HistoryAction.Pop;\n\n  // Should the current navigation prevent the scroll reset if scroll cannot\n  // be restored?\n  let pendingPreventScrollReset = false;\n\n  // AbortController for the active navigation\n  let pendingNavigationController: AbortController | null;\n\n  // Should the current navigation enable document.startViewTransition?\n  let pendingViewTransitionEnabled = false;\n\n  // Store applied view transitions so we can apply them on POP\n  let appliedViewTransitions: Map<string, Set<string>> = new Map<\n    string,\n    Set<string>\n  >();\n\n  // Cleanup function for persisting applied transitions to sessionStorage\n  let removePageHideEventListener: (() => void) | null = null;\n\n  // We use this to avoid touching history in completeNavigation if a\n  // revalidation is entirely uninterrupted\n  let isUninterruptedRevalidation = false;\n\n  // Use this internal flag to force revalidation of all loaders:\n  //  - submissions (completed or interrupted)\n  //  - useRevalidator()\n  //  - X-Remix-Revalidate (from redirect)\n  let isRevalidationRequired = false;\n\n  // Use this internal array to capture routes that require revalidation due\n  // to a cancelled deferred on action submission\n  let cancelledDeferredRoutes: string[] = [];\n\n  // Use this internal array to capture fetcher loads that were cancelled by an\n  // action navigation and require revalidation\n  let cancelledFetcherLoads: Set<string> = new Set();\n\n  // AbortControllers for any in-flight fetchers\n  let fetchControllers = new Map<string, AbortController>();\n\n  // Track loads based on the order in which they started\n  let incrementingLoadId = 0;\n\n  // Track the outstanding pending navigation data load to be compared against\n  // the globally incrementing load when a fetcher load lands after a completed\n  // navigation\n  let pendingNavigationLoadId = -1;\n\n  // Fetchers that triggered data reloads as a result of their actions\n  let fetchReloadIds = new Map<string, number>();\n\n  // Fetchers that triggered redirect navigations\n  let fetchRedirectIds = new Set<string>();\n\n  // Most recent href/match for fetcher.load calls for fetchers\n  let fetchLoadMatches = new Map<string, FetchLoadMatch>();\n\n  // Ref-count mounted fetchers so we know when it's ok to clean them up\n  let activeFetchers = new Map<string, number>();\n\n  // Fetchers that have requested a delete when using v7_fetcherPersist,\n  // they'll be officially removed after they return to idle\n  let deletedFetchers = new Set<string>();\n\n  // Store DeferredData instances for active route matches.  When a\n  // route loader returns defer() we stick one in here.  Then, when a nested\n  // promise resolves we update loaderData.  If a new navigation starts we\n  // cancel active deferreds for eliminated routes.\n  let activeDeferreds = new Map<string, DeferredData>();\n\n  // Store blocker functions in a separate Map outside of router state since\n  // we don't need to update UI state if they change\n  let blockerFunctions = new Map<string, BlockerFunction>();\n\n  // Map of pending patchRoutesOnNavigation() promises (keyed by path/matches) so\n  // that we only kick them off once for a given combo\n  let pendingPatchRoutes = new Map<\n    string,\n    ReturnType<AgnosticPatchRoutesOnNavigationFunction>\n  >();\n\n  // Flag to ignore the next history update, so we can revert the URL change on\n  // a POP navigation that was blocked by the user without touching router state\n  let unblockBlockerHistoryUpdate: (() => void) | undefined = undefined;\n\n  // Initialize the router, all side effects should be kicked off from here.\n  // Implemented as a Fluent API for ease of:\n  //   let router = createRouter(init).initialize();\n  function initialize() {\n    // If history informs us of a POP navigation, start the navigation but do not update\n    // state.  We'll update our own state once the navigation completes\n    unlistenHistory = init.history.listen(\n      ({ action: historyAction, location, delta }) => {\n        // Ignore this event if it was just us resetting the URL from a\n        // blocked POP navigation\n        if (unblockBlockerHistoryUpdate) {\n          unblockBlockerHistoryUpdate();\n          unblockBlockerHistoryUpdate = undefined;\n          return;\n        }\n\n        warning(\n          blockerFunctions.size === 0 || delta != null,\n          \"You are trying to use a blocker on a POP navigation to a location \" +\n            \"that was not created by @remix-run/router. This will fail silently in \" +\n            \"production. This can happen if you are navigating outside the router \" +\n            \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n            \"router navigation APIs.  This can also happen if you are using \" +\n            \"createHashRouter and the user manually changes the URL.\"\n        );\n\n        let blockerKey = shouldBlockNavigation({\n          currentLocation: state.location,\n          nextLocation: location,\n          historyAction,\n        });\n\n        if (blockerKey && delta != null) {\n          // Restore the URL to match the current UI, but don't update router state\n          let nextHistoryUpdatePromise = new Promise<void>((resolve) => {\n            unblockBlockerHistoryUpdate = resolve;\n          });\n          init.history.go(delta * -1);\n\n          // Put the blocker into a blocked state\n          updateBlocker(blockerKey, {\n            state: \"blocked\",\n            location,\n            proceed() {\n              updateBlocker(blockerKey!, {\n                state: \"proceeding\",\n                proceed: undefined,\n                reset: undefined,\n                location,\n              });\n              // Re-do the same POP navigation we just blocked, after the url\n              // restoration is also complete.  See:\n              // https://github.com/remix-run/react-router/issues/11613\n              nextHistoryUpdatePromise.then(() => init.history.go(delta));\n            },\n            reset() {\n              let blockers = new Map(state.blockers);\n              blockers.set(blockerKey!, IDLE_BLOCKER);\n              updateState({ blockers });\n            },\n          });\n          return;\n        }\n\n        return startNavigation(historyAction, location);\n      }\n    );\n\n    if (isBrowser) {\n      // FIXME: This feels gross.  How can we cleanup the lines between\n      // scrollRestoration/appliedTransitions persistance?\n      restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n      let _saveAppliedTransitions = () =>\n        persistAppliedTransitions(routerWindow, appliedViewTransitions);\n      routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n      removePageHideEventListener = () =>\n        routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n    }\n\n    // Kick off initial data load if needed.  Use Pop to avoid modifying history\n    // Note we don't do any handling of lazy here.  For SPA's it'll get handled\n    // in the normal navigation flow.  For SSR it's expected that lazy modules are\n    // resolved prior to router creation since we can't go into a fallbackElement\n    // UI for SSR'd apps\n    if (!state.initialized) {\n      startNavigation(HistoryAction.Pop, state.location, {\n        initialHydration: true,\n      });\n    }\n\n    return router;\n  }\n\n  // Clean up a router and it's side effects\n  function dispose() {\n    if (unlistenHistory) {\n      unlistenHistory();\n    }\n    if (removePageHideEventListener) {\n      removePageHideEventListener();\n    }\n    subscribers.clear();\n    pendingNavigationController && pendingNavigationController.abort();\n    state.fetchers.forEach((_, key) => deleteFetcher(key));\n    state.blockers.forEach((_, key) => deleteBlocker(key));\n  }\n\n  // Subscribe to state updates for the router\n  function subscribe(fn: RouterSubscriber) {\n    subscribers.add(fn);\n    return () => subscribers.delete(fn);\n  }\n\n  // Update our state and notify the calling context of the change\n  function updateState(\n    newState: Partial<RouterState>,\n    opts: {\n      flushSync?: boolean;\n      viewTransitionOpts?: ViewTransitionOpts;\n    } = {}\n  ): void {\n    state = {\n      ...state,\n      ...newState,\n    };\n\n    // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n    // can be removed\n    let completedFetchers: string[] = [];\n    let deletedFetchersKeys: string[] = [];\n\n    if (future.v7_fetcherPersist) {\n      state.fetchers.forEach((fetcher, key) => {\n        if (fetcher.state === \"idle\") {\n          if (deletedFetchers.has(key)) {\n            // Unmounted from the UI and can be totally removed\n            deletedFetchersKeys.push(key);\n          } else {\n            // Returned to idle but still mounted in the UI, so semi-remains for\n            // revalidations and such\n            completedFetchers.push(key);\n          }\n        }\n      });\n    }\n\n    // Remove any lingering deleted fetchers that have already been removed\n    // from state.fetchers\n    deletedFetchers.forEach((key) => {\n      if (!state.fetchers.has(key) && !fetchControllers.has(key)) {\n        deletedFetchersKeys.push(key);\n      }\n    });\n\n    // Iterate over a local copy so that if flushSync is used and we end up\n    // removing and adding a new subscriber due to the useCallback dependencies,\n    // we don't get ourselves into a loop calling the new subscriber immediately\n    [...subscribers].forEach((subscriber) =>\n      subscriber(state, {\n        deletedFetchers: deletedFetchersKeys,\n        viewTransitionOpts: opts.viewTransitionOpts,\n        flushSync: opts.flushSync === true,\n      })\n    );\n\n    // Remove idle fetchers from state since we only care about in-flight fetchers.\n    if (future.v7_fetcherPersist) {\n      completedFetchers.forEach((key) => state.fetchers.delete(key));\n      deletedFetchersKeys.forEach((key) => deleteFetcher(key));\n    } else {\n      // We already called deleteFetcher() on these, can remove them from this\n      // Set now that we've handed the keys off to the data layer\n      deletedFetchersKeys.forEach((key) => deletedFetchers.delete(key));\n    }\n  }\n\n  // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n  // and setting state.[historyAction/location/matches] to the new route.\n  // - Location is a required param\n  // - Navigation will always be set to IDLE_NAVIGATION\n  // - Can pass any other state in newState\n  function completeNavigation(\n    location: Location,\n    newState: Partial<Omit<RouterState, \"action\" | \"location\" | \"navigation\">>,\n    { flushSync }: { flushSync?: boolean } = {}\n  ): void {\n    // Deduce if we're in a loading/actionReload state:\n    // - We have committed actionData in the store\n    // - The current navigation was a mutation submission\n    // - We're past the submitting state and into the loading state\n    // - The location being loaded is not the result of a redirect\n    let isActionReload =\n      state.actionData != null &&\n      state.navigation.formMethod != null &&\n      isMutationMethod(state.navigation.formMethod) &&\n      state.navigation.state === \"loading\" &&\n      location.state?._isRedirect !== true;\n\n    let actionData: RouteData | null;\n    if (newState.actionData) {\n      if (Object.keys(newState.actionData).length > 0) {\n        actionData = newState.actionData;\n      } else {\n        // Empty actionData -> clear prior actionData due to an action error\n        actionData = null;\n      }\n    } else if (isActionReload) {\n      // Keep the current data if we're wrapping up the action reload\n      actionData = state.actionData;\n    } else {\n      // Clear actionData on any other completed navigations\n      actionData = null;\n    }\n\n    // Always preserve any existing loaderData from re-used routes\n    let loaderData = newState.loaderData\n      ? mergeLoaderData(\n          state.loaderData,\n          newState.loaderData,\n          newState.matches || [],\n          newState.errors\n        )\n      : state.loaderData;\n\n    // On a successful navigation we can assume we got through all blockers\n    // so we can start fresh\n    let blockers = state.blockers;\n    if (blockers.size > 0) {\n      blockers = new Map(blockers);\n      blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n    }\n\n    // Always respect the user flag.  Otherwise don't reset on mutation\n    // submission navigations unless they redirect\n    let preventScrollReset =\n      pendingPreventScrollReset === true ||\n      (state.navigation.formMethod != null &&\n        isMutationMethod(state.navigation.formMethod) &&\n        location.state?._isRedirect !== true);\n\n    // Commit any in-flight routes at the end of the HMR revalidation \"navigation\"\n    if (inFlightDataRoutes) {\n      dataRoutes = inFlightDataRoutes;\n      inFlightDataRoutes = undefined;\n    }\n\n    if (isUninterruptedRevalidation) {\n      // If this was an uninterrupted revalidation then do not touch history\n    } else if (pendingAction === HistoryAction.Pop) {\n      // Do nothing for POP - URL has already been updated\n    } else if (pendingAction === HistoryAction.Push) {\n      init.history.push(location, location.state);\n    } else if (pendingAction === HistoryAction.Replace) {\n      init.history.replace(location, location.state);\n    }\n\n    let viewTransitionOpts: ViewTransitionOpts | undefined;\n\n    // On POP, enable transitions if they were enabled on the original navigation\n    if (pendingAction === HistoryAction.Pop) {\n      // Forward takes precedence so they behave like the original navigation\n      let priorPaths = appliedViewTransitions.get(state.location.pathname);\n      if (priorPaths && priorPaths.has(location.pathname)) {\n        viewTransitionOpts = {\n          currentLocation: state.location,\n          nextLocation: location,\n        };\n      } else if (appliedViewTransitions.has(location.pathname)) {\n        // If we don't have a previous forward nav, assume we're popping back to\n        // the new location and enable if that location previously enabled\n        viewTransitionOpts = {\n          currentLocation: location,\n          nextLocation: state.location,\n        };\n      }\n    } else if (pendingViewTransitionEnabled) {\n      // Store the applied transition on PUSH/REPLACE\n      let toPaths = appliedViewTransitions.get(state.location.pathname);\n      if (toPaths) {\n        toPaths.add(location.pathname);\n      } else {\n        toPaths = new Set<string>([location.pathname]);\n        appliedViewTransitions.set(state.location.pathname, toPaths);\n      }\n      viewTransitionOpts = {\n        currentLocation: state.location,\n        nextLocation: location,\n      };\n    }\n\n    updateState(\n      {\n        ...newState, // matches, errors, fetchers go through as-is\n        actionData,\n        loaderData,\n        historyAction: pendingAction,\n        location,\n        initialized: true,\n        navigation: IDLE_NAVIGATION,\n        revalidation: \"idle\",\n        restoreScrollPosition: getSavedScrollPosition(\n          location,\n          newState.matches || state.matches\n        ),\n        preventScrollReset,\n        blockers,\n      },\n      {\n        viewTransitionOpts,\n        flushSync: flushSync === true,\n      }\n    );\n\n    // Reset stateful navigation vars\n    pendingAction = HistoryAction.Pop;\n    pendingPreventScrollReset = false;\n    pendingViewTransitionEnabled = false;\n    isUninterruptedRevalidation = false;\n    isRevalidationRequired = false;\n    cancelledDeferredRoutes = [];\n  }\n\n  // Trigger a navigation event, which can either be a numerical POP or a PUSH\n  // replace with an optional submission\n  async function navigate(\n    to: number | To | null,\n    opts?: RouterNavigateOptions\n  ): Promise<void> {\n    if (typeof to === \"number\") {\n      init.history.go(to);\n      return;\n    }\n\n    let normalizedPath = normalizeTo(\n      state.location,\n      state.matches,\n      basename,\n      future.v7_prependBasename,\n      to,\n      future.v7_relativeSplatPath,\n      opts?.fromRouteId,\n      opts?.relative\n    );\n    let { path, submission, error } = normalizeNavigateOptions(\n      future.v7_normalizeFormMethod,\n      false,\n      normalizedPath,\n      opts\n    );\n\n    let currentLocation = state.location;\n    let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n    // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n    // URL from window.location, so we need to encode it here so the behavior\n    // remains the same as POP and non-data-router usages.  new URL() does all\n    // the same encoding we'd get from a history.pushState/window.location read\n    // without having to touch history\n    nextLocation = {\n      ...nextLocation,\n      ...init.history.encodeLocation(nextLocation),\n    };\n\n    let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n    let historyAction = HistoryAction.Push;\n\n    if (userReplace === true) {\n      historyAction = HistoryAction.Replace;\n    } else if (userReplace === false) {\n      // no-op\n    } else if (\n      submission != null &&\n      isMutationMethod(submission.formMethod) &&\n      submission.formAction === state.location.pathname + state.location.search\n    ) {\n      // By default on submissions to the current location we REPLACE so that\n      // users don't have to double-click the back button to get to the prior\n      // location.  If the user redirects to a different location from the\n      // action/loader this will be ignored and the redirect will be a PUSH\n      historyAction = HistoryAction.Replace;\n    }\n\n    let preventScrollReset =\n      opts && \"preventScrollReset\" in opts\n        ? opts.preventScrollReset === true\n        : undefined;\n\n    let flushSync = (opts && opts.flushSync) === true;\n\n    let blockerKey = shouldBlockNavigation({\n      currentLocation,\n      nextLocation,\n      historyAction,\n    });\n\n    if (blockerKey) {\n      // Put the blocker into a blocked state\n      updateBlocker(blockerKey, {\n        state: \"blocked\",\n        location: nextLocation,\n        proceed() {\n          updateBlocker(blockerKey!, {\n            state: \"proceeding\",\n            proceed: undefined,\n            reset: undefined,\n            location: nextLocation,\n          });\n          // Send the same navigation through\n          navigate(to, opts);\n        },\n        reset() {\n          let blockers = new Map(state.blockers);\n          blockers.set(blockerKey!, IDLE_BLOCKER);\n          updateState({ blockers });\n        },\n      });\n      return;\n    }\n\n    return await startNavigation(historyAction, nextLocation, {\n      submission,\n      // Send through the formData serialization error if we have one so we can\n      // render at the right error boundary after we match routes\n      pendingError: error,\n      preventScrollReset,\n      replace: opts && opts.replace,\n      enableViewTransition: opts && opts.viewTransition,\n      flushSync,\n    });\n  }\n\n  // Revalidate all current loaders.  If a navigation is in progress or if this\n  // is interrupted by a navigation, allow this to \"succeed\" by calling all\n  // loaders during the next loader round\n  function revalidate() {\n    interruptActiveLoads();\n    updateState({ revalidation: \"loading\" });\n\n    // If we're currently submitting an action, we don't need to start a new\n    // navigation, we'll just let the follow up loader execution call all loaders\n    if (state.navigation.state === \"submitting\") {\n      return;\n    }\n\n    // If we're currently in an idle state, start a new navigation for the current\n    // action/location and mark it as uninterrupted, which will skip the history\n    // update in completeNavigation\n    if (state.navigation.state === \"idle\") {\n      startNavigation(state.historyAction, state.location, {\n        startUninterruptedRevalidation: true,\n      });\n      return;\n    }\n\n    // Otherwise, if we're currently in a loading state, just start a new\n    // navigation to the navigation.location but do not trigger an uninterrupted\n    // revalidation so that history correctly updates once the navigation completes\n    startNavigation(\n      pendingAction || state.historyAction,\n      state.navigation.location,\n      {\n        overrideNavigation: state.navigation,\n        // Proxy through any rending view transition\n        enableViewTransition: pendingViewTransitionEnabled === true,\n      }\n    );\n  }\n\n  // Start a navigation to the given action/location.  Can optionally provide a\n  // overrideNavigation which will override the normalLoad in the case of a redirect\n  // navigation\n  async function startNavigation(\n    historyAction: HistoryAction,\n    location: Location,\n    opts?: {\n      initialHydration?: boolean;\n      submission?: Submission;\n      fetcherSubmission?: Submission;\n      overrideNavigation?: Navigation;\n      pendingError?: ErrorResponseImpl;\n      startUninterruptedRevalidation?: boolean;\n      preventScrollReset?: boolean;\n      replace?: boolean;\n      enableViewTransition?: boolean;\n      flushSync?: boolean;\n    }\n  ): Promise<void> {\n    // Abort any in-progress navigations and start a new one. Unset any ongoing\n    // uninterrupted revalidations unless told otherwise, since we want this\n    // new navigation to update history normally\n    pendingNavigationController && pendingNavigationController.abort();\n    pendingNavigationController = null;\n    pendingAction = historyAction;\n    isUninterruptedRevalidation =\n      (opts && opts.startUninterruptedRevalidation) === true;\n\n    // Save the current scroll position every time we start a new navigation,\n    // and track whether we should reset scroll on completion\n    saveScrollPosition(state.location, state.matches);\n    pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n    pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let loadingNavigation = opts && opts.overrideNavigation;\n    let matches =\n      opts?.initialHydration &&\n      state.matches &&\n      state.matches.length > 0 &&\n      !initialMatchesIsFOW\n        ? // `matchRoutes()` has already been called if we're in here via `router.initialize()`\n          state.matches\n        : matchRoutes(routesToUse, location, basename);\n    let flushSync = (opts && opts.flushSync) === true;\n\n    // Short circuit if it's only a hash change and not a revalidation or\n    // mutation submission.\n    //\n    // Ignore on initial page loads because since the initial hydration will always\n    // be \"same hash\".  For example, on /page#hash and submit a <Form method=\"post\">\n    // which will default to a navigation to /page\n    if (\n      matches &&\n      state.initialized &&\n      !isRevalidationRequired &&\n      isHashChangeOnly(state.location, location) &&\n      !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n    ) {\n      completeNavigation(location, { matches }, { flushSync });\n      return;\n    }\n\n    let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname);\n    if (fogOfWar.active && fogOfWar.matches) {\n      matches = fogOfWar.matches;\n    }\n\n    // Short circuit with a 404 on the root error boundary if we match nothing\n    if (!matches) {\n      let { error, notFoundMatches, route } = handleNavigational404(\n        location.pathname\n      );\n      completeNavigation(\n        location,\n        {\n          matches: notFoundMatches,\n          loaderData: {},\n          errors: {\n            [route.id]: error,\n          },\n        },\n        { flushSync }\n      );\n      return;\n    }\n\n    // Create a controller/Request for this navigation\n    pendingNavigationController = new AbortController();\n    let request = createClientSideRequest(\n      init.history,\n      location,\n      pendingNavigationController.signal,\n      opts && opts.submission\n    );\n    let pendingActionResult: PendingActionResult | undefined;\n\n    if (opts && opts.pendingError) {\n      // If we have a pendingError, it means the user attempted a GET submission\n      // with binary FormData so assign here and skip to handleLoaders.  That\n      // way we handle calling loaders above the boundary etc.  It's not really\n      // different from an actionError in that sense.\n      pendingActionResult = [\n        findNearestBoundary(matches).route.id,\n        { type: ResultType.error, error: opts.pendingError },\n      ];\n    } else if (\n      opts &&\n      opts.submission &&\n      isMutationMethod(opts.submission.formMethod)\n    ) {\n      // Call action if we received an action submission\n      let actionResult = await handleAction(\n        request,\n        location,\n        opts.submission,\n        matches,\n        fogOfWar.active,\n        { replace: opts.replace, flushSync }\n      );\n\n      if (actionResult.shortCircuited) {\n        return;\n      }\n\n      // If we received a 404 from handleAction, it's because we couldn't lazily\n      // discover the destination route so we don't want to call loaders\n      if (actionResult.pendingActionResult) {\n        let [routeId, result] = actionResult.pendingActionResult;\n        if (\n          isErrorResult(result) &&\n          isRouteErrorResponse(result.error) &&\n          result.error.status === 404\n        ) {\n          pendingNavigationController = null;\n\n          completeNavigation(location, {\n            matches: actionResult.matches,\n            loaderData: {},\n            errors: {\n              [routeId]: result.error,\n            },\n          });\n          return;\n        }\n      }\n\n      matches = actionResult.matches || matches;\n      pendingActionResult = actionResult.pendingActionResult;\n      loadingNavigation = getLoadingNavigation(location, opts.submission);\n      flushSync = false;\n      // No need to do fog of war matching again on loader execution\n      fogOfWar.active = false;\n\n      // Create a GET request for the loaders\n      request = createClientSideRequest(\n        init.history,\n        request.url,\n        request.signal\n      );\n    }\n\n    // Call loaders\n    let {\n      shortCircuited,\n      matches: updatedMatches,\n      loaderData,\n      errors,\n    } = await handleLoaders(\n      request,\n      location,\n      matches,\n      fogOfWar.active,\n      loadingNavigation,\n      opts && opts.submission,\n      opts && opts.fetcherSubmission,\n      opts && opts.replace,\n      opts && opts.initialHydration === true,\n      flushSync,\n      pendingActionResult\n    );\n\n    if (shortCircuited) {\n      return;\n    }\n\n    // Clean up now that the action/loaders have completed.  Don't clean up if\n    // we short circuited because pendingNavigationController will have already\n    // been assigned to a new controller for the next navigation\n    pendingNavigationController = null;\n\n    completeNavigation(location, {\n      matches: updatedMatches || matches,\n      ...getActionDataForCommit(pendingActionResult),\n      loaderData,\n      errors,\n    });\n  }\n\n  // Call the action matched by the leaf route for this navigation and handle\n  // redirects/errors\n  async function handleAction(\n    request: Request,\n    location: Location,\n    submission: Submission,\n    matches: AgnosticDataRouteMatch[],\n    isFogOfWar: boolean,\n    opts: { replace?: boolean; flushSync?: boolean } = {}\n  ): Promise<HandleActionResult> {\n    interruptActiveLoads();\n\n    // Put us in a submitting state\n    let navigation = getSubmittingNavigation(location, submission);\n    updateState({ navigation }, { flushSync: opts.flushSync === true });\n\n    if (isFogOfWar) {\n      let discoverResult = await discoverRoutes(\n        matches,\n        location.pathname,\n        request.signal\n      );\n      if (discoverResult.type === \"aborted\") {\n        return { shortCircuited: true };\n      } else if (discoverResult.type === \"error\") {\n        let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n          .route.id;\n        return {\n          matches: discoverResult.partialMatches,\n          pendingActionResult: [\n            boundaryId,\n            {\n              type: ResultType.error,\n              error: discoverResult.error,\n            },\n          ],\n        };\n      } else if (!discoverResult.matches) {\n        let { notFoundMatches, error, route } = handleNavigational404(\n          location.pathname\n        );\n        return {\n          matches: notFoundMatches,\n          pendingActionResult: [\n            route.id,\n            {\n              type: ResultType.error,\n              error,\n            },\n          ],\n        };\n      } else {\n        matches = discoverResult.matches;\n      }\n    }\n\n    // Call our action and get the result\n    let result: DataResult;\n    let actionMatch = getTargetMatch(matches, location);\n\n    if (!actionMatch.route.action && !actionMatch.route.lazy) {\n      result = {\n        type: ResultType.error,\n        error: getInternalRouterError(405, {\n          method: request.method,\n          pathname: location.pathname,\n          routeId: actionMatch.route.id,\n        }),\n      };\n    } else {\n      let results = await callDataStrategy(\n        \"action\",\n        state,\n        request,\n        [actionMatch],\n        matches,\n        null\n      );\n      result = results[actionMatch.route.id];\n\n      if (request.signal.aborted) {\n        return { shortCircuited: true };\n      }\n    }\n\n    if (isRedirectResult(result)) {\n      let replace: boolean;\n      if (opts && opts.replace != null) {\n        replace = opts.replace;\n      } else {\n        // If the user didn't explicity indicate replace behavior, replace if\n        // we redirected to the exact same location we're currently at to avoid\n        // double back-buttons\n        let location = normalizeRedirectLocation(\n          result.response.headers.get(\"Location\")!,\n          new URL(request.url),\n          basename\n        );\n        replace = location === state.location.pathname + state.location.search;\n      }\n      await startRedirectNavigation(request, result, true, {\n        submission,\n        replace,\n      });\n      return { shortCircuited: true };\n    }\n\n    if (isDeferredResult(result)) {\n      throw getInternalRouterError(400, { type: \"defer-action\" });\n    }\n\n    if (isErrorResult(result)) {\n      // Store off the pending error - we use it to determine which loaders\n      // to call and will commit it when we complete the navigation\n      let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n      // By default, all submissions to the current location are REPLACE\n      // navigations, but if the action threw an error that'll be rendered in\n      // an errorElement, we fall back to PUSH so that the user can use the\n      // back button to get back to the pre-submission form location to try\n      // again\n      if ((opts && opts.replace) !== true) {\n        pendingAction = HistoryAction.Push;\n      }\n\n      return {\n        matches,\n        pendingActionResult: [boundaryMatch.route.id, result],\n      };\n    }\n\n    return {\n      matches,\n      pendingActionResult: [actionMatch.route.id, result],\n    };\n  }\n\n  // Call all applicable loaders for the given matches, handling redirects,\n  // errors, etc.\n  async function handleLoaders(\n    request: Request,\n    location: Location,\n    matches: AgnosticDataRouteMatch[],\n    isFogOfWar: boolean,\n    overrideNavigation?: Navigation,\n    submission?: Submission,\n    fetcherSubmission?: Submission,\n    replace?: boolean,\n    initialHydration?: boolean,\n    flushSync?: boolean,\n    pendingActionResult?: PendingActionResult\n  ): Promise<HandleLoadersResult> {\n    // Figure out the right navigation we want to use for data loading\n    let loadingNavigation =\n      overrideNavigation || getLoadingNavigation(location, submission);\n\n    // If this was a redirect from an action we don't have a \"submission\" but\n    // we have it on the loading navigation so use that if available\n    let activeSubmission =\n      submission ||\n      fetcherSubmission ||\n      getSubmissionFromNavigation(loadingNavigation);\n\n    // If this is an uninterrupted revalidation, we remain in our current idle\n    // state.  If not, we need to switch to our loading state and load data,\n    // preserving any new action data or existing action data (in the case of\n    // a revalidation interrupting an actionReload)\n    // If we have partialHydration enabled, then don't update the state for the\n    // initial data load since it's not a \"navigation\"\n    let shouldUpdateNavigationState =\n      !isUninterruptedRevalidation &&\n      (!future.v7_partialHydration || !initialHydration);\n\n    // When fog of war is enabled, we enter our `loading` state earlier so we\n    // can discover new routes during the `loading` state.  We skip this if\n    // we've already run actions since we would have done our matching already.\n    // If the children() function threw then, we want to proceed with the\n    // partial matches it discovered.\n    if (isFogOfWar) {\n      if (shouldUpdateNavigationState) {\n        let actionData = getUpdatedActionData(pendingActionResult);\n        updateState(\n          {\n            navigation: loadingNavigation,\n            ...(actionData !== undefined ? { actionData } : {}),\n          },\n          {\n            flushSync,\n          }\n        );\n      }\n\n      let discoverResult = await discoverRoutes(\n        matches,\n        location.pathname,\n        request.signal\n      );\n\n      if (discoverResult.type === \"aborted\") {\n        return { shortCircuited: true };\n      } else if (discoverResult.type === \"error\") {\n        let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n          .route.id;\n        return {\n          matches: discoverResult.partialMatches,\n          loaderData: {},\n          errors: {\n            [boundaryId]: discoverResult.error,\n          },\n        };\n      } else if (!discoverResult.matches) {\n        let { error, notFoundMatches, route } = handleNavigational404(\n          location.pathname\n        );\n        return {\n          matches: notFoundMatches,\n          loaderData: {},\n          errors: {\n            [route.id]: error,\n          },\n        };\n      } else {\n        matches = discoverResult.matches;\n      }\n    }\n\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n      init.history,\n      state,\n      matches,\n      activeSubmission,\n      location,\n      future.v7_partialHydration && initialHydration === true,\n      future.v7_skipActionErrorRevalidation,\n      isRevalidationRequired,\n      cancelledDeferredRoutes,\n      cancelledFetcherLoads,\n      deletedFetchers,\n      fetchLoadMatches,\n      fetchRedirectIds,\n      routesToUse,\n      basename,\n      pendingActionResult\n    );\n\n    // Cancel pending deferreds for no-longer-matched routes or routes we're\n    // about to reload.  Note that if this is an action reload we would have\n    // already cancelled all pending deferreds so this would be a no-op\n    cancelActiveDeferreds(\n      (routeId) =>\n        !(matches && matches.some((m) => m.route.id === routeId)) ||\n        (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n    );\n\n    pendingNavigationLoadId = ++incrementingLoadId;\n\n    // Short circuit if we have no loaders to run\n    if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n      let updatedFetchers = markFetchRedirectsDone();\n      completeNavigation(\n        location,\n        {\n          matches,\n          loaderData: {},\n          // Commit pending error if we're short circuiting\n          errors:\n            pendingActionResult && isErrorResult(pendingActionResult[1])\n              ? { [pendingActionResult[0]]: pendingActionResult[1].error }\n              : null,\n          ...getActionDataForCommit(pendingActionResult),\n          ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n        },\n        { flushSync }\n      );\n      return { shortCircuited: true };\n    }\n\n    if (shouldUpdateNavigationState) {\n      let updates: Partial<RouterState> = {};\n      if (!isFogOfWar) {\n        // Only update navigation/actionNData if we didn't already do it above\n        updates.navigation = loadingNavigation;\n        let actionData = getUpdatedActionData(pendingActionResult);\n        if (actionData !== undefined) {\n          updates.actionData = actionData;\n        }\n      }\n      if (revalidatingFetchers.length > 0) {\n        updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers);\n      }\n      updateState(updates, { flushSync });\n    }\n\n    revalidatingFetchers.forEach((rf) => {\n      abortFetcher(rf.key);\n      if (rf.controller) {\n        // Fetchers use an independent AbortController so that aborting a fetcher\n        // (via deleteFetcher) does not abort the triggering navigation that\n        // triggered the revalidation\n        fetchControllers.set(rf.key, rf.controller);\n      }\n    });\n\n    // Proxy navigation abort through to revalidation fetchers\n    let abortPendingFetchRevalidations = () =>\n      revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n    if (pendingNavigationController) {\n      pendingNavigationController.signal.addEventListener(\n        \"abort\",\n        abortPendingFetchRevalidations\n      );\n    }\n\n    let { loaderResults, fetcherResults } =\n      await callLoadersAndMaybeResolveData(\n        state,\n        matches,\n        matchesToLoad,\n        revalidatingFetchers,\n        request\n      );\n\n    if (request.signal.aborted) {\n      return { shortCircuited: true };\n    }\n\n    // Clean up _after_ loaders have completed.  Don't clean up if we short\n    // circuited because fetchControllers would have been aborted and\n    // reassigned to new controllers for the next navigation\n    if (pendingNavigationController) {\n      pendingNavigationController.signal.removeEventListener(\n        \"abort\",\n        abortPendingFetchRevalidations\n      );\n    }\n\n    revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n    // If any loaders returned a redirect Response, start a new REPLACE navigation\n    let redirect = findRedirect(loaderResults);\n    if (redirect) {\n      await startRedirectNavigation(request, redirect.result, true, {\n        replace,\n      });\n      return { shortCircuited: true };\n    }\n\n    redirect = findRedirect(fetcherResults);\n    if (redirect) {\n      // If this redirect came from a fetcher make sure we mark it in\n      // fetchRedirectIds so it doesn't get revalidated on the next set of\n      // loader executions\n      fetchRedirectIds.add(redirect.key);\n      await startRedirectNavigation(request, redirect.result, true, {\n        replace,\n      });\n      return { shortCircuited: true };\n    }\n\n    // Process and commit output from loaders\n    let { loaderData, errors } = processLoaderData(\n      state,\n      matches,\n      loaderResults,\n      pendingActionResult,\n      revalidatingFetchers,\n      fetcherResults,\n      activeDeferreds\n    );\n\n    // Wire up subscribers to update loaderData as promises settle\n    activeDeferreds.forEach((deferredData, routeId) => {\n      deferredData.subscribe((aborted) => {\n        // Note: No need to updateState here since the TrackedPromise on\n        // loaderData is stable across resolve/reject\n        // Remove this instance if we were aborted or if promises have settled\n        if (aborted || deferredData.done) {\n          activeDeferreds.delete(routeId);\n        }\n      });\n    });\n\n    // Preserve SSR errors during partial hydration\n    if (future.v7_partialHydration && initialHydration && state.errors) {\n      errors = { ...state.errors, ...errors };\n    }\n\n    let updatedFetchers = markFetchRedirectsDone();\n    let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n    let shouldUpdateFetchers =\n      updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n    return {\n      matches,\n      loaderData,\n      errors,\n      ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n    };\n  }\n\n  function getUpdatedActionData(\n    pendingActionResult: PendingActionResult | undefined\n  ): Record<string, RouteData> | null | undefined {\n    if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n      // This is cast to `any` currently because `RouteData`uses any and it\n      // would be a breaking change to use any.\n      // TODO: v7 - change `RouteData` to use `unknown` instead of `any`\n      return {\n        [pendingActionResult[0]]: pendingActionResult[1].data as any,\n      };\n    } else if (state.actionData) {\n      if (Object.keys(state.actionData).length === 0) {\n        return null;\n      } else {\n        return state.actionData;\n      }\n    }\n  }\n\n  function getUpdatedRevalidatingFetchers(\n    revalidatingFetchers: RevalidatingFetcher[]\n  ) {\n    revalidatingFetchers.forEach((rf) => {\n      let fetcher = state.fetchers.get(rf.key);\n      let revalidatingFetcher = getLoadingFetcher(\n        undefined,\n        fetcher ? fetcher.data : undefined\n      );\n      state.fetchers.set(rf.key, revalidatingFetcher);\n    });\n    return new Map(state.fetchers);\n  }\n\n  // Trigger a fetcher load/submit for the given fetcher key\n  function fetch(\n    key: string,\n    routeId: string,\n    href: string | null,\n    opts?: RouterFetchOptions\n  ) {\n    if (isServer) {\n      throw new Error(\n        \"router.fetch() was called during the server render, but it shouldn't be. \" +\n          \"You are likely calling a useFetcher() method in the body of your component. \" +\n          \"Try moving it to a useEffect or a callback.\"\n      );\n    }\n\n    abortFetcher(key);\n\n    let flushSync = (opts && opts.flushSync) === true;\n\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let normalizedPath = normalizeTo(\n      state.location,\n      state.matches,\n      basename,\n      future.v7_prependBasename,\n      href,\n      future.v7_relativeSplatPath,\n      routeId,\n      opts?.relative\n    );\n    let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n    let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath);\n    if (fogOfWar.active && fogOfWar.matches) {\n      matches = fogOfWar.matches;\n    }\n\n    if (!matches) {\n      setFetcherError(\n        key,\n        routeId,\n        getInternalRouterError(404, { pathname: normalizedPath }),\n        { flushSync }\n      );\n      return;\n    }\n\n    let { path, submission, error } = normalizeNavigateOptions(\n      future.v7_normalizeFormMethod,\n      true,\n      normalizedPath,\n      opts\n    );\n\n    if (error) {\n      setFetcherError(key, routeId, error, { flushSync });\n      return;\n    }\n\n    let match = getTargetMatch(matches, path);\n\n    let preventScrollReset = (opts && opts.preventScrollReset) === true;\n\n    if (submission && isMutationMethod(submission.formMethod)) {\n      handleFetcherAction(\n        key,\n        routeId,\n        path,\n        match,\n        matches,\n        fogOfWar.active,\n        flushSync,\n        preventScrollReset,\n        submission\n      );\n      return;\n    }\n\n    // Store off the match so we can call it's shouldRevalidate on subsequent\n    // revalidations\n    fetchLoadMatches.set(key, { routeId, path });\n    handleFetcherLoader(\n      key,\n      routeId,\n      path,\n      match,\n      matches,\n      fogOfWar.active,\n      flushSync,\n      preventScrollReset,\n      submission\n    );\n  }\n\n  // Call the action for the matched fetcher.submit(), and then handle redirects,\n  // errors, and revalidation\n  async function handleFetcherAction(\n    key: string,\n    routeId: string,\n    path: string,\n    match: AgnosticDataRouteMatch,\n    requestMatches: AgnosticDataRouteMatch[],\n    isFogOfWar: boolean,\n    flushSync: boolean,\n    preventScrollReset: boolean,\n    submission: Submission\n  ) {\n    interruptActiveLoads();\n    fetchLoadMatches.delete(key);\n\n    function detectAndHandle405Error(m: AgnosticDataRouteMatch) {\n      if (!m.route.action && !m.route.lazy) {\n        let error = getInternalRouterError(405, {\n          method: submission.formMethod,\n          pathname: path,\n          routeId: routeId,\n        });\n        setFetcherError(key, routeId, error, { flushSync });\n        return true;\n      }\n      return false;\n    }\n\n    if (!isFogOfWar && detectAndHandle405Error(match)) {\n      return;\n    }\n\n    // Put this fetcher into it's submitting state\n    let existingFetcher = state.fetchers.get(key);\n    updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n      flushSync,\n    });\n\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(\n      init.history,\n      path,\n      abortController.signal,\n      submission\n    );\n\n    if (isFogOfWar) {\n      let discoverResult = await discoverRoutes(\n        requestMatches,\n        new URL(fetchRequest.url).pathname,\n        fetchRequest.signal,\n        key\n      );\n\n      if (discoverResult.type === \"aborted\") {\n        return;\n      } else if (discoverResult.type === \"error\") {\n        setFetcherError(key, routeId, discoverResult.error, { flushSync });\n        return;\n      } else if (!discoverResult.matches) {\n        setFetcherError(\n          key,\n          routeId,\n          getInternalRouterError(404, { pathname: path }),\n          { flushSync }\n        );\n        return;\n      } else {\n        requestMatches = discoverResult.matches;\n        match = getTargetMatch(requestMatches, path);\n\n        if (detectAndHandle405Error(match)) {\n          return;\n        }\n      }\n    }\n\n    // Call the action for the fetcher\n    fetchControllers.set(key, abortController);\n\n    let originatingLoadId = incrementingLoadId;\n    let actionResults = await callDataStrategy(\n      \"action\",\n      state,\n      fetchRequest,\n      [match],\n      requestMatches,\n      key\n    );\n    let actionResult = actionResults[match.route.id];\n\n    if (fetchRequest.signal.aborted) {\n      // We can delete this so long as we weren't aborted by our own fetcher\n      // re-submit which would have put _new_ controller is in fetchControllers\n      if (fetchControllers.get(key) === abortController) {\n        fetchControllers.delete(key);\n      }\n      return;\n    }\n\n    // When using v7_fetcherPersist, we don't want errors bubbling up to the UI\n    // or redirects processed for unmounted fetchers so we just revert them to\n    // idle\n    if (future.v7_fetcherPersist && deletedFetchers.has(key)) {\n      if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n        updateFetcherState(key, getDoneFetcher(undefined));\n        return;\n      }\n      // Let SuccessResult's fall through for revalidation\n    } else {\n      if (isRedirectResult(actionResult)) {\n        fetchControllers.delete(key);\n        if (pendingNavigationLoadId > originatingLoadId) {\n          // A new navigation was kicked off after our action started, so that\n          // should take precedence over this redirect navigation.  We already\n          // set isRevalidationRequired so all loaders for the new route should\n          // fire unless opted out via shouldRevalidate\n          updateFetcherState(key, getDoneFetcher(undefined));\n          return;\n        } else {\n          fetchRedirectIds.add(key);\n          updateFetcherState(key, getLoadingFetcher(submission));\n          return startRedirectNavigation(fetchRequest, actionResult, false, {\n            fetcherSubmission: submission,\n            preventScrollReset,\n          });\n        }\n      }\n\n      // Process any non-redirect errors thrown\n      if (isErrorResult(actionResult)) {\n        setFetcherError(key, routeId, actionResult.error);\n        return;\n      }\n    }\n\n    if (isDeferredResult(actionResult)) {\n      throw getInternalRouterError(400, { type: \"defer-action\" });\n    }\n\n    // Start the data load for current matches, or the next location if we're\n    // in the middle of a navigation\n    let nextLocation = state.navigation.location || state.location;\n    let revalidationRequest = createClientSideRequest(\n      init.history,\n      nextLocation,\n      abortController.signal\n    );\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let matches =\n      state.navigation.state !== \"idle\"\n        ? matchRoutes(routesToUse, state.navigation.location, basename)\n        : state.matches;\n\n    invariant(matches, \"Didn't find any matches after fetcher action\");\n\n    let loadId = ++incrementingLoadId;\n    fetchReloadIds.set(key, loadId);\n\n    let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n    state.fetchers.set(key, loadFetcher);\n\n    let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n      init.history,\n      state,\n      matches,\n      submission,\n      nextLocation,\n      false,\n      future.v7_skipActionErrorRevalidation,\n      isRevalidationRequired,\n      cancelledDeferredRoutes,\n      cancelledFetcherLoads,\n      deletedFetchers,\n      fetchLoadMatches,\n      fetchRedirectIds,\n      routesToUse,\n      basename,\n      [match.route.id, actionResult]\n    );\n\n    // Put all revalidating fetchers into the loading state, except for the\n    // current fetcher which we want to keep in it's current loading state which\n    // contains it's action submission info + action data\n    revalidatingFetchers\n      .filter((rf) => rf.key !== key)\n      .forEach((rf) => {\n        let staleKey = rf.key;\n        let existingFetcher = state.fetchers.get(staleKey);\n        let revalidatingFetcher = getLoadingFetcher(\n          undefined,\n          existingFetcher ? existingFetcher.data : undefined\n        );\n        state.fetchers.set(staleKey, revalidatingFetcher);\n        abortFetcher(staleKey);\n        if (rf.controller) {\n          fetchControllers.set(staleKey, rf.controller);\n        }\n      });\n\n    updateState({ fetchers: new Map(state.fetchers) });\n\n    let abortPendingFetchRevalidations = () =>\n      revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n    abortController.signal.addEventListener(\n      \"abort\",\n      abortPendingFetchRevalidations\n    );\n\n    let { loaderResults, fetcherResults } =\n      await callLoadersAndMaybeResolveData(\n        state,\n        matches,\n        matchesToLoad,\n        revalidatingFetchers,\n        revalidationRequest\n      );\n\n    if (abortController.signal.aborted) {\n      return;\n    }\n\n    abortController.signal.removeEventListener(\n      \"abort\",\n      abortPendingFetchRevalidations\n    );\n\n    fetchReloadIds.delete(key);\n    fetchControllers.delete(key);\n    revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n    let redirect = findRedirect(loaderResults);\n    if (redirect) {\n      return startRedirectNavigation(\n        revalidationRequest,\n        redirect.result,\n        false,\n        { preventScrollReset }\n      );\n    }\n\n    redirect = findRedirect(fetcherResults);\n    if (redirect) {\n      // If this redirect came from a fetcher make sure we mark it in\n      // fetchRedirectIds so it doesn't get revalidated on the next set of\n      // loader executions\n      fetchRedirectIds.add(redirect.key);\n      return startRedirectNavigation(\n        revalidationRequest,\n        redirect.result,\n        false,\n        { preventScrollReset }\n      );\n    }\n\n    // Process and commit output from loaders\n    let { loaderData, errors } = processLoaderData(\n      state,\n      matches,\n      loaderResults,\n      undefined,\n      revalidatingFetchers,\n      fetcherResults,\n      activeDeferreds\n    );\n\n    // Since we let revalidations complete even if the submitting fetcher was\n    // deleted, only put it back to idle if it hasn't been deleted\n    if (state.fetchers.has(key)) {\n      let doneFetcher = getDoneFetcher(actionResult.data);\n      state.fetchers.set(key, doneFetcher);\n    }\n\n    abortStaleFetchLoads(loadId);\n\n    // If we are currently in a navigation loading state and this fetcher is\n    // more recent than the navigation, we want the newer data so abort the\n    // navigation and complete it with the fetcher data\n    if (\n      state.navigation.state === \"loading\" &&\n      loadId > pendingNavigationLoadId\n    ) {\n      invariant(pendingAction, \"Expected pending action\");\n      pendingNavigationController && pendingNavigationController.abort();\n\n      completeNavigation(state.navigation.location, {\n        matches,\n        loaderData,\n        errors,\n        fetchers: new Map(state.fetchers),\n      });\n    } else {\n      // otherwise just update with the fetcher data, preserving any existing\n      // loaderData for loaders that did not need to reload.  We have to\n      // manually merge here since we aren't going through completeNavigation\n      updateState({\n        errors,\n        loaderData: mergeLoaderData(\n          state.loaderData,\n          loaderData,\n          matches,\n          errors\n        ),\n        fetchers: new Map(state.fetchers),\n      });\n      isRevalidationRequired = false;\n    }\n  }\n\n  // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n  async function handleFetcherLoader(\n    key: string,\n    routeId: string,\n    path: string,\n    match: AgnosticDataRouteMatch,\n    matches: AgnosticDataRouteMatch[],\n    isFogOfWar: boolean,\n    flushSync: boolean,\n    preventScrollReset: boolean,\n    submission?: Submission\n  ) {\n    let existingFetcher = state.fetchers.get(key);\n    updateFetcherState(\n      key,\n      getLoadingFetcher(\n        submission,\n        existingFetcher ? existingFetcher.data : undefined\n      ),\n      { flushSync }\n    );\n\n    let abortController = new AbortController();\n    let fetchRequest = createClientSideRequest(\n      init.history,\n      path,\n      abortController.signal\n    );\n\n    if (isFogOfWar) {\n      let discoverResult = await discoverRoutes(\n        matches,\n        new URL(fetchRequest.url).pathname,\n        fetchRequest.signal,\n        key\n      );\n\n      if (discoverResult.type === \"aborted\") {\n        return;\n      } else if (discoverResult.type === \"error\") {\n        setFetcherError(key, routeId, discoverResult.error, { flushSync });\n        return;\n      } else if (!discoverResult.matches) {\n        setFetcherError(\n          key,\n          routeId,\n          getInternalRouterError(404, { pathname: path }),\n          { flushSync }\n        );\n        return;\n      } else {\n        matches = discoverResult.matches;\n        match = getTargetMatch(matches, path);\n      }\n    }\n\n    // Call the loader for this fetcher route match\n    fetchControllers.set(key, abortController);\n\n    let originatingLoadId = incrementingLoadId;\n    let results = await callDataStrategy(\n      \"loader\",\n      state,\n      fetchRequest,\n      [match],\n      matches,\n      key\n    );\n    let result = results[match.route.id];\n\n    // Deferred isn't supported for fetcher loads, await everything and treat it\n    // as a normal load.  resolveDeferredData will return undefined if this\n    // fetcher gets aborted, so we just leave result untouched and short circuit\n    // below if that happens\n    if (isDeferredResult(result)) {\n      result =\n        (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n        result;\n    }\n\n    // We can delete this so long as we weren't aborted by our our own fetcher\n    // re-load which would have put _new_ controller is in fetchControllers\n    if (fetchControllers.get(key) === abortController) {\n      fetchControllers.delete(key);\n    }\n\n    if (fetchRequest.signal.aborted) {\n      return;\n    }\n\n    // We don't want errors bubbling up or redirects followed for unmounted\n    // fetchers, so short circuit here if it was removed from the UI\n    if (deletedFetchers.has(key)) {\n      updateFetcherState(key, getDoneFetcher(undefined));\n      return;\n    }\n\n    // If the loader threw a redirect Response, start a new REPLACE navigation\n    if (isRedirectResult(result)) {\n      if (pendingNavigationLoadId > originatingLoadId) {\n        // A new navigation was kicked off after our loader started, so that\n        // should take precedence over this redirect navigation\n        updateFetcherState(key, getDoneFetcher(undefined));\n        return;\n      } else {\n        fetchRedirectIds.add(key);\n        await startRedirectNavigation(fetchRequest, result, false, {\n          preventScrollReset,\n        });\n        return;\n      }\n    }\n\n    // Process any non-redirect errors thrown\n    if (isErrorResult(result)) {\n      setFetcherError(key, routeId, result.error);\n      return;\n    }\n\n    invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n    // Put the fetcher back into an idle state\n    updateFetcherState(key, getDoneFetcher(result.data));\n  }\n\n  /**\n   * Utility function to handle redirects returned from an action or loader.\n   * Normally, a redirect \"replaces\" the navigation that triggered it.  So, for\n   * example:\n   *\n   *  - user is on /a\n   *  - user clicks a link to /b\n   *  - loader for /b redirects to /c\n   *\n   * In a non-JS app the browser would track the in-flight navigation to /b and\n   * then replace it with /c when it encountered the redirect response.  In\n   * the end it would only ever update the URL bar with /c.\n   *\n   * In client-side routing using pushState/replaceState, we aim to emulate\n   * this behavior and we also do not update history until the end of the\n   * navigation (including processed redirects).  This means that we never\n   * actually touch history until we've processed redirects, so we just use\n   * the history action from the original navigation (PUSH or REPLACE).\n   */\n  async function startRedirectNavigation(\n    request: Request,\n    redirect: RedirectResult,\n    isNavigation: boolean,\n    {\n      submission,\n      fetcherSubmission,\n      preventScrollReset,\n      replace,\n    }: {\n      submission?: Submission;\n      fetcherSubmission?: Submission;\n      preventScrollReset?: boolean;\n      replace?: boolean;\n    } = {}\n  ) {\n    if (redirect.response.headers.has(\"X-Remix-Revalidate\")) {\n      isRevalidationRequired = true;\n    }\n\n    let location = redirect.response.headers.get(\"Location\");\n    invariant(location, \"Expected a Location header on the redirect Response\");\n    location = normalizeRedirectLocation(\n      location,\n      new URL(request.url),\n      basename\n    );\n    let redirectLocation = createLocation(state.location, location, {\n      _isRedirect: true,\n    });\n\n    if (isBrowser) {\n      let isDocumentReload = false;\n\n      if (redirect.response.headers.has(\"X-Remix-Reload-Document\")) {\n        // Hard reload if the response contained X-Remix-Reload-Document\n        isDocumentReload = true;\n      } else if (ABSOLUTE_URL_REGEX.test(location)) {\n        const url = init.history.createURL(location);\n        isDocumentReload =\n          // Hard reload if it's an absolute URL to a new origin\n          url.origin !== routerWindow.location.origin ||\n          // Hard reload if it's an absolute URL that does not match our basename\n          stripBasename(url.pathname, basename) == null;\n      }\n\n      if (isDocumentReload) {\n        if (replace) {\n          routerWindow.location.replace(location);\n        } else {\n          routerWindow.location.assign(location);\n        }\n        return;\n      }\n    }\n\n    // There's no need to abort on redirects, since we don't detect the\n    // redirect until the action/loaders have settled\n    pendingNavigationController = null;\n\n    let redirectHistoryAction =\n      replace === true || redirect.response.headers.has(\"X-Remix-Replace\")\n        ? HistoryAction.Replace\n        : HistoryAction.Push;\n\n    // Use the incoming submission if provided, fallback on the active one in\n    // state.navigation\n    let { formMethod, formAction, formEncType } = state.navigation;\n    if (\n      !submission &&\n      !fetcherSubmission &&\n      formMethod &&\n      formAction &&\n      formEncType\n    ) {\n      submission = getSubmissionFromNavigation(state.navigation);\n    }\n\n    // If this was a 307/308 submission we want to preserve the HTTP method and\n    // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n    // redirected location\n    let activeSubmission = submission || fetcherSubmission;\n    if (\n      redirectPreserveMethodStatusCodes.has(redirect.response.status) &&\n      activeSubmission &&\n      isMutationMethod(activeSubmission.formMethod)\n    ) {\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        submission: {\n          ...activeSubmission,\n          formAction: location,\n        },\n        // Preserve these flags across redirects\n        preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n        enableViewTransition: isNavigation\n          ? pendingViewTransitionEnabled\n          : undefined,\n      });\n    } else {\n      // If we have a navigation submission, we will preserve it through the\n      // redirect navigation\n      let overrideNavigation = getLoadingNavigation(\n        redirectLocation,\n        submission\n      );\n      await startNavigation(redirectHistoryAction, redirectLocation, {\n        overrideNavigation,\n        // Send fetcher submissions through for shouldRevalidate\n        fetcherSubmission,\n        // Preserve these flags across redirects\n        preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n        enableViewTransition: isNavigation\n          ? pendingViewTransitionEnabled\n          : undefined,\n      });\n    }\n  }\n\n  // Utility wrapper for calling dataStrategy client-side without having to\n  // pass around the manifest, mapRouteProperties, etc.\n  async function callDataStrategy(\n    type: \"loader\" | \"action\",\n    state: RouterState,\n    request: Request,\n    matchesToLoad: AgnosticDataRouteMatch[],\n    matches: AgnosticDataRouteMatch[],\n    fetcherKey: string | null\n  ): Promise<Record<string, DataResult>> {\n    let results: Record<string, DataStrategyResult>;\n    let dataResults: Record<string, DataResult> = {};\n    try {\n      results = await callDataStrategyImpl(\n        dataStrategyImpl,\n        type,\n        state,\n        request,\n        matchesToLoad,\n        matches,\n        fetcherKey,\n        manifest,\n        mapRouteProperties\n      );\n    } catch (e) {\n      // If the outer dataStrategy method throws, just return the error for all\n      // matches - and it'll naturally bubble to the root\n      matchesToLoad.forEach((m) => {\n        dataResults[m.route.id] = {\n          type: ResultType.error,\n          error: e,\n        };\n      });\n      return dataResults;\n    }\n\n    for (let [routeId, result] of Object.entries(results)) {\n      if (isRedirectDataStrategyResultResult(result)) {\n        let response = result.result as Response;\n        dataResults[routeId] = {\n          type: ResultType.redirect,\n          response: normalizeRelativeRoutingRedirectResponse(\n            response,\n            request,\n            routeId,\n            matches,\n            basename,\n            future.v7_relativeSplatPath\n          ),\n        };\n      } else {\n        dataResults[routeId] = await convertDataStrategyResultToDataResult(\n          result\n        );\n      }\n    }\n\n    return dataResults;\n  }\n\n  async function callLoadersAndMaybeResolveData(\n    state: RouterState,\n    matches: AgnosticDataRouteMatch[],\n    matchesToLoad: AgnosticDataRouteMatch[],\n    fetchersToLoad: RevalidatingFetcher[],\n    request: Request\n  ) {\n    let currentMatches = state.matches;\n\n    // Kick off loaders and fetchers in parallel\n    let loaderResultsPromise = callDataStrategy(\n      \"loader\",\n      state,\n      request,\n      matchesToLoad,\n      matches,\n      null\n    );\n\n    let fetcherResultsPromise = Promise.all(\n      fetchersToLoad.map(async (f) => {\n        if (f.matches && f.match && f.controller) {\n          let results = await callDataStrategy(\n            \"loader\",\n            state,\n            createClientSideRequest(init.history, f.path, f.controller.signal),\n            [f.match],\n            f.matches,\n            f.key\n          );\n          let result = results[f.match.route.id];\n          // Fetcher results are keyed by fetcher key from here on out, not routeId\n          return { [f.key]: result };\n        } else {\n          return Promise.resolve({\n            [f.key]: {\n              type: ResultType.error,\n              error: getInternalRouterError(404, {\n                pathname: f.path,\n              }),\n            } as ErrorResult,\n          });\n        }\n      })\n    );\n\n    let loaderResults = await loaderResultsPromise;\n    let fetcherResults = (await fetcherResultsPromise).reduce(\n      (acc, r) => Object.assign(acc, r),\n      {}\n    );\n\n    await Promise.all([\n      resolveNavigationDeferredResults(\n        matches,\n        loaderResults,\n        request.signal,\n        currentMatches,\n        state.loaderData\n      ),\n      resolveFetcherDeferredResults(matches, fetcherResults, fetchersToLoad),\n    ]);\n\n    return {\n      loaderResults,\n      fetcherResults,\n    };\n  }\n\n  function interruptActiveLoads() {\n    // Every interruption triggers a revalidation\n    isRevalidationRequired = true;\n\n    // Cancel pending route-level deferreds and mark cancelled routes for\n    // revalidation\n    cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n    // Abort in-flight fetcher loads\n    fetchLoadMatches.forEach((_, key) => {\n      if (fetchControllers.has(key)) {\n        cancelledFetcherLoads.add(key);\n      }\n      abortFetcher(key);\n    });\n  }\n\n  function updateFetcherState(\n    key: string,\n    fetcher: Fetcher,\n    opts: { flushSync?: boolean } = {}\n  ) {\n    state.fetchers.set(key, fetcher);\n    updateState(\n      { fetchers: new Map(state.fetchers) },\n      { flushSync: (opts && opts.flushSync) === true }\n    );\n  }\n\n  function setFetcherError(\n    key: string,\n    routeId: string,\n    error: any,\n    opts: { flushSync?: boolean } = {}\n  ) {\n    let boundaryMatch = findNearestBoundary(state.matches, routeId);\n    deleteFetcher(key);\n    updateState(\n      {\n        errors: {\n          [boundaryMatch.route.id]: error,\n        },\n        fetchers: new Map(state.fetchers),\n      },\n      { flushSync: (opts && opts.flushSync) === true }\n    );\n  }\n\n  function getFetcher<TData = any>(key: string): Fetcher<TData> {\n    activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n    // If this fetcher was previously marked for deletion, unmark it since we\n    // have a new instance\n    if (deletedFetchers.has(key)) {\n      deletedFetchers.delete(key);\n    }\n    return state.fetchers.get(key) || IDLE_FETCHER;\n  }\n\n  function deleteFetcher(key: string): void {\n    let fetcher = state.fetchers.get(key);\n    // Don't abort the controller if this is a deletion of a fetcher.submit()\n    // in it's loading phase since - we don't want to abort the corresponding\n    // revalidation and want them to complete and land\n    if (\n      fetchControllers.has(key) &&\n      !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n    ) {\n      abortFetcher(key);\n    }\n    fetchLoadMatches.delete(key);\n    fetchReloadIds.delete(key);\n    fetchRedirectIds.delete(key);\n\n    // If we opted into the flag we can clear this now since we're calling\n    // deleteFetcher() at the end of updateState() and we've already handed the\n    // deleted fetcher keys off to the data layer.\n    // If not, we're eagerly calling deleteFetcher() and we need to keep this\n    // Set populated until the next updateState call, and we'll clear\n    // `deletedFetchers` then\n    if (future.v7_fetcherPersist) {\n      deletedFetchers.delete(key);\n    }\n\n    cancelledFetcherLoads.delete(key);\n    state.fetchers.delete(key);\n  }\n\n  function deleteFetcherAndUpdateState(key: string): void {\n    let count = (activeFetchers.get(key) || 0) - 1;\n    if (count <= 0) {\n      activeFetchers.delete(key);\n      deletedFetchers.add(key);\n      if (!future.v7_fetcherPersist) {\n        deleteFetcher(key);\n      }\n    } else {\n      activeFetchers.set(key, count);\n    }\n\n    updateState({ fetchers: new Map(state.fetchers) });\n  }\n\n  function abortFetcher(key: string) {\n    let controller = fetchControllers.get(key);\n    if (controller) {\n      controller.abort();\n      fetchControllers.delete(key);\n    }\n  }\n\n  function markFetchersDone(keys: string[]) {\n    for (let key of keys) {\n      let fetcher = getFetcher(key);\n      let doneFetcher = getDoneFetcher(fetcher.data);\n      state.fetchers.set(key, doneFetcher);\n    }\n  }\n\n  function markFetchRedirectsDone(): boolean {\n    let doneKeys = [];\n    let updatedFetchers = false;\n    for (let key of fetchRedirectIds) {\n      let fetcher = state.fetchers.get(key);\n      invariant(fetcher, `Expected fetcher: ${key}`);\n      if (fetcher.state === \"loading\") {\n        fetchRedirectIds.delete(key);\n        doneKeys.push(key);\n        updatedFetchers = true;\n      }\n    }\n    markFetchersDone(doneKeys);\n    return updatedFetchers;\n  }\n\n  function abortStaleFetchLoads(landedId: number): boolean {\n    let yeetedKeys = [];\n    for (let [key, id] of fetchReloadIds) {\n      if (id < landedId) {\n        let fetcher = state.fetchers.get(key);\n        invariant(fetcher, `Expected fetcher: ${key}`);\n        if (fetcher.state === \"loading\") {\n          abortFetcher(key);\n          fetchReloadIds.delete(key);\n          yeetedKeys.push(key);\n        }\n      }\n    }\n    markFetchersDone(yeetedKeys);\n    return yeetedKeys.length > 0;\n  }\n\n  function getBlocker(key: string, fn: BlockerFunction) {\n    let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n    if (blockerFunctions.get(key) !== fn) {\n      blockerFunctions.set(key, fn);\n    }\n\n    return blocker;\n  }\n\n  function deleteBlocker(key: string) {\n    state.blockers.delete(key);\n    blockerFunctions.delete(key);\n  }\n\n  // Utility function to update blockers, ensuring valid state transitions\n  function updateBlocker(key: string, newBlocker: Blocker) {\n    let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n    // Poor mans state machine :)\n    // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n    invariant(\n      (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n        (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n        (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n        (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n        (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n      `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n    );\n\n    let blockers = new Map(state.blockers);\n    blockers.set(key, newBlocker);\n    updateState({ blockers });\n  }\n\n  function shouldBlockNavigation({\n    currentLocation,\n    nextLocation,\n    historyAction,\n  }: {\n    currentLocation: Location;\n    nextLocation: Location;\n    historyAction: HistoryAction;\n  }): string | undefined {\n    if (blockerFunctions.size === 0) {\n      return;\n    }\n\n    // We ony support a single active blocker at the moment since we don't have\n    // any compelling use cases for multi-blocker yet\n    if (blockerFunctions.size > 1) {\n      warning(false, \"A router only supports one blocker at a time\");\n    }\n\n    let entries = Array.from(blockerFunctions.entries());\n    let [blockerKey, blockerFunction] = entries[entries.length - 1];\n    let blocker = state.blockers.get(blockerKey);\n\n    if (blocker && blocker.state === \"proceeding\") {\n      // If the blocker is currently proceeding, we don't need to re-check\n      // it and can let this navigation continue\n      return;\n    }\n\n    // At this point, we know we're unblocked/blocked so we need to check the\n    // user-provided blocker function\n    if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n      return blockerKey;\n    }\n  }\n\n  function handleNavigational404(pathname: string) {\n    let error = getInternalRouterError(404, { pathname });\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    let { matches, route } = getShortCircuitMatches(routesToUse);\n\n    // Cancel all pending deferred on 404s since we don't keep any routes\n    cancelActiveDeferreds();\n\n    return { notFoundMatches: matches, route, error };\n  }\n\n  function cancelActiveDeferreds(\n    predicate?: (routeId: string) => boolean\n  ): string[] {\n    let cancelledRouteIds: string[] = [];\n    activeDeferreds.forEach((dfd, routeId) => {\n      if (!predicate || predicate(routeId)) {\n        // Cancel the deferred - but do not remove from activeDeferreds here -\n        // we rely on the subscribers to do that so our tests can assert proper\n        // cleanup via _internalActiveDeferreds\n        dfd.cancel();\n        cancelledRouteIds.push(routeId);\n        activeDeferreds.delete(routeId);\n      }\n    });\n    return cancelledRouteIds;\n  }\n\n  // Opt in to capturing and reporting scroll positions during navigations,\n  // used by the <ScrollRestoration> component\n  function enableScrollRestoration(\n    positions: Record<string, number>,\n    getPosition: GetScrollPositionFunction,\n    getKey?: GetScrollRestorationKeyFunction\n  ) {\n    savedScrollPositions = positions;\n    getScrollPosition = getPosition;\n    getScrollRestorationKey = getKey || null;\n\n    // Perform initial hydration scroll restoration, since we miss the boat on\n    // the initial updateState() because we've not yet rendered <ScrollRestoration/>\n    // and therefore have no savedScrollPositions available\n    if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n      initialScrollRestored = true;\n      let y = getSavedScrollPosition(state.location, state.matches);\n      if (y != null) {\n        updateState({ restoreScrollPosition: y });\n      }\n    }\n\n    return () => {\n      savedScrollPositions = null;\n      getScrollPosition = null;\n      getScrollRestorationKey = null;\n    };\n  }\n\n  function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n    if (getScrollRestorationKey) {\n      let key = getScrollRestorationKey(\n        location,\n        matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n      );\n      return key || location.key;\n    }\n    return location.key;\n  }\n\n  function saveScrollPosition(\n    location: Location,\n    matches: AgnosticDataRouteMatch[]\n  ): void {\n    if (savedScrollPositions && getScrollPosition) {\n      let key = getScrollKey(location, matches);\n      savedScrollPositions[key] = getScrollPosition();\n    }\n  }\n\n  function getSavedScrollPosition(\n    location: Location,\n    matches: AgnosticDataRouteMatch[]\n  ): number | null {\n    if (savedScrollPositions) {\n      let key = getScrollKey(location, matches);\n      let y = savedScrollPositions[key];\n      if (typeof y === \"number\") {\n        return y;\n      }\n    }\n    return null;\n  }\n\n  function checkFogOfWar(\n    matches: AgnosticDataRouteMatch[] | null,\n    routesToUse: AgnosticDataRouteObject[],\n    pathname: string\n  ): { active: boolean; matches: AgnosticDataRouteMatch[] | null } {\n    if (patchRoutesOnNavigationImpl) {\n      if (!matches) {\n        let fogMatches = matchRoutesImpl<AgnosticDataRouteObject>(\n          routesToUse,\n          pathname,\n          basename,\n          true\n        );\n\n        return { active: true, matches: fogMatches || [] };\n      } else {\n        if (Object.keys(matches[0].params).length > 0) {\n          // If we matched a dynamic param or a splat, it might only be because\n          // we haven't yet discovered other routes that would match with a\n          // higher score.  Call patchRoutesOnNavigation just to be sure\n          let partialMatches = matchRoutesImpl<AgnosticDataRouteObject>(\n            routesToUse,\n            pathname,\n            basename,\n            true\n          );\n          return { active: true, matches: partialMatches };\n        }\n      }\n    }\n\n    return { active: false, matches: null };\n  }\n\n  type DiscoverRoutesSuccessResult = {\n    type: \"success\";\n    matches: AgnosticDataRouteMatch[] | null;\n  };\n  type DiscoverRoutesErrorResult = {\n    type: \"error\";\n    error: any;\n    partialMatches: AgnosticDataRouteMatch[];\n  };\n  type DiscoverRoutesAbortedResult = { type: \"aborted\" };\n  type DiscoverRoutesResult =\n    | DiscoverRoutesSuccessResult\n    | DiscoverRoutesErrorResult\n    | DiscoverRoutesAbortedResult;\n\n  async function discoverRoutes(\n    matches: AgnosticDataRouteMatch[],\n    pathname: string,\n    signal: AbortSignal,\n    fetcherKey?: string\n  ): Promise<DiscoverRoutesResult> {\n    if (!patchRoutesOnNavigationImpl) {\n      return { type: \"success\", matches };\n    }\n\n    let partialMatches: AgnosticDataRouteMatch[] | null = matches;\n    while (true) {\n      let isNonHMR = inFlightDataRoutes == null;\n      let routesToUse = inFlightDataRoutes || dataRoutes;\n      let localManifest = manifest;\n      try {\n        await patchRoutesOnNavigationImpl({\n          signal,\n          path: pathname,\n          matches: partialMatches,\n          fetcherKey,\n          patch: (routeId, children) => {\n            if (signal.aborted) return;\n            patchRoutesImpl(\n              routeId,\n              children,\n              routesToUse,\n              localManifest,\n              mapRouteProperties\n            );\n          },\n        });\n      } catch (e) {\n        return { type: \"error\", error: e, partialMatches };\n      } finally {\n        // If we are not in the middle of an HMR revalidation and we changed the\n        // routes, provide a new identity so when we `updateState` at the end of\n        // this navigation/fetch `router.routes` will be a new identity and\n        // trigger a re-run of memoized `router.routes` dependencies.\n        // HMR will already update the identity and reflow when it lands\n        // `inFlightDataRoutes` in `completeNavigation`\n        if (isNonHMR && !signal.aborted) {\n          dataRoutes = [...dataRoutes];\n        }\n      }\n\n      if (signal.aborted) {\n        return { type: \"aborted\" };\n      }\n\n      let newMatches = matchRoutes(routesToUse, pathname, basename);\n      if (newMatches) {\n        return { type: \"success\", matches: newMatches };\n      }\n\n      let newPartialMatches = matchRoutesImpl<AgnosticDataRouteObject>(\n        routesToUse,\n        pathname,\n        basename,\n        true\n      );\n\n      // Avoid loops if the second pass results in the same partial matches\n      if (\n        !newPartialMatches ||\n        (partialMatches.length === newPartialMatches.length &&\n          partialMatches.every(\n            (m, i) => m.route.id === newPartialMatches![i].route.id\n          ))\n      ) {\n        return { type: \"success\", matches: null };\n      }\n\n      partialMatches = newPartialMatches;\n    }\n  }\n\n  function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n    manifest = {};\n    inFlightDataRoutes = convertRoutesToDataRoutes(\n      newRoutes,\n      mapRouteProperties,\n      undefined,\n      manifest\n    );\n  }\n\n  function patchRoutes(\n    routeId: string | null,\n    children: AgnosticRouteObject[]\n  ): void {\n    let isNonHMR = inFlightDataRoutes == null;\n    let routesToUse = inFlightDataRoutes || dataRoutes;\n    patchRoutesImpl(\n      routeId,\n      children,\n      routesToUse,\n      manifest,\n      mapRouteProperties\n    );\n\n    // If we are not in the middle of an HMR revalidation and we changed the\n    // routes, provide a new identity and trigger a reflow via `updateState`\n    // to re-run memoized `router.routes` dependencies.\n    // HMR will already update the identity and reflow when it lands\n    // `inFlightDataRoutes` in `completeNavigation`\n    if (isNonHMR) {\n      dataRoutes = [...dataRoutes];\n      updateState({});\n    }\n  }\n\n  router = {\n    get basename() {\n      return basename;\n    },\n    get future() {\n      return future;\n    },\n    get state() {\n      return state;\n    },\n    get routes() {\n      return dataRoutes;\n    },\n    get window() {\n      return routerWindow;\n    },\n    initialize,\n    subscribe,\n    enableScrollRestoration,\n    navigate,\n    fetch,\n    revalidate,\n    // Passthrough to history-aware createHref used by useHref so we get proper\n    // hash-aware URLs in DOM paths\n    createHref: (to: To) => init.history.createHref(to),\n    encodeLocation: (to: To) => init.history.encodeLocation(to),\n    getFetcher,\n    deleteFetcher: deleteFetcherAndUpdateState,\n    dispose,\n    getBlocker,\n    deleteBlocker,\n    patchRoutes,\n    _internalFetchControllers: fetchControllers,\n    _internalActiveDeferreds: activeDeferreds,\n    // TODO: Remove setRoutes, it's temporary to avoid dealing with\n    // updating the tree while validating the update algorithm.\n    _internalSetRoutes,\n  };\n\n  return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface StaticHandlerFutureConfig {\n  v7_relativeSplatPath: boolean;\n  v7_throwAbortReason: boolean;\n}\n\nexport interface CreateStaticHandlerOptions {\n  basename?: string;\n  /**\n   * @deprecated Use `mapRouteProperties` instead\n   */\n  detectErrorBoundary?: DetectErrorBoundaryFunction;\n  mapRouteProperties?: MapRoutePropertiesFunction;\n  future?: Partial<StaticHandlerFutureConfig>;\n}\n\nexport function createStaticHandler(\n  routes: AgnosticRouteObject[],\n  opts?: CreateStaticHandlerOptions\n): StaticHandler {\n  invariant(\n    routes.length > 0,\n    \"You must provide a non-empty routes array to createStaticHandler\"\n  );\n\n  let manifest: RouteManifest = {};\n  let basename = (opts ? opts.basename : null) || \"/\";\n  let mapRouteProperties: MapRoutePropertiesFunction;\n  if (opts?.mapRouteProperties) {\n    mapRouteProperties = opts.mapRouteProperties;\n  } else if (opts?.detectErrorBoundary) {\n    // If they are still using the deprecated version, wrap it with the new API\n    let detectErrorBoundary = opts.detectErrorBoundary;\n    mapRouteProperties = (route) => ({\n      hasErrorBoundary: detectErrorBoundary(route),\n    });\n  } else {\n    mapRouteProperties = defaultMapRouteProperties;\n  }\n  // Config driven behavior flags\n  let future: StaticHandlerFutureConfig = {\n    v7_relativeSplatPath: false,\n    v7_throwAbortReason: false,\n    ...(opts ? opts.future : null),\n  };\n\n  let dataRoutes = convertRoutesToDataRoutes(\n    routes,\n    mapRouteProperties,\n    undefined,\n    manifest\n  );\n\n  /**\n   * The query() method is intended for document requests, in which we want to\n   * call an optional action and potentially multiple loaders for all nested\n   * routes.  It returns a StaticHandlerContext object, which is very similar\n   * to the router state (location, loaderData, actionData, errors, etc.) and\n   * also adds SSR-specific information such as the statusCode and headers\n   * from action/loaders Responses.\n   *\n   * It _should_ never throw and should report all errors through the\n   * returned context.errors object, properly associating errors to their error\n   * boundary.  Additionally, it tracks _deepestRenderedBoundaryId which can be\n   * used to emulate React error boundaries during SSr by performing a second\n   * pass only down to the boundaryId.\n   *\n   * The one exception where we do not return a StaticHandlerContext is when a\n   * redirect response is returned or thrown from any action/loader.  We\n   * propagate that out and return the raw Response so the HTTP server can\n   * return it directly.\n   *\n   * - `opts.requestContext` is an optional server context that will be passed\n   *   to actions/loaders in the `context` parameter\n   * - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent\n   *   the bubbling of errors which allows single-fetch-type implementations\n   *   where the client will handle the bubbling and we may need to return data\n   *   for the handling route\n   */\n  async function query(\n    request: Request,\n    {\n      requestContext,\n      skipLoaderErrorBubbling,\n      dataStrategy,\n    }: {\n      requestContext?: unknown;\n      skipLoaderErrorBubbling?: boolean;\n      dataStrategy?: DataStrategyFunction;\n    } = {}\n  ): Promise<StaticHandlerContext | Response> {\n    let url = new URL(request.url);\n    let method = request.method;\n    let location = createLocation(\"\", createPath(url), null, \"default\");\n    let matches = matchRoutes(dataRoutes, location, basename);\n\n    // SSR supports HEAD requests while SPA doesn't\n    if (!isValidMethod(method) && method !== \"HEAD\") {\n      let error = getInternalRouterError(405, { method });\n      let { matches: methodNotAllowedMatches, route } =\n        getShortCircuitMatches(dataRoutes);\n      return {\n        basename,\n        location,\n        matches: methodNotAllowedMatches,\n        loaderData: {},\n        actionData: null,\n        errors: {\n          [route.id]: error,\n        },\n        statusCode: error.status,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null,\n      };\n    } else if (!matches) {\n      let error = getInternalRouterError(404, { pathname: location.pathname });\n      let { matches: notFoundMatches, route } =\n        getShortCircuitMatches(dataRoutes);\n      return {\n        basename,\n        location,\n        matches: notFoundMatches,\n        loaderData: {},\n        actionData: null,\n        errors: {\n          [route.id]: error,\n        },\n        statusCode: error.status,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null,\n      };\n    }\n\n    let result = await queryImpl(\n      request,\n      location,\n      matches,\n      requestContext,\n      dataStrategy || null,\n      skipLoaderErrorBubbling === true,\n      null\n    );\n    if (isResponse(result)) {\n      return result;\n    }\n\n    // When returning StaticHandlerContext, we patch back in the location here\n    // since we need it for React Context.  But this helps keep our submit and\n    // loadRouteData operating on a Request instead of a Location\n    return { location, basename, ...result };\n  }\n\n  /**\n   * The queryRoute() method is intended for targeted route requests, either\n   * for fetch ?_data requests or resource route requests.  In this case, we\n   * are only ever calling a single action or loader, and we are returning the\n   * returned value directly.  In most cases, this will be a Response returned\n   * from the action/loader, but it may be a primitive or other value as well -\n   * and in such cases the calling context should handle that accordingly.\n   *\n   * We do respect the throw/return differentiation, so if an action/loader\n   * throws, then this method will throw the value.  This is important so we\n   * can do proper boundary identification in Remix where a thrown Response\n   * must go to the Catch Boundary but a returned Response is happy-path.\n   *\n   * One thing to note is that any Router-initiated Errors that make sense\n   * to associate with a status code will be thrown as an ErrorResponse\n   * instance which include the raw Error, such that the calling context can\n   * serialize the error as they see fit while including the proper response\n   * code.  Examples here are 404 and 405 errors that occur prior to reaching\n   * any user-defined loaders.\n   *\n   * - `opts.routeId` allows you to specify the specific route handler to call.\n   *   If not provided the handler will determine the proper route by matching\n   *   against `request.url`\n   * - `opts.requestContext` is an optional server context that will be passed\n   *    to actions/loaders in the `context` parameter\n   */\n  async function queryRoute(\n    request: Request,\n    {\n      routeId,\n      requestContext,\n      dataStrategy,\n    }: {\n      requestContext?: unknown;\n      routeId?: string;\n      dataStrategy?: DataStrategyFunction;\n    } = {}\n  ): Promise<any> {\n    let url = new URL(request.url);\n    let method = request.method;\n    let location = createLocation(\"\", createPath(url), null, \"default\");\n    let matches = matchRoutes(dataRoutes, location, basename);\n\n    // SSR supports HEAD requests while SPA doesn't\n    if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n      throw getInternalRouterError(405, { method });\n    } else if (!matches) {\n      throw getInternalRouterError(404, { pathname: location.pathname });\n    }\n\n    let match = routeId\n      ? matches.find((m) => m.route.id === routeId)\n      : getTargetMatch(matches, location);\n\n    if (routeId && !match) {\n      throw getInternalRouterError(403, {\n        pathname: location.pathname,\n        routeId,\n      });\n    } else if (!match) {\n      // This should never hit I don't think?\n      throw getInternalRouterError(404, { pathname: location.pathname });\n    }\n\n    let result = await queryImpl(\n      request,\n      location,\n      matches,\n      requestContext,\n      dataStrategy || null,\n      false,\n      match\n    );\n\n    if (isResponse(result)) {\n      return result;\n    }\n\n    let error = result.errors ? Object.values(result.errors)[0] : undefined;\n    if (error !== undefined) {\n      // If we got back result.errors, that means the loader/action threw\n      // _something_ that wasn't a Response, but it's not guaranteed/required\n      // to be an `instanceof Error` either, so we have to use throw here to\n      // preserve the \"error\" state outside of queryImpl.\n      throw error;\n    }\n\n    // Pick off the right state value to return\n    if (result.actionData) {\n      return Object.values(result.actionData)[0];\n    }\n\n    if (result.loaderData) {\n      let data = Object.values(result.loaderData)[0];\n      if (result.activeDeferreds?.[match.route.id]) {\n        data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n      }\n      return data;\n    }\n\n    return undefined;\n  }\n\n  async function queryImpl(\n    request: Request,\n    location: Location,\n    matches: AgnosticDataRouteMatch[],\n    requestContext: unknown,\n    dataStrategy: DataStrategyFunction | null,\n    skipLoaderErrorBubbling: boolean,\n    routeMatch: AgnosticDataRouteMatch | null\n  ): Promise<Omit<StaticHandlerContext, \"location\" | \"basename\"> | Response> {\n    invariant(\n      request.signal,\n      \"query()/queryRoute() requests must contain an AbortController signal\"\n    );\n\n    try {\n      if (isMutationMethod(request.method.toLowerCase())) {\n        let result = await submit(\n          request,\n          matches,\n          routeMatch || getTargetMatch(matches, location),\n          requestContext,\n          dataStrategy,\n          skipLoaderErrorBubbling,\n          routeMatch != null\n        );\n        return result;\n      }\n\n      let result = await loadRouteData(\n        request,\n        matches,\n        requestContext,\n        dataStrategy,\n        skipLoaderErrorBubbling,\n        routeMatch\n      );\n      return isResponse(result)\n        ? result\n        : {\n            ...result,\n            actionData: null,\n            actionHeaders: {},\n          };\n    } catch (e) {\n      // If the user threw/returned a Response in callLoaderOrAction for a\n      // `queryRoute` call, we throw the `DataStrategyResult` to bail out early\n      // and then return or throw the raw Response here accordingly\n      if (isDataStrategyResult(e) && isResponse(e.result)) {\n        if (e.type === ResultType.error) {\n          throw e.result;\n        }\n        return e.result;\n      }\n      // Redirects are always returned since they don't propagate to catch\n      // boundaries\n      if (isRedirectResponse(e)) {\n        return e;\n      }\n      throw e;\n    }\n  }\n\n  async function submit(\n    request: Request,\n    matches: AgnosticDataRouteMatch[],\n    actionMatch: AgnosticDataRouteMatch,\n    requestContext: unknown,\n    dataStrategy: DataStrategyFunction | null,\n    skipLoaderErrorBubbling: boolean,\n    isRouteRequest: boolean\n  ): Promise<Omit<StaticHandlerContext, \"location\" | \"basename\"> | Response> {\n    let result: DataResult;\n\n    if (!actionMatch.route.action && !actionMatch.route.lazy) {\n      let error = getInternalRouterError(405, {\n        method: request.method,\n        pathname: new URL(request.url).pathname,\n        routeId: actionMatch.route.id,\n      });\n      if (isRouteRequest) {\n        throw error;\n      }\n      result = {\n        type: ResultType.error,\n        error,\n      };\n    } else {\n      let results = await callDataStrategy(\n        \"action\",\n        request,\n        [actionMatch],\n        matches,\n        isRouteRequest,\n        requestContext,\n        dataStrategy\n      );\n      result = results[actionMatch.route.id];\n\n      if (request.signal.aborted) {\n        throwStaticHandlerAbortedError(request, isRouteRequest, future);\n      }\n    }\n\n    if (isRedirectResult(result)) {\n      // Uhhhh - this should never happen, we should always throw these from\n      // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n      // can get back on the \"throw all redirect responses\" train here should\n      // this ever happen :/\n      throw new Response(null, {\n        status: result.response.status,\n        headers: {\n          Location: result.response.headers.get(\"Location\")!,\n        },\n      });\n    }\n\n    if (isDeferredResult(result)) {\n      let error = getInternalRouterError(400, { type: \"defer-action\" });\n      if (isRouteRequest) {\n        throw error;\n      }\n      result = {\n        type: ResultType.error,\n        error,\n      };\n    }\n\n    if (isRouteRequest) {\n      // Note: This should only be non-Response values if we get here, since\n      // isRouteRequest should throw any Response received in callLoaderOrAction\n      if (isErrorResult(result)) {\n        throw result.error;\n      }\n\n      return {\n        matches: [actionMatch],\n        loaderData: {},\n        actionData: { [actionMatch.route.id]: result.data },\n        errors: null,\n        // Note: statusCode + headers are unused here since queryRoute will\n        // return the raw Response or value\n        statusCode: 200,\n        loaderHeaders: {},\n        actionHeaders: {},\n        activeDeferreds: null,\n      };\n    }\n\n    // Create a GET request for the loaders\n    let loaderRequest = new Request(request.url, {\n      headers: request.headers,\n      redirect: request.redirect,\n      signal: request.signal,\n    });\n\n    if (isErrorResult(result)) {\n      // Store off the pending error - we use it to determine which loaders\n      // to call and will commit it when we complete the navigation\n      let boundaryMatch = skipLoaderErrorBubbling\n        ? actionMatch\n        : findNearestBoundary(matches, actionMatch.route.id);\n\n      let context = await loadRouteData(\n        loaderRequest,\n        matches,\n        requestContext,\n        dataStrategy,\n        skipLoaderErrorBubbling,\n        null,\n        [boundaryMatch.route.id, result]\n      );\n\n      // action status codes take precedence over loader status codes\n      return {\n        ...context,\n        statusCode: isRouteErrorResponse(result.error)\n          ? result.error.status\n          : result.statusCode != null\n          ? result.statusCode\n          : 500,\n        actionData: null,\n        actionHeaders: {\n          ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n        },\n      };\n    }\n\n    let context = await loadRouteData(\n      loaderRequest,\n      matches,\n      requestContext,\n      dataStrategy,\n      skipLoaderErrorBubbling,\n      null\n    );\n\n    return {\n      ...context,\n      actionData: {\n        [actionMatch.route.id]: result.data,\n      },\n      // action status codes take precedence over loader status codes\n      ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n      actionHeaders: result.headers\n        ? { [actionMatch.route.id]: result.headers }\n        : {},\n    };\n  }\n\n  async function loadRouteData(\n    request: Request,\n    matches: AgnosticDataRouteMatch[],\n    requestContext: unknown,\n    dataStrategy: DataStrategyFunction | null,\n    skipLoaderErrorBubbling: boolean,\n    routeMatch: AgnosticDataRouteMatch | null,\n    pendingActionResult?: PendingActionResult\n  ): Promise<\n    | Omit<\n        StaticHandlerContext,\n        \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n      >\n    | Response\n  > {\n    let isRouteRequest = routeMatch != null;\n\n    // Short circuit if we have no loaders to run (queryRoute())\n    if (\n      isRouteRequest &&\n      !routeMatch?.route.loader &&\n      !routeMatch?.route.lazy\n    ) {\n      throw getInternalRouterError(400, {\n        method: request.method,\n        pathname: new URL(request.url).pathname,\n        routeId: routeMatch?.route.id,\n      });\n    }\n\n    let requestMatches = routeMatch\n      ? [routeMatch]\n      : pendingActionResult && isErrorResult(pendingActionResult[1])\n      ? getLoaderMatchesUntilBoundary(matches, pendingActionResult[0])\n      : matches;\n    let matchesToLoad = requestMatches.filter(\n      (m) => m.route.loader || m.route.lazy\n    );\n\n    // Short circuit if we have no loaders to run (query())\n    if (matchesToLoad.length === 0) {\n      return {\n        matches,\n        // Add a null for all matched routes for proper revalidation on the client\n        loaderData: matches.reduce(\n          (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n          {}\n        ),\n        errors:\n          pendingActionResult && isErrorResult(pendingActionResult[1])\n            ? {\n                [pendingActionResult[0]]: pendingActionResult[1].error,\n              }\n            : null,\n        statusCode: 200,\n        loaderHeaders: {},\n        activeDeferreds: null,\n      };\n    }\n\n    let results = await callDataStrategy(\n      \"loader\",\n      request,\n      matchesToLoad,\n      matches,\n      isRouteRequest,\n      requestContext,\n      dataStrategy\n    );\n\n    if (request.signal.aborted) {\n      throwStaticHandlerAbortedError(request, isRouteRequest, future);\n    }\n\n    // Process and commit output from loaders\n    let activeDeferreds = new Map<string, DeferredData>();\n    let context = processRouteLoaderData(\n      matches,\n      results,\n      pendingActionResult,\n      activeDeferreds,\n      skipLoaderErrorBubbling\n    );\n\n    // Add a null for any non-loader matches for proper revalidation on the client\n    let executedLoaders = new Set<string>(\n      matchesToLoad.map((match) => match.route.id)\n    );\n    matches.forEach((match) => {\n      if (!executedLoaders.has(match.route.id)) {\n        context.loaderData[match.route.id] = null;\n      }\n    });\n\n    return {\n      ...context,\n      matches,\n      activeDeferreds:\n        activeDeferreds.size > 0\n          ? Object.fromEntries(activeDeferreds.entries())\n          : null,\n    };\n  }\n\n  // Utility wrapper for calling dataStrategy server-side without having to\n  // pass around the manifest, mapRouteProperties, etc.\n  async function callDataStrategy(\n    type: \"loader\" | \"action\",\n    request: Request,\n    matchesToLoad: AgnosticDataRouteMatch[],\n    matches: AgnosticDataRouteMatch[],\n    isRouteRequest: boolean,\n    requestContext: unknown,\n    dataStrategy: DataStrategyFunction | null\n  ): Promise<Record<string, DataResult>> {\n    let results = await callDataStrategyImpl(\n      dataStrategy || defaultDataStrategy,\n      type,\n      null,\n      request,\n      matchesToLoad,\n      matches,\n      null,\n      manifest,\n      mapRouteProperties,\n      requestContext\n    );\n\n    let dataResults: Record<string, DataResult> = {};\n    await Promise.all(\n      matches.map(async (match) => {\n        if (!(match.route.id in results)) {\n          return;\n        }\n        let result = results[match.route.id];\n        if (isRedirectDataStrategyResultResult(result)) {\n          let response = result.result as Response;\n          // Throw redirects and let the server handle them with an HTTP redirect\n          throw normalizeRelativeRoutingRedirectResponse(\n            response,\n            request,\n            match.route.id,\n            matches,\n            basename,\n            future.v7_relativeSplatPath\n          );\n        }\n        if (isResponse(result.result) && isRouteRequest) {\n          // For SSR single-route requests, we want to hand Responses back\n          // directly without unwrapping\n          throw result;\n        }\n\n        dataResults[match.route.id] =\n          await convertDataStrategyResultToDataResult(result);\n      })\n    );\n    return dataResults;\n  }\n\n  return {\n    dataRoutes,\n    query,\n    queryRoute,\n  };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n  routes: AgnosticDataRouteObject[],\n  context: StaticHandlerContext,\n  error: any\n) {\n  let newContext: StaticHandlerContext = {\n    ...context,\n    statusCode: isRouteErrorResponse(error) ? error.status : 500,\n    errors: {\n      [context._deepestRenderedBoundaryId || routes[0].id]: error,\n    },\n  };\n  return newContext;\n}\n\nfunction throwStaticHandlerAbortedError(\n  request: Request,\n  isRouteRequest: boolean,\n  future: StaticHandlerFutureConfig\n) {\n  if (future.v7_throwAbortReason && request.signal.reason !== undefined) {\n    throw request.signal.reason;\n  }\n\n  let method = isRouteRequest ? \"queryRoute\" : \"query\";\n  throw new Error(`${method}() call aborted: ${request.method} ${request.url}`);\n}\n\nfunction isSubmissionNavigation(\n  opts: BaseNavigateOrFetchOptions\n): opts is SubmissionNavigateOptions {\n  return (\n    opts != null &&\n    ((\"formData\" in opts && opts.formData != null) ||\n      (\"body\" in opts && opts.body !== undefined))\n  );\n}\n\nfunction normalizeTo(\n  location: Path,\n  matches: AgnosticDataRouteMatch[],\n  basename: string,\n  prependBasename: boolean,\n  to: To | null,\n  v7_relativeSplatPath: boolean,\n  fromRouteId?: string,\n  relative?: RelativeRoutingType\n) {\n  let contextualMatches: AgnosticDataRouteMatch[];\n  let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n  if (fromRouteId) {\n    // Grab matches up to the calling route so our route-relative logic is\n    // relative to the correct source route\n    contextualMatches = [];\n    for (let match of matches) {\n      contextualMatches.push(match);\n      if (match.route.id === fromRouteId) {\n        activeRouteMatch = match;\n        break;\n      }\n    }\n  } else {\n    contextualMatches = matches;\n    activeRouteMatch = matches[matches.length - 1];\n  }\n\n  // Resolve the relative path\n  let path = resolveTo(\n    to ? to : \".\",\n    getResolveToMatches(contextualMatches, v7_relativeSplatPath),\n    stripBasename(location.pathname, basename) || location.pathname,\n    relative === \"path\"\n  );\n\n  // When `to` is not specified we inherit search/hash from the current\n  // location, unlike when to=\".\" and we just inherit the path.\n  // See https://github.com/remix-run/remix/issues/927\n  if (to == null) {\n    path.search = location.search;\n    path.hash = location.hash;\n  }\n\n  // Account for `?index` params when routing to the current location\n  if ((to == null || to === \"\" || to === \".\") && activeRouteMatch) {\n    let nakedIndex = hasNakedIndexQuery(path.search);\n    if (activeRouteMatch.route.index && !nakedIndex) {\n      // Add one when we're targeting an index route\n      path.search = path.search\n        ? path.search.replace(/^\\?/, \"?index&\")\n        : \"?index\";\n    } else if (!activeRouteMatch.route.index && nakedIndex) {\n      // Remove existing ones when we're not\n      let params = new URLSearchParams(path.search);\n      let indexValues = params.getAll(\"index\");\n      params.delete(\"index\");\n      indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n      let qs = params.toString();\n      path.search = qs ? `?${qs}` : \"\";\n    }\n  }\n\n  // If we're operating within a basename, prepend it to the pathname.  If\n  // this is a root navigation, then just use the raw basename which allows\n  // the basename to have full control over the presence of a trailing slash\n  // on root actions\n  if (prependBasename && basename !== \"/\") {\n    path.pathname =\n      path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n\n  return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n  normalizeFormMethod: boolean,\n  isFetcher: boolean,\n  path: string,\n  opts?: BaseNavigateOrFetchOptions\n): {\n  path: string;\n  submission?: Submission;\n  error?: ErrorResponseImpl;\n} {\n  // Return location verbatim on non-submission navigations\n  if (!opts || !isSubmissionNavigation(opts)) {\n    return { path };\n  }\n\n  if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n    return {\n      path,\n      error: getInternalRouterError(405, { method: opts.formMethod }),\n    };\n  }\n\n  let getInvalidBodyError = () => ({\n    path,\n    error: getInternalRouterError(400, { type: \"invalid-body\" }),\n  });\n\n  // Create a Submission on non-GET navigations\n  let rawFormMethod = opts.formMethod || \"get\";\n  let formMethod = normalizeFormMethod\n    ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n    : (rawFormMethod.toLowerCase() as FormMethod);\n  let formAction = stripHashFromPath(path);\n\n  if (opts.body !== undefined) {\n    if (opts.formEncType === \"text/plain\") {\n      // text only support POST/PUT/PATCH/DELETE submissions\n      if (!isMutationMethod(formMethod)) {\n        return getInvalidBodyError();\n      }\n\n      let text =\n        typeof opts.body === \"string\"\n          ? opts.body\n          : opts.body instanceof FormData ||\n            opts.body instanceof URLSearchParams\n          ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n            Array.from(opts.body.entries()).reduce(\n              (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n              \"\"\n            )\n          : String(opts.body);\n\n      return {\n        path,\n        submission: {\n          formMethod,\n          formAction,\n          formEncType: opts.formEncType,\n          formData: undefined,\n          json: undefined,\n          text,\n        },\n      };\n    } else if (opts.formEncType === \"application/json\") {\n      // json only supports POST/PUT/PATCH/DELETE submissions\n      if (!isMutationMethod(formMethod)) {\n        return getInvalidBodyError();\n      }\n\n      try {\n        let json =\n          typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n        return {\n          path,\n          submission: {\n            formMethod,\n            formAction,\n            formEncType: opts.formEncType,\n            formData: undefined,\n            json,\n            text: undefined,\n          },\n        };\n      } catch (e) {\n        return getInvalidBodyError();\n      }\n    }\n  }\n\n  invariant(\n    typeof FormData === \"function\",\n    \"FormData is not available in this environment\"\n  );\n\n  let searchParams: URLSearchParams;\n  let formData: FormData;\n\n  if (opts.formData) {\n    searchParams = convertFormDataToSearchParams(opts.formData);\n    formData = opts.formData;\n  } else if (opts.body instanceof FormData) {\n    searchParams = convertFormDataToSearchParams(opts.body);\n    formData = opts.body;\n  } else if (opts.body instanceof URLSearchParams) {\n    searchParams = opts.body;\n    formData = convertSearchParamsToFormData(searchParams);\n  } else if (opts.body == null) {\n    searchParams = new URLSearchParams();\n    formData = new FormData();\n  } else {\n    try {\n      searchParams = new URLSearchParams(opts.body);\n      formData = convertSearchParamsToFormData(searchParams);\n    } catch (e) {\n      return getInvalidBodyError();\n    }\n  }\n\n  let submission: Submission = {\n    formMethod,\n    formAction,\n    formEncType:\n      (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n    formData,\n    json: undefined,\n    text: undefined,\n  };\n\n  if (isMutationMethod(submission.formMethod)) {\n    return { path, submission };\n  }\n\n  // Flatten submission onto URLSearchParams for GET submissions\n  let parsedPath = parsePath(path);\n  // On GET navigation submissions we can drop the ?index param from the\n  // resulting location since all loaders will run.  But fetcher GET submissions\n  // only run a single loader so we need to preserve any incoming ?index params\n  if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n    searchParams.append(\"index\", \"\");\n  }\n  parsedPath.search = `?${searchParams}`;\n\n  return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes at/below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n  matches: AgnosticDataRouteMatch[],\n  boundaryId: string,\n  includeBoundary = false\n) {\n  let index = matches.findIndex((m) => m.route.id === boundaryId);\n  if (index >= 0) {\n    return matches.slice(0, includeBoundary ? index + 1 : index);\n  }\n  return matches;\n}\n\nfunction getMatchesToLoad(\n  history: History,\n  state: RouterState,\n  matches: AgnosticDataRouteMatch[],\n  submission: Submission | undefined,\n  location: Location,\n  initialHydration: boolean,\n  skipActionErrorRevalidation: boolean,\n  isRevalidationRequired: boolean,\n  cancelledDeferredRoutes: string[],\n  cancelledFetcherLoads: Set<string>,\n  deletedFetchers: Set<string>,\n  fetchLoadMatches: Map<string, FetchLoadMatch>,\n  fetchRedirectIds: Set<string>,\n  routesToUse: AgnosticDataRouteObject[],\n  basename: string | undefined,\n  pendingActionResult?: PendingActionResult\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n  let actionResult = pendingActionResult\n    ? isErrorResult(pendingActionResult[1])\n      ? pendingActionResult[1].error\n      : pendingActionResult[1].data\n    : undefined;\n  let currentUrl = history.createURL(state.location);\n  let nextUrl = history.createURL(location);\n\n  // Pick navigation matches that are net-new or qualify for revalidation\n  let boundaryMatches = matches;\n  if (initialHydration && state.errors) {\n    // On initial hydration, only consider matches up to _and including_ the boundary.\n    // This is inclusive to handle cases where a server loader ran successfully,\n    // a child server loader bubbled up to this route, but this route has\n    // `clientLoader.hydrate` so we want to still run the `clientLoader` so that\n    // we have a complete version of `loaderData`\n    boundaryMatches = getLoaderMatchesUntilBoundary(\n      matches,\n      Object.keys(state.errors)[0],\n      true\n    );\n  } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) {\n    // If an action threw an error, we call loaders up to, but not including the\n    // boundary\n    boundaryMatches = getLoaderMatchesUntilBoundary(\n      matches,\n      pendingActionResult[0]\n    );\n  }\n\n  // Don't revalidate loaders by default after action 4xx/5xx responses\n  // when the flag is enabled.  They can still opt-into revalidation via\n  // `shouldRevalidate` via `actionResult`\n  let actionStatus = pendingActionResult\n    ? pendingActionResult[1].statusCode\n    : undefined;\n  let shouldSkipRevalidation =\n    skipActionErrorRevalidation && actionStatus && actionStatus >= 400;\n\n  let navigationMatches = boundaryMatches.filter((match, index) => {\n    let { route } = match;\n    if (route.lazy) {\n      // We haven't loaded this route yet so we don't know if it's got a loader!\n      return true;\n    }\n\n    if (route.loader == null) {\n      return false;\n    }\n\n    if (initialHydration) {\n      return shouldLoadRouteOnHydration(route, state.loaderData, state.errors);\n    }\n\n    // Always call the loader on new route instances and pending defer cancellations\n    if (\n      isNewLoader(state.loaderData, state.matches[index], match) ||\n      cancelledDeferredRoutes.some((id) => id === match.route.id)\n    ) {\n      return true;\n    }\n\n    // This is the default implementation for when we revalidate.  If the route\n    // provides it's own implementation, then we give them full control but\n    // provide this value so they can leverage it if needed after they check\n    // their own specific use cases\n    let currentRouteMatch = state.matches[index];\n    let nextRouteMatch = match;\n\n    return shouldRevalidateLoader(match, {\n      currentUrl,\n      currentParams: currentRouteMatch.params,\n      nextUrl,\n      nextParams: nextRouteMatch.params,\n      ...submission,\n      actionResult,\n      actionStatus,\n      defaultShouldRevalidate: shouldSkipRevalidation\n        ? false\n        : // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n          isRevalidationRequired ||\n          currentUrl.pathname + currentUrl.search ===\n            nextUrl.pathname + nextUrl.search ||\n          // Search params affect all loaders\n          currentUrl.search !== nextUrl.search ||\n          isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n    });\n  });\n\n  // Pick fetcher.loads that need to be revalidated\n  let revalidatingFetchers: RevalidatingFetcher[] = [];\n  fetchLoadMatches.forEach((f, key) => {\n    // Don't revalidate:\n    //  - on initial hydration (shouldn't be any fetchers then anyway)\n    //  - if fetcher won't be present in the subsequent render\n    //    - no longer matches the URL (v7_fetcherPersist=false)\n    //    - was unmounted but persisted due to v7_fetcherPersist=true\n    if (\n      initialHydration ||\n      !matches.some((m) => m.route.id === f.routeId) ||\n      deletedFetchers.has(key)\n    ) {\n      return;\n    }\n\n    let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n    // If the fetcher path no longer matches, push it in with null matches so\n    // we can trigger a 404 in callLoadersAndMaybeResolveData.  Note this is\n    // currently only a use-case for Remix HMR where the route tree can change\n    // at runtime and remove a route previously loaded via a fetcher\n    if (!fetcherMatches) {\n      revalidatingFetchers.push({\n        key,\n        routeId: f.routeId,\n        path: f.path,\n        matches: null,\n        match: null,\n        controller: null,\n      });\n      return;\n    }\n\n    // Revalidating fetchers are decoupled from the route matches since they\n    // load from a static href.  They revalidate based on explicit revalidation\n    // (submission, useRevalidator, or X-Remix-Revalidate)\n    let fetcher = state.fetchers.get(key);\n    let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n    let shouldRevalidate = false;\n    if (fetchRedirectIds.has(key)) {\n      // Never trigger a revalidation of an actively redirecting fetcher\n      shouldRevalidate = false;\n    } else if (cancelledFetcherLoads.has(key)) {\n      // Always mark for revalidation if the fetcher was cancelled\n      cancelledFetcherLoads.delete(key);\n      shouldRevalidate = true;\n    } else if (\n      fetcher &&\n      fetcher.state !== \"idle\" &&\n      fetcher.data === undefined\n    ) {\n      // If the fetcher hasn't ever completed loading yet, then this isn't a\n      // revalidation, it would just be a brand new load if an explicit\n      // revalidation is required\n      shouldRevalidate = isRevalidationRequired;\n    } else {\n      // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n      // to explicit revalidations only\n      shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n        currentUrl,\n        currentParams: state.matches[state.matches.length - 1].params,\n        nextUrl,\n        nextParams: matches[matches.length - 1].params,\n        ...submission,\n        actionResult,\n        actionStatus,\n        defaultShouldRevalidate: shouldSkipRevalidation\n          ? false\n          : isRevalidationRequired,\n      });\n    }\n\n    if (shouldRevalidate) {\n      revalidatingFetchers.push({\n        key,\n        routeId: f.routeId,\n        path: f.path,\n        matches: fetcherMatches,\n        match: fetcherMatch,\n        controller: new AbortController(),\n      });\n    }\n  });\n\n  return [navigationMatches, revalidatingFetchers];\n}\n\nfunction shouldLoadRouteOnHydration(\n  route: AgnosticDataRouteObject,\n  loaderData: RouteData | null | undefined,\n  errors: RouteData | null | undefined\n) {\n  // We dunno if we have a loader - gotta find out!\n  if (route.lazy) {\n    return true;\n  }\n\n  // No loader, nothing to initialize\n  if (!route.loader) {\n    return false;\n  }\n\n  let hasData = loaderData != null && loaderData[route.id] !== undefined;\n  let hasError = errors != null && errors[route.id] !== undefined;\n\n  // Don't run if we error'd during SSR\n  if (!hasData && hasError) {\n    return false;\n  }\n\n  // Explicitly opting-in to running on hydration\n  if (typeof route.loader === \"function\" && route.loader.hydrate === true) {\n    return true;\n  }\n\n  // Otherwise, run if we're not yet initialized with anything\n  return !hasData && !hasError;\n}\n\nfunction isNewLoader(\n  currentLoaderData: RouteData,\n  currentMatch: AgnosticDataRouteMatch,\n  match: AgnosticDataRouteMatch\n) {\n  let isNew =\n    // [a] -> [a, b]\n    !currentMatch ||\n    // [a, b] -> [a, c]\n    match.route.id !== currentMatch.route.id;\n\n  // Handle the case that we don't have data for a re-used route, potentially\n  // from a prior error or from a cancelled pending deferred\n  let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n  // Always load if this is a net-new route or we don't yet have data\n  return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n  currentMatch: AgnosticDataRouteMatch,\n  match: AgnosticDataRouteMatch\n) {\n  let currentPath = currentMatch.route.path;\n  return (\n    // param change for this match, /users/123 -> /users/456\n    currentMatch.pathname !== match.pathname ||\n    // splat param changed, which is not present in match.path\n    // e.g. /files/images/avatar.jpg -> files/finances.xls\n    (currentPath != null &&\n      currentPath.endsWith(\"*\") &&\n      currentMatch.params[\"*\"] !== match.params[\"*\"])\n  );\n}\n\nfunction shouldRevalidateLoader(\n  loaderMatch: AgnosticDataRouteMatch,\n  arg: ShouldRevalidateFunctionArgs\n) {\n  if (loaderMatch.route.shouldRevalidate) {\n    let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n    if (typeof routeChoice === \"boolean\") {\n      return routeChoice;\n    }\n  }\n\n  return arg.defaultShouldRevalidate;\n}\n\nfunction patchRoutesImpl(\n  routeId: string | null,\n  children: AgnosticRouteObject[],\n  routesToUse: AgnosticDataRouteObject[],\n  manifest: RouteManifest,\n  mapRouteProperties: MapRoutePropertiesFunction\n) {\n  let childrenToPatch: AgnosticDataRouteObject[];\n  if (routeId) {\n    let route = manifest[routeId];\n    invariant(\n      route,\n      `No route found to patch children into: routeId = ${routeId}`\n    );\n    if (!route.children) {\n      route.children = [];\n    }\n    childrenToPatch = route.children;\n  } else {\n    childrenToPatch = routesToUse;\n  }\n\n  // Don't patch in routes we already know about so that `patch` is idempotent\n  // to simplify user-land code. This is useful because we re-call the\n  // `patchRoutesOnNavigation` function for matched routes with params.\n  let uniqueChildren = children.filter(\n    (newRoute) =>\n      !childrenToPatch.some((existingRoute) =>\n        isSameRoute(newRoute, existingRoute)\n      )\n  );\n\n  let newRoutes = convertRoutesToDataRoutes(\n    uniqueChildren,\n    mapRouteProperties,\n    [routeId || \"_\", \"patch\", String(childrenToPatch?.length || \"0\")],\n    manifest\n  );\n\n  childrenToPatch.push(...newRoutes);\n}\n\nfunction isSameRoute(\n  newRoute: AgnosticRouteObject,\n  existingRoute: AgnosticRouteObject\n): boolean {\n  // Most optimal check is by id\n  if (\n    \"id\" in newRoute &&\n    \"id\" in existingRoute &&\n    newRoute.id === existingRoute.id\n  ) {\n    return true;\n  }\n\n  // Second is by pathing differences\n  if (\n    !(\n      newRoute.index === existingRoute.index &&\n      newRoute.path === existingRoute.path &&\n      newRoute.caseSensitive === existingRoute.caseSensitive\n    )\n  ) {\n    return false;\n  }\n\n  // Pathless layout routes are trickier since we need to check children.\n  // If they have no children then they're the same as far as we can tell\n  if (\n    (!newRoute.children || newRoute.children.length === 0) &&\n    (!existingRoute.children || existingRoute.children.length === 0)\n  ) {\n    return true;\n  }\n\n  // Otherwise, we look to see if every child in the new route is already\n  // represented in the existing route's children\n  return newRoute.children!.every((aChild, i) =>\n    existingRoute.children?.some((bChild) => isSameRoute(aChild, bChild))\n  );\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n  route: AgnosticDataRouteObject,\n  mapRouteProperties: MapRoutePropertiesFunction,\n  manifest: RouteManifest\n) {\n  if (!route.lazy) {\n    return;\n  }\n\n  let lazyRoute = await route.lazy();\n\n  // If the lazy route function was executed and removed by another parallel\n  // call then we can return - first lazy() to finish wins because the return\n  // value of lazy is expected to be static\n  if (!route.lazy) {\n    return;\n  }\n\n  let routeToUpdate = manifest[route.id];\n  invariant(routeToUpdate, \"No route found in manifest\");\n\n  // Update the route in place.  This should be safe because there's no way\n  // we could yet be sitting on this route as we can't get there without\n  // resolving lazy() first.\n  //\n  // This is different than the HMR \"update\" use-case where we may actively be\n  // on the route being updated.  The main concern boils down to \"does this\n  // mutation affect any ongoing navigations or any current state.matches\n  // values?\".  If not, it should be safe to update in place.\n  let routeUpdates: Record<string, any> = {};\n  for (let lazyRouteProperty in lazyRoute) {\n    let staticRouteValue =\n      routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n    let isPropertyStaticallyDefined =\n      staticRouteValue !== undefined &&\n      // This property isn't static since it should always be updated based\n      // on the route updates\n      lazyRouteProperty !== \"hasErrorBoundary\";\n\n    warning(\n      !isPropertyStaticallyDefined,\n      `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n        `defined but its lazy function is also returning a value for this property. ` +\n        `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n    );\n\n    if (\n      !isPropertyStaticallyDefined &&\n      !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n    ) {\n      routeUpdates[lazyRouteProperty] =\n        lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n    }\n  }\n\n  // Mutate the route with the provided updates.  Do this first so we pass\n  // the updated version to mapRouteProperties\n  Object.assign(routeToUpdate, routeUpdates);\n\n  // Mutate the `hasErrorBoundary` property on the route based on the route\n  // updates and remove the `lazy` function so we don't resolve the lazy\n  // route again.\n  Object.assign(routeToUpdate, {\n    // To keep things framework agnostic, we use the provided\n    // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n    // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n    // the logic will differ between frameworks.\n    ...mapRouteProperties(routeToUpdate),\n    lazy: undefined,\n  });\n}\n\n// Default implementation of `dataStrategy` which fetches all loaders in parallel\nasync function defaultDataStrategy({\n  matches,\n}: DataStrategyFunctionArgs): ReturnType<DataStrategyFunction> {\n  let matchesToLoad = matches.filter((m) => m.shouldLoad);\n  let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));\n  return results.reduce(\n    (acc, result, i) =>\n      Object.assign(acc, { [matchesToLoad[i].route.id]: result }),\n    {}\n  );\n}\n\nasync function callDataStrategyImpl(\n  dataStrategyImpl: DataStrategyFunction,\n  type: \"loader\" | \"action\",\n  state: RouterState | null,\n  request: Request,\n  matchesToLoad: AgnosticDataRouteMatch[],\n  matches: AgnosticDataRouteMatch[],\n  fetcherKey: string | null,\n  manifest: RouteManifest,\n  mapRouteProperties: MapRoutePropertiesFunction,\n  requestContext?: unknown\n): Promise<Record<string, DataStrategyResult>> {\n  let loadRouteDefinitionsPromises = matches.map((m) =>\n    m.route.lazy\n      ? loadLazyRouteModule(m.route, mapRouteProperties, manifest)\n      : undefined\n  );\n\n  let dsMatches = matches.map((match, i) => {\n    let loadRoutePromise = loadRouteDefinitionsPromises[i];\n    let shouldLoad = matchesToLoad.some((m) => m.route.id === match.route.id);\n    // `resolve` encapsulates route.lazy(), executing the loader/action,\n    // and mapping return values/thrown errors to a `DataStrategyResult`.  Users\n    // can pass a callback to take fine-grained control over the execution\n    // of the loader/action\n    let resolve: DataStrategyMatch[\"resolve\"] = async (handlerOverride) => {\n      if (\n        handlerOverride &&\n        request.method === \"GET\" &&\n        (match.route.lazy || match.route.loader)\n      ) {\n        shouldLoad = true;\n      }\n      return shouldLoad\n        ? callLoaderOrAction(\n            type,\n            request,\n            match,\n            loadRoutePromise,\n            handlerOverride,\n            requestContext\n          )\n        : Promise.resolve({ type: ResultType.data, result: undefined });\n    };\n\n    return {\n      ...match,\n      shouldLoad,\n      resolve,\n    };\n  });\n\n  // Send all matches here to allow for a middleware-type implementation.\n  // handler will be a no-op for unneeded routes and we filter those results\n  // back out below.\n  let results = await dataStrategyImpl({\n    matches: dsMatches,\n    request,\n    params: matches[0].params,\n    fetcherKey,\n    context: requestContext,\n  });\n\n  // Wait for all routes to load here but 'swallow the error since we want\n  // it to bubble up from the `await loadRoutePromise` in `callLoaderOrAction` -\n  // called from `match.resolve()`\n  try {\n    await Promise.all(loadRouteDefinitionsPromises);\n  } catch (e) {\n    // No-op\n  }\n\n  return results;\n}\n\n// Default logic for calling a loader/action is the user has no specified a dataStrategy\nasync function callLoaderOrAction(\n  type: \"loader\" | \"action\",\n  request: Request,\n  match: AgnosticDataRouteMatch,\n  loadRoutePromise: Promise<void> | undefined,\n  handlerOverride: Parameters<DataStrategyMatch[\"resolve\"]>[0],\n  staticContext?: unknown\n): Promise<DataStrategyResult> {\n  let result: DataStrategyResult;\n  let onReject: (() => void) | undefined;\n\n  let runHandler = (\n    handler: AgnosticRouteObject[\"loader\"] | AgnosticRouteObject[\"action\"]\n  ): Promise<DataStrategyResult> => {\n    // Setup a promise we can race against so that abort signals short circuit\n    let reject: () => void;\n    // This will never resolve so safe to type it as Promise<DataStrategyResult> to\n    // satisfy the function return value\n    let abortPromise = new Promise<DataStrategyResult>((_, r) => (reject = r));\n    onReject = () => reject();\n    request.signal.addEventListener(\"abort\", onReject);\n\n    let actualHandler = (ctx?: unknown) => {\n      if (typeof handler !== \"function\") {\n        return Promise.reject(\n          new Error(\n            `You cannot call the handler for a route which defines a boolean ` +\n              `\"${type}\" [routeId: ${match.route.id}]`\n          )\n        );\n      }\n      return handler(\n        {\n          request,\n          params: match.params,\n          context: staticContext,\n        },\n        ...(ctx !== undefined ? [ctx] : [])\n      );\n    };\n\n    let handlerPromise: Promise<DataStrategyResult> = (async () => {\n      try {\n        let val = await (handlerOverride\n          ? handlerOverride((ctx: unknown) => actualHandler(ctx))\n          : actualHandler());\n        return { type: \"data\", result: val };\n      } catch (e) {\n        return { type: \"error\", result: e };\n      }\n    })();\n\n    return Promise.race([handlerPromise, abortPromise]);\n  };\n\n  try {\n    let handler = match.route[type];\n\n    // If we have a route.lazy promise, await that first\n    if (loadRoutePromise) {\n      if (handler) {\n        // Run statically defined handler in parallel with lazy()\n        let handlerError;\n        let [value] = await Promise.all([\n          // If the handler throws, don't let it immediately bubble out,\n          // since we need to let the lazy() execution finish so we know if this\n          // route has a boundary that can handle the error\n          runHandler(handler).catch((e) => {\n            handlerError = e;\n          }),\n          loadRoutePromise,\n        ]);\n        if (handlerError !== undefined) {\n          throw handlerError;\n        }\n        result = value!;\n      } else {\n        // Load lazy route module, then run any returned handler\n        await loadRoutePromise;\n\n        handler = match.route[type];\n        if (handler) {\n          // Handler still runs even if we got interrupted to maintain consistency\n          // with un-abortable behavior of handler execution on non-lazy or\n          // previously-lazy-loaded routes\n          result = await runHandler(handler);\n        } else if (type === \"action\") {\n          let url = new URL(request.url);\n          let pathname = url.pathname + url.search;\n          throw getInternalRouterError(405, {\n            method: request.method,\n            pathname,\n            routeId: match.route.id,\n          });\n        } else {\n          // lazy() route has no loader to run.  Short circuit here so we don't\n          // hit the invariant below that errors on returning undefined.\n          return { type: ResultType.data, result: undefined };\n        }\n      }\n    } else if (!handler) {\n      let url = new URL(request.url);\n      let pathname = url.pathname + url.search;\n      throw getInternalRouterError(404, {\n        pathname,\n      });\n    } else {\n      result = await runHandler(handler);\n    }\n\n    invariant(\n      result.result !== undefined,\n      `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n        `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n        `function. Please return a value or \\`null\\`.`\n    );\n  } catch (e) {\n    // We should already be catching and converting normal handler executions to\n    // DataStrategyResults and returning them, so anything that throws here is an\n    // unexpected error we still need to wrap\n    return { type: ResultType.error, result: e };\n  } finally {\n    if (onReject) {\n      request.signal.removeEventListener(\"abort\", onReject);\n    }\n  }\n\n  return result;\n}\n\nasync function convertDataStrategyResultToDataResult(\n  dataStrategyResult: DataStrategyResult\n): Promise<DataResult> {\n  let { result, type } = dataStrategyResult;\n\n  if (isResponse(result)) {\n    let data: any;\n\n    try {\n      let contentType = result.headers.get(\"Content-Type\");\n      // Check between word boundaries instead of startsWith() due to the last\n      // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n      if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n        if (result.body == null) {\n          data = null;\n        } else {\n          data = await result.json();\n        }\n      } else {\n        data = await result.text();\n      }\n    } catch (e) {\n      return { type: ResultType.error, error: e };\n    }\n\n    if (type === ResultType.error) {\n      return {\n        type: ResultType.error,\n        error: new ErrorResponseImpl(result.status, result.statusText, data),\n        statusCode: result.status,\n        headers: result.headers,\n      };\n    }\n\n    return {\n      type: ResultType.data,\n      data,\n      statusCode: result.status,\n      headers: result.headers,\n    };\n  }\n\n  if (type === ResultType.error) {\n    if (isDataWithResponseInit(result)) {\n      if (result.data instanceof Error) {\n        return {\n          type: ResultType.error,\n          error: result.data,\n          statusCode: result.init?.status,\n          headers: result.init?.headers\n            ? new Headers(result.init.headers)\n            : undefined,\n        };\n      }\n\n      // Convert thrown data() to ErrorResponse instances\n      return {\n        type: ResultType.error,\n        error: new ErrorResponseImpl(\n          result.init?.status || 500,\n          undefined,\n          result.data\n        ),\n        statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n        headers: result.init?.headers\n          ? new Headers(result.init.headers)\n          : undefined,\n      };\n    }\n    return {\n      type: ResultType.error,\n      error: result,\n      statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n    };\n  }\n\n  if (isDeferredData(result)) {\n    return {\n      type: ResultType.deferred,\n      deferredData: result,\n      statusCode: result.init?.status,\n      headers: result.init?.headers && new Headers(result.init.headers),\n    };\n  }\n\n  if (isDataWithResponseInit(result)) {\n    return {\n      type: ResultType.data,\n      data: result.data,\n      statusCode: result.init?.status,\n      headers: result.init?.headers\n        ? new Headers(result.init.headers)\n        : undefined,\n    };\n  }\n\n  return { type: ResultType.data, data: result };\n}\n\n// Support relative routing in internal redirects\nfunction normalizeRelativeRoutingRedirectResponse(\n  response: Response,\n  request: Request,\n  routeId: string,\n  matches: AgnosticDataRouteMatch[],\n  basename: string,\n  v7_relativeSplatPath: boolean\n) {\n  let location = response.headers.get(\"Location\");\n  invariant(\n    location,\n    \"Redirects returned/thrown from loaders/actions must have a Location header\"\n  );\n\n  if (!ABSOLUTE_URL_REGEX.test(location)) {\n    let trimmedMatches = matches.slice(\n      0,\n      matches.findIndex((m) => m.route.id === routeId) + 1\n    );\n    location = normalizeTo(\n      new URL(request.url),\n      trimmedMatches,\n      basename,\n      true,\n      location,\n      v7_relativeSplatPath\n    );\n    response.headers.set(\"Location\", location);\n  }\n\n  return response;\n}\n\nfunction normalizeRedirectLocation(\n  location: string,\n  currentUrl: URL,\n  basename: string\n): string {\n  if (ABSOLUTE_URL_REGEX.test(location)) {\n    // Strip off the protocol+origin for same-origin + same-basename absolute redirects\n    let normalizedLocation = location;\n    let url = normalizedLocation.startsWith(\"//\")\n      ? new URL(currentUrl.protocol + normalizedLocation)\n      : new URL(normalizedLocation);\n    let isSameBasename = stripBasename(url.pathname, basename) != null;\n    if (url.origin === currentUrl.origin && isSameBasename) {\n      return url.pathname + url.search + url.hash;\n    }\n  }\n  return location;\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches.  During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n  history: History,\n  location: string | Location,\n  signal: AbortSignal,\n  submission?: Submission\n): Request {\n  let url = history.createURL(stripHashFromPath(location)).toString();\n  let init: RequestInit = { signal };\n\n  if (submission && isMutationMethod(submission.formMethod)) {\n    let { formMethod, formEncType } = submission;\n    // Didn't think we needed this but it turns out unlike other methods, patch\n    // won't be properly normalized to uppercase and results in a 405 error.\n    // See: https://fetch.spec.whatwg.org/#concept-method\n    init.method = formMethod.toUpperCase();\n\n    if (formEncType === \"application/json\") {\n      init.headers = new Headers({ \"Content-Type\": formEncType });\n      init.body = JSON.stringify(submission.json);\n    } else if (formEncType === \"text/plain\") {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = submission.text;\n    } else if (\n      formEncType === \"application/x-www-form-urlencoded\" &&\n      submission.formData\n    ) {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = convertFormDataToSearchParams(submission.formData);\n    } else {\n      // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n      init.body = submission.formData;\n    }\n  }\n\n  return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n  let searchParams = new URLSearchParams();\n\n  for (let [key, value] of formData.entries()) {\n    // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n    searchParams.append(key, typeof value === \"string\" ? value : value.name);\n  }\n\n  return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n  searchParams: URLSearchParams\n): FormData {\n  let formData = new FormData();\n  for (let [key, value] of searchParams.entries()) {\n    formData.append(key, value);\n  }\n  return formData;\n}\n\nfunction processRouteLoaderData(\n  matches: AgnosticDataRouteMatch[],\n  results: Record<string, DataResult>,\n  pendingActionResult: PendingActionResult | undefined,\n  activeDeferreds: Map<string, DeferredData>,\n  skipLoaderErrorBubbling: boolean\n): {\n  loaderData: RouterState[\"loaderData\"];\n  errors: RouterState[\"errors\"] | null;\n  statusCode: number;\n  loaderHeaders: Record<string, Headers>;\n} {\n  // Fill in loaderData/errors from our loaders\n  let loaderData: RouterState[\"loaderData\"] = {};\n  let errors: RouterState[\"errors\"] | null = null;\n  let statusCode: number | undefined;\n  let foundError = false;\n  let loaderHeaders: Record<string, Headers> = {};\n  let pendingError =\n    pendingActionResult && isErrorResult(pendingActionResult[1])\n      ? pendingActionResult[1].error\n      : undefined;\n\n  // Process loader results into state.loaderData/state.errors\n  matches.forEach((match) => {\n    if (!(match.route.id in results)) {\n      return;\n    }\n    let id = match.route.id;\n    let result = results[id];\n    invariant(\n      !isRedirectResult(result),\n      \"Cannot handle redirect results in processLoaderData\"\n    );\n    if (isErrorResult(result)) {\n      let error = result.error;\n      // If we have a pending action error, we report it at the highest-route\n      // that throws a loader error, and then clear it out to indicate that\n      // it was consumed\n      if (pendingError !== undefined) {\n        error = pendingError;\n        pendingError = undefined;\n      }\n\n      errors = errors || {};\n\n      if (skipLoaderErrorBubbling) {\n        errors[id] = error;\n      } else {\n        // Look upwards from the matched route for the closest ancestor error\n        // boundary, defaulting to the root match.  Prefer higher error values\n        // if lower errors bubble to the same boundary\n        let boundaryMatch = findNearestBoundary(matches, id);\n        if (errors[boundaryMatch.route.id] == null) {\n          errors[boundaryMatch.route.id] = error;\n        }\n      }\n\n      // Clear our any prior loaderData for the throwing route\n      loaderData[id] = undefined;\n\n      // Once we find our first (highest) error, we set the status code and\n      // prevent deeper status codes from overriding\n      if (!foundError) {\n        foundError = true;\n        statusCode = isRouteErrorResponse(result.error)\n          ? result.error.status\n          : 500;\n      }\n      if (result.headers) {\n        loaderHeaders[id] = result.headers;\n      }\n    } else {\n      if (isDeferredResult(result)) {\n        activeDeferreds.set(id, result.deferredData);\n        loaderData[id] = result.deferredData.data;\n        // Error status codes always override success status codes, but if all\n        // loaders are successful we take the deepest status code.\n        if (\n          result.statusCode != null &&\n          result.statusCode !== 200 &&\n          !foundError\n        ) {\n          statusCode = result.statusCode;\n        }\n        if (result.headers) {\n          loaderHeaders[id] = result.headers;\n        }\n      } else {\n        loaderData[id] = result.data;\n        // Error status codes always override success status codes, but if all\n        // loaders are successful we take the deepest status code.\n        if (result.statusCode && result.statusCode !== 200 && !foundError) {\n          statusCode = result.statusCode;\n        }\n        if (result.headers) {\n          loaderHeaders[id] = result.headers;\n        }\n      }\n    }\n  });\n\n  // If we didn't consume the pending action error (i.e., all loaders\n  // resolved), then consume it here.  Also clear out any loaderData for the\n  // throwing route\n  if (pendingError !== undefined && pendingActionResult) {\n    errors = { [pendingActionResult[0]]: pendingError };\n    loaderData[pendingActionResult[0]] = undefined;\n  }\n\n  return {\n    loaderData,\n    errors,\n    statusCode: statusCode || 200,\n    loaderHeaders,\n  };\n}\n\nfunction processLoaderData(\n  state: RouterState,\n  matches: AgnosticDataRouteMatch[],\n  results: Record<string, DataResult>,\n  pendingActionResult: PendingActionResult | undefined,\n  revalidatingFetchers: RevalidatingFetcher[],\n  fetcherResults: Record<string, DataResult>,\n  activeDeferreds: Map<string, DeferredData>\n): {\n  loaderData: RouterState[\"loaderData\"];\n  errors?: RouterState[\"errors\"];\n} {\n  let { loaderData, errors } = processRouteLoaderData(\n    matches,\n    results,\n    pendingActionResult,\n    activeDeferreds,\n    false // This method is only called client side so we always want to bubble\n  );\n\n  // Process results from our revalidating fetchers\n  revalidatingFetchers.forEach((rf) => {\n    let { key, match, controller } = rf;\n    let result = fetcherResults[key];\n    invariant(result, \"Did not find corresponding fetcher result\");\n\n    // Process fetcher non-redirect errors\n    if (controller && controller.signal.aborted) {\n      // Nothing to do for aborted fetchers\n      return;\n    } else if (isErrorResult(result)) {\n      let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n      if (!(errors && errors[boundaryMatch.route.id])) {\n        errors = {\n          ...errors,\n          [boundaryMatch.route.id]: result.error,\n        };\n      }\n      state.fetchers.delete(key);\n    } else if (isRedirectResult(result)) {\n      // Should never get here, redirects should get processed above, but we\n      // keep this to type narrow to a success result in the else\n      invariant(false, \"Unhandled fetcher revalidation redirect\");\n    } else if (isDeferredResult(result)) {\n      // Should never get here, deferred data should be awaited for fetchers\n      // in resolveDeferredResults\n      invariant(false, \"Unhandled fetcher deferred data\");\n    } else {\n      let doneFetcher = getDoneFetcher(result.data);\n      state.fetchers.set(key, doneFetcher);\n    }\n  });\n\n  return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n  loaderData: RouteData,\n  newLoaderData: RouteData,\n  matches: AgnosticDataRouteMatch[],\n  errors: RouteData | null | undefined\n): RouteData {\n  let mergedLoaderData = { ...newLoaderData };\n  for (let match of matches) {\n    let id = match.route.id;\n    if (newLoaderData.hasOwnProperty(id)) {\n      if (newLoaderData[id] !== undefined) {\n        mergedLoaderData[id] = newLoaderData[id];\n      } else {\n        // No-op - this is so we ignore existing data if we have a key in the\n        // incoming object with an undefined value, which is how we unset a prior\n        // loaderData if we encounter a loader error\n      }\n    } else if (loaderData[id] !== undefined && match.route.loader) {\n      // Preserve existing keys not included in newLoaderData and where a loader\n      // wasn't removed by HMR\n      mergedLoaderData[id] = loaderData[id];\n    }\n\n    if (errors && errors.hasOwnProperty(id)) {\n      // Don't keep any loader data below the boundary\n      break;\n    }\n  }\n  return mergedLoaderData;\n}\n\nfunction getActionDataForCommit(\n  pendingActionResult: PendingActionResult | undefined\n) {\n  if (!pendingActionResult) {\n    return {};\n  }\n  return isErrorResult(pendingActionResult[1])\n    ? {\n        // Clear out prior actionData on errors\n        actionData: {},\n      }\n    : {\n        actionData: {\n          [pendingActionResult[0]]: pendingActionResult[1].data,\n        },\n      };\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n  matches: AgnosticDataRouteMatch[],\n  routeId?: string\n): AgnosticDataRouteMatch {\n  let eligibleMatches = routeId\n    ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n    : [...matches];\n  return (\n    eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n    matches[0]\n  );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n  matches: AgnosticDataRouteMatch[];\n  route: AgnosticDataRouteObject;\n} {\n  // Prefer a root layout route if present, otherwise shim in a route object\n  let route =\n    routes.length === 1\n      ? routes[0]\n      : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n          id: `__shim-error-route__`,\n        };\n\n  return {\n    matches: [\n      {\n        params: {},\n        pathname: \"\",\n        pathnameBase: \"\",\n        route,\n      },\n    ],\n    route,\n  };\n}\n\nfunction getInternalRouterError(\n  status: number,\n  {\n    pathname,\n    routeId,\n    method,\n    type,\n    message,\n  }: {\n    pathname?: string;\n    routeId?: string;\n    method?: string;\n    type?: \"defer-action\" | \"invalid-body\";\n    message?: string;\n  } = {}\n) {\n  let statusText = \"Unknown Server Error\";\n  let errorMessage = \"Unknown @remix-run/router error\";\n\n  if (status === 400) {\n    statusText = \"Bad Request\";\n    if (method && pathname && routeId) {\n      errorMessage =\n        `You made a ${method} request to \"${pathname}\" but ` +\n        `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n        `so there is no way to handle the request.`;\n    } else if (type === \"defer-action\") {\n      errorMessage = \"defer() is not supported in actions\";\n    } else if (type === \"invalid-body\") {\n      errorMessage = \"Unable to encode submission body\";\n    }\n  } else if (status === 403) {\n    statusText = \"Forbidden\";\n    errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n  } else if (status === 404) {\n    statusText = \"Not Found\";\n    errorMessage = `No route matches URL \"${pathname}\"`;\n  } else if (status === 405) {\n    statusText = \"Method Not Allowed\";\n    if (method && pathname && routeId) {\n      errorMessage =\n        `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n        `did not provide an \\`action\\` for route \"${routeId}\", ` +\n        `so there is no way to handle the request.`;\n    } else if (method) {\n      errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n    }\n  }\n\n  return new ErrorResponseImpl(\n    status || 500,\n    statusText,\n    new Error(errorMessage),\n    true\n  );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n  results: Record<string, DataResult>\n): { key: string; result: RedirectResult } | undefined {\n  let entries = Object.entries(results);\n  for (let i = entries.length - 1; i >= 0; i--) {\n    let [key, result] = entries[i];\n    if (isRedirectResult(result)) {\n      return { key, result };\n    }\n  }\n}\n\nfunction stripHashFromPath(path: To) {\n  let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n  return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n  if (a.pathname !== b.pathname || a.search !== b.search) {\n    return false;\n  }\n\n  if (a.hash === \"\") {\n    // /page -> /page#hash\n    return b.hash !== \"\";\n  } else if (a.hash === b.hash) {\n    // /page#hash -> /page#hash\n    return true;\n  } else if (b.hash !== \"\") {\n    // /page#hash -> /page#other\n    return true;\n  }\n\n  // If the hash is removed the browser will re-perform a request to the server\n  // /page#hash -> /page\n  return false;\n}\n\nfunction isPromise<T = unknown>(val: unknown): val is Promise<T> {\n  return typeof val === \"object\" && val != null && \"then\" in val;\n}\n\nfunction isDataStrategyResult(result: unknown): result is DataStrategyResult {\n  return (\n    result != null &&\n    typeof result === \"object\" &&\n    \"type\" in result &&\n    \"result\" in result &&\n    (result.type === ResultType.data || result.type === ResultType.error)\n  );\n}\n\nfunction isRedirectDataStrategyResultResult(result: DataStrategyResult) {\n  return (\n    isResponse(result.result) && redirectStatusCodes.has(result.result.status)\n  );\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n  return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n  return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n  return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDataWithResponseInit(\n  value: any\n): value is DataWithResponseInit<unknown> {\n  return (\n    typeof value === \"object\" &&\n    value != null &&\n    \"type\" in value &&\n    \"data\" in value &&\n    \"init\" in value &&\n    value.type === \"DataWithResponseInit\"\n  );\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n  let deferred: DeferredData = value;\n  return (\n    deferred &&\n    typeof deferred === \"object\" &&\n    typeof deferred.data === \"object\" &&\n    typeof deferred.subscribe === \"function\" &&\n    typeof deferred.cancel === \"function\" &&\n    typeof deferred.resolveData === \"function\"\n  );\n}\n\nfunction isResponse(value: any): value is Response {\n  return (\n    value != null &&\n    typeof value.status === \"number\" &&\n    typeof value.statusText === \"string\" &&\n    typeof value.headers === \"object\" &&\n    typeof value.body !== \"undefined\"\n  );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n  if (!isResponse(result)) {\n    return false;\n  }\n\n  let status = result.status;\n  let location = result.headers.get(\"Location\");\n  return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n  return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n  method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n  return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveNavigationDeferredResults(\n  matches: (AgnosticDataRouteMatch | null)[],\n  results: Record<string, DataResult>,\n  signal: AbortSignal,\n  currentMatches: AgnosticDataRouteMatch[],\n  currentLoaderData: RouteData\n) {\n  let entries = Object.entries(results);\n  for (let index = 0; index < entries.length; index++) {\n    let [routeId, result] = entries[index];\n    let match = matches.find((m) => m?.route.id === routeId);\n    // If we don't have a match, then we can have a deferred result to do\n    // anything with.  This is for revalidating fetchers where the route was\n    // removed during HMR\n    if (!match) {\n      continue;\n    }\n\n    let currentMatch = currentMatches.find(\n      (m) => m.route.id === match!.route.id\n    );\n    let isRevalidatingLoader =\n      currentMatch != null &&\n      !isNewRouteInstance(currentMatch, match) &&\n      (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n    if (isDeferredResult(result) && isRevalidatingLoader) {\n      // Note: we do not have to touch activeDeferreds here since we race them\n      // against the signal in resolveDeferredData and they'll get aborted\n      // there if needed\n      await resolveDeferredData(result, signal, false).then((result) => {\n        if (result) {\n          results[routeId] = result;\n        }\n      });\n    }\n  }\n}\n\nasync function resolveFetcherDeferredResults(\n  matches: (AgnosticDataRouteMatch | null)[],\n  results: Record<string, DataResult>,\n  revalidatingFetchers: RevalidatingFetcher[]\n) {\n  for (let index = 0; index < revalidatingFetchers.length; index++) {\n    let { key, routeId, controller } = revalidatingFetchers[index];\n    let result = results[key];\n    let match = matches.find((m) => m?.route.id === routeId);\n    // If we don't have a match, then we can have a deferred result to do\n    // anything with.  This is for revalidating fetchers where the route was\n    // removed during HMR\n    if (!match) {\n      continue;\n    }\n\n    if (isDeferredResult(result)) {\n      // Note: we do not have to touch activeDeferreds here since we race them\n      // against the signal in resolveDeferredData and they'll get aborted\n      // there if needed\n      invariant(\n        controller,\n        \"Expected an AbortController for revalidating fetcher deferred result\"\n      );\n      await resolveDeferredData(result, controller.signal, true).then(\n        (result) => {\n          if (result) {\n            results[key] = result;\n          }\n        }\n      );\n    }\n  }\n}\n\nasync function resolveDeferredData(\n  result: DeferredResult,\n  signal: AbortSignal,\n  unwrap = false\n): Promise<SuccessResult | ErrorResult | undefined> {\n  let aborted = await result.deferredData.resolveData(signal);\n  if (aborted) {\n    return;\n  }\n\n  if (unwrap) {\n    try {\n      return {\n        type: ResultType.data,\n        data: result.deferredData.unwrappedData,\n      };\n    } catch (e) {\n      // Handle any TrackedPromise._error values encountered while unwrapping\n      return {\n        type: ResultType.error,\n        error: e,\n      };\n    }\n  }\n\n  return {\n    type: ResultType.data,\n    data: result.deferredData.data,\n  };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n  return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\nfunction getTargetMatch(\n  matches: AgnosticDataRouteMatch[],\n  location: Location | string\n) {\n  let search =\n    typeof location === \"string\" ? parsePath(location).search : location.search;\n  if (\n    matches[matches.length - 1].route.index &&\n    hasNakedIndexQuery(search || \"\")\n  ) {\n    // Return the leaf index route when index is present\n    return matches[matches.length - 1];\n  }\n  // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n  // pathless layout routes)\n  let pathMatches = getPathContributingMatches(matches);\n  return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n  navigation: Navigation\n): Submission | undefined {\n  let { formMethod, formAction, formEncType, text, formData, json } =\n    navigation;\n  if (!formMethod || !formAction || !formEncType) {\n    return;\n  }\n\n  if (text != null) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData: undefined,\n      json: undefined,\n      text,\n    };\n  } else if (formData != null) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData,\n      json: undefined,\n      text: undefined,\n    };\n  } else if (json !== undefined) {\n    return {\n      formMethod,\n      formAction,\n      formEncType,\n      formData: undefined,\n      json,\n      text: undefined,\n    };\n  }\n}\n\nfunction getLoadingNavigation(\n  location: Location,\n  submission?: Submission\n): NavigationStates[\"Loading\"] {\n  if (submission) {\n    let navigation: NavigationStates[\"Loading\"] = {\n      state: \"loading\",\n      location,\n      formMethod: submission.formMethod,\n      formAction: submission.formAction,\n      formEncType: submission.formEncType,\n      formData: submission.formData,\n      json: submission.json,\n      text: submission.text,\n    };\n    return navigation;\n  } else {\n    let navigation: NavigationStates[\"Loading\"] = {\n      state: \"loading\",\n      location,\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined,\n      json: undefined,\n      text: undefined,\n    };\n    return navigation;\n  }\n}\n\nfunction getSubmittingNavigation(\n  location: Location,\n  submission: Submission\n): NavigationStates[\"Submitting\"] {\n  let navigation: NavigationStates[\"Submitting\"] = {\n    state: \"submitting\",\n    location,\n    formMethod: submission.formMethod,\n    formAction: submission.formAction,\n    formEncType: submission.formEncType,\n    formData: submission.formData,\n    json: submission.json,\n    text: submission.text,\n  };\n  return navigation;\n}\n\nfunction getLoadingFetcher(\n  submission?: Submission,\n  data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n  if (submission) {\n    let fetcher: FetcherStates[\"Loading\"] = {\n      state: \"loading\",\n      formMethod: submission.formMethod,\n      formAction: submission.formAction,\n      formEncType: submission.formEncType,\n      formData: submission.formData,\n      json: submission.json,\n      text: submission.text,\n      data,\n    };\n    return fetcher;\n  } else {\n    let fetcher: FetcherStates[\"Loading\"] = {\n      state: \"loading\",\n      formMethod: undefined,\n      formAction: undefined,\n      formEncType: undefined,\n      formData: undefined,\n      json: undefined,\n      text: undefined,\n      data,\n    };\n    return fetcher;\n  }\n}\n\nfunction getSubmittingFetcher(\n  submission: Submission,\n  existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n  let fetcher: FetcherStates[\"Submitting\"] = {\n    state: \"submitting\",\n    formMethod: submission.formMethod,\n    formAction: submission.formAction,\n    formEncType: submission.formEncType,\n    formData: submission.formData,\n    json: submission.json,\n    text: submission.text,\n    data: existingFetcher ? existingFetcher.data : undefined,\n  };\n  return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n  let fetcher: FetcherStates[\"Idle\"] = {\n    state: \"idle\",\n    formMethod: undefined,\n    formAction: undefined,\n    formEncType: undefined,\n    formData: undefined,\n    json: undefined,\n    text: undefined,\n    data,\n  };\n  return fetcher;\n}\n\nfunction restoreAppliedTransitions(\n  _window: Window,\n  transitions: Map<string, Set<string>>\n) {\n  try {\n    let sessionPositions = _window.sessionStorage.getItem(\n      TRANSITIONS_STORAGE_KEY\n    );\n    if (sessionPositions) {\n      let json = JSON.parse(sessionPositions);\n      for (let [k, v] of Object.entries(json || {})) {\n        if (v && Array.isArray(v)) {\n          transitions.set(k, new Set(v || []));\n        }\n      }\n    }\n  } catch (e) {\n    // no-op, use default empty object\n  }\n}\n\nfunction persistAppliedTransitions(\n  _window: Window,\n  transitions: Map<string, Set<string>>\n) {\n  if (transitions.size > 0) {\n    let json: Record<string, string[]> = {};\n    for (let [k, v] of transitions) {\n      json[k] = [...v];\n    }\n    try {\n      _window.sessionStorage.setItem(\n        TRANSITIONS_STORAGE_KEY,\n        JSON.stringify(json)\n      );\n    } catch (error) {\n      warning(\n        false,\n        `Failed to save applied view transitions in sessionStorage (${error}).`\n      );\n    }\n  }\n}\n//#endregion\n","import * as React from \"react\";\nimport type {\n  AgnosticIndexRouteObject,\n  AgnosticNonIndexRouteObject,\n  AgnosticRouteMatch,\n  History,\n  LazyRouteFunction,\n  Location,\n  Action as NavigationType,\n  RelativeRoutingType,\n  Router,\n  StaticHandlerContext,\n  To,\n  TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n  caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n  path?: AgnosticIndexRouteObject[\"path\"];\n  id?: AgnosticIndexRouteObject[\"id\"];\n  loader?: AgnosticIndexRouteObject[\"loader\"];\n  action?: AgnosticIndexRouteObject[\"action\"];\n  hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n  handle?: AgnosticIndexRouteObject[\"handle\"];\n  index: true;\n  children?: undefined;\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n  lazy?: LazyRouteFunction<RouteObject>;\n}\n\nexport interface NonIndexRouteObject {\n  caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n  path?: AgnosticNonIndexRouteObject[\"path\"];\n  id?: AgnosticNonIndexRouteObject[\"id\"];\n  loader?: AgnosticNonIndexRouteObject[\"loader\"];\n  action?: AgnosticNonIndexRouteObject[\"action\"];\n  hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n  handle?: AgnosticNonIndexRouteObject[\"handle\"];\n  index?: false;\n  children?: RouteObject[];\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n  lazy?: LazyRouteFunction<RouteObject>;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n  children?: DataRouteObject[];\n  id: string;\n};\n\nexport interface RouteMatch<\n  ParamKey extends string = string,\n  RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch<ParamKey, RouteObjectType> {}\n\nexport interface DataRouteMatch extends RouteMatch<string, DataRouteObject> {}\n\nexport interface DataRouterContextObject\n  // Omit `future` since those can be pulled from the `router`\n  // `NavigationContext` needs future since it doesn't have a `router` in all cases\n  extends Omit<NavigationContextObject, \"future\"> {\n  router: Router;\n  staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n  React.createContext<DataRouterContextObject | null>(null);\nif (__DEV__) {\n  DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n  Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n  DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext<TrackedPromise | null>(null);\nif (__DEV__) {\n  AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n  replace?: boolean;\n  state?: any;\n  preventScrollReset?: boolean;\n  relative?: RelativeRoutingType;\n  flushSync?: boolean;\n  viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `<Router>` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n  createHref: History[\"createHref\"];\n  // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n  encodeLocation?: History[\"encodeLocation\"];\n  go: History[\"go\"];\n  push(to: To, state?: any, opts?: NavigateOptions): void;\n  replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n  basename: string;\n  navigator: Navigator;\n  static: boolean;\n  future: {\n    v7_relativeSplatPath: boolean;\n  };\n}\n\nexport const NavigationContext = React.createContext<NavigationContextObject>(\n  null!\n);\n\nif (__DEV__) {\n  NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n  location: Location;\n  navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext<LocationContextObject>(\n  null!\n);\n\nif (__DEV__) {\n  LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n  outlet: React.ReactElement | null;\n  matches: RouteMatch[];\n  isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext<RouteContextObject>({\n  outlet: null,\n  matches: [],\n  isDataRoute: false,\n});\n\nif (__DEV__) {\n  RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext<any>(null);\n\nif (__DEV__) {\n  RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n  AgnosticRouteMatch,\n  Blocker,\n  BlockerFunction,\n  Location,\n  ParamParseKey,\n  Params,\n  Path,\n  PathMatch,\n  PathPattern,\n  RelativeRoutingType,\n  Router as RemixRouter,\n  RevalidationState,\n  To,\n  UIMatch,\n} from \"@remix-run/router\";\nimport {\n  IDLE_BLOCKER,\n  Action as NavigationType,\n  UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n  UNSAFE_decodePath as decodePath,\n  UNSAFE_getResolveToMatches as getResolveToMatches,\n  UNSAFE_invariant as invariant,\n  isRouteErrorResponse,\n  joinPaths,\n  matchPath,\n  matchRoutes,\n  parsePath,\n  resolveTo,\n  stripBasename,\n  UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n  DataRouteMatch,\n  NavigateOptions,\n  RouteContextObject,\n  RouteMatch,\n  RouteObject,\n} from \"./context\";\nimport {\n  AwaitContext,\n  DataRouterContext,\n  DataRouterStateContext,\n  LocationContext,\n  NavigationContext,\n  RouteContext,\n  RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/v6/hooks/use-href\n */\nexport function useHref(\n  to: To,\n  { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useHref() may be used only in the context of a <Router> component.`\n  );\n\n  let { basename, navigator } = React.useContext(NavigationContext);\n  let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n  let joinedPathname = pathname;\n\n  // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the href.  If this is a root navigation, then just use the raw\n  // basename which allows the basename to have full control over the presence\n  // of a trailing slash on root links\n  if (basename !== \"/\") {\n    joinedPathname =\n      pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n  }\n\n  return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a `<Router>`.\n *\n * @see https://reactrouter.com/v6/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n  return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/v6/hooks/use-location\n */\nexport function useLocation(): Location {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useLocation() may be used only in the context of a <Router> component.`\n  );\n\n  return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n  return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * `<NavLink>`.\n *\n * @see https://reactrouter.com/v6/hooks/use-match\n */\nexport function useMatch<\n  ParamKey extends ParamParseKey<Path>,\n  Path extends string\n>(pattern: PathPattern<Path> | Path): PathMatch<ParamKey> | null {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useMatch() may be used only in the context of a <Router> component.`\n  );\n\n  let { pathname } = useLocation();\n  return React.useMemo(\n    () => matchPath<ParamKey, Path>(pattern, decodePath(pathname)),\n    [pathname, pattern]\n  );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n  (to: To, options?: NavigateOptions): void;\n  (delta: number): void;\n}\n\nconst navigateEffectWarning =\n  `You should call navigate() in a React.useEffect(), not when ` +\n  `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n  cb: Parameters<typeof React.useLayoutEffect>[0]\n) {\n  let isStatic = React.useContext(NavigationContext).static;\n  if (!isStatic) {\n    // We should be able to get rid of this once react 18.3 is released\n    // See: https://github.com/facebook/react/pull/26395\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(cb);\n  }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by `<Link>`s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/v6/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n  let { isDataRoute } = React.useContext(RouteContext);\n  // Conditional usage is OK here because the usage of a data router is static\n  // eslint-disable-next-line react-hooks/rules-of-hooks\n  return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useNavigate() may be used only in the context of a <Router> component.`\n  );\n\n  let dataRouterContext = React.useContext(DataRouterContext);\n  let { basename, future, navigator } = React.useContext(NavigationContext);\n  let { matches } = React.useContext(RouteContext);\n  let { pathname: locationPathname } = useLocation();\n\n  let routePathnamesJson = JSON.stringify(\n    getResolveToMatches(matches, future.v7_relativeSplatPath)\n  );\n\n  let activeRef = React.useRef(false);\n  useIsomorphicLayoutEffect(() => {\n    activeRef.current = true;\n  });\n\n  let navigate: NavigateFunction = React.useCallback(\n    (to: To | number, options: NavigateOptions = {}) => {\n      warning(activeRef.current, navigateEffectWarning);\n\n      // Short circuit here since if this happens on first render the navigate\n      // is useless because we haven't wired up our history listener yet\n      if (!activeRef.current) return;\n\n      if (typeof to === \"number\") {\n        navigator.go(to);\n        return;\n      }\n\n      let path = resolveTo(\n        to,\n        JSON.parse(routePathnamesJson),\n        locationPathname,\n        options.relative === \"path\"\n      );\n\n      // If we're operating within a basename, prepend it to the pathname prior\n      // to handing off to history (but only if we're not in a data router,\n      // otherwise it'll prepend the basename inside of the router).\n      // If this is a root navigation, then we navigate to the raw basename\n      // which allows the basename to have full control over the presence of a\n      // trailing slash on root links\n      if (dataRouterContext == null && basename !== \"/\") {\n        path.pathname =\n          path.pathname === \"/\"\n            ? basename\n            : joinPaths([basename, path.pathname]);\n      }\n\n      (!!options.replace ? navigator.replace : navigator.push)(\n        path,\n        options.state,\n        options\n      );\n    },\n    [\n      basename,\n      navigator,\n      routePathnamesJson,\n      locationPathname,\n      dataRouterContext,\n    ]\n  );\n\n  return navigate;\n}\n\nconst OutletContext = React.createContext<unknown>(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/v6/hooks/use-outlet-context\n */\nexport function useOutletContext<Context = unknown>(): Context {\n  return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `<Outlet>` to render child routes.\n *\n * @see https://reactrouter.com/v6/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n  let outlet = React.useContext(RouteContext).outlet;\n  if (outlet) {\n    return (\n      <OutletContext.Provider value={context}>{outlet}</OutletContext.Provider>\n    );\n  }\n  return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/v6/hooks/use-params\n */\nexport function useParams<\n  ParamsOrKey extends string | Record<string, string | undefined> = string\n>(): Readonly<\n  [ParamsOrKey] extends [string] ? Params<ParamsOrKey> : Partial<ParamsOrKey>\n> {\n  let { matches } = React.useContext(RouteContext);\n  let routeMatch = matches[matches.length - 1];\n  return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/v6/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n  to: To,\n  { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n  let { future } = React.useContext(NavigationContext);\n  let { matches } = React.useContext(RouteContext);\n  let { pathname: locationPathname } = useLocation();\n  let routePathnamesJson = JSON.stringify(\n    getResolveToMatches(matches, future.v7_relativeSplatPath)\n  );\n\n  return React.useMemo(\n    () =>\n      resolveTo(\n        to,\n        JSON.parse(routePathnamesJson),\n        locationPathname,\n        relative === \"path\"\n      ),\n    [to, routePathnamesJson, locationPathname, relative]\n  );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `<Outlet>` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/v6/hooks/use-routes\n */\nexport function useRoutes(\n  routes: RouteObject[],\n  locationArg?: Partial<Location> | string\n): React.ReactElement | null {\n  return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n  routes: RouteObject[],\n  locationArg?: Partial<Location> | string,\n  dataRouterState?: RemixRouter[\"state\"],\n  future?: RemixRouter[\"future\"]\n): React.ReactElement | null {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of the\n    // router loaded. We can help them understand how to avoid that.\n    `useRoutes() may be used only in the context of a <Router> component.`\n  );\n\n  let { navigator, static: isStatic } = React.useContext(NavigationContext);\n  let { matches: parentMatches } = React.useContext(RouteContext);\n  let routeMatch = parentMatches[parentMatches.length - 1];\n  let parentParams = routeMatch ? routeMatch.params : {};\n  let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n  let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n  let parentRoute = routeMatch && routeMatch.route;\n\n  if (__DEV__) {\n    // You won't get a warning about 2 different <Routes> under a <Route>\n    // without a trailing *, but this is a best-effort warning anyway since we\n    // cannot even give the warning unless they land at the parent route.\n    //\n    // Example:\n    //\n    // <Routes>\n    //   {/* This route path MUST end with /* because otherwise\n    //       it will never match /blog/post/123 */}\n    //   <Route path=\"blog\" element={<Blog />} />\n    //   <Route path=\"blog/feed\" element={<BlogFeed />} />\n    // </Routes>\n    //\n    // function Blog() {\n    //   return (\n    //     <Routes>\n    //       <Route path=\"post/:id\" element={<Post />} />\n    //     </Routes>\n    //   );\n    // }\n    let parentPath = (parentRoute && parentRoute.path) || \"\";\n    warningOnce(\n      parentPathname,\n      !parentRoute || parentPath.endsWith(\"*\"),\n      `You rendered descendant <Routes> (or called \\`useRoutes()\\`) at ` +\n        `\"${parentPathname}\" (under <Route path=\"${parentPath}\">) but the ` +\n        `parent route path has no trailing \"*\". This means if you navigate ` +\n        `deeper, the parent won't match anymore and therefore the child ` +\n        `routes will never render.\\n\\n` +\n        `Please change the parent <Route path=\"${parentPath}\"> to <Route ` +\n        `path=\"${parentPath === \"/\" ? \"*\" : `${parentPath}/*`}\">.`\n    );\n  }\n\n  let locationFromContext = useLocation();\n\n  let location;\n  if (locationArg) {\n    let parsedLocationArg =\n      typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n    invariant(\n      parentPathnameBase === \"/\" ||\n        parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n      `When overriding the location using \\`<Routes location>\\` or \\`useRoutes(routes, location)\\`, ` +\n        `the location pathname must begin with the portion of the URL pathname that was ` +\n        `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n        `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n    );\n\n    location = parsedLocationArg;\n  } else {\n    location = locationFromContext;\n  }\n\n  let pathname = location.pathname || \"/\";\n\n  let remainingPathname = pathname;\n  if (parentPathnameBase !== \"/\") {\n    // Determine the remaining pathname by removing the # of URL segments the\n    // parentPathnameBase has, instead of removing based on character count.\n    // This is because we can't guarantee that incoming/outgoing encodings/\n    // decodings will match exactly.\n    // We decode paths before matching on a per-segment basis with\n    // decodeURIComponent(), but we re-encode pathnames via `new URL()` so they\n    // match what `window.location.pathname` would reflect.  Those don't 100%\n    // align when it comes to encoded URI characters such as % and &.\n    //\n    // So we may end up with:\n    //   pathname:           \"/descendant/a%25b/match\"\n    //   parentPathnameBase: \"/descendant/a%b\"\n    //\n    // And the direct substring removal approach won't work :/\n    let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n    let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n    remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n  }\n\n  let matches =\n    !isStatic &&\n    dataRouterState &&\n    dataRouterState.matches &&\n    dataRouterState.matches.length > 0\n      ? (dataRouterState.matches as AgnosticRouteMatch<string, RouteObject>[])\n      : matchRoutes(routes, { pathname: remainingPathname });\n\n  if (__DEV__) {\n    warning(\n      parentRoute || matches != null,\n      `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n    );\n\n    warning(\n      matches == null ||\n        matches[matches.length - 1].route.element !== undefined ||\n        matches[matches.length - 1].route.Component !== undefined ||\n        matches[matches.length - 1].route.lazy !== undefined,\n      `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n        `does not have an element or Component. This means it will render an <Outlet /> with a ` +\n        `null value by default resulting in an \"empty\" page.`\n    );\n  }\n\n  let renderedMatches = _renderMatches(\n    matches &&\n      matches.map((match) =>\n        Object.assign({}, match, {\n          params: Object.assign({}, parentParams, match.params),\n          pathname: joinPaths([\n            parentPathnameBase,\n            // Re-encode pathnames that were decoded inside matchRoutes\n            navigator.encodeLocation\n              ? navigator.encodeLocation(match.pathname).pathname\n              : match.pathname,\n          ]),\n          pathnameBase:\n            match.pathnameBase === \"/\"\n              ? parentPathnameBase\n              : joinPaths([\n                  parentPathnameBase,\n                  // Re-encode pathnames that were decoded inside matchRoutes\n                  navigator.encodeLocation\n                    ? navigator.encodeLocation(match.pathnameBase).pathname\n                    : match.pathnameBase,\n                ]),\n        })\n      ),\n    parentMatches,\n    dataRouterState,\n    future\n  );\n\n  // When a user passes in a `locationArg`, the associated routes need to\n  // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n  // to use the scoped location instead of the global location.\n  if (locationArg && renderedMatches) {\n    return (\n      <LocationContext.Provider\n        value={{\n          location: {\n            pathname: \"/\",\n            search: \"\",\n            hash: \"\",\n            state: null,\n            key: \"default\",\n            ...location,\n          },\n          navigationType: NavigationType.Pop,\n        }}\n      >\n        {renderedMatches}\n      </LocationContext.Provider>\n    );\n  }\n\n  return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n  let error = useRouteError();\n  let message = isRouteErrorResponse(error)\n    ? `${error.status} ${error.statusText}`\n    : error instanceof Error\n    ? error.message\n    : JSON.stringify(error);\n  let stack = error instanceof Error ? error.stack : null;\n  let lightgrey = \"rgba(200,200,200, 0.5)\";\n  let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n  let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n  let devInfo = null;\n  if (__DEV__) {\n    console.error(\n      \"Error handled by React Router default ErrorBoundary:\",\n      error\n    );\n\n    devInfo = (\n      <>\n        <p>💿 Hey developer 👋</p>\n        <p>\n          You can provide a way better UX than this when your app throws errors\n          by providing your own <code style={codeStyles}>ErrorBoundary</code> or{\" \"}\n          <code style={codeStyles}>errorElement</code> prop on your route.\n        </p>\n      </>\n    );\n  }\n\n  return (\n    <>\n      <h2>Unexpected Application Error!</h2>\n      <h3 style={{ fontStyle: \"italic\" }}>{message}</h3>\n      {stack ? <pre style={preStyles}>{stack}</pre> : null}\n      {devInfo}\n    </>\n  );\n}\n\nconst defaultErrorElement = <DefaultErrorComponent />;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n  location: Location;\n  revalidation: RevalidationState;\n  error: any;\n  component: React.ReactNode;\n  routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n  location: Location;\n  revalidation: RevalidationState;\n  error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n  RenderErrorBoundaryProps,\n  RenderErrorBoundaryState\n> {\n  constructor(props: RenderErrorBoundaryProps) {\n    super(props);\n    this.state = {\n      location: props.location,\n      revalidation: props.revalidation,\n      error: props.error,\n    };\n  }\n\n  static getDerivedStateFromError(error: any) {\n    return { error: error };\n  }\n\n  static getDerivedStateFromProps(\n    props: RenderErrorBoundaryProps,\n    state: RenderErrorBoundaryState\n  ) {\n    // When we get into an error state, the user will likely click \"back\" to the\n    // previous page that didn't have an error. Because this wraps the entire\n    // application, that will have no effect--the error page continues to display.\n    // This gives us a mechanism to recover from the error when the location changes.\n    //\n    // Whether we're in an error state or not, we update the location in state\n    // so that when we are in an error state, it gets reset when a new location\n    // comes in and the user recovers from the error.\n    if (\n      state.location !== props.location ||\n      (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n    ) {\n      return {\n        error: props.error,\n        location: props.location,\n        revalidation: props.revalidation,\n      };\n    }\n\n    // If we're not changing locations, preserve the location but still surface\n    // any new errors that may come through. We retain the existing error, we do\n    // this because the error provided from the app state may be cleared without\n    // the location changing.\n    return {\n      error: props.error !== undefined ? props.error : state.error,\n      location: state.location,\n      revalidation: props.revalidation || state.revalidation,\n    };\n  }\n\n  componentDidCatch(error: any, errorInfo: any) {\n    console.error(\n      \"React Router caught the following error during render\",\n      error,\n      errorInfo\n    );\n  }\n\n  render() {\n    return this.state.error !== undefined ? (\n      <RouteContext.Provider value={this.props.routeContext}>\n        <RouteErrorContext.Provider\n          value={this.state.error}\n          children={this.props.component}\n        />\n      </RouteContext.Provider>\n    ) : (\n      this.props.children\n    );\n  }\n}\n\ninterface RenderedRouteProps {\n  routeContext: RouteContextObject;\n  match: RouteMatch<string, RouteObject>;\n  children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n  let dataRouterContext = React.useContext(DataRouterContext);\n\n  // Track how deep we got in our render pass to emulate SSR componentDidCatch\n  // in a DataStaticRouter\n  if (\n    dataRouterContext &&\n    dataRouterContext.static &&\n    dataRouterContext.staticContext &&\n    (match.route.errorElement || match.route.ErrorBoundary)\n  ) {\n    dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n  }\n\n  return (\n    <RouteContext.Provider value={routeContext}>\n      {children}\n    </RouteContext.Provider>\n  );\n}\n\nexport function _renderMatches(\n  matches: RouteMatch[] | null,\n  parentMatches: RouteMatch[] = [],\n  dataRouterState: RemixRouter[\"state\"] | null = null,\n  future: RemixRouter[\"future\"] | null = null\n): React.ReactElement | null {\n  if (matches == null) {\n    if (!dataRouterState) {\n      return null;\n    }\n\n    if (dataRouterState.errors) {\n      // Don't bail if we have data router errors so we can render them in the\n      // boundary.  Use the pre-matched (or shimmed) matches\n      matches = dataRouterState.matches as DataRouteMatch[];\n    } else if (\n      future?.v7_partialHydration &&\n      parentMatches.length === 0 &&\n      !dataRouterState.initialized &&\n      dataRouterState.matches.length > 0\n    ) {\n      // Don't bail if we're initializing with partial hydration and we have\n      // router matches.  That means we're actively running `patchRoutesOnNavigation`\n      // so we should render down the partial matches to the appropriate\n      // `HydrateFallback`.  We only do this if `parentMatches` is empty so it\n      // only impacts the root matches for `RouterProvider` and no descendant\n      // `<Routes>`\n      matches = dataRouterState.matches as DataRouteMatch[];\n    } else {\n      return null;\n    }\n  }\n\n  let renderedMatches = matches;\n\n  // If we have data errors, trim matches to the highest error boundary\n  let errors = dataRouterState?.errors;\n  if (errors != null) {\n    let errorIndex = renderedMatches.findIndex(\n      (m) => m.route.id && errors?.[m.route.id] !== undefined\n    );\n    invariant(\n      errorIndex >= 0,\n      `Could not find a matching route for errors on route IDs: ${Object.keys(\n        errors\n      ).join(\",\")}`\n    );\n    renderedMatches = renderedMatches.slice(\n      0,\n      Math.min(renderedMatches.length, errorIndex + 1)\n    );\n  }\n\n  // If we're in a partial hydration mode, detect if we need to render down to\n  // a given HydrateFallback while we load the rest of the hydration data\n  let renderFallback = false;\n  let fallbackIndex = -1;\n  if (dataRouterState && future && future.v7_partialHydration) {\n    for (let i = 0; i < renderedMatches.length; i++) {\n      let match = renderedMatches[i];\n      // Track the deepest fallback up until the first route without data\n      if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n        fallbackIndex = i;\n      }\n\n      if (match.route.id) {\n        let { loaderData, errors } = dataRouterState;\n        let needsToRunLoader =\n          match.route.loader &&\n          loaderData[match.route.id] === undefined &&\n          (!errors || errors[match.route.id] === undefined);\n        if (match.route.lazy || needsToRunLoader) {\n          // We found the first route that's not ready to render (waiting on\n          // lazy, or has a loader that hasn't run yet).  Flag that we need to\n          // render a fallback and render up until the appropriate fallback\n          renderFallback = true;\n          if (fallbackIndex >= 0) {\n            renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n          } else {\n            renderedMatches = [renderedMatches[0]];\n          }\n          break;\n        }\n      }\n    }\n  }\n\n  return renderedMatches.reduceRight((outlet, match, index) => {\n    // Only data routers handle errors/fallbacks\n    let error: any;\n    let shouldRenderHydrateFallback = false;\n    let errorElement: React.ReactNode | null = null;\n    let hydrateFallbackElement: React.ReactNode | null = null;\n    if (dataRouterState) {\n      error = errors && match.route.id ? errors[match.route.id] : undefined;\n      errorElement = match.route.errorElement || defaultErrorElement;\n\n      if (renderFallback) {\n        if (fallbackIndex < 0 && index === 0) {\n          warningOnce(\n            \"route-fallback\",\n            false,\n            \"No `HydrateFallback` element provided to render during initial hydration\"\n          );\n          shouldRenderHydrateFallback = true;\n          hydrateFallbackElement = null;\n        } else if (fallbackIndex === index) {\n          shouldRenderHydrateFallback = true;\n          hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n        }\n      }\n    }\n\n    let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n    let getChildren = () => {\n      let children: React.ReactNode;\n      if (error) {\n        children = errorElement;\n      } else if (shouldRenderHydrateFallback) {\n        children = hydrateFallbackElement;\n      } else if (match.route.Component) {\n        // Note: This is a de-optimized path since React won't re-use the\n        // ReactElement since it's identity changes with each new\n        // React.createElement call.  We keep this so folks can use\n        // `<Route Component={...}>` in `<Routes>` but generally `Component`\n        // usage is only advised in `RouterProvider` when we can convert it to\n        // `element` ahead of time.\n        children = <match.route.Component />;\n      } else if (match.route.element) {\n        children = match.route.element;\n      } else {\n        children = outlet;\n      }\n      return (\n        <RenderedRoute\n          match={match}\n          routeContext={{\n            outlet,\n            matches,\n            isDataRoute: dataRouterState != null,\n          }}\n          children={children}\n        />\n      );\n    };\n    // Only wrap in an error boundary within data router usages when we have an\n    // ErrorBoundary/errorElement on this route.  Otherwise let it bubble up to\n    // an ancestor ErrorBoundary/errorElement\n    return dataRouterState &&\n      (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n      <RenderErrorBoundary\n        location={dataRouterState.location}\n        revalidation={dataRouterState.revalidation}\n        component={errorElement}\n        error={error}\n        children={getChildren()}\n        routeContext={{ outlet: null, matches, isDataRoute: true }}\n      />\n    ) : (\n      getChildren()\n    );\n  }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n  UseBlocker = \"useBlocker\",\n  UseRevalidator = \"useRevalidator\",\n  UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n  UseBlocker = \"useBlocker\",\n  UseLoaderData = \"useLoaderData\",\n  UseActionData = \"useActionData\",\n  UseRouteError = \"useRouteError\",\n  UseNavigation = \"useNavigation\",\n  UseRouteLoaderData = \"useRouteLoaderData\",\n  UseMatches = \"useMatches\",\n  UseRevalidator = \"useRevalidator\",\n  UseNavigateStable = \"useNavigate\",\n  UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n  hookName: DataRouterHook | DataRouterStateHook\n) {\n  return `${hookName} must be used within a data router.  See https://reactrouter.com/v6/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n  let ctx = React.useContext(DataRouterContext);\n  invariant(ctx, getDataRouterConsoleError(hookName));\n  return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n  let state = React.useContext(DataRouterStateContext);\n  invariant(state, getDataRouterConsoleError(hookName));\n  return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n  let route = React.useContext(RouteContext);\n  invariant(route, getDataRouterConsoleError(hookName));\n  return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n  let route = useRouteContext(hookName);\n  let thisRoute = route.matches[route.matches.length - 1];\n  invariant(\n    thisRoute.route.id,\n    `${hookName} can only be used on routes that contain a unique \"id\"`\n  );\n  return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n  return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n  let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n  return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n  let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n  let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n  return React.useMemo(\n    () => ({\n      revalidate: dataRouterContext.router.revalidate,\n      state: state.revalidation,\n    }),\n    [dataRouterContext.router.revalidate, state.revalidation]\n  );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n  let { matches, loaderData } = useDataRouterState(\n    DataRouterStateHook.UseMatches\n  );\n  return React.useMemo(\n    () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n    [matches, loaderData]\n  );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n  let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n  if (state.errors && state.errors[routeId] != null) {\n    console.error(\n      `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n    );\n    return undefined;\n  }\n  return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n  let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n  return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n  let state = useDataRouterState(DataRouterStateHook.UseActionData);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n  return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error.  This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n  let error = React.useContext(RouteErrorContext);\n  let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n  let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n  // If this was a render error, we put it in a RouteError context inside\n  // of RenderErrorBoundary\n  if (error !== undefined) {\n    return error;\n  }\n\n  // Otherwise look for errors from our data router state\n  return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `<Await />` value\n */\nexport function useAsyncValue(): unknown {\n  let value = React.useContext(AwaitContext);\n  return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `<Await />` value\n */\nexport function useAsyncError(): unknown {\n  let value = React.useContext(AwaitContext);\n  return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation.  Mostly used to avoid\n * using half-filled form data.  This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n  let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n  let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n  let [blockerKey, setBlockerKey] = React.useState(\"\");\n  let blockerFunction = React.useCallback<BlockerFunction>(\n    (arg) => {\n      if (typeof shouldBlock !== \"function\") {\n        return !!shouldBlock;\n      }\n      if (basename === \"/\") {\n        return shouldBlock(arg);\n      }\n\n      // If they provided us a function and we've got an active basename, strip\n      // it from the locations we expose to the user to match the behavior of\n      // useLocation\n      let { currentLocation, nextLocation, historyAction } = arg;\n      return shouldBlock({\n        currentLocation: {\n          ...currentLocation,\n          pathname:\n            stripBasename(currentLocation.pathname, basename) ||\n            currentLocation.pathname,\n        },\n        nextLocation: {\n          ...nextLocation,\n          pathname:\n            stripBasename(nextLocation.pathname, basename) ||\n            nextLocation.pathname,\n        },\n        historyAction,\n      });\n    },\n    [basename, shouldBlock]\n  );\n\n  // This effect is in charge of blocker key assignment and deletion (which is\n  // tightly coupled to the key)\n  React.useEffect(() => {\n    let key = String(++blockerId);\n    setBlockerKey(key);\n    return () => router.deleteBlocker(key);\n  }, [router]);\n\n  // This effect handles assigning the blockerFunction.  This is to handle\n  // unstable blocker function identities, and happens only after the prior\n  // effect so we don't get an orphaned blockerFunction in the router with a\n  // key of \"\".  Until then we just have the IDLE_BLOCKER.\n  React.useEffect(() => {\n    if (blockerKey !== \"\") {\n      router.getBlocker(blockerKey, blockerFunction);\n    }\n  }, [router, blockerKey, blockerFunction]);\n\n  // Prefer the blocker from `state` not `router.state` since DataRouterContext\n  // is memoized so this ensures we update on blocker state updates\n  return blockerKey && state.blockers.has(blockerKey)\n    ? state.blockers.get(blockerKey)!\n    : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n  let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n  let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n  let activeRef = React.useRef(false);\n  useIsomorphicLayoutEffect(() => {\n    activeRef.current = true;\n  });\n\n  let navigate: NavigateFunction = React.useCallback(\n    (to: To | number, options: NavigateOptions = {}) => {\n      warning(activeRef.current, navigateEffectWarning);\n\n      // Short circuit here since if this happens on first render the navigate\n      // is useless because we haven't wired up our router subscriber yet\n      if (!activeRef.current) return;\n\n      if (typeof to === \"number\") {\n        router.navigate(to);\n      } else {\n        router.navigate(to, { fromRouteId: id, ...options });\n      }\n    },\n    [router, id]\n  );\n\n  return navigate;\n}\n\nconst alreadyWarned: Record<string, boolean> = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n  if (!cond && !alreadyWarned[key]) {\n    alreadyWarned[key] = true;\n    warning(false, message);\n  }\n}\n","import type { FutureConfig as RouterFutureConfig } from \"@remix-run/router\";\nimport type { FutureConfig as RenderFutureConfig } from \"./components\";\n\nconst alreadyWarned: { [key: string]: boolean } = {};\n\nexport function warnOnce(key: string, message: string): void {\n  if (__DEV__ && !alreadyWarned[message]) {\n    alreadyWarned[message] = true;\n    console.warn(message);\n  }\n}\n\nconst logDeprecation = (flag: string, msg: string, link: string) =>\n  warnOnce(\n    flag,\n    `⚠️ React Router Future Flag Warning: ${msg}. ` +\n      `You can use the \\`${flag}\\` future flag to opt-in early. ` +\n      `For more information, see ${link}.`\n  );\n\nexport function logV6DeprecationWarnings(\n  renderFuture: Partial<RenderFutureConfig> | undefined,\n  routerFuture?: Omit<RouterFutureConfig, \"v7_prependBasename\">\n) {\n  if (renderFuture?.v7_startTransition === undefined) {\n    logDeprecation(\n      \"v7_startTransition\",\n      \"React Router will begin wrapping state updates in `React.startTransition` in v7\",\n      \"https://reactrouter.com/v6/upgrading/future#v7_starttransition\"\n    );\n  }\n\n  if (\n    renderFuture?.v7_relativeSplatPath === undefined &&\n    (!routerFuture || !routerFuture.v7_relativeSplatPath)\n  ) {\n    logDeprecation(\n      \"v7_relativeSplatPath\",\n      \"Relative route resolution within Splat routes is changing in v7\",\n      \"https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath\"\n    );\n  }\n\n  if (routerFuture) {\n    if (routerFuture.v7_fetcherPersist === undefined) {\n      logDeprecation(\n        \"v7_fetcherPersist\",\n        \"The persistence behavior of fetchers is changing in v7\",\n        \"https://reactrouter.com/v6/upgrading/future#v7_fetcherpersist\"\n      );\n    }\n\n    if (routerFuture.v7_normalizeFormMethod === undefined) {\n      logDeprecation(\n        \"v7_normalizeFormMethod\",\n        \"Casing of `formMethod` fields is being normalized to uppercase in v7\",\n        \"https://reactrouter.com/v6/upgrading/future#v7_normalizeformmethod\"\n      );\n    }\n\n    if (routerFuture.v7_partialHydration === undefined) {\n      logDeprecation(\n        \"v7_partialHydration\",\n        \"`RouterProvider` hydration behavior is changing in v7\",\n        \"https://reactrouter.com/v6/upgrading/future#v7_partialhydration\"\n      );\n    }\n\n    if (routerFuture.v7_skipActionErrorRevalidation === undefined) {\n      logDeprecation(\n        \"v7_skipActionErrorRevalidation\",\n        \"The revalidation behavior after 4xx/5xx `action` responses is changing in v7\",\n        \"https://reactrouter.com/v6/upgrading/future#v7_skipactionerrorrevalidation\"\n      );\n    }\n  }\n}\n","import type {\n  InitialEntry,\n  LazyRouteFunction,\n  Location,\n  MemoryHistory,\n  RelativeRoutingType,\n  Router as RemixRouter,\n  RouterState,\n  RouterSubscriber,\n  To,\n  TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n  AbortedDeferredError,\n  Action as NavigationType,\n  createMemoryHistory,\n  UNSAFE_getResolveToMatches as getResolveToMatches,\n  UNSAFE_invariant as invariant,\n  parsePath,\n  resolveTo,\n  stripBasename,\n  UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n  DataRouteObject,\n  IndexRouteObject,\n  Navigator,\n  NonIndexRouteObject,\n  RouteMatch,\n  RouteObject,\n} from \"./context\";\nimport {\n  AwaitContext,\n  DataRouterContext,\n  DataRouterStateContext,\n  LocationContext,\n  NavigationContext,\n  RouteContext,\n} from \"./context\";\nimport {\n  _renderMatches,\n  useAsyncValue,\n  useInRouterContext,\n  useLocation,\n  useNavigate,\n  useOutlet,\n  useRoutes,\n  useRoutesImpl,\n} from \"./hooks\";\nimport { logV6DeprecationWarnings } from \"./deprecations\";\n\nexport interface FutureConfig {\n  v7_relativeSplatPath: boolean;\n  v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n  fallbackElement?: React.ReactNode;\n  router: RemixRouter;\n  // Only accept future flags relevant to rendering behavior\n  // routing flags should be accessed via router.future\n  future?: Partial<Pick<FutureConfig, \"v7_startTransition\">>;\n}\n\n/**\n  Webpack + React 17 fails to compile on any of the following because webpack\n  complains that `startTransition` doesn't exist in `React`:\n  * import { startTransition } from \"react\"\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n  Moving it to a constant such as the following solves the Webpack/React 17 issue:\n  * import * as React from from \"react\";\n    const START_TRANSITION = \"startTransition\";\n    START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n  However, that introduces webpack/terser minification issues in production builds\n  in React 18 where minification/obfuscation ends up removing the call of\n  React.startTransition entirely from the first half of the ternary.  Grabbing\n  this exported reference once up front resolves that issue.\n\n  See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n  fallbackElement,\n  router,\n  future,\n}: RouterProviderProps): React.ReactElement {\n  let [state, setStateImpl] = React.useState(router.state);\n  let { v7_startTransition } = future || {};\n\n  let setState = React.useCallback<RouterSubscriber>(\n    (newState: RouterState) => {\n      if (v7_startTransition && startTransitionImpl) {\n        startTransitionImpl(() => setStateImpl(newState));\n      } else {\n        setStateImpl(newState);\n      }\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  // Need to use a layout effect here so we are subscribed early enough to\n  // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n  React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n  React.useEffect(() => {\n    warning(\n      fallbackElement == null || !router.future.v7_partialHydration,\n      \"`<RouterProvider fallbackElement>` is deprecated when using \" +\n        \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n    );\n    // Only log this once on initial mount\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  let navigator = React.useMemo((): Navigator => {\n    return {\n      createHref: router.createHref,\n      encodeLocation: router.encodeLocation,\n      go: (n) => router.navigate(n),\n      push: (to, state, opts) =>\n        router.navigate(to, {\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n      replace: (to, state, opts) =>\n        router.navigate(to, {\n          replace: true,\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n    };\n  }, [router]);\n\n  let basename = router.basename || \"/\";\n\n  let dataRouterContext = React.useMemo(\n    () => ({\n      router,\n      navigator,\n      static: false,\n      basename,\n    }),\n    [router, navigator, basename]\n  );\n\n  React.useEffect(\n    () => logV6DeprecationWarnings(future, router.future),\n    [router, future]\n  );\n\n  // The fragment and {null} here are important!  We need them to keep React 18's\n  // useId happy when we are server-rendering since we may have a <script> here\n  // containing the hydrated server-side staticContext (from StaticRouterProvider).\n  // useId relies on the component tree structure to generate deterministic id's\n  // so we need to ensure it remains the same on the client even though\n  // we don't need the <script> tag\n  return (\n    <>\n      <DataRouterContext.Provider value={dataRouterContext}>\n        <DataRouterStateContext.Provider value={state}>\n          <Router\n            basename={basename}\n            location={state.location}\n            navigationType={state.historyAction}\n            navigator={navigator}\n            future={{\n              v7_relativeSplatPath: router.future.v7_relativeSplatPath,\n            }}\n          >\n            {state.initialized || router.future.v7_partialHydration ? (\n              <DataRoutes\n                routes={router.routes}\n                future={router.future}\n                state={state}\n              />\n            ) : (\n              fallbackElement\n            )}\n          </Router>\n        </DataRouterStateContext.Provider>\n      </DataRouterContext.Provider>\n      {null}\n    </>\n  );\n}\n\nfunction DataRoutes({\n  routes,\n  future,\n  state,\n}: {\n  routes: DataRouteObject[];\n  future: RemixRouter[\"future\"];\n  state: RouterState;\n}): React.ReactElement | null {\n  return useRoutesImpl(routes, undefined, state, future);\n}\n\nexport interface MemoryRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  initialEntries?: InitialEntry[];\n  initialIndex?: number;\n  future?: Partial<FutureConfig>;\n}\n\n/**\n * A `<Router>` that stores all entries in memory.\n *\n * @see https://reactrouter.com/v6/router-components/memory-router\n */\nexport function MemoryRouter({\n  basename,\n  children,\n  initialEntries,\n  initialIndex,\n  future,\n}: MemoryRouterProps): React.ReactElement {\n  let historyRef = React.useRef<MemoryHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createMemoryHistory({\n      initialEntries,\n      initialIndex,\n      v5Compat: true,\n    });\n  }\n\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nexport interface NavigateProps {\n  to: To;\n  replace?: boolean;\n  state?: any;\n  relative?: RelativeRoutingType;\n}\n\n/**\n * Changes the current location.\n *\n * Note: This API is mostly useful in React.Component subclasses that are not\n * able to use hooks. In functional components, we recommend you use the\n * `useNavigate` hook instead.\n *\n * @see https://reactrouter.com/v6/components/navigate\n */\nexport function Navigate({\n  to,\n  replace,\n  state,\n  relative,\n}: NavigateProps): null {\n  invariant(\n    useInRouterContext(),\n    // TODO: This error is probably because they somehow have 2 versions of\n    // the router loaded. We can help them understand how to avoid that.\n    `<Navigate> may be used only in the context of a <Router> component.`\n  );\n\n  let { future, static: isStatic } = React.useContext(NavigationContext);\n\n  warning(\n    !isStatic,\n    `<Navigate> must not be used on the initial render in a <StaticRouter>. ` +\n      `This is a no-op, but you should modify your code so the <Navigate> is ` +\n      `only ever rendered in response to some user interaction or state change.`\n  );\n\n  let { matches } = React.useContext(RouteContext);\n  let { pathname: locationPathname } = useLocation();\n  let navigate = useNavigate();\n\n  // Resolve the path outside of the effect so that when effects run twice in\n  // StrictMode they navigate to the same place\n  let path = resolveTo(\n    to,\n    getResolveToMatches(matches, future.v7_relativeSplatPath),\n    locationPathname,\n    relative === \"path\"\n  );\n  let jsonPath = JSON.stringify(path);\n\n  React.useEffect(\n    () => navigate(JSON.parse(jsonPath), { replace, state, relative }),\n    [navigate, jsonPath, relative, replace, state]\n  );\n\n  return null;\n}\n\nexport interface OutletProps {\n  context?: unknown;\n}\n\n/**\n * Renders the child route's element, if there is one.\n *\n * @see https://reactrouter.com/v6/components/outlet\n */\nexport function Outlet(props: OutletProps): React.ReactElement | null {\n  return useOutlet(props.context);\n}\n\nexport interface PathRouteProps {\n  caseSensitive?: NonIndexRouteObject[\"caseSensitive\"];\n  path?: NonIndexRouteObject[\"path\"];\n  id?: NonIndexRouteObject[\"id\"];\n  lazy?: LazyRouteFunction<NonIndexRouteObject>;\n  loader?: NonIndexRouteObject[\"loader\"];\n  action?: NonIndexRouteObject[\"action\"];\n  hasErrorBoundary?: NonIndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: NonIndexRouteObject[\"shouldRevalidate\"];\n  handle?: NonIndexRouteObject[\"handle\"];\n  index?: false;\n  children?: React.ReactNode;\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n}\n\nexport interface LayoutRouteProps extends PathRouteProps {}\n\nexport interface IndexRouteProps {\n  caseSensitive?: IndexRouteObject[\"caseSensitive\"];\n  path?: IndexRouteObject[\"path\"];\n  id?: IndexRouteObject[\"id\"];\n  lazy?: LazyRouteFunction<IndexRouteObject>;\n  loader?: IndexRouteObject[\"loader\"];\n  action?: IndexRouteObject[\"action\"];\n  hasErrorBoundary?: IndexRouteObject[\"hasErrorBoundary\"];\n  shouldRevalidate?: IndexRouteObject[\"shouldRevalidate\"];\n  handle?: IndexRouteObject[\"handle\"];\n  index: true;\n  children?: undefined;\n  element?: React.ReactNode | null;\n  hydrateFallbackElement?: React.ReactNode | null;\n  errorElement?: React.ReactNode | null;\n  Component?: React.ComponentType | null;\n  HydrateFallback?: React.ComponentType | null;\n  ErrorBoundary?: React.ComponentType | null;\n}\n\nexport type RouteProps = PathRouteProps | LayoutRouteProps | IndexRouteProps;\n\n/**\n * Declares an element that should be rendered at a certain URL path.\n *\n * @see https://reactrouter.com/v6/components/route\n */\nexport function Route(_props: RouteProps): React.ReactElement | null {\n  invariant(\n    false,\n    `A <Route> is only ever to be used as the child of <Routes> element, ` +\n      `never rendered directly. Please wrap your <Route> in a <Routes>.`\n  );\n}\n\nexport interface RouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  location: Partial<Location> | string;\n  navigationType?: NavigationType;\n  navigator: Navigator;\n  static?: boolean;\n  future?: Partial<Pick<FutureConfig, \"v7_relativeSplatPath\">>;\n}\n\n/**\n * Provides location context for the rest of the app.\n *\n * Note: You usually won't render a `<Router>` directly. Instead, you'll render a\n * router that is more specific to your environment such as a `<BrowserRouter>`\n * in web browsers or a `<StaticRouter>` for server rendering.\n *\n * @see https://reactrouter.com/v6/router-components/router\n */\nexport function Router({\n  basename: basenameProp = \"/\",\n  children = null,\n  location: locationProp,\n  navigationType = NavigationType.Pop,\n  navigator,\n  static: staticProp = false,\n  future,\n}: RouterProps): React.ReactElement | null {\n  invariant(\n    !useInRouterContext(),\n    `You cannot render a <Router> inside another <Router>.` +\n      ` You should never have more than one in your app.`\n  );\n\n  // Preserve trailing slashes on basename, so we can let the user control\n  // the enforcement of trailing slashes throughout the app\n  let basename = basenameProp.replace(/^\\/*/, \"/\");\n  let navigationContext = React.useMemo(\n    () => ({\n      basename,\n      navigator,\n      static: staticProp,\n      future: {\n        v7_relativeSplatPath: false,\n        ...future,\n      },\n    }),\n    [basename, future, navigator, staticProp]\n  );\n\n  if (typeof locationProp === \"string\") {\n    locationProp = parsePath(locationProp);\n  }\n\n  let {\n    pathname = \"/\",\n    search = \"\",\n    hash = \"\",\n    state = null,\n    key = \"default\",\n  } = locationProp;\n\n  let locationContext = React.useMemo(() => {\n    let trailingPathname = stripBasename(pathname, basename);\n\n    if (trailingPathname == null) {\n      return null;\n    }\n\n    return {\n      location: {\n        pathname: trailingPathname,\n        search,\n        hash,\n        state,\n        key,\n      },\n      navigationType,\n    };\n  }, [basename, pathname, search, hash, state, key, navigationType]);\n\n  warning(\n    locationContext != null,\n    `<Router basename=\"${basename}\"> is not able to match the URL ` +\n      `\"${pathname}${search}${hash}\" because it does not start with the ` +\n      `basename, so the <Router> won't render anything.`\n  );\n\n  if (locationContext == null) {\n    return null;\n  }\n\n  return (\n    <NavigationContext.Provider value={navigationContext}>\n      <LocationContext.Provider children={children} value={locationContext} />\n    </NavigationContext.Provider>\n  );\n}\n\nexport interface RoutesProps {\n  children?: React.ReactNode;\n  location?: Partial<Location> | string;\n}\n\n/**\n * A container for a nested tree of `<Route>` elements that renders the branch\n * that best matches the current location.\n *\n * @see https://reactrouter.com/v6/components/routes\n */\nexport function Routes({\n  children,\n  location,\n}: RoutesProps): React.ReactElement | null {\n  return useRoutes(createRoutesFromChildren(children), location);\n}\n\nexport interface AwaitResolveRenderFunction {\n  (data: Awaited<any>): React.ReactNode;\n}\n\nexport interface AwaitProps {\n  children: React.ReactNode | AwaitResolveRenderFunction;\n  errorElement?: React.ReactNode;\n  resolve: TrackedPromise | any;\n}\n\n/**\n * Component to use for rendering lazily loaded data from returning defer()\n * in a loader function\n */\nexport function Await({ children, errorElement, resolve }: AwaitProps) {\n  return (\n    <AwaitErrorBoundary resolve={resolve} errorElement={errorElement}>\n      <ResolveAwait>{children}</ResolveAwait>\n    </AwaitErrorBoundary>\n  );\n}\n\ntype AwaitErrorBoundaryProps = React.PropsWithChildren<{\n  errorElement?: React.ReactNode;\n  resolve: TrackedPromise | any;\n}>;\n\ntype AwaitErrorBoundaryState = {\n  error: any;\n};\n\nenum AwaitRenderStatus {\n  pending,\n  success,\n  error,\n}\n\nconst neverSettledPromise = new Promise(() => {});\n\nclass AwaitErrorBoundary extends React.Component<\n  AwaitErrorBoundaryProps,\n  AwaitErrorBoundaryState\n> {\n  constructor(props: AwaitErrorBoundaryProps) {\n    super(props);\n    this.state = { error: null };\n  }\n\n  static getDerivedStateFromError(error: any) {\n    return { error };\n  }\n\n  componentDidCatch(error: any, errorInfo: any) {\n    console.error(\n      \"<Await> caught the following error during render\",\n      error,\n      errorInfo\n    );\n  }\n\n  render() {\n    let { children, errorElement, resolve } = this.props;\n\n    let promise: TrackedPromise | null = null;\n    let status: AwaitRenderStatus = AwaitRenderStatus.pending;\n\n    if (!(resolve instanceof Promise)) {\n      // Didn't get a promise - provide as a resolved promise\n      status = AwaitRenderStatus.success;\n      promise = Promise.resolve();\n      Object.defineProperty(promise, \"_tracked\", { get: () => true });\n      Object.defineProperty(promise, \"_data\", { get: () => resolve });\n    } else if (this.state.error) {\n      // Caught a render error, provide it as a rejected promise\n      status = AwaitRenderStatus.error;\n      let renderError = this.state.error;\n      promise = Promise.reject().catch(() => {}); // Avoid unhandled rejection warnings\n      Object.defineProperty(promise, \"_tracked\", { get: () => true });\n      Object.defineProperty(promise, \"_error\", { get: () => renderError });\n    } else if ((resolve as TrackedPromise)._tracked) {\n      // Already tracked promise - check contents\n      promise = resolve;\n      status =\n        \"_error\" in promise\n          ? AwaitRenderStatus.error\n          : \"_data\" in promise\n          ? AwaitRenderStatus.success\n          : AwaitRenderStatus.pending;\n    } else {\n      // Raw (untracked) promise - track it\n      status = AwaitRenderStatus.pending;\n      Object.defineProperty(resolve, \"_tracked\", { get: () => true });\n      promise = resolve.then(\n        (data: any) =>\n          Object.defineProperty(resolve, \"_data\", { get: () => data }),\n        (error: any) =>\n          Object.defineProperty(resolve, \"_error\", { get: () => error })\n      );\n    }\n\n    if (\n      status === AwaitRenderStatus.error &&\n      promise._error instanceof AbortedDeferredError\n    ) {\n      // Freeze the UI by throwing a never resolved promise\n      throw neverSettledPromise;\n    }\n\n    if (status === AwaitRenderStatus.error && !errorElement) {\n      // No errorElement, throw to the nearest route-level error boundary\n      throw promise._error;\n    }\n\n    if (status === AwaitRenderStatus.error) {\n      // Render via our errorElement\n      return <AwaitContext.Provider value={promise} children={errorElement} />;\n    }\n\n    if (status === AwaitRenderStatus.success) {\n      // Render children with resolved value\n      return <AwaitContext.Provider value={promise} children={children} />;\n    }\n\n    // Throw to the suspense boundary\n    throw promise;\n  }\n}\n\n/**\n * @private\n * Indirection to leverage useAsyncValue for a render-prop API on `<Await>`\n */\nfunction ResolveAwait({\n  children,\n}: {\n  children: React.ReactNode | AwaitResolveRenderFunction;\n}) {\n  let data = useAsyncValue();\n  let toRender = typeof children === \"function\" ? children(data) : children;\n  return <>{toRender}</>;\n}\n\n///////////////////////////////////////////////////////////////////////////////\n// UTILS\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Creates a route config from a React \"children\" object, which is usually\n * either a `<Route>` element or an array of them. Used internally by\n * `<Routes>` to create a route config from its children.\n *\n * @see https://reactrouter.com/v6/utils/create-routes-from-children\n */\nexport function createRoutesFromChildren(\n  children: React.ReactNode,\n  parentPath: number[] = []\n): RouteObject[] {\n  let routes: RouteObject[] = [];\n\n  React.Children.forEach(children, (element, index) => {\n    if (!React.isValidElement(element)) {\n      // Ignore non-elements. This allows people to more easily inline\n      // conditionals in their route config.\n      return;\n    }\n\n    let treePath = [...parentPath, index];\n\n    if (element.type === React.Fragment) {\n      // Transparently support React.Fragment and its children.\n      routes.push.apply(\n        routes,\n        createRoutesFromChildren(element.props.children, treePath)\n      );\n      return;\n    }\n\n    invariant(\n      element.type === Route,\n      `[${\n        typeof element.type === \"string\" ? element.type : element.type.name\n      }] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`\n    );\n\n    invariant(\n      !element.props.index || !element.props.children,\n      \"An index route cannot have child routes.\"\n    );\n\n    let route: RouteObject = {\n      id: element.props.id || treePath.join(\"-\"),\n      caseSensitive: element.props.caseSensitive,\n      element: element.props.element,\n      Component: element.props.Component,\n      index: element.props.index,\n      path: element.props.path,\n      loader: element.props.loader,\n      action: element.props.action,\n      errorElement: element.props.errorElement,\n      ErrorBoundary: element.props.ErrorBoundary,\n      hasErrorBoundary:\n        element.props.ErrorBoundary != null ||\n        element.props.errorElement != null,\n      shouldRevalidate: element.props.shouldRevalidate,\n      handle: element.props.handle,\n      lazy: element.props.lazy,\n    };\n\n    if (element.props.children) {\n      route.children = createRoutesFromChildren(\n        element.props.children,\n        treePath\n      );\n    }\n\n    routes.push(route);\n  });\n\n  return routes;\n}\n\n/**\n * Renders the result of `matchRoutes()` into a React element.\n */\nexport function renderMatches(\n  matches: RouteMatch[] | null\n): React.ReactElement | null {\n  return _renderMatches(matches);\n}\n","import type {\n  FormEncType,\n  HTMLFormMethod,\n  RelativeRoutingType,\n} from \"@remix-run/router\";\nimport { stripBasename, UNSAFE_warning as warning } from \"@remix-run/router\";\n\nexport const defaultMethod: HTMLFormMethod = \"get\";\nconst defaultEncType: FormEncType = \"application/x-www-form-urlencoded\";\n\nexport function isHtmlElement(object: any): object is HTMLElement {\n  return object != null && typeof object.tagName === \"string\";\n}\n\nexport function isButtonElement(object: any): object is HTMLButtonElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\n\nexport function isFormElement(object: any): object is HTMLFormElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\n\nexport function isInputElement(object: any): object is HTMLInputElement {\n  return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\n\ntype LimitedMouseEvent = Pick<\n  MouseEvent,\n  \"button\" | \"metaKey\" | \"altKey\" | \"ctrlKey\" | \"shiftKey\"\n>;\n\nfunction isModifiedEvent(event: LimitedMouseEvent) {\n  return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nexport function shouldProcessLinkClick(\n  event: LimitedMouseEvent,\n  target?: string\n) {\n  return (\n    event.button === 0 && // Ignore everything but left clicks\n    (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n    !isModifiedEvent(event) // Ignore clicks with modifier keys\n  );\n}\n\nexport type ParamKeyValuePair = [string, string];\n\nexport type URLSearchParamsInit =\n  | string\n  | ParamKeyValuePair[]\n  | Record<string, string | string[]>\n  | URLSearchParams;\n\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n *   let searchParams = new URLSearchParams([\n *     ['sort', 'name'],\n *     ['sort', 'price']\n *   ]);\n *\n * you can do:\n *\n *   let searchParams = createSearchParams({\n *     sort: ['name', 'price']\n *   });\n */\nexport function createSearchParams(\n  init: URLSearchParamsInit = \"\"\n): URLSearchParams {\n  return new URLSearchParams(\n    typeof init === \"string\" ||\n    Array.isArray(init) ||\n    init instanceof URLSearchParams\n      ? init\n      : Object.keys(init).reduce((memo, key) => {\n          let value = init[key];\n          return memo.concat(\n            Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]\n          );\n        }, [] as ParamKeyValuePair[])\n  );\n}\n\nexport function getSearchParamsForLocation(\n  locationSearch: string,\n  defaultSearchParams: URLSearchParams | null\n) {\n  let searchParams = createSearchParams(locationSearch);\n\n  if (defaultSearchParams) {\n    // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n    // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n    // web extensions. Relevant Bugzilla tickets:\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n    defaultSearchParams.forEach((_, key) => {\n      if (!searchParams.has(key)) {\n        defaultSearchParams.getAll(key).forEach((value) => {\n          searchParams.append(key, value);\n        });\n      }\n    });\n  }\n\n  return searchParams;\n}\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n  [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport type SubmitTarget =\n  | HTMLFormElement\n  | HTMLButtonElement\n  | HTMLInputElement\n  | FormData\n  | URLSearchParams\n  | JsonValue\n  | null;\n\n// One-time check for submitter support\nlet _formDataSupportsSubmitter: boolean | null = null;\n\nfunction isFormDataSubmitterSupported() {\n  if (_formDataSupportsSubmitter === null) {\n    try {\n      new FormData(\n        document.createElement(\"form\"),\n        // @ts-expect-error if FormData supports the submitter parameter, this will throw\n        0\n      );\n      _formDataSupportsSubmitter = false;\n    } catch (e) {\n      _formDataSupportsSubmitter = true;\n    }\n  }\n  return _formDataSupportsSubmitter;\n}\n\n/**\n * Submit options shared by both navigations and fetchers\n */\ninterface SharedSubmitOptions {\n  /**\n   * The HTTP method used to submit the form. Overrides `<form method>`.\n   * Defaults to \"GET\".\n   */\n  method?: HTMLFormMethod;\n\n  /**\n   * The action URL path used to submit the form. Overrides `<form action>`.\n   * Defaults to the path of the current route.\n   */\n  action?: string;\n\n  /**\n   * The encoding used to submit the form. Overrides `<form encType>`.\n   * Defaults to \"application/x-www-form-urlencoded\".\n   */\n  encType?: FormEncType;\n\n  /**\n   * Determines whether the form action is relative to the route hierarchy or\n   * the pathname.  Use this if you want to opt out of navigating the route\n   * hierarchy and want to instead route based on /-delimited URL segments\n   */\n  relative?: RelativeRoutingType;\n\n  /**\n   * In browser-based environments, prevent resetting scroll after this\n   * navigation when using the <ScrollRestoration> component\n   */\n  preventScrollReset?: boolean;\n\n  /**\n   * Enable flushSync for this submission's state updates\n   */\n  flushSync?: boolean;\n}\n\n/**\n * Submit options available to fetchers\n */\nexport interface FetcherSubmitOptions extends SharedSubmitOptions {}\n\n/**\n * Submit options available to navigations\n */\nexport interface SubmitOptions extends FetcherSubmitOptions {\n  /**\n   * Set `true` to replace the current entry in the browser's history stack\n   * instead of creating a new one (i.e. stay on \"the same page\"). Defaults\n   * to `false`.\n   */\n  replace?: boolean;\n\n  /**\n   * State object to add to the history stack entry for this navigation\n   */\n  state?: any;\n\n  /**\n   * Indicate a specific fetcherKey to use when using navigate=false\n   */\n  fetcherKey?: string;\n\n  /**\n   * navigate=false will use a fetcher instead of a navigation\n   */\n  navigate?: boolean;\n\n  /**\n   * Enable view transitions on this submission navigation\n   */\n  viewTransition?: boolean;\n}\n\nconst supportedFormEncTypes: Set<FormEncType> = new Set([\n  \"application/x-www-form-urlencoded\",\n  \"multipart/form-data\",\n  \"text/plain\",\n]);\n\nfunction getFormEncType(encType: string | null) {\n  if (encType != null && !supportedFormEncTypes.has(encType as FormEncType)) {\n    warning(\n      false,\n      `\"${encType}\" is not a valid \\`encType\\` for \\`<Form>\\`/\\`<fetcher.Form>\\` ` +\n        `and will default to \"${defaultEncType}\"`\n    );\n\n    return null;\n  }\n  return encType;\n}\n\nexport function getFormSubmissionInfo(\n  target: SubmitTarget,\n  basename: string\n): {\n  action: string | null;\n  method: string;\n  encType: string;\n  formData: FormData | undefined;\n  body: any;\n} {\n  let method: string;\n  let action: string | null;\n  let encType: string;\n  let formData: FormData | undefined;\n  let body: any;\n\n  if (isFormElement(target)) {\n    // When grabbing the action from the element, it will have had the basename\n    // prefixed to ensure non-JS scenarios work, so strip it since we'll\n    // re-prefix in the router\n    let attr = target.getAttribute(\"action\");\n    action = attr ? stripBasename(attr, basename) : null;\n    method = target.getAttribute(\"method\") || defaultMethod;\n    encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n\n    formData = new FormData(target);\n  } else if (\n    isButtonElement(target) ||\n    (isInputElement(target) &&\n      (target.type === \"submit\" || target.type === \"image\"))\n  ) {\n    let form = target.form;\n\n    if (form == null) {\n      throw new Error(\n        `Cannot submit a <button> or <input type=\"submit\"> without a <form>`\n      );\n    }\n\n    // <button>/<input type=\"submit\"> may override attributes of <form>\n\n    // When grabbing the action from the element, it will have had the basename\n    // prefixed to ensure non-JS scenarios work, so strip it since we'll\n    // re-prefix in the router\n    let attr = target.getAttribute(\"formaction\") || form.getAttribute(\"action\");\n    action = attr ? stripBasename(attr, basename) : null;\n\n    method =\n      target.getAttribute(\"formmethod\") ||\n      form.getAttribute(\"method\") ||\n      defaultMethod;\n    encType =\n      getFormEncType(target.getAttribute(\"formenctype\")) ||\n      getFormEncType(form.getAttribute(\"enctype\")) ||\n      defaultEncType;\n\n    // Build a FormData object populated from a form and submitter\n    formData = new FormData(form, target);\n\n    // If this browser doesn't support the `FormData(el, submitter)` format,\n    // then tack on the submitter value at the end.  This is a lightweight\n    // solution that is not 100% spec compliant.  For complete support in older\n    // browsers, consider using the `formdata-submitter-polyfill` package\n    if (!isFormDataSubmitterSupported()) {\n      let { name, type, value } = target;\n      if (type === \"image\") {\n        let prefix = name ? `${name}.` : \"\";\n        formData.append(`${prefix}x`, \"0\");\n        formData.append(`${prefix}y`, \"0\");\n      } else if (name) {\n        formData.append(name, value);\n      }\n    }\n  } else if (isHtmlElement(target)) {\n    throw new Error(\n      `Cannot submit element that is not <form>, <button>, or ` +\n        `<input type=\"submit|image\">`\n    );\n  } else {\n    method = defaultMethod;\n    action = null;\n    encType = defaultEncType;\n    body = target;\n  }\n\n  // Send body for <Form encType=\"text/plain\" so we encode it into text\n  if (formData && encType === \"text/plain\") {\n    body = formData;\n    formData = undefined;\n  }\n\n  return { action, method: method.toLowerCase(), encType, formData, body };\n}\n","/**\n * NOTE: If you refactor this to split up the modules into separate files,\n * you'll need to update the rollup config for react-router-dom-v5-compat.\n */\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport type {\n  DataRouteObject,\n  FutureConfig,\n  Location,\n  NavigateOptions,\n  NavigationType,\n  Navigator,\n  RelativeRoutingType,\n  RouteObject,\n  RouterProps,\n  RouterProviderProps,\n  To,\n  DataStrategyFunction,\n  PatchRoutesOnNavigationFunction,\n} from \"react-router\";\nimport {\n  Router,\n  createPath,\n  useHref,\n  useLocation,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useResolvedPath,\n  useBlocker,\n  UNSAFE_DataRouterContext as DataRouterContext,\n  UNSAFE_DataRouterStateContext as DataRouterStateContext,\n  UNSAFE_NavigationContext as NavigationContext,\n  UNSAFE_RouteContext as RouteContext,\n  UNSAFE_logV6DeprecationWarnings as logV6DeprecationWarnings,\n  UNSAFE_mapRouteProperties as mapRouteProperties,\n  UNSAFE_useRouteId as useRouteId,\n  UNSAFE_useRoutesImpl as useRoutesImpl,\n} from \"react-router\";\nimport type {\n  BrowserHistory,\n  Fetcher,\n  FormEncType,\n  FormMethod,\n  FutureConfig as RouterFutureConfig,\n  GetScrollRestorationKeyFunction,\n  HashHistory,\n  History,\n  HTMLFormMethod,\n  HydrationState,\n  Router as RemixRouter,\n  V7_FormMethod,\n  RouterState,\n  RouterSubscriber,\n  BlockerFunction,\n} from \"@remix-run/router\";\nimport {\n  createRouter,\n  createBrowserHistory,\n  createHashHistory,\n  joinPaths,\n  stripBasename,\n  UNSAFE_ErrorResponseImpl as ErrorResponseImpl,\n  UNSAFE_invariant as invariant,\n  UNSAFE_warning as warning,\n  matchPath,\n  IDLE_FETCHER,\n} from \"@remix-run/router\";\n\nimport type {\n  SubmitOptions,\n  ParamKeyValuePair,\n  URLSearchParamsInit,\n  SubmitTarget,\n  FetcherSubmitOptions,\n} from \"./dom\";\nimport {\n  createSearchParams,\n  defaultMethod,\n  getFormSubmissionInfo,\n  getSearchParamsForLocation,\n  shouldProcessLinkClick,\n} from \"./dom\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Re-exports\n////////////////////////////////////////////////////////////////////////////////\n\nexport type {\n  FormEncType,\n  FormMethod,\n  GetScrollRestorationKeyFunction,\n  ParamKeyValuePair,\n  SubmitOptions,\n  URLSearchParamsInit,\n  V7_FormMethod,\n};\nexport { createSearchParams, ErrorResponseImpl as UNSAFE_ErrorResponseImpl };\n\n// Note: Keep in sync with react-router exports!\nexport type {\n  ActionFunction,\n  ActionFunctionArgs,\n  AwaitProps,\n  Blocker,\n  BlockerFunction,\n  DataRouteMatch,\n  DataRouteObject,\n  DataStrategyFunction,\n  DataStrategyFunctionArgs,\n  DataStrategyMatch,\n  DataStrategyResult,\n  ErrorResponse,\n  Fetcher,\n  FutureConfig,\n  Hash,\n  IndexRouteObject,\n  IndexRouteProps,\n  JsonFunction,\n  LazyRouteFunction,\n  LayoutRouteProps,\n  LoaderFunction,\n  LoaderFunctionArgs,\n  Location,\n  MemoryRouterProps,\n  NavigateFunction,\n  NavigateOptions,\n  NavigateProps,\n  Navigation,\n  Navigator,\n  NonIndexRouteObject,\n  OutletProps,\n  Params,\n  ParamParseKey,\n  PatchRoutesOnNavigationFunction,\n  PatchRoutesOnNavigationFunctionArgs,\n  Path,\n  PathMatch,\n  Pathname,\n  PathParam,\n  PathPattern,\n  PathRouteProps,\n  RedirectFunction,\n  RelativeRoutingType,\n  RouteMatch,\n  RouteObject,\n  RouteProps,\n  RouterProps,\n  RouterProviderProps,\n  RoutesProps,\n  Search,\n  ShouldRevalidateFunction,\n  ShouldRevalidateFunctionArgs,\n  To,\n  UIMatch,\n} from \"react-router\";\nexport {\n  AbortedDeferredError,\n  Await,\n  MemoryRouter,\n  Navigate,\n  NavigationType,\n  Outlet,\n  Route,\n  Router,\n  Routes,\n  createMemoryRouter,\n  createPath,\n  createRoutesFromChildren,\n  createRoutesFromElements,\n  defer,\n  isRouteErrorResponse,\n  generatePath,\n  json,\n  matchPath,\n  matchRoutes,\n  parsePath,\n  redirect,\n  redirectDocument,\n  replace,\n  renderMatches,\n  resolvePath,\n  useActionData,\n  useAsyncError,\n  useAsyncValue,\n  useBlocker,\n  useHref,\n  useInRouterContext,\n  useLoaderData,\n  useLocation,\n  useMatch,\n  useMatches,\n  useNavigate,\n  useNavigation,\n  useNavigationType,\n  useOutlet,\n  useOutletContext,\n  useParams,\n  useResolvedPath,\n  useRevalidator,\n  useRouteError,\n  useRouteLoaderData,\n  useRoutes,\n} from \"react-router\";\n\n///////////////////////////////////////////////////////////////////////////////\n// DANGER! PLEASE READ ME!\n// We provide these exports as an escape hatch in the event that you need any\n// routing data that we don't provide an explicit API for. With that said, we\n// want to cover your use case if we can, so if you feel the need to use these\n// we want to hear from you. Let us know what you're building and we'll do our\n// best to make sure we can support you!\n//\n// We consider these exports an implementation detail and do not guarantee\n// against any breaking changes, regardless of the semver release. Use with\n// extreme caution and only if you understand the consequences. Godspeed.\n///////////////////////////////////////////////////////////////////////////////\n\n/** @internal */\nexport {\n  UNSAFE_DataRouterContext,\n  UNSAFE_DataRouterStateContext,\n  UNSAFE_NavigationContext,\n  UNSAFE_LocationContext,\n  UNSAFE_RouteContext,\n  UNSAFE_useRouteId,\n} from \"react-router\";\n//#endregion\n\ndeclare global {\n  var __staticRouterHydrationData: HydrationState | undefined;\n  var __reactRouterVersion: string;\n  interface Document {\n    startViewTransition(cb: () => Promise<void> | void): ViewTransition;\n  }\n}\n\n// HEY YOU! DON'T TOUCH THIS VARIABLE!\n//\n// It is replaced with the proper version at build time via a babel plugin in\n// the rollup config.\n//\n// Export a global property onto the window for React Router detection by the\n// Core Web Vitals Technology Report.  This way they can configure the `wappalyzer`\n// to detect and properly classify live websites as being built with React Router:\n// https://github.com/HTTPArchive/wappalyzer/blob/main/src/technologies/r.json\nconst REACT_ROUTER_VERSION = \"0\";\ntry {\n  window.__reactRouterVersion = REACT_ROUTER_VERSION;\n} catch (e) {\n  // no-op\n}\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Routers\n////////////////////////////////////////////////////////////////////////////////\n\ninterface DOMRouterOpts {\n  basename?: string;\n  future?: Partial<Omit<RouterFutureConfig, \"v7_prependBasename\">>;\n  hydrationData?: HydrationState;\n  dataStrategy?: DataStrategyFunction;\n  patchRoutesOnNavigation?: PatchRoutesOnNavigationFunction;\n  window?: Window;\n}\n\nexport function createBrowserRouter(\n  routes: RouteObject[],\n  opts?: DOMRouterOpts\n): RemixRouter {\n  return createRouter({\n    basename: opts?.basename,\n    future: {\n      ...opts?.future,\n      v7_prependBasename: true,\n    },\n    history: createBrowserHistory({ window: opts?.window }),\n    hydrationData: opts?.hydrationData || parseHydrationData(),\n    routes,\n    mapRouteProperties,\n    dataStrategy: opts?.dataStrategy,\n    patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,\n    window: opts?.window,\n  }).initialize();\n}\n\nexport function createHashRouter(\n  routes: RouteObject[],\n  opts?: DOMRouterOpts\n): RemixRouter {\n  return createRouter({\n    basename: opts?.basename,\n    future: {\n      ...opts?.future,\n      v7_prependBasename: true,\n    },\n    history: createHashHistory({ window: opts?.window }),\n    hydrationData: opts?.hydrationData || parseHydrationData(),\n    routes,\n    mapRouteProperties,\n    dataStrategy: opts?.dataStrategy,\n    patchRoutesOnNavigation: opts?.patchRoutesOnNavigation,\n    window: opts?.window,\n  }).initialize();\n}\n\nfunction parseHydrationData(): HydrationState | undefined {\n  let state = window?.__staticRouterHydrationData;\n  if (state && state.errors) {\n    state = {\n      ...state,\n      errors: deserializeErrors(state.errors),\n    };\n  }\n  return state;\n}\n\nfunction deserializeErrors(\n  errors: RemixRouter[\"state\"][\"errors\"]\n): RemixRouter[\"state\"][\"errors\"] {\n  if (!errors) return null;\n  let entries = Object.entries(errors);\n  let serialized: RemixRouter[\"state\"][\"errors\"] = {};\n  for (let [key, val] of entries) {\n    // Hey you!  If you change this, please change the corresponding logic in\n    // serializeErrors in react-router-dom/server.tsx :)\n    if (val && val.__type === \"RouteErrorResponse\") {\n      serialized[key] = new ErrorResponseImpl(\n        val.status,\n        val.statusText,\n        val.data,\n        val.internal === true\n      );\n    } else if (val && val.__type === \"Error\") {\n      // Attempt to reconstruct the right type of Error (i.e., ReferenceError)\n      if (val.__subType) {\n        let ErrorConstructor = window[val.__subType];\n        if (typeof ErrorConstructor === \"function\") {\n          try {\n            // @ts-expect-error\n            let error = new ErrorConstructor(val.message);\n            // Wipe away the client-side stack trace.  Nothing to fill it in with\n            // because we don't serialize SSR stack traces for security reasons\n            error.stack = \"\";\n            serialized[key] = error;\n          } catch (e) {\n            // no-op - fall through and create a normal Error\n          }\n        }\n      }\n\n      if (serialized[key] == null) {\n        let error = new Error(val.message);\n        // Wipe away the client-side stack trace.  Nothing to fill it in with\n        // because we don't serialize SSR stack traces for security reasons\n        error.stack = \"\";\n        serialized[key] = error;\n      }\n    } else {\n      serialized[key] = val;\n    }\n  }\n  return serialized;\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Contexts\n////////////////////////////////////////////////////////////////////////////////\n\ntype ViewTransitionContextObject =\n  | {\n      isTransitioning: false;\n    }\n  | {\n      isTransitioning: true;\n      flushSync: boolean;\n      currentLocation: Location;\n      nextLocation: Location;\n    };\n\nconst ViewTransitionContext = React.createContext<ViewTransitionContextObject>({\n  isTransitioning: false,\n});\nif (__DEV__) {\n  ViewTransitionContext.displayName = \"ViewTransition\";\n}\n\nexport { ViewTransitionContext as UNSAFE_ViewTransitionContext };\n\n// TODO: (v7) Change the useFetcher data from `any` to `unknown`\ntype FetchersContextObject = Map<string, any>;\n\nconst FetchersContext = React.createContext<FetchersContextObject>(new Map());\nif (__DEV__) {\n  FetchersContext.displayName = \"Fetchers\";\n}\n\nexport { FetchersContext as UNSAFE_FetchersContext };\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Components\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n  Webpack + React 17 fails to compile on any of the following because webpack\n  complains that `startTransition` doesn't exist in `React`:\n  * import { startTransition } from \"react\"\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n  * import * as React from from \"react\";\n    \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n  Moving it to a constant such as the following solves the Webpack/React 17 issue:\n  * import * as React from from \"react\";\n    const START_TRANSITION = \"startTransition\";\n    START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n  However, that introduces webpack/terser minification issues in production builds\n  in React 18 where minification/obfuscation ends up removing the call of\n  React.startTransition entirely from the first half of the ternary.  Grabbing\n  this exported reference once up front resolves that issue.\n\n  See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\nconst FLUSH_SYNC = \"flushSync\";\nconst flushSyncImpl = ReactDOM[FLUSH_SYNC];\nconst USE_ID = \"useId\";\nconst useIdImpl = React[USE_ID];\n\nfunction startTransitionSafe(cb: () => void) {\n  if (startTransitionImpl) {\n    startTransitionImpl(cb);\n  } else {\n    cb();\n  }\n}\n\nfunction flushSyncSafe(cb: () => void) {\n  if (flushSyncImpl) {\n    flushSyncImpl(cb);\n  } else {\n    cb();\n  }\n}\n\ninterface ViewTransition {\n  finished: Promise<void>;\n  ready: Promise<void>;\n  updateCallbackDone: Promise<void>;\n  skipTransition(): void;\n}\n\nclass Deferred<T> {\n  status: \"pending\" | \"resolved\" | \"rejected\" = \"pending\";\n  promise: Promise<T>;\n  // @ts-expect-error - no initializer\n  resolve: (value: T) => void;\n  // @ts-expect-error - no initializer\n  reject: (reason?: unknown) => void;\n  constructor() {\n    this.promise = new Promise((resolve, reject) => {\n      this.resolve = (value) => {\n        if (this.status === \"pending\") {\n          this.status = \"resolved\";\n          resolve(value);\n        }\n      };\n      this.reject = (reason) => {\n        if (this.status === \"pending\") {\n          this.status = \"rejected\";\n          reject(reason);\n        }\n      };\n    });\n  }\n}\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n  fallbackElement,\n  router,\n  future,\n}: RouterProviderProps): React.ReactElement {\n  let [state, setStateImpl] = React.useState(router.state);\n  let [pendingState, setPendingState] = React.useState<RouterState>();\n  let [vtContext, setVtContext] = React.useState<ViewTransitionContextObject>({\n    isTransitioning: false,\n  });\n  let [renderDfd, setRenderDfd] = React.useState<Deferred<void>>();\n  let [transition, setTransition] = React.useState<ViewTransition>();\n  let [interruption, setInterruption] = React.useState<{\n    state: RouterState;\n    currentLocation: Location;\n    nextLocation: Location;\n  }>();\n  let fetcherData = React.useRef<Map<string, any>>(new Map());\n  let { v7_startTransition } = future || {};\n\n  let optInStartTransition = React.useCallback(\n    (cb: () => void) => {\n      if (v7_startTransition) {\n        startTransitionSafe(cb);\n      } else {\n        cb();\n      }\n    },\n    [v7_startTransition]\n  );\n\n  let setState = React.useCallback<RouterSubscriber>(\n    (\n      newState: RouterState,\n      {\n        deletedFetchers,\n        flushSync: flushSync,\n        viewTransitionOpts: viewTransitionOpts,\n      }\n    ) => {\n      newState.fetchers.forEach((fetcher, key) => {\n        if (fetcher.data !== undefined) {\n          fetcherData.current.set(key, fetcher.data);\n        }\n      });\n      deletedFetchers.forEach((key) => fetcherData.current.delete(key));\n\n      let isViewTransitionUnavailable =\n        router.window == null ||\n        router.window.document == null ||\n        typeof router.window.document.startViewTransition !== \"function\";\n\n      // If this isn't a view transition or it's not available in this browser,\n      // just update and be done with it\n      if (!viewTransitionOpts || isViewTransitionUnavailable) {\n        if (flushSync) {\n          flushSyncSafe(() => setStateImpl(newState));\n        } else {\n          optInStartTransition(() => setStateImpl(newState));\n        }\n        return;\n      }\n\n      // flushSync + startViewTransition\n      if (flushSync) {\n        // Flush through the context to mark DOM elements as transition=ing\n        flushSyncSafe(() => {\n          // Cancel any pending transitions\n          if (transition) {\n            renderDfd && renderDfd.resolve();\n            transition.skipTransition();\n          }\n          setVtContext({\n            isTransitioning: true,\n            flushSync: true,\n            currentLocation: viewTransitionOpts.currentLocation,\n            nextLocation: viewTransitionOpts.nextLocation,\n          });\n        });\n\n        // Update the DOM\n        let t = router.window!.document.startViewTransition(() => {\n          flushSyncSafe(() => setStateImpl(newState));\n        });\n\n        // Clean up after the animation completes\n        t.finished.finally(() => {\n          flushSyncSafe(() => {\n            setRenderDfd(undefined);\n            setTransition(undefined);\n            setPendingState(undefined);\n            setVtContext({ isTransitioning: false });\n          });\n        });\n\n        flushSyncSafe(() => setTransition(t));\n        return;\n      }\n\n      // startTransition + startViewTransition\n      if (transition) {\n        // Interrupting an in-progress transition, cancel and let everything flush\n        // out, and then kick off a new transition from the interruption state\n        renderDfd && renderDfd.resolve();\n        transition.skipTransition();\n        setInterruption({\n          state: newState,\n          currentLocation: viewTransitionOpts.currentLocation,\n          nextLocation: viewTransitionOpts.nextLocation,\n        });\n      } else {\n        // Completed navigation update with opted-in view transitions, let 'er rip\n        setPendingState(newState);\n        setVtContext({\n          isTransitioning: true,\n          flushSync: false,\n          currentLocation: viewTransitionOpts.currentLocation,\n          nextLocation: viewTransitionOpts.nextLocation,\n        });\n      }\n    },\n    [router.window, transition, renderDfd, fetcherData, optInStartTransition]\n  );\n\n  // Need to use a layout effect here so we are subscribed early enough to\n  // pick up on any render-driven redirects/navigations (useEffect/<Navigate>)\n  React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n  // When we start a view transition, create a Deferred we can use for the\n  // eventual \"completed\" render\n  React.useEffect(() => {\n    if (vtContext.isTransitioning && !vtContext.flushSync) {\n      setRenderDfd(new Deferred<void>());\n    }\n  }, [vtContext]);\n\n  // Once the deferred is created, kick off startViewTransition() to update the\n  // DOM and then wait on the Deferred to resolve (indicating the DOM update has\n  // happened)\n  React.useEffect(() => {\n    if (renderDfd && pendingState && router.window) {\n      let newState = pendingState;\n      let renderPromise = renderDfd.promise;\n      let transition = router.window.document.startViewTransition(async () => {\n        optInStartTransition(() => setStateImpl(newState));\n        await renderPromise;\n      });\n      transition.finished.finally(() => {\n        setRenderDfd(undefined);\n        setTransition(undefined);\n        setPendingState(undefined);\n        setVtContext({ isTransitioning: false });\n      });\n      setTransition(transition);\n    }\n  }, [optInStartTransition, pendingState, renderDfd, router.window]);\n\n  // When the new location finally renders and is committed to the DOM, this\n  // effect will run to resolve the transition\n  React.useEffect(() => {\n    if (\n      renderDfd &&\n      pendingState &&\n      state.location.key === pendingState.location.key\n    ) {\n      renderDfd.resolve();\n    }\n  }, [renderDfd, transition, state.location, pendingState]);\n\n  // If we get interrupted with a new navigation during a transition, we skip\n  // the active transition, let it cleanup, then kick it off again here\n  React.useEffect(() => {\n    if (!vtContext.isTransitioning && interruption) {\n      setPendingState(interruption.state);\n      setVtContext({\n        isTransitioning: true,\n        flushSync: false,\n        currentLocation: interruption.currentLocation,\n        nextLocation: interruption.nextLocation,\n      });\n      setInterruption(undefined);\n    }\n  }, [vtContext.isTransitioning, interruption]);\n\n  React.useEffect(() => {\n    warning(\n      fallbackElement == null || !router.future.v7_partialHydration,\n      \"`<RouterProvider fallbackElement>` is deprecated when using \" +\n        \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n    );\n    // Only log this once on initial mount\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  let navigator = React.useMemo((): Navigator => {\n    return {\n      createHref: router.createHref,\n      encodeLocation: router.encodeLocation,\n      go: (n) => router.navigate(n),\n      push: (to, state, opts) =>\n        router.navigate(to, {\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n      replace: (to, state, opts) =>\n        router.navigate(to, {\n          replace: true,\n          state,\n          preventScrollReset: opts?.preventScrollReset,\n        }),\n    };\n  }, [router]);\n\n  let basename = router.basename || \"/\";\n\n  let dataRouterContext = React.useMemo(\n    () => ({\n      router,\n      navigator,\n      static: false,\n      basename,\n    }),\n    [router, navigator, basename]\n  );\n\n  let routerFuture = React.useMemo<RouterProps[\"future\"]>(\n    () => ({\n      v7_relativeSplatPath: router.future.v7_relativeSplatPath,\n    }),\n    [router.future.v7_relativeSplatPath]\n  );\n\n  React.useEffect(\n    () => logV6DeprecationWarnings(future, router.future),\n    [future, router.future]\n  );\n\n  // The fragment and {null} here are important!  We need them to keep React 18's\n  // useId happy when we are server-rendering since we may have a <script> here\n  // containing the hydrated server-side staticContext (from StaticRouterProvider).\n  // useId relies on the component tree structure to generate deterministic id's\n  // so we need to ensure it remains the same on the client even though\n  // we don't need the <script> tag\n  return (\n    <>\n      <DataRouterContext.Provider value={dataRouterContext}>\n        <DataRouterStateContext.Provider value={state}>\n          <FetchersContext.Provider value={fetcherData.current}>\n            <ViewTransitionContext.Provider value={vtContext}>\n              <Router\n                basename={basename}\n                location={state.location}\n                navigationType={state.historyAction}\n                navigator={navigator}\n                future={routerFuture}\n              >\n                {state.initialized || router.future.v7_partialHydration ? (\n                  <MemoizedDataRoutes\n                    routes={router.routes}\n                    future={router.future}\n                    state={state}\n                  />\n                ) : (\n                  fallbackElement\n                )}\n              </Router>\n            </ViewTransitionContext.Provider>\n          </FetchersContext.Provider>\n        </DataRouterStateContext.Provider>\n      </DataRouterContext.Provider>\n      {null}\n    </>\n  );\n}\n\n// Memoize to avoid re-renders when updating `ViewTransitionContext`\nconst MemoizedDataRoutes = React.memo(DataRoutes);\n\nfunction DataRoutes({\n  routes,\n  future,\n  state,\n}: {\n  routes: DataRouteObject[];\n  future: RemixRouter[\"future\"];\n  state: RouterState;\n}): React.ReactElement | null {\n  return useRoutesImpl(routes, undefined, state, future);\n}\n\nexport interface BrowserRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  future?: Partial<FutureConfig>;\n  window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Provides the cleanest URLs.\n */\nexport function BrowserRouter({\n  basename,\n  children,\n  future,\n  window,\n}: BrowserRouterProps) {\n  let historyRef = React.useRef<BrowserHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createBrowserHistory({ window, v5Compat: true });\n  }\n\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nexport interface HashRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  future?: Partial<FutureConfig>;\n  window?: Window;\n}\n\n/**\n * A `<Router>` for use in web browsers. Stores the location in the hash\n * portion of the URL so it is not sent to the server.\n */\nexport function HashRouter({\n  basename,\n  children,\n  future,\n  window,\n}: HashRouterProps) {\n  let historyRef = React.useRef<HashHistory>();\n  if (historyRef.current == null) {\n    historyRef.current = createHashHistory({ window, v5Compat: true });\n  }\n\n  let history = historyRef.current;\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nexport interface HistoryRouterProps {\n  basename?: string;\n  children?: React.ReactNode;\n  future?: FutureConfig;\n  history: History;\n}\n\n/**\n * A `<Router>` that accepts a pre-instantiated history object. It's important\n * to note that using your own history object is highly discouraged and may add\n * two versions of the history library to your bundles unless you use the same\n * version of the history library that React Router uses internally.\n */\nfunction HistoryRouter({\n  basename,\n  children,\n  future,\n  history,\n}: HistoryRouterProps) {\n  let [state, setStateImpl] = React.useState({\n    action: history.action,\n    location: history.location,\n  });\n  let { v7_startTransition } = future || {};\n  let setState = React.useCallback(\n    (newState: { action: NavigationType; location: Location }) => {\n      v7_startTransition && startTransitionImpl\n        ? startTransitionImpl(() => setStateImpl(newState))\n        : setStateImpl(newState);\n    },\n    [setStateImpl, v7_startTransition]\n  );\n\n  React.useLayoutEffect(() => history.listen(setState), [history, setState]);\n\n  React.useEffect(() => logV6DeprecationWarnings(future), [future]);\n\n  return (\n    <Router\n      basename={basename}\n      children={children}\n      location={state.location}\n      navigationType={state.action}\n      navigator={history}\n      future={future}\n    />\n  );\n}\n\nif (__DEV__) {\n  HistoryRouter.displayName = \"unstable_HistoryRouter\";\n}\n\nexport { HistoryRouter as unstable_HistoryRouter };\n\nexport interface LinkProps\n  extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, \"href\"> {\n  reloadDocument?: boolean;\n  replace?: boolean;\n  state?: any;\n  preventScrollReset?: boolean;\n  relative?: RelativeRoutingType;\n  to: To;\n  viewTransition?: boolean;\n}\n\nconst isBrowser =\n  typeof window !== \"undefined\" &&\n  typeof window.document !== \"undefined\" &&\n  typeof window.document.createElement !== \"undefined\";\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\n/**\n * The public API for rendering a history-aware `<a>`.\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n  function LinkWithRef(\n    {\n      onClick,\n      relative,\n      reloadDocument,\n      replace,\n      state,\n      target,\n      to,\n      preventScrollReset,\n      viewTransition,\n      ...rest\n    },\n    ref\n  ) {\n    let { basename } = React.useContext(NavigationContext);\n\n    // Rendered into <a href> for absolute URLs\n    let absoluteHref;\n    let isExternal = false;\n\n    if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) {\n      // Render the absolute href server- and client-side\n      absoluteHref = to;\n\n      // Only check for external origins client-side\n      if (isBrowser) {\n        try {\n          let currentUrl = new URL(window.location.href);\n          let targetUrl = to.startsWith(\"//\")\n            ? new URL(currentUrl.protocol + to)\n            : new URL(to);\n          let path = stripBasename(targetUrl.pathname, basename);\n\n          if (targetUrl.origin === currentUrl.origin && path != null) {\n            // Strip the protocol/origin/basename for same-origin absolute URLs\n            to = path + targetUrl.search + targetUrl.hash;\n          } else {\n            isExternal = true;\n          }\n        } catch (e) {\n          // We can't do external URL detection without a valid URL\n          warning(\n            false,\n            `<Link to=\"${to}\"> contains an invalid URL which will probably break ` +\n              `when clicked - please update to a valid URL path.`\n          );\n        }\n      }\n    }\n\n    // Rendered into <a href> for relative URLs\n    let href = useHref(to, { relative });\n\n    let internalOnClick = useLinkClickHandler(to, {\n      replace,\n      state,\n      target,\n      preventScrollReset,\n      relative,\n      viewTransition,\n    });\n    function handleClick(\n      event: React.MouseEvent<HTMLAnchorElement, MouseEvent>\n    ) {\n      if (onClick) onClick(event);\n      if (!event.defaultPrevented) {\n        internalOnClick(event);\n      }\n    }\n\n    return (\n      // eslint-disable-next-line jsx-a11y/anchor-has-content\n      <a\n        {...rest}\n        href={absoluteHref || href}\n        onClick={isExternal || reloadDocument ? onClick : handleClick}\n        ref={ref}\n        target={target}\n      />\n    );\n  }\n);\n\nif (__DEV__) {\n  Link.displayName = \"Link\";\n}\n\nexport type NavLinkRenderProps = {\n  isActive: boolean;\n  isPending: boolean;\n  isTransitioning: boolean;\n};\n\nexport interface NavLinkProps\n  extends Omit<LinkProps, \"className\" | \"style\" | \"children\"> {\n  children?: React.ReactNode | ((props: NavLinkRenderProps) => React.ReactNode);\n  caseSensitive?: boolean;\n  className?: string | ((props: NavLinkRenderProps) => string | undefined);\n  end?: boolean;\n  style?:\n    | React.CSSProperties\n    | ((props: NavLinkRenderProps) => React.CSSProperties | undefined);\n}\n\n/**\n * A `<Link>` wrapper that knows if it's \"active\" or not.\n */\nexport const NavLink = React.forwardRef<HTMLAnchorElement, NavLinkProps>(\n  function NavLinkWithRef(\n    {\n      \"aria-current\": ariaCurrentProp = \"page\",\n      caseSensitive = false,\n      className: classNameProp = \"\",\n      end = false,\n      style: styleProp,\n      to,\n      viewTransition,\n      children,\n      ...rest\n    },\n    ref\n  ) {\n    let path = useResolvedPath(to, { relative: rest.relative });\n    let location = useLocation();\n    let routerState = React.useContext(DataRouterStateContext);\n    let { navigator, basename } = React.useContext(NavigationContext);\n    let isTransitioning =\n      routerState != null &&\n      // Conditional usage is OK here because the usage of a data router is static\n      // eslint-disable-next-line react-hooks/rules-of-hooks\n      useViewTransitionState(path) &&\n      viewTransition === true;\n\n    let toPathname = navigator.encodeLocation\n      ? navigator.encodeLocation(path).pathname\n      : path.pathname;\n    let locationPathname = location.pathname;\n    let nextLocationPathname =\n      routerState && routerState.navigation && routerState.navigation.location\n        ? routerState.navigation.location.pathname\n        : null;\n\n    if (!caseSensitive) {\n      locationPathname = locationPathname.toLowerCase();\n      nextLocationPathname = nextLocationPathname\n        ? nextLocationPathname.toLowerCase()\n        : null;\n      toPathname = toPathname.toLowerCase();\n    }\n\n    if (nextLocationPathname && basename) {\n      nextLocationPathname =\n        stripBasename(nextLocationPathname, basename) || nextLocationPathname;\n    }\n\n    // If the `to` has a trailing slash, look at that exact spot.  Otherwise,\n    // we're looking for a slash _after_ what's in `to`.  For example:\n    //\n    // <NavLink to=\"/users\"> and <NavLink to=\"/users/\">\n    // both want to look for a / at index 6 to match URL `/users/matt`\n    const endSlashPosition =\n      toPathname !== \"/\" && toPathname.endsWith(\"/\")\n        ? toPathname.length - 1\n        : toPathname.length;\n    let isActive =\n      locationPathname === toPathname ||\n      (!end &&\n        locationPathname.startsWith(toPathname) &&\n        locationPathname.charAt(endSlashPosition) === \"/\");\n\n    let isPending =\n      nextLocationPathname != null &&\n      (nextLocationPathname === toPathname ||\n        (!end &&\n          nextLocationPathname.startsWith(toPathname) &&\n          nextLocationPathname.charAt(toPathname.length) === \"/\"));\n\n    let renderProps = {\n      isActive,\n      isPending,\n      isTransitioning,\n    };\n\n    let ariaCurrent = isActive ? ariaCurrentProp : undefined;\n\n    let className: string | undefined;\n    if (typeof classNameProp === \"function\") {\n      className = classNameProp(renderProps);\n    } else {\n      // If the className prop is not a function, we use a default `active`\n      // class for <NavLink />s that are active. In v5 `active` was the default\n      // value for `activeClassName`, but we are removing that API and can still\n      // use the old default behavior for a cleaner upgrade path and keep the\n      // simple styling rules working as they currently do.\n      className = [\n        classNameProp,\n        isActive ? \"active\" : null,\n        isPending ? \"pending\" : null,\n        isTransitioning ? \"transitioning\" : null,\n      ]\n        .filter(Boolean)\n        .join(\" \");\n    }\n\n    let style =\n      typeof styleProp === \"function\" ? styleProp(renderProps) : styleProp;\n\n    return (\n      <Link\n        {...rest}\n        aria-current={ariaCurrent}\n        className={className}\n        ref={ref}\n        style={style}\n        to={to}\n        viewTransition={viewTransition}\n      >\n        {typeof children === \"function\" ? children(renderProps) : children}\n      </Link>\n    );\n  }\n);\n\nif (__DEV__) {\n  NavLink.displayName = \"NavLink\";\n}\n\n/**\n * Form props shared by navigations and fetchers\n */\ninterface SharedFormProps extends React.FormHTMLAttributes<HTMLFormElement> {\n  /**\n   * The HTTP verb to use when the form is submit. Supports \"get\", \"post\",\n   * \"put\", \"delete\", \"patch\".\n   */\n  method?: HTMLFormMethod;\n\n  /**\n   * `<form encType>` - enhancing beyond the normal string type and limiting\n   * to the built-in browser supported values\n   */\n  encType?:\n    | \"application/x-www-form-urlencoded\"\n    | \"multipart/form-data\"\n    | \"text/plain\";\n\n  /**\n   * Normal `<form action>` but supports React Router's relative paths.\n   */\n  action?: string;\n\n  /**\n   * Determines whether the form action is relative to the route hierarchy or\n   * the pathname.  Use this if you want to opt out of navigating the route\n   * hierarchy and want to instead route based on /-delimited URL segments\n   */\n  relative?: RelativeRoutingType;\n\n  /**\n   * Prevent the scroll position from resetting to the top of the viewport on\n   * completion of the navigation when using the <ScrollRestoration> component\n   */\n  preventScrollReset?: boolean;\n\n  /**\n   * A function to call when the form is submitted. If you call\n   * `event.preventDefault()` then this form will not do anything.\n   */\n  onSubmit?: React.FormEventHandler<HTMLFormElement>;\n}\n\n/**\n * Form props available to fetchers\n */\nexport interface FetcherFormProps extends SharedFormProps {}\n\n/**\n * Form props available to navigations\n */\nexport interface FormProps extends SharedFormProps {\n  /**\n   * Indicate a specific fetcherKey to use when using navigate=false\n   */\n  fetcherKey?: string;\n\n  /**\n   * navigate=false will use a fetcher instead of a navigation\n   */\n  navigate?: boolean;\n\n  /**\n   * Forces a full document navigation instead of a fetch.\n   */\n  reloadDocument?: boolean;\n\n  /**\n   * Replaces the current entry in the browser history stack when the form\n   * navigates. Use this if you don't want the user to be able to click \"back\"\n   * to the page with the form on it.\n   */\n  replace?: boolean;\n\n  /**\n   * State object to add to the history stack entry for this navigation\n   */\n  state?: any;\n\n  /**\n   * Enable view transitions on this Form navigation\n   */\n  viewTransition?: boolean;\n}\n\ntype HTMLSubmitEvent = React.BaseSyntheticEvent<\n  SubmitEvent,\n  Event,\n  HTMLFormElement\n>;\n\ntype HTMLFormSubmitter = HTMLButtonElement | HTMLInputElement;\n\n/**\n * A `@remix-run/router`-aware `<form>`. It behaves like a normal form except\n * that the interaction with the server is with `fetch` instead of new document\n * requests, allowing components to add nicer UX to the page as the form is\n * submitted and returns with data.\n */\nexport const Form = React.forwardRef<HTMLFormElement, FormProps>(\n  (\n    {\n      fetcherKey,\n      navigate,\n      reloadDocument,\n      replace,\n      state,\n      method = defaultMethod,\n      action,\n      onSubmit,\n      relative,\n      preventScrollReset,\n      viewTransition,\n      ...props\n    },\n    forwardedRef\n  ) => {\n    let submit = useSubmit();\n    let formAction = useFormAction(action, { relative });\n    let formMethod: HTMLFormMethod =\n      method.toLowerCase() === \"get\" ? \"get\" : \"post\";\n\n    let submitHandler: React.FormEventHandler<HTMLFormElement> = (event) => {\n      onSubmit && onSubmit(event);\n      if (event.defaultPrevented) return;\n      event.preventDefault();\n\n      let submitter = (event as unknown as HTMLSubmitEvent).nativeEvent\n        .submitter as HTMLFormSubmitter | null;\n\n      let submitMethod =\n        (submitter?.getAttribute(\"formmethod\") as HTMLFormMethod | undefined) ||\n        method;\n\n      submit(submitter || event.currentTarget, {\n        fetcherKey,\n        method: submitMethod,\n        navigate,\n        replace,\n        state,\n        relative,\n        preventScrollReset,\n        viewTransition,\n      });\n    };\n\n    return (\n      <form\n        ref={forwardedRef}\n        method={formMethod}\n        action={formAction}\n        onSubmit={reloadDocument ? onSubmit : submitHandler}\n        {...props}\n      />\n    );\n  }\n);\n\nif (__DEV__) {\n  Form.displayName = \"Form\";\n}\n\nexport interface ScrollRestorationProps {\n  getKey?: GetScrollRestorationKeyFunction;\n  storageKey?: string;\n}\n\n/**\n * This component will emulate the browser's scroll restoration on location\n * changes.\n */\nexport function ScrollRestoration({\n  getKey,\n  storageKey,\n}: ScrollRestorationProps) {\n  useScrollRestoration({ getKey, storageKey });\n  return null;\n}\n\nif (__DEV__) {\n  ScrollRestoration.displayName = \"ScrollRestoration\";\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hooks\n////////////////////////////////////////////////////////////////////////////////\n\nenum DataRouterHook {\n  UseScrollRestoration = \"useScrollRestoration\",\n  UseSubmit = \"useSubmit\",\n  UseSubmitFetcher = \"useSubmitFetcher\",\n  UseFetcher = \"useFetcher\",\n  useViewTransitionState = \"useViewTransitionState\",\n}\n\nenum DataRouterStateHook {\n  UseFetcher = \"useFetcher\",\n  UseFetchers = \"useFetchers\",\n  UseScrollRestoration = \"useScrollRestoration\",\n}\n\n// Internal hooks\n\nfunction getDataRouterConsoleError(\n  hookName: DataRouterHook | DataRouterStateHook\n) {\n  return `${hookName} must be used within a data router.  See https://reactrouter.com/v6/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n  let ctx = React.useContext(DataRouterContext);\n  invariant(ctx, getDataRouterConsoleError(hookName));\n  return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n  let state = React.useContext(DataRouterStateContext);\n  invariant(state, getDataRouterConsoleError(hookName));\n  return state;\n}\n\n// External hooks\n\n/**\n * Handles the click behavior for router `<Link>` components. This is useful if\n * you need to create custom `<Link>` components with the same click behavior we\n * use in our exported `<Link>`.\n */\nexport function useLinkClickHandler<E extends Element = HTMLAnchorElement>(\n  to: To,\n  {\n    target,\n    replace: replaceProp,\n    state,\n    preventScrollReset,\n    relative,\n    viewTransition,\n  }: {\n    target?: React.HTMLAttributeAnchorTarget;\n    replace?: boolean;\n    state?: any;\n    preventScrollReset?: boolean;\n    relative?: RelativeRoutingType;\n    viewTransition?: boolean;\n  } = {}\n): (event: React.MouseEvent<E, MouseEvent>) => void {\n  let navigate = useNavigate();\n  let location = useLocation();\n  let path = useResolvedPath(to, { relative });\n\n  return React.useCallback(\n    (event: React.MouseEvent<E, MouseEvent>) => {\n      if (shouldProcessLinkClick(event, target)) {\n        event.preventDefault();\n\n        // If the URL hasn't changed, a regular <a> will do a replace instead of\n        // a push, so do the same here unless the replace prop is explicitly set\n        let replace =\n          replaceProp !== undefined\n            ? replaceProp\n            : createPath(location) === createPath(path);\n\n        navigate(to, {\n          replace,\n          state,\n          preventScrollReset,\n          relative,\n          viewTransition,\n        });\n      }\n    },\n    [\n      location,\n      navigate,\n      path,\n      replaceProp,\n      state,\n      target,\n      to,\n      preventScrollReset,\n      relative,\n      viewTransition,\n    ]\n  );\n}\n\n/**\n * A convenient wrapper for reading and writing search parameters via the\n * URLSearchParams interface.\n */\nexport function useSearchParams(\n  defaultInit?: URLSearchParamsInit\n): [URLSearchParams, SetURLSearchParams] {\n  warning(\n    typeof URLSearchParams !== \"undefined\",\n    `You cannot use the \\`useSearchParams\\` hook in a browser that does not ` +\n      `support the URLSearchParams API. If you need to support Internet ` +\n      `Explorer 11, we recommend you load a polyfill such as ` +\n      `https://github.com/ungap/url-search-params.`\n  );\n\n  let defaultSearchParamsRef = React.useRef(createSearchParams(defaultInit));\n  let hasSetSearchParamsRef = React.useRef(false);\n\n  let location = useLocation();\n  let searchParams = React.useMemo(\n    () =>\n      // Only merge in the defaults if we haven't yet called setSearchParams.\n      // Once we call that we want those to take precedence, otherwise you can't\n      // remove a param with setSearchParams({}) if it has an initial value\n      getSearchParamsForLocation(\n        location.search,\n        hasSetSearchParamsRef.current ? null : defaultSearchParamsRef.current\n      ),\n    [location.search]\n  );\n\n  let navigate = useNavigate();\n  let setSearchParams = React.useCallback<SetURLSearchParams>(\n    (nextInit, navigateOptions) => {\n      const newSearchParams = createSearchParams(\n        typeof nextInit === \"function\" ? nextInit(searchParams) : nextInit\n      );\n      hasSetSearchParamsRef.current = true;\n      navigate(\"?\" + newSearchParams, navigateOptions);\n    },\n    [navigate, searchParams]\n  );\n\n  return [searchParams, setSearchParams];\n}\n\nexport type SetURLSearchParams = (\n  nextInit?:\n    | URLSearchParamsInit\n    | ((prev: URLSearchParams) => URLSearchParamsInit),\n  navigateOpts?: NavigateOptions\n) => void;\n\n/**\n * Submits a HTML `<form>` to the server without reloading the page.\n */\nexport interface SubmitFunction {\n  (\n    /**\n     * Specifies the `<form>` to be submitted to the server, a specific\n     * `<button>` or `<input type=\"submit\">` to use to submit the form, or some\n     * arbitrary data to submit.\n     *\n     * Note: When using a `<button>` its `name` and `value` will also be\n     * included in the form data that is submitted.\n     */\n    target: SubmitTarget,\n\n    /**\n     * Options that override the `<form>`'s own attributes. Required when\n     * submitting arbitrary data without a backing `<form>`.\n     */\n    options?: SubmitOptions\n  ): void;\n}\n\n/**\n * Submits a fetcher `<form>` to the server without reloading the page.\n */\nexport interface FetcherSubmitFunction {\n  (\n    target: SubmitTarget,\n    // Fetchers cannot replace or set state because they are not navigation events\n    options?: FetcherSubmitOptions\n  ): void;\n}\n\nfunction validateClientSideSubmission() {\n  if (typeof document === \"undefined\") {\n    throw new Error(\n      \"You are calling submit during the server render. \" +\n        \"Try calling submit within a `useEffect` or callback instead.\"\n    );\n  }\n}\n\nlet fetcherId = 0;\nlet getUniqueFetcherId = () => `__${String(++fetcherId)}__`;\n\n/**\n * Returns a function that may be used to programmatically submit a form (or\n * some arbitrary data) to the server.\n */\nexport function useSubmit(): SubmitFunction {\n  let { router } = useDataRouterContext(DataRouterHook.UseSubmit);\n  let { basename } = React.useContext(NavigationContext);\n  let currentRouteId = useRouteId();\n\n  return React.useCallback<SubmitFunction>(\n    (target, options = {}) => {\n      validateClientSideSubmission();\n\n      let { action, method, encType, formData, body } = getFormSubmissionInfo(\n        target,\n        basename\n      );\n\n      if (options.navigate === false) {\n        let key = options.fetcherKey || getUniqueFetcherId();\n        router.fetch(key, currentRouteId, options.action || action, {\n          preventScrollReset: options.preventScrollReset,\n          formData,\n          body,\n          formMethod: options.method || (method as HTMLFormMethod),\n          formEncType: options.encType || (encType as FormEncType),\n          flushSync: options.flushSync,\n        });\n      } else {\n        router.navigate(options.action || action, {\n          preventScrollReset: options.preventScrollReset,\n          formData,\n          body,\n          formMethod: options.method || (method as HTMLFormMethod),\n          formEncType: options.encType || (encType as FormEncType),\n          replace: options.replace,\n          state: options.state,\n          fromRouteId: currentRouteId,\n          flushSync: options.flushSync,\n          viewTransition: options.viewTransition,\n        });\n      }\n    },\n    [router, basename, currentRouteId]\n  );\n}\n\n// v7: Eventually we should deprecate this entirely in favor of using the\n// router method directly?\nexport function useFormAction(\n  action?: string,\n  { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n  let { basename } = React.useContext(NavigationContext);\n  let routeContext = React.useContext(RouteContext);\n  invariant(routeContext, \"useFormAction must be used inside a RouteContext\");\n\n  let [match] = routeContext.matches.slice(-1);\n  // Shallow clone path so we can modify it below, otherwise we modify the\n  // object referenced by useMemo inside useResolvedPath\n  let path = { ...useResolvedPath(action ? action : \".\", { relative }) };\n\n  // If no action was specified, browsers will persist current search params\n  // when determining the path, so match that behavior\n  // https://github.com/remix-run/remix/issues/927\n  let location = useLocation();\n  if (action == null) {\n    // Safe to write to this directly here since if action was undefined, we\n    // would have called useResolvedPath(\".\") which will never include a search\n    path.search = location.search;\n\n    // When grabbing search params from the URL, remove any included ?index param\n    // since it might not apply to our contextual route.  We add it back based\n    // on match.route.index below\n    let params = new URLSearchParams(path.search);\n    let indexValues = params.getAll(\"index\");\n    let hasNakedIndexParam = indexValues.some((v) => v === \"\");\n    if (hasNakedIndexParam) {\n      params.delete(\"index\");\n      indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n      let qs = params.toString();\n      path.search = qs ? `?${qs}` : \"\";\n    }\n  }\n\n  if ((!action || action === \".\") && match.route.index) {\n    path.search = path.search\n      ? path.search.replace(/^\\?/, \"?index&\")\n      : \"?index\";\n  }\n\n  // If we're operating within a basename, prepend it to the pathname prior\n  // to creating the form action.  If this is a root navigation, then just use\n  // the raw basename which allows the basename to have full control over the\n  // presence of a trailing slash on root actions\n  if (basename !== \"/\") {\n    path.pathname =\n      path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n  }\n\n  return createPath(path);\n}\n\nexport type FetcherWithComponents<TData> = Fetcher<TData> & {\n  Form: React.ForwardRefExoticComponent<\n    FetcherFormProps & React.RefAttributes<HTMLFormElement>\n  >;\n  submit: FetcherSubmitFunction;\n  load: (href: string, opts?: { flushSync?: boolean }) => void;\n};\n\n// TODO: (v7) Change the useFetcher generic default from `any` to `unknown`\n\n/**\n * Interacts with route loaders and actions without causing a navigation. Great\n * for any interaction that stays on the same page.\n */\nexport function useFetcher<TData = any>({\n  key,\n}: { key?: string } = {}): FetcherWithComponents<TData> {\n  let { router } = useDataRouterContext(DataRouterHook.UseFetcher);\n  let state = useDataRouterState(DataRouterStateHook.UseFetcher);\n  let fetcherData = React.useContext(FetchersContext);\n  let route = React.useContext(RouteContext);\n  let routeId = route.matches[route.matches.length - 1]?.route.id;\n\n  invariant(fetcherData, `useFetcher must be used inside a FetchersContext`);\n  invariant(route, `useFetcher must be used inside a RouteContext`);\n  invariant(\n    routeId != null,\n    `useFetcher can only be used on routes that contain a unique \"id\"`\n  );\n\n  // Fetcher key handling\n  // OK to call conditionally to feature detect `useId`\n  // eslint-disable-next-line react-hooks/rules-of-hooks\n  let defaultKey = useIdImpl ? useIdImpl() : \"\";\n  let [fetcherKey, setFetcherKey] = React.useState<string>(key || defaultKey);\n  if (key && key !== fetcherKey) {\n    setFetcherKey(key);\n  } else if (!fetcherKey) {\n    // We will only fall through here when `useId` is not available\n    setFetcherKey(getUniqueFetcherId());\n  }\n\n  // Registration/cleanup\n  React.useEffect(() => {\n    router.getFetcher(fetcherKey);\n    return () => {\n      // Tell the router we've unmounted - if v7_fetcherPersist is enabled this\n      // will not delete immediately but instead queue up a delete after the\n      // fetcher returns to an `idle` state\n      router.deleteFetcher(fetcherKey);\n    };\n  }, [router, fetcherKey]);\n\n  // Fetcher additions\n  let load = React.useCallback(\n    (href: string, opts?: { flushSync?: boolean }) => {\n      invariant(routeId, \"No routeId available for fetcher.load()\");\n      router.fetch(fetcherKey, routeId, href, opts);\n    },\n    [fetcherKey, routeId, router]\n  );\n\n  let submitImpl = useSubmit();\n  let submit = React.useCallback<FetcherSubmitFunction>(\n    (target, opts) => {\n      submitImpl(target, {\n        ...opts,\n        navigate: false,\n        fetcherKey,\n      });\n    },\n    [fetcherKey, submitImpl]\n  );\n\n  let FetcherForm = React.useMemo(() => {\n    let FetcherForm = React.forwardRef<HTMLFormElement, FetcherFormProps>(\n      (props, ref) => {\n        return (\n          <Form {...props} navigate={false} fetcherKey={fetcherKey} ref={ref} />\n        );\n      }\n    );\n    if (__DEV__) {\n      FetcherForm.displayName = \"fetcher.Form\";\n    }\n    return FetcherForm;\n  }, [fetcherKey]);\n\n  // Exposed FetcherWithComponents\n  let fetcher = state.fetchers.get(fetcherKey) || IDLE_FETCHER;\n  let data = fetcherData.get(fetcherKey);\n  let fetcherWithComponents = React.useMemo(\n    () => ({\n      Form: FetcherForm,\n      submit,\n      load,\n      ...fetcher,\n      data,\n    }),\n    [FetcherForm, submit, load, fetcher, data]\n  );\n\n  return fetcherWithComponents;\n}\n\n/**\n * Provides all fetchers currently on the page. Useful for layouts and parent\n * routes that need to provide pending/optimistic UI regarding the fetch.\n */\nexport function useFetchers(): (Fetcher & { key: string })[] {\n  let state = useDataRouterState(DataRouterStateHook.UseFetchers);\n  return Array.from(state.fetchers.entries()).map(([key, fetcher]) => ({\n    ...fetcher,\n    key,\n  }));\n}\n\nconst SCROLL_RESTORATION_STORAGE_KEY = \"react-router-scroll-positions\";\nlet savedScrollPositions: Record<string, number> = {};\n\n/**\n * When rendered inside a RouterProvider, will restore scroll positions on navigations\n */\nfunction useScrollRestoration({\n  getKey,\n  storageKey,\n}: {\n  getKey?: GetScrollRestorationKeyFunction;\n  storageKey?: string;\n} = {}) {\n  let { router } = useDataRouterContext(DataRouterHook.UseScrollRestoration);\n  let { restoreScrollPosition, preventScrollReset } = useDataRouterState(\n    DataRouterStateHook.UseScrollRestoration\n  );\n  let { basename } = React.useContext(NavigationContext);\n  let location = useLocation();\n  let matches = useMatches();\n  let navigation = useNavigation();\n\n  // Trigger manual scroll restoration while we're active\n  React.useEffect(() => {\n    window.history.scrollRestoration = \"manual\";\n    return () => {\n      window.history.scrollRestoration = \"auto\";\n    };\n  }, []);\n\n  // Save positions on pagehide\n  usePageHide(\n    React.useCallback(() => {\n      if (navigation.state === \"idle\") {\n        let key = (getKey ? getKey(location, matches) : null) || location.key;\n        savedScrollPositions[key] = window.scrollY;\n      }\n      try {\n        sessionStorage.setItem(\n          storageKey || SCROLL_RESTORATION_STORAGE_KEY,\n          JSON.stringify(savedScrollPositions)\n        );\n      } catch (error) {\n        warning(\n          false,\n          `Failed to save scroll positions in sessionStorage, <ScrollRestoration /> will not work properly (${error}).`\n        );\n      }\n      window.history.scrollRestoration = \"auto\";\n    }, [storageKey, getKey, navigation.state, location, matches])\n  );\n\n  // Read in any saved scroll locations\n  if (typeof document !== \"undefined\") {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      try {\n        let sessionPositions = sessionStorage.getItem(\n          storageKey || SCROLL_RESTORATION_STORAGE_KEY\n        );\n        if (sessionPositions) {\n          savedScrollPositions = JSON.parse(sessionPositions);\n        }\n      } catch (e) {\n        // no-op, use default empty object\n      }\n    }, [storageKey]);\n\n    // Enable scroll restoration in the router\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      let getKeyWithoutBasename: GetScrollRestorationKeyFunction | undefined =\n        getKey && basename !== \"/\"\n          ? (location, matches) =>\n              getKey(\n                // Strip the basename to match useLocation()\n                {\n                  ...location,\n                  pathname:\n                    stripBasename(location.pathname, basename) ||\n                    location.pathname,\n                },\n                matches\n              )\n          : getKey;\n      let disableScrollRestoration = router?.enableScrollRestoration(\n        savedScrollPositions,\n        () => window.scrollY,\n        getKeyWithoutBasename\n      );\n      return () => disableScrollRestoration && disableScrollRestoration();\n    }, [router, basename, getKey]);\n\n    // Restore scrolling when state.restoreScrollPosition changes\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    React.useLayoutEffect(() => {\n      // Explicit false means don't do anything (used for submissions)\n      if (restoreScrollPosition === false) {\n        return;\n      }\n\n      // been here before, scroll to it\n      if (typeof restoreScrollPosition === \"number\") {\n        window.scrollTo(0, restoreScrollPosition);\n        return;\n      }\n\n      // try to scroll to the hash\n      if (location.hash) {\n        let el = document.getElementById(\n          decodeURIComponent(location.hash.slice(1))\n        );\n        if (el) {\n          el.scrollIntoView();\n          return;\n        }\n      }\n\n      // Don't reset if this navigation opted out\n      if (preventScrollReset === true) {\n        return;\n      }\n\n      // otherwise go to the top on new locations\n      window.scrollTo(0, 0);\n    }, [location, restoreScrollPosition, preventScrollReset]);\n  }\n}\n\nexport { useScrollRestoration as UNSAFE_useScrollRestoration };\n\n/**\n * Setup a callback to be fired on the window's `beforeunload` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nexport function useBeforeUnload(\n  callback: (event: BeforeUnloadEvent) => any,\n  options?: { capture?: boolean }\n): void {\n  let { capture } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? { capture } : undefined;\n    window.addEventListener(\"beforeunload\", callback, opts);\n    return () => {\n      window.removeEventListener(\"beforeunload\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n\n/**\n * Setup a callback to be fired on the window's `pagehide` event. This is\n * useful for saving some data to `window.localStorage` just before the page\n * refreshes.  This event is better supported than beforeunload across browsers.\n *\n * Note: The `callback` argument should be a function created with\n * `React.useCallback()`.\n */\nfunction usePageHide(\n  callback: (event: PageTransitionEvent) => any,\n  options?: { capture?: boolean }\n): void {\n  let { capture } = options || {};\n  React.useEffect(() => {\n    let opts = capture != null ? { capture } : undefined;\n    window.addEventListener(\"pagehide\", callback, opts);\n    return () => {\n      window.removeEventListener(\"pagehide\", callback, opts);\n    };\n  }, [callback, capture]);\n}\n\n/**\n * Wrapper around useBlocker to show a window.confirm prompt to users instead\n * of building a custom UI with useBlocker.\n *\n * Warning: This has *a lot of rough edges* and behaves very differently (and\n * very incorrectly in some cases) across browsers if user click addition\n * back/forward navigations while the confirm is open.  Use at your own risk.\n */\nfunction usePrompt({\n  when,\n  message,\n}: {\n  when: boolean | BlockerFunction;\n  message: string;\n}) {\n  let blocker = useBlocker(when);\n\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\") {\n      let proceed = window.confirm(message);\n      if (proceed) {\n        // This timeout is needed to avoid a weird \"race\" on POP navigations\n        // between the `window.history` revert navigation and the result of\n        // `window.confirm`\n        setTimeout(blocker.proceed, 0);\n      } else {\n        blocker.reset();\n      }\n    }\n  }, [blocker, message]);\n\n  React.useEffect(() => {\n    if (blocker.state === \"blocked\" && !when) {\n      blocker.reset();\n    }\n  }, [blocker, when]);\n}\n\nexport { usePrompt as unstable_usePrompt };\n\n/**\n * Return a boolean indicating if there is an active view transition to the\n * given href.  You can use this value to render CSS classes or viewTransitionName\n * styles onto your elements\n *\n * @param href The destination href\n * @param [opts.relative] Relative routing type (\"route\" | \"path\")\n */\nfunction useViewTransitionState(\n  to: To,\n  opts: { relative?: RelativeRoutingType } = {}\n) {\n  let vtContext = React.useContext(ViewTransitionContext);\n\n  invariant(\n    vtContext != null,\n    \"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`.  \" +\n      \"Did you accidentally import `RouterProvider` from `react-router`?\"\n  );\n\n  let { basename } = useDataRouterContext(\n    DataRouterHook.useViewTransitionState\n  );\n  let path = useResolvedPath(to, { relative: opts.relative });\n  if (!vtContext.isTransitioning) {\n    return false;\n  }\n\n  let currentPath =\n    stripBasename(vtContext.currentLocation.pathname, basename) ||\n    vtContext.currentLocation.pathname;\n  let nextPath =\n    stripBasename(vtContext.nextLocation.pathname, basename) ||\n    vtContext.nextLocation.pathname;\n\n  // Transition is active if we're going to or coming from the indicated\n  // destination.  This ensures that other PUSH navigations that reverse\n  // an indicated transition apply.  I.e., on the list view you have:\n  //\n  //   <NavLink to=\"/details/1\" viewTransition>\n  //\n  // If you click the breadcrumb back to the list view:\n  //\n  //   <NavLink to=\"/list\" viewTransition>\n  //\n  // We should apply the transition because it's indicated as active going\n  // from /list -> /details/1 and therefore should be active on the reverse\n  // (even though this isn't strictly a POP reverse)\n  return (\n    matchPath(path.pathname, nextPath) != null ||\n    matchPath(path.pathname, currentPath) != null\n  );\n}\n\nexport { useViewTransitionState as useViewTransitionState };\n\n//#endregion\n","function _typeof(o) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n    return typeof o;\n  } : function (o) {\n    return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n  }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n  var i = toPrimitive(t, \"string\");\n  return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n  if (\"object\" != _typeof(t) || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != _typeof(i)) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n  return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n  var t = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    r && (o = o.filter(function (r) {\n      return Object.getOwnPropertyDescriptor(e, r).enumerable;\n    })), t.push.apply(t, o);\n  }\n  return t;\n}\nfunction _objectSpread2(e) {\n  for (var r = 1; r < arguments.length; r++) {\n    var t = null != arguments[r] ? arguments[r] : {};\n    r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n      defineProperty(e, r, t[r]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n      Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n    });\n  }\n  return e;\n}\nexport { _objectSpread2 as default };","'use strict';\n\nexport default function bind(fn, thisArg) {\n  return function wrap() {\n    return fn.apply(thisArg, arguments);\n  };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\nconst {iterator, toStringTag} = Symbol;\n\nconst kindOf = (cache => thing => {\n    const str = toString.call(thing);\n    return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n  type = type.toLowerCase();\n  return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n  return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n    && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n  let result;\n  if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n    result = ArrayBuffer.isView(val);\n  } else {\n    result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n  }\n  return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n  if (kindOf(val) !== 'object') {\n    return false;\n  }\n\n  const prototype = getPrototypeOf(val);\n  return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(toStringTag in val) && !(iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n  let kind;\n  return thing && (\n    (typeof FormData === 'function' && thing instanceof FormData) || (\n      isFunction(thing.append) && (\n        (kind = kindOf(thing)) === 'formdata' ||\n        // detect form-data instance\n        (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n      )\n    )\n  )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n  str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n  // Don't bother if no value provided\n  if (obj === null || typeof obj === 'undefined') {\n    return;\n  }\n\n  let i;\n  let l;\n\n  // Force an array if not already something iterable\n  if (typeof obj !== 'object') {\n    /*eslint no-param-reassign:0*/\n    obj = [obj];\n  }\n\n  if (isArray(obj)) {\n    // Iterate over array values\n    for (i = 0, l = obj.length; i < l; i++) {\n      fn.call(null, obj[i], i, obj);\n    }\n  } else {\n    // Iterate over object keys\n    const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n    const len = keys.length;\n    let key;\n\n    for (i = 0; i < len; i++) {\n      key = keys[i];\n      fn.call(null, obj[key], key, obj);\n    }\n  }\n}\n\nfunction findKey(obj, key) {\n  key = key.toLowerCase();\n  const keys = Object.keys(obj);\n  let i = keys.length;\n  let _key;\n  while (i-- > 0) {\n    _key = keys[i];\n    if (key === _key.toLowerCase()) {\n      return _key;\n    }\n  }\n  return null;\n}\n\nconst _global = (() => {\n  /*eslint no-undef:0*/\n  if (typeof globalThis !== \"undefined\") return globalThis;\n  return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n  const {caseless} = isContextDefined(this) && this || {};\n  const result = {};\n  const assignValue = (val, key) => {\n    const targetKey = caseless && findKey(result, key) || key;\n    if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n      result[targetKey] = merge(result[targetKey], val);\n    } else if (isPlainObject(val)) {\n      result[targetKey] = merge({}, val);\n    } else if (isArray(val)) {\n      result[targetKey] = val.slice();\n    } else {\n      result[targetKey] = val;\n    }\n  }\n\n  for (let i = 0, l = arguments.length; i < l; i++) {\n    arguments[i] && forEach(arguments[i], assignValue);\n  }\n  return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n  forEach(b, (val, key) => {\n    if (thisArg && isFunction(val)) {\n      a[key] = bind(val, thisArg);\n    } else {\n      a[key] = val;\n    }\n  }, {allOwnKeys});\n  return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n  if (content.charCodeAt(0) === 0xFEFF) {\n    content = content.slice(1);\n  }\n  return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n  constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n  constructor.prototype.constructor = constructor;\n  Object.defineProperty(constructor, 'super', {\n    value: superConstructor.prototype\n  });\n  props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n  let props;\n  let i;\n  let prop;\n  const merged = {};\n\n  destObj = destObj || {};\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  if (sourceObj == null) return destObj;\n\n  do {\n    props = Object.getOwnPropertyNames(sourceObj);\n    i = props.length;\n    while (i-- > 0) {\n      prop = props[i];\n      if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n        destObj[prop] = sourceObj[prop];\n        merged[prop] = true;\n      }\n    }\n    sourceObj = filter !== false && getPrototypeOf(sourceObj);\n  } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n  return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n  str = String(str);\n  if (position === undefined || position > str.length) {\n    position = str.length;\n  }\n  position -= searchString.length;\n  const lastIndex = str.indexOf(searchString, position);\n  return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n  if (!thing) return null;\n  if (isArray(thing)) return thing;\n  let i = thing.length;\n  if (!isNumber(i)) return null;\n  const arr = new Array(i);\n  while (i-- > 0) {\n    arr[i] = thing[i];\n  }\n  return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n  // eslint-disable-next-line func-names\n  return thing => {\n    return TypedArray && thing instanceof TypedArray;\n  };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object<any, any>} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n  const generator = obj && obj[iterator];\n\n  const _iterator = generator.call(obj);\n\n  let result;\n\n  while ((result = _iterator.next()) && !result.done) {\n    const pair = result.value;\n    fn.call(obj, pair[0], pair[1]);\n  }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array<boolean>}\n */\nconst matchAll = (regExp, str) => {\n  let matches;\n  const arr = [];\n\n  while ((matches = regExp.exec(str)) !== null) {\n    arr.push(matches);\n  }\n\n  return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n  return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n    function replacer(m, p1, p2) {\n      return p1.toUpperCase() + p2;\n    }\n  );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n  const descriptors = Object.getOwnPropertyDescriptors(obj);\n  const reducedDescriptors = {};\n\n  forEach(descriptors, (descriptor, name) => {\n    let ret;\n    if ((ret = reducer(descriptor, name, obj)) !== false) {\n      reducedDescriptors[name] = ret || descriptor;\n    }\n  });\n\n  Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n  reduceDescriptors(obj, (descriptor, name) => {\n    // skip restricted props in strict mode\n    if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n      return false;\n    }\n\n    const value = obj[name];\n\n    if (!isFunction(value)) return;\n\n    descriptor.enumerable = false;\n\n    if ('writable' in descriptor) {\n      descriptor.writable = false;\n      return;\n    }\n\n    if (!descriptor.set) {\n      descriptor.set = () => {\n        throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n      };\n    }\n  });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n  const obj = {};\n\n  const define = (arr) => {\n    arr.forEach(value => {\n      obj[value] = true;\n    });\n  }\n\n  isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n  return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n  return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n  return !!(thing && isFunction(thing.append) && thing[toStringTag] === 'FormData' && thing[iterator]);\n}\n\nconst toJSONObject = (obj) => {\n  const stack = new Array(10);\n\n  const visit = (source, i) => {\n\n    if (isObject(source)) {\n      if (stack.indexOf(source) >= 0) {\n        return;\n      }\n\n      if(!('toJSON' in source)) {\n        stack[i] = source;\n        const target = isArray(source) ? [] : {};\n\n        forEach(source, (value, key) => {\n          const reducedValue = visit(value, i + 1);\n          !isUndefined(reducedValue) && (target[key] = reducedValue);\n        });\n\n        stack[i] = undefined;\n\n        return target;\n      }\n    }\n\n    return source;\n  }\n\n  return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n  thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n  if (setImmediateSupported) {\n    return setImmediate;\n  }\n\n  return postMessageSupported ? ((token, callbacks) => {\n    _global.addEventListener(\"message\", ({source, data}) => {\n      if (source === _global && data === token) {\n        callbacks.length && callbacks.shift()();\n      }\n    }, false);\n\n    return (cb) => {\n      callbacks.push(cb);\n      _global.postMessage(token, \"*\");\n    }\n  })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n  typeof setImmediate === 'function',\n  isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n  queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\n\nconst isIterable = (thing) => thing != null && isFunction(thing[iterator]);\n\n\nexport default {\n  isArray,\n  isArrayBuffer,\n  isBuffer,\n  isFormData,\n  isArrayBufferView,\n  isString,\n  isNumber,\n  isBoolean,\n  isObject,\n  isPlainObject,\n  isReadableStream,\n  isRequest,\n  isResponse,\n  isHeaders,\n  isUndefined,\n  isDate,\n  isFile,\n  isBlob,\n  isRegExp,\n  isFunction,\n  isStream,\n  isURLSearchParams,\n  isTypedArray,\n  isFileList,\n  forEach,\n  merge,\n  extend,\n  trim,\n  stripBOM,\n  inherits,\n  toFlatObject,\n  kindOf,\n  kindOfTest,\n  endsWith,\n  toArray,\n  forEachEntry,\n  matchAll,\n  isHTMLForm,\n  hasOwnProperty,\n  hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n  reduceDescriptors,\n  freezeMethods,\n  toObjectSet,\n  toCamelCase,\n  noop,\n  toFiniteNumber,\n  findKey,\n  global: _global,\n  isContextDefined,\n  isSpecCompliantForm,\n  toJSONObject,\n  isAsyncFn,\n  isThenable,\n  setImmediate: _setImmediate,\n  asap,\n  isIterable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n  Error.call(this);\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, this.constructor);\n  } else {\n    this.stack = (new Error()).stack;\n  }\n\n  this.message = message;\n  this.name = 'AxiosError';\n  code && (this.code = code);\n  config && (this.config = config);\n  request && (this.request = request);\n  if (response) {\n    this.response = response;\n    this.status = response.status ? response.status : null;\n  }\n}\n\nutils.inherits(AxiosError, Error, {\n  toJSON: function toJSON() {\n    return {\n      // Standard\n      message: this.message,\n      name: this.name,\n      // Microsoft\n      description: this.description,\n      number: this.number,\n      // Mozilla\n      fileName: this.fileName,\n      lineNumber: this.lineNumber,\n      columnNumber: this.columnNumber,\n      stack: this.stack,\n      // Axios\n      config: utils.toJSONObject(this.config),\n      code: this.code,\n      status: this.status\n    };\n  }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n  'ERR_BAD_OPTION_VALUE',\n  'ERR_BAD_OPTION',\n  'ECONNABORTED',\n  'ETIMEDOUT',\n  'ERR_NETWORK',\n  'ERR_FR_TOO_MANY_REDIRECTS',\n  'ERR_DEPRECATED',\n  'ERR_BAD_RESPONSE',\n  'ERR_BAD_REQUEST',\n  'ERR_CANCELED',\n  'ERR_NOT_SUPPORT',\n  'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n  descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n  const axiosError = Object.create(prototype);\n\n  utils.toFlatObject(error, axiosError, function filter(obj) {\n    return obj !== Error.prototype;\n  }, prop => {\n    return prop !== 'isAxiosError';\n  });\n\n  AxiosError.call(axiosError, error.message, code, config, request, response);\n\n  axiosError.cause = error;\n\n  axiosError.name = error.name;\n\n  customProps && Object.assign(axiosError, customProps);\n\n  return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n  return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n  return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n  if (!path) return key;\n  return path.concat(key).map(function each(token, i) {\n    // eslint-disable-next-line no-param-reassign\n    token = removeBrackets(token);\n    return !dots && i ? '[' + token + ']' : token;\n  }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array<any>} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n  return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n  return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object<any, any>} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object<string, any>} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n  if (!utils.isObject(obj)) {\n    throw new TypeError('target must be an object');\n  }\n\n  // eslint-disable-next-line no-param-reassign\n  formData = formData || new (PlatformFormData || FormData)();\n\n  // eslint-disable-next-line no-param-reassign\n  options = utils.toFlatObject(options, {\n    metaTokens: true,\n    dots: false,\n    indexes: false\n  }, false, function defined(option, source) {\n    // eslint-disable-next-line no-eq-null,eqeqeq\n    return !utils.isUndefined(source[option]);\n  });\n\n  const metaTokens = options.metaTokens;\n  // eslint-disable-next-line no-use-before-define\n  const visitor = options.visitor || defaultVisitor;\n  const dots = options.dots;\n  const indexes = options.indexes;\n  const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n  const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n  if (!utils.isFunction(visitor)) {\n    throw new TypeError('visitor must be a function');\n  }\n\n  function convertValue(value) {\n    if (value === null) return '';\n\n    if (utils.isDate(value)) {\n      return value.toISOString();\n    }\n\n    if (!useBlob && utils.isBlob(value)) {\n      throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n    }\n\n    if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n      return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n    }\n\n    return value;\n  }\n\n  /**\n   * Default visitor.\n   *\n   * @param {*} value\n   * @param {String|Number} key\n   * @param {Array<String|Number>} path\n   * @this {FormData}\n   *\n   * @returns {boolean} return true to visit the each prop of the value recursively\n   */\n  function defaultVisitor(value, key, path) {\n    let arr = value;\n\n    if (value && !path && typeof value === 'object') {\n      if (utils.endsWith(key, '{}')) {\n        // eslint-disable-next-line no-param-reassign\n        key = metaTokens ? key : key.slice(0, -2);\n        // eslint-disable-next-line no-param-reassign\n        value = JSON.stringify(value);\n      } else if (\n        (utils.isArray(value) && isFlatArray(value)) ||\n        ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n        )) {\n        // eslint-disable-next-line no-param-reassign\n        key = removeBrackets(key);\n\n        arr.forEach(function each(el, index) {\n          !(utils.isUndefined(el) || el === null) && formData.append(\n            // eslint-disable-next-line no-nested-ternary\n            indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n            convertValue(el)\n          );\n        });\n        return false;\n      }\n    }\n\n    if (isVisitable(value)) {\n      return true;\n    }\n\n    formData.append(renderKey(path, key, dots), convertValue(value));\n\n    return false;\n  }\n\n  const stack = [];\n\n  const exposedHelpers = Object.assign(predicates, {\n    defaultVisitor,\n    convertValue,\n    isVisitable\n  });\n\n  function build(value, path) {\n    if (utils.isUndefined(value)) return;\n\n    if (stack.indexOf(value) !== -1) {\n      throw Error('Circular reference detected in ' + path.join('.'));\n    }\n\n    stack.push(value);\n\n    utils.forEach(value, function each(el, key) {\n      const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n        formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n      );\n\n      if (result === true) {\n        build(el, path ? path.concat(key) : [key]);\n      }\n    });\n\n    stack.pop();\n  }\n\n  if (!utils.isObject(obj)) {\n    throw new TypeError('data must be an object');\n  }\n\n  build(obj);\n\n  return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n  const charMap = {\n    '!': '%21',\n    \"'\": '%27',\n    '(': '%28',\n    ')': '%29',\n    '~': '%7E',\n    '%20': '+',\n    '%00': '\\x00'\n  };\n  return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n    return charMap[match];\n  });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object<string, any>} params - The parameters to be converted to a FormData object.\n * @param {Object<string, any>} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n  this._pairs = [];\n\n  params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n  this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n  const _encode = encoder ? function(value) {\n    return encoder.call(this, value, encode);\n  } : encode;\n\n  return this._pairs.map(function each(pair) {\n    return _encode(pair[0]) + '=' + _encode(pair[1]);\n  }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n  return encodeURIComponent(val).\n    replace(/%3A/gi, ':').\n    replace(/%24/g, '$').\n    replace(/%2C/gi, ',').\n    replace(/%20/g, '+').\n    replace(/%5B/gi, '[').\n    replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?(object|Function)} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n  /*eslint no-param-reassign:0*/\n  if (!params) {\n    return url;\n  }\n  \n  const _encode = options && options.encode || encode;\n\n  if (utils.isFunction(options)) {\n    options = {\n      serialize: options\n    };\n  } \n\n  const serializeFn = options && options.serialize;\n\n  let serializedParams;\n\n  if (serializeFn) {\n    serializedParams = serializeFn(params, options);\n  } else {\n    serializedParams = utils.isURLSearchParams(params) ?\n      params.toString() :\n      new AxiosURLSearchParams(params, options).toString(_encode);\n  }\n\n  if (serializedParams) {\n    const hashmarkIndex = url.indexOf(\"#\");\n\n    if (hashmarkIndex !== -1) {\n      url = url.slice(0, hashmarkIndex);\n    }\n    url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n  }\n\n  return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n  constructor() {\n    this.handlers = [];\n  }\n\n  /**\n   * Add a new interceptor to the stack\n   *\n   * @param {Function} fulfilled The function to handle `then` for a `Promise`\n   * @param {Function} rejected The function to handle `reject` for a `Promise`\n   *\n   * @return {Number} An ID used to remove interceptor later\n   */\n  use(fulfilled, rejected, options) {\n    this.handlers.push({\n      fulfilled,\n      rejected,\n      synchronous: options ? options.synchronous : false,\n      runWhen: options ? options.runWhen : null\n    });\n    return this.handlers.length - 1;\n  }\n\n  /**\n   * Remove an interceptor from the stack\n   *\n   * @param {Number} id The ID that was returned by `use`\n   *\n   * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n   */\n  eject(id) {\n    if (this.handlers[id]) {\n      this.handlers[id] = null;\n    }\n  }\n\n  /**\n   * Clear all interceptors from the stack\n   *\n   * @returns {void}\n   */\n  clear() {\n    if (this.handlers) {\n      this.handlers = [];\n    }\n  }\n\n  /**\n   * Iterate over all the registered interceptors\n   *\n   * This method is particularly useful for skipping over any\n   * interceptors that may have become `null` calling `eject`.\n   *\n   * @param {Function} fn The function to call for each interceptor\n   *\n   * @returns {void}\n   */\n  forEach(fn) {\n    utils.forEach(this.handlers, function forEachHandler(h) {\n      if (h !== null) {\n        fn(h);\n      }\n    });\n  }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n  silentJSONParsing: true,\n  forcedJSONParsing: true,\n  clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\nexport default {\n  isBrowser: true,\n  classes: {\n    URLSearchParams,\n    FormData,\n    Blob\n  },\n  protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n *  typeof window -> undefined\n *  typeof document -> undefined\n *\n * react-native:\n *  navigator.product -> 'ReactNative'\n * nativescript\n *  navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n  (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n  return (\n    typeof WorkerGlobalScope !== 'undefined' &&\n    // eslint-disable-next-line no-undef\n    self instanceof WorkerGlobalScope &&\n    typeof self.importScripts === 'function'\n  );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nexport {\n  hasBrowserEnv,\n  hasStandardBrowserWebWorkerEnv,\n  hasStandardBrowserEnv,\n  _navigator as navigator,\n  origin\n}\n","import platform from './node/index.js';\nimport * as utils from './common/utils.js';\n\nexport default {\n  ...utils,\n  ...platform\n}\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n  // foo[x][y][z]\n  // foo.x.y.z\n  // foo-x-y-z\n  // foo x y z\n  return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n    return match[0] === '[]' ? '' : match[1] || match[0];\n  });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array<any>} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n  const obj = {};\n  const keys = Object.keys(arr);\n  let i;\n  const len = keys.length;\n  let key;\n  for (i = 0; i < len; i++) {\n    key = keys[i];\n    obj[key] = arr[key];\n  }\n  return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object<string, any> | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n  function buildPath(path, value, target, index) {\n    let name = path[index++];\n\n    if (name === '__proto__') return true;\n\n    const isNumericKey = Number.isFinite(+name);\n    const isLast = index >= path.length;\n    name = !name && utils.isArray(target) ? target.length : name;\n\n    if (isLast) {\n      if (utils.hasOwnProp(target, name)) {\n        target[name] = [target[name], value];\n      } else {\n        target[name] = value;\n      }\n\n      return !isNumericKey;\n    }\n\n    if (!target[name] || !utils.isObject(target[name])) {\n      target[name] = [];\n    }\n\n    const result = buildPath(path, value, target[name], index);\n\n    if (result && utils.isArray(target[name])) {\n      target[name] = arrayToObject(target[name]);\n    }\n\n    return !isNumericKey;\n  }\n\n  if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n    const obj = {};\n\n    utils.forEachEntry(formData, (name, value) => {\n      buildPath(parsePropPath(name), value, obj, 0);\n    });\n\n    return obj;\n  }\n\n  return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n  if (utils.isString(rawValue)) {\n    try {\n      (parser || JSON.parse)(rawValue);\n      return utils.trim(rawValue);\n    } catch (e) {\n      if (e.name !== 'SyntaxError') {\n        throw e;\n      }\n    }\n  }\n\n  return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n  transitional: transitionalDefaults,\n\n  adapter: ['xhr', 'http', 'fetch'],\n\n  transformRequest: [function transformRequest(data, headers) {\n    const contentType = headers.getContentType() || '';\n    const hasJSONContentType = contentType.indexOf('application/json') > -1;\n    const isObjectPayload = utils.isObject(data);\n\n    if (isObjectPayload && utils.isHTMLForm(data)) {\n      data = new FormData(data);\n    }\n\n    const isFormData = utils.isFormData(data);\n\n    if (isFormData) {\n      return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n    }\n\n    if (utils.isArrayBuffer(data) ||\n      utils.isBuffer(data) ||\n      utils.isStream(data) ||\n      utils.isFile(data) ||\n      utils.isBlob(data) ||\n      utils.isReadableStream(data)\n    ) {\n      return data;\n    }\n    if (utils.isArrayBufferView(data)) {\n      return data.buffer;\n    }\n    if (utils.isURLSearchParams(data)) {\n      headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n      return data.toString();\n    }\n\n    let isFileList;\n\n    if (isObjectPayload) {\n      if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n        return toURLEncodedForm(data, this.formSerializer).toString();\n      }\n\n      if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n        const _FormData = this.env && this.env.FormData;\n\n        return toFormData(\n          isFileList ? {'files[]': data} : data,\n          _FormData && new _FormData(),\n          this.formSerializer\n        );\n      }\n    }\n\n    if (isObjectPayload || hasJSONContentType ) {\n      headers.setContentType('application/json', false);\n      return stringifySafely(data);\n    }\n\n    return data;\n  }],\n\n  transformResponse: [function transformResponse(data) {\n    const transitional = this.transitional || defaults.transitional;\n    const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n    const JSONRequested = this.responseType === 'json';\n\n    if (utils.isResponse(data) || utils.isReadableStream(data)) {\n      return data;\n    }\n\n    if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n      const silentJSONParsing = transitional && transitional.silentJSONParsing;\n      const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n      try {\n        return JSON.parse(data);\n      } catch (e) {\n        if (strictJSONParsing) {\n          if (e.name === 'SyntaxError') {\n            throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n          }\n          throw e;\n        }\n      }\n    }\n\n    return data;\n  }],\n\n  /**\n   * A timeout in milliseconds to abort a request. If set to 0 (default) a\n   * timeout is not created.\n   */\n  timeout: 0,\n\n  xsrfCookieName: 'XSRF-TOKEN',\n  xsrfHeaderName: 'X-XSRF-TOKEN',\n\n  maxContentLength: -1,\n  maxBodyLength: -1,\n\n  env: {\n    FormData: platform.classes.FormData,\n    Blob: platform.classes.Blob\n  },\n\n  validateStatus: function validateStatus(status) {\n    return status >= 200 && status < 300;\n  },\n\n  headers: {\n    common: {\n      'Accept': 'application/json, text/plain, */*',\n      'Content-Type': undefined\n    }\n  }\n};\n\nutils.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n  defaults.headers[method] = {};\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n  return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n    visitor: function(value, key, path, helpers) {\n      if (platform.isNode && utils.isBuffer(value)) {\n        this.append(key, value.toString('base64'));\n        return false;\n      }\n\n      return helpers.defaultVisitor.apply(this, arguments);\n    }\n  }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n  'age', 'authorization', 'content-length', 'content-type', 'etag',\n  'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n  'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n  'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n  const parsed = {};\n  let key;\n  let val;\n  let i;\n\n  rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n    i = line.indexOf(':');\n    key = line.substring(0, i).trim().toLowerCase();\n    val = line.substring(i + 1).trim();\n\n    if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n      return;\n    }\n\n    if (key === 'set-cookie') {\n      if (parsed[key]) {\n        parsed[key].push(val);\n      } else {\n        parsed[key] = [val];\n      }\n    } else {\n      parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n    }\n  });\n\n  return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n  return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n  if (value === false || value == null) {\n    return value;\n  }\n\n  return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n  const tokens = Object.create(null);\n  const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n  let match;\n\n  while ((match = tokensRE.exec(str))) {\n    tokens[match[1]] = match[2];\n  }\n\n  return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n  if (utils.isFunction(filter)) {\n    return filter.call(this, value, header);\n  }\n\n  if (isHeaderNameFilter) {\n    value = header;\n  }\n\n  if (!utils.isString(value)) return;\n\n  if (utils.isString(filter)) {\n    return value.indexOf(filter) !== -1;\n  }\n\n  if (utils.isRegExp(filter)) {\n    return filter.test(value);\n  }\n}\n\nfunction formatHeader(header) {\n  return header.trim()\n    .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n      return char.toUpperCase() + str;\n    });\n}\n\nfunction buildAccessors(obj, header) {\n  const accessorName = utils.toCamelCase(' ' + header);\n\n  ['get', 'set', 'has'].forEach(methodName => {\n    Object.defineProperty(obj, methodName + accessorName, {\n      value: function(arg1, arg2, arg3) {\n        return this[methodName].call(this, header, arg1, arg2, arg3);\n      },\n      configurable: true\n    });\n  });\n}\n\nclass AxiosHeaders {\n  constructor(headers) {\n    headers && this.set(headers);\n  }\n\n  set(header, valueOrRewrite, rewrite) {\n    const self = this;\n\n    function setHeader(_value, _header, _rewrite) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!lHeader) {\n        throw new Error('header name must be a non-empty string');\n      }\n\n      const key = utils.findKey(self, lHeader);\n\n      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n        self[key || _header] = normalizeValue(_value);\n      }\n    }\n\n    const setHeaders = (headers, _rewrite) =>\n      utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n    if (utils.isPlainObject(header) || header instanceof this.constructor) {\n      setHeaders(header, valueOrRewrite)\n    } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n      setHeaders(parseHeaders(header), valueOrRewrite);\n    } else if (utils.isObject(header) && utils.isIterable(header)) {\n      let obj = {}, dest, key;\n      for (const entry of header) {\n        if (!utils.isArray(entry)) {\n          throw TypeError('Object iterator must return a key-value pair');\n        }\n\n        obj[key = entry[0]] = (dest = obj[key]) ?\n          (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];\n      }\n\n      setHeaders(obj, valueOrRewrite)\n    } else {\n      header != null && setHeader(valueOrRewrite, header, rewrite);\n    }\n\n    return this;\n  }\n\n  get(header, parser) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils.findKey(this, header);\n\n      if (key) {\n        const value = this[key];\n\n        if (!parser) {\n          return value;\n        }\n\n        if (parser === true) {\n          return parseTokens(value);\n        }\n\n        if (utils.isFunction(parser)) {\n          return parser.call(this, value, key);\n        }\n\n        if (utils.isRegExp(parser)) {\n          return parser.exec(value);\n        }\n\n        throw new TypeError('parser must be boolean|regexp|function');\n      }\n    }\n  }\n\n  has(header, matcher) {\n    header = normalizeHeader(header);\n\n    if (header) {\n      const key = utils.findKey(this, header);\n\n      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n    }\n\n    return false;\n  }\n\n  delete(header, matcher) {\n    const self = this;\n    let deleted = false;\n\n    function deleteHeader(_header) {\n      _header = normalizeHeader(_header);\n\n      if (_header) {\n        const key = utils.findKey(self, _header);\n\n        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n          delete self[key];\n\n          deleted = true;\n        }\n      }\n    }\n\n    if (utils.isArray(header)) {\n      header.forEach(deleteHeader);\n    } else {\n      deleteHeader(header);\n    }\n\n    return deleted;\n  }\n\n  clear(matcher) {\n    const keys = Object.keys(this);\n    let i = keys.length;\n    let deleted = false;\n\n    while (i--) {\n      const key = keys[i];\n      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n        delete this[key];\n        deleted = true;\n      }\n    }\n\n    return deleted;\n  }\n\n  normalize(format) {\n    const self = this;\n    const headers = {};\n\n    utils.forEach(this, (value, header) => {\n      const key = utils.findKey(headers, header);\n\n      if (key) {\n        self[key] = normalizeValue(value);\n        delete self[header];\n        return;\n      }\n\n      const normalized = format ? formatHeader(header) : String(header).trim();\n\n      if (normalized !== header) {\n        delete self[header];\n      }\n\n      self[normalized] = normalizeValue(value);\n\n      headers[normalized] = true;\n    });\n\n    return this;\n  }\n\n  concat(...targets) {\n    return this.constructor.concat(this, ...targets);\n  }\n\n  toJSON(asStrings) {\n    const obj = Object.create(null);\n\n    utils.forEach(this, (value, header) => {\n      value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n    });\n\n    return obj;\n  }\n\n  [Symbol.iterator]() {\n    return Object.entries(this.toJSON())[Symbol.iterator]();\n  }\n\n  toString() {\n    return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n  }\n\n  getSetCookie() {\n    return this.get(\"set-cookie\") || [];\n  }\n\n  get [Symbol.toStringTag]() {\n    return 'AxiosHeaders';\n  }\n\n  static from(thing) {\n    return thing instanceof this ? thing : new this(thing);\n  }\n\n  static concat(first, ...targets) {\n    const computed = new this(first);\n\n    targets.forEach((target) => computed.set(target));\n\n    return computed;\n  }\n\n  static accessor(header) {\n    const internals = this[$internals] = (this[$internals] = {\n      accessors: {}\n    });\n\n    const accessors = internals.accessors;\n    const prototype = this.prototype;\n\n    function defineAccessor(_header) {\n      const lHeader = normalizeHeader(_header);\n\n      if (!accessors[lHeader]) {\n        buildAccessors(prototype, _header);\n        accessors[lHeader] = true;\n      }\n    }\n\n    utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n    return this;\n  }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n  return {\n    get: () => value,\n    set(headerValue) {\n      this[mapped] = headerValue;\n    }\n  }\n});\n\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n  const config = this || defaults;\n  const context = response || config;\n  const headers = AxiosHeaders.from(context.headers);\n  let data = context.data;\n\n  utils.forEach(fns, function transform(fn) {\n    data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n  });\n\n  headers.normalize();\n\n  return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n  return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n  // eslint-disable-next-line no-eq-null,eqeqeq\n  AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n  this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n  __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n  const validateStatus = response.config.validateStatus;\n  if (!response.status || !validateStatus || validateStatus(response.status)) {\n    resolve(response);\n  } else {\n    reject(new AxiosError(\n      'Request failed with status code ' + response.status,\n      [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n      response.config,\n      response.request,\n      response\n    ));\n  }\n}\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n  samplesCount = samplesCount || 10;\n  const bytes = new Array(samplesCount);\n  const timestamps = new Array(samplesCount);\n  let head = 0;\n  let tail = 0;\n  let firstSampleTS;\n\n  min = min !== undefined ? min : 1000;\n\n  return function push(chunkLength) {\n    const now = Date.now();\n\n    const startedAt = timestamps[tail];\n\n    if (!firstSampleTS) {\n      firstSampleTS = now;\n    }\n\n    bytes[head] = chunkLength;\n    timestamps[head] = now;\n\n    let i = tail;\n    let bytesCount = 0;\n\n    while (i !== head) {\n      bytesCount += bytes[i++];\n      i = i % samplesCount;\n    }\n\n    head = (head + 1) % samplesCount;\n\n    if (head === tail) {\n      tail = (tail + 1) % samplesCount;\n    }\n\n    if (now - firstSampleTS < min) {\n      return;\n    }\n\n    const passed = startedAt && now - startedAt;\n\n    return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n  };\n}\n\nexport default speedometer;\n","/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n  let timestamp = 0;\n  let threshold = 1000 / freq;\n  let lastArgs;\n  let timer;\n\n  const invoke = (args, now = Date.now()) => {\n    timestamp = now;\n    lastArgs = null;\n    if (timer) {\n      clearTimeout(timer);\n      timer = null;\n    }\n    fn.apply(null, args);\n  }\n\n  const throttled = (...args) => {\n    const now = Date.now();\n    const passed = now - timestamp;\n    if ( passed >= threshold) {\n      invoke(args, now);\n    } else {\n      lastArgs = args;\n      if (!timer) {\n        timer = setTimeout(() => {\n          timer = null;\n          invoke(lastArgs)\n        }, threshold - passed);\n      }\n    }\n  }\n\n  const flush = () => lastArgs && invoke(lastArgs);\n\n  return [throttled, flush];\n}\n\nexport default throttle;\n","import speedometer from \"./speedometer.js\";\nimport throttle from \"./throttle.js\";\nimport utils from \"../utils.js\";\n\nexport const progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n  let bytesNotified = 0;\n  const _speedometer = speedometer(50, 250);\n\n  return throttle(e => {\n    const loaded = e.loaded;\n    const total = e.lengthComputable ? e.total : undefined;\n    const progressBytes = loaded - bytesNotified;\n    const rate = _speedometer(progressBytes);\n    const inRange = loaded <= total;\n\n    bytesNotified = loaded;\n\n    const data = {\n      loaded,\n      total,\n      progress: total ? (loaded / total) : undefined,\n      bytes: progressBytes,\n      rate: rate ? rate : undefined,\n      estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n      event: e,\n      lengthComputable: total != null,\n      [isDownloadStream ? 'download' : 'upload']: true\n    };\n\n    listener(data);\n  }, freq);\n}\n\nexport const progressEventDecorator = (total, throttled) => {\n  const lengthComputable = total != null;\n\n  return [(loaded) => throttled[0]({\n    lengthComputable,\n    total,\n    loaded\n  }), throttled[1]];\n}\n\nexport const asyncDecorator = (fn) => (...args) => utils.asap(() => fn(...args));\n","import platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {\n  url = new URL(url, platform.origin);\n\n  return (\n    origin.protocol === url.protocol &&\n    origin.host === url.host &&\n    (isMSIE || origin.port === url.port)\n  );\n})(\n  new URL(platform.origin),\n  platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)\n) : () => true;\n","import utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.hasStandardBrowserEnv ?\n\n  // Standard browser envs support document.cookie\n  {\n    write(name, value, expires, path, domain, secure) {\n      const cookie = [name + '=' + encodeURIComponent(value)];\n\n      utils.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n      utils.isString(path) && cookie.push('path=' + path);\n\n      utils.isString(domain) && cookie.push('domain=' + domain);\n\n      secure === true && cookie.push('secure');\n\n      document.cookie = cookie.join('; ');\n    },\n\n    read(name) {\n      const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n      return (match ? decodeURIComponent(match[3]) : null);\n    },\n\n    remove(name) {\n      this.write(name, '', Date.now() - 86400000);\n    }\n  }\n\n  :\n\n  // Non-standard browser env (web workers, react-native) lack needed support.\n  {\n    write() {},\n    read() {\n      return null;\n    },\n    remove() {}\n  };\n\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {\n  let isRelativeUrl = !isAbsoluteURL(requestedURL);\n  if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {\n    return combineURLs(baseURL, requestedURL);\n  }\n  return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n  // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n  // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n  // by any combination of letters, digits, plus, period, or hyphen.\n  return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n  return relativeURL\n    ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n    : baseURL;\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n  // eslint-disable-next-line no-param-reassign\n  config2 = config2 || {};\n  const config = {};\n\n  function getMergedValue(target, source, prop, caseless) {\n    if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n      return utils.merge.call({caseless}, target, source);\n    } else if (utils.isPlainObject(source)) {\n      return utils.merge({}, source);\n    } else if (utils.isArray(source)) {\n      return source.slice();\n    }\n    return source;\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDeepProperties(a, b, prop , caseless) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(a, b, prop , caseless);\n    } else if (!utils.isUndefined(a)) {\n      return getMergedValue(undefined, a, prop , caseless);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function valueFromConfig2(a, b) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function defaultToConfig2(a, b) {\n    if (!utils.isUndefined(b)) {\n      return getMergedValue(undefined, b);\n    } else if (!utils.isUndefined(a)) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  // eslint-disable-next-line consistent-return\n  function mergeDirectKeys(a, b, prop) {\n    if (prop in config2) {\n      return getMergedValue(a, b);\n    } else if (prop in config1) {\n      return getMergedValue(undefined, a);\n    }\n  }\n\n  const mergeMap = {\n    url: valueFromConfig2,\n    method: valueFromConfig2,\n    data: valueFromConfig2,\n    baseURL: defaultToConfig2,\n    transformRequest: defaultToConfig2,\n    transformResponse: defaultToConfig2,\n    paramsSerializer: defaultToConfig2,\n    timeout: defaultToConfig2,\n    timeoutMessage: defaultToConfig2,\n    withCredentials: defaultToConfig2,\n    withXSRFToken: defaultToConfig2,\n    adapter: defaultToConfig2,\n    responseType: defaultToConfig2,\n    xsrfCookieName: defaultToConfig2,\n    xsrfHeaderName: defaultToConfig2,\n    onUploadProgress: defaultToConfig2,\n    onDownloadProgress: defaultToConfig2,\n    decompress: defaultToConfig2,\n    maxContentLength: defaultToConfig2,\n    maxBodyLength: defaultToConfig2,\n    beforeRedirect: defaultToConfig2,\n    transport: defaultToConfig2,\n    httpAgent: defaultToConfig2,\n    httpsAgent: defaultToConfig2,\n    cancelToken: defaultToConfig2,\n    socketPath: defaultToConfig2,\n    responseEncoding: defaultToConfig2,\n    validateStatus: mergeDirectKeys,\n    headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)\n  };\n\n  utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n    const merge = mergeMap[prop] || mergeDeepProperties;\n    const configValue = merge(config1[prop], config2[prop], prop);\n    (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n  });\n\n  return config;\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport isURLSameOrigin from \"./isURLSameOrigin.js\";\nimport cookies from \"./cookies.js\";\nimport buildFullPath from \"../core/buildFullPath.js\";\nimport mergeConfig from \"../core/mergeConfig.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport buildURL from \"./buildURL.js\";\n\nexport default (config) => {\n  const newConfig = mergeConfig({}, config);\n\n  let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n  newConfig.headers = headers = AxiosHeaders.from(headers);\n\n  newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);\n\n  // HTTP basic authentication\n  if (auth) {\n    headers.set('Authorization', 'Basic ' +\n      btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n    );\n  }\n\n  let contentType;\n\n  if (utils.isFormData(data)) {\n    if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n      headers.setContentType(undefined); // Let the browser set it\n    } else if ((contentType = headers.getContentType()) !== false) {\n      // fix semicolon duplication issue for ReactNative FormData implementation\n      const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n      headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n    }\n  }\n\n  // Add xsrf header\n  // This is only done if running in a standard browser environment.\n  // Specifically not if we're in a web worker, or react-native.\n\n  if (platform.hasStandardBrowserEnv) {\n    withXSRFToken && utils.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n    if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n      // Add xsrf header\n      const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n      if (xsrfValue) {\n        headers.set(xsrfHeaderName, xsrfValue);\n      }\n    }\n  }\n\n  return newConfig;\n}\n\n","import utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport {progressEventReducer} from '../helpers/progressEventReducer.js';\nimport resolveConfig from \"../helpers/resolveConfig.js\";\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n  return new Promise(function dispatchXhrRequest(resolve, reject) {\n    const _config = resolveConfig(config);\n    let requestData = _config.data;\n    const requestHeaders = AxiosHeaders.from(_config.headers).normalize();\n    let {responseType, onUploadProgress, onDownloadProgress} = _config;\n    let onCanceled;\n    let uploadThrottled, downloadThrottled;\n    let flushUpload, flushDownload;\n\n    function done() {\n      flushUpload && flushUpload(); // flush events\n      flushDownload && flushDownload(); // flush events\n\n      _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n      _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n    }\n\n    let request = new XMLHttpRequest();\n\n    request.open(_config.method.toUpperCase(), _config.url, true);\n\n    // Set the request timeout in MS\n    request.timeout = _config.timeout;\n\n    function onloadend() {\n      if (!request) {\n        return;\n      }\n      // Prepare the response\n      const responseHeaders = AxiosHeaders.from(\n        'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n      );\n      const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n        request.responseText : request.response;\n      const response = {\n        data: responseData,\n        status: request.status,\n        statusText: request.statusText,\n        headers: responseHeaders,\n        config,\n        request\n      };\n\n      settle(function _resolve(value) {\n        resolve(value);\n        done();\n      }, function _reject(err) {\n        reject(err);\n        done();\n      }, response);\n\n      // Clean up request\n      request = null;\n    }\n\n    if ('onloadend' in request) {\n      // Use onloadend if available\n      request.onloadend = onloadend;\n    } else {\n      // Listen for ready state to emulate onloadend\n      request.onreadystatechange = function handleLoad() {\n        if (!request || request.readyState !== 4) {\n          return;\n        }\n\n        // The request errored out and we didn't get a response, this will be\n        // handled by onerror instead\n        // With one exception: request that using file: protocol, most browsers\n        // will return status as 0 even though it's a successful request\n        if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n          return;\n        }\n        // readystate handler is calling before onerror or ontimeout handlers,\n        // so we should call onloadend on the next 'tick'\n        setTimeout(onloadend);\n      };\n    }\n\n    // Handle browser request cancellation (as opposed to a manual cancellation)\n    request.onabort = function handleAbort() {\n      if (!request) {\n        return;\n      }\n\n      reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle low level network errors\n    request.onerror = function handleError() {\n      // Real errors are hidden from us by the browser\n      // onerror should only fire if it's a network error\n      reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Handle timeout\n    request.ontimeout = function handleTimeout() {\n      let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n      const transitional = _config.transitional || transitionalDefaults;\n      if (_config.timeoutErrorMessage) {\n        timeoutErrorMessage = _config.timeoutErrorMessage;\n      }\n      reject(new AxiosError(\n        timeoutErrorMessage,\n        transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n        config,\n        request));\n\n      // Clean up request\n      request = null;\n    };\n\n    // Remove Content-Type if data is undefined\n    requestData === undefined && requestHeaders.setContentType(null);\n\n    // Add headers to the request\n    if ('setRequestHeader' in request) {\n      utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n        request.setRequestHeader(key, val);\n      });\n    }\n\n    // Add withCredentials to request if needed\n    if (!utils.isUndefined(_config.withCredentials)) {\n      request.withCredentials = !!_config.withCredentials;\n    }\n\n    // Add responseType to request if needed\n    if (responseType && responseType !== 'json') {\n      request.responseType = _config.responseType;\n    }\n\n    // Handle progress if needed\n    if (onDownloadProgress) {\n      ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n      request.addEventListener('progress', downloadThrottled);\n    }\n\n    // Not all browsers support upload events\n    if (onUploadProgress && request.upload) {\n      ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n      request.upload.addEventListener('progress', uploadThrottled);\n\n      request.upload.addEventListener('loadend', flushUpload);\n    }\n\n    if (_config.cancelToken || _config.signal) {\n      // Handle cancellation\n      // eslint-disable-next-line func-names\n      onCanceled = cancel => {\n        if (!request) {\n          return;\n        }\n        reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n        request.abort();\n        request = null;\n      };\n\n      _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n      if (_config.signal) {\n        _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n      }\n    }\n\n    const protocol = parseProtocol(_config.url);\n\n    if (protocol && platform.protocols.indexOf(protocol) === -1) {\n      reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n      return;\n    }\n\n\n    // Send the request\n    request.send(requestData || null);\n  });\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n  const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n  return match && match[1] || '';\n}\n","import CanceledError from \"../cancel/CanceledError.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport utils from '../utils.js';\n\nconst composeSignals = (signals, timeout) => {\n  const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n  if (timeout || length) {\n    let controller = new AbortController();\n\n    let aborted;\n\n    const onabort = function (reason) {\n      if (!aborted) {\n        aborted = true;\n        unsubscribe();\n        const err = reason instanceof Error ? reason : this.reason;\n        controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n      }\n    }\n\n    let timer = timeout && setTimeout(() => {\n      timer = null;\n      onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT))\n    }, timeout)\n\n    const unsubscribe = () => {\n      if (signals) {\n        timer && clearTimeout(timer);\n        timer = null;\n        signals.forEach(signal => {\n          signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n        });\n        signals = null;\n      }\n    }\n\n    signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n    const {signal} = controller;\n\n    signal.unsubscribe = () => utils.asap(unsubscribe);\n\n    return signal;\n  }\n}\n\nexport default composeSignals;\n","function _OverloadYield(e, d) {\n  this.v = e, this.k = d;\n}\nexport { _OverloadYield as default };","import OverloadYield from \"./OverloadYield.js\";\nfunction _wrapAsyncGenerator(e) {\n  return function () {\n    return new AsyncGenerator(e.apply(this, arguments));\n  };\n}\nfunction AsyncGenerator(e) {\n  var r, t;\n  function resume(r, t) {\n    try {\n      var n = e[r](t),\n        o = n.value,\n        u = o instanceof OverloadYield;\n      Promise.resolve(u ? o.v : o).then(function (t) {\n        if (u) {\n          var i = \"return\" === r ? \"return\" : \"next\";\n          if (!o.k || t.done) return resume(i, t);\n          t = e[i](t).value;\n        }\n        settle(n.done ? \"return\" : \"normal\", t);\n      }, function (e) {\n        resume(\"throw\", e);\n      });\n    } catch (e) {\n      settle(\"throw\", e);\n    }\n  }\n  function settle(e, n) {\n    switch (e) {\n      case \"return\":\n        r.resolve({\n          value: n,\n          done: !0\n        });\n        break;\n      case \"throw\":\n        r.reject(n);\n        break;\n      default:\n        r.resolve({\n          value: n,\n          done: !1\n        });\n    }\n    (r = r.next) ? resume(r.key, r.arg) : t = null;\n  }\n  this._invoke = function (e, n) {\n    return new Promise(function (o, u) {\n      var i = {\n        key: e,\n        arg: n,\n        resolve: o,\n        reject: u,\n        next: null\n      };\n      t ? t = t.next = i : (r = t = i, resume(e, n));\n    });\n  }, \"function\" != typeof e[\"return\"] && (this[\"return\"] = void 0);\n}\nAsyncGenerator.prototype[\"function\" == typeof Symbol && Symbol.asyncIterator || \"@@asyncIterator\"] = function () {\n  return this;\n}, AsyncGenerator.prototype.next = function (e) {\n  return this._invoke(\"next\", e);\n}, AsyncGenerator.prototype[\"throw\"] = function (e) {\n  return this._invoke(\"throw\", e);\n}, AsyncGenerator.prototype[\"return\"] = function (e) {\n  return this._invoke(\"return\", e);\n};\nexport { _wrapAsyncGenerator as default };","import OverloadYield from \"./OverloadYield.js\";\nfunction _awaitAsyncGenerator(e) {\n  return new OverloadYield(e, 0);\n}\nexport { _awaitAsyncGenerator as default };","import OverloadYield from \"./OverloadYield.js\";\nfunction _asyncGeneratorDelegate(t) {\n  var e = {},\n    n = !1;\n  function pump(e, r) {\n    return n = !0, r = new Promise(function (n) {\n      n(t[e](r));\n    }), {\n      done: !1,\n      value: new OverloadYield(r, 1)\n    };\n  }\n  return e[\"undefined\" != typeof Symbol && Symbol.iterator || \"@@iterator\"] = function () {\n    return this;\n  }, e.next = function (t) {\n    return n ? (n = !1, t) : pump(\"next\", t);\n  }, \"function\" == typeof t[\"throw\"] && (e[\"throw\"] = function (t) {\n    if (n) throw n = !1, t;\n    return pump(\"throw\", t);\n  }), \"function\" == typeof t[\"return\"] && (e[\"return\"] = function (t) {\n    return n ? (n = !1, t) : pump(\"return\", t);\n  }), e;\n}\nexport { _asyncGeneratorDelegate as default };","function _asyncIterator(r) {\n  var n,\n    t,\n    o,\n    e = 2;\n  for (\"undefined\" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) {\n    if (t && null != (n = r[t])) return n.call(r);\n    if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r));\n    t = \"@@asyncIterator\", o = \"@@iterator\";\n  }\n  throw new TypeError(\"Object is not async iterable\");\n}\nfunction AsyncFromSyncIterator(r) {\n  function AsyncFromSyncIteratorContinuation(r) {\n    if (Object(r) !== r) return Promise.reject(new TypeError(r + \" is not an object.\"));\n    var n = r.done;\n    return Promise.resolve(r.value).then(function (r) {\n      return {\n        value: r,\n        done: n\n      };\n    });\n  }\n  return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) {\n    this.s = r, this.n = r.next;\n  }, AsyncFromSyncIterator.prototype = {\n    s: null,\n    n: null,\n    next: function next() {\n      return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments));\n    },\n    \"return\": function _return(r) {\n      var n = this.s[\"return\"];\n      return void 0 === n ? Promise.resolve({\n        value: r,\n        done: !0\n      }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));\n    },\n    \"throw\": function _throw(r) {\n      var n = this.s[\"return\"];\n      return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments));\n    }\n  }, new AsyncFromSyncIterator(r);\n}\nexport { _asyncIterator as default };","\nexport const streamChunk = function* (chunk, chunkSize) {\n  let len = chunk.byteLength;\n\n  if (!chunkSize || len < chunkSize) {\n    yield chunk;\n    return;\n  }\n\n  let pos = 0;\n  let end;\n\n  while (pos < len) {\n    end = pos + chunkSize;\n    yield chunk.slice(pos, end);\n    pos = end;\n  }\n}\n\nexport const readBytes = async function* (iterable, chunkSize) {\n  for await (const chunk of readStream(iterable)) {\n    yield* streamChunk(chunk, chunkSize);\n  }\n}\n\nconst readStream = async function* (stream) {\n  if (stream[Symbol.asyncIterator]) {\n    yield* stream;\n    return;\n  }\n\n  const reader = stream.getReader();\n  try {\n    for (;;) {\n      const {done, value} = await reader.read();\n      if (done) {\n        break;\n      }\n      yield value;\n    }\n  } finally {\n    await reader.cancel();\n  }\n}\n\nexport const trackStream = (stream, chunkSize, onProgress, onFinish) => {\n  const iterator = readBytes(stream, chunkSize);\n\n  let bytes = 0;\n  let done;\n  let _onFinish = (e) => {\n    if (!done) {\n      done = true;\n      onFinish && onFinish(e);\n    }\n  }\n\n  return new ReadableStream({\n    async pull(controller) {\n      try {\n        const {done, value} = await iterator.next();\n\n        if (done) {\n         _onFinish();\n          controller.close();\n          return;\n        }\n\n        let len = value.byteLength;\n        if (onProgress) {\n          let loadedBytes = bytes += len;\n          onProgress(loadedBytes);\n        }\n        controller.enqueue(new Uint8Array(value));\n      } catch (err) {\n        _onFinish(err);\n        throw err;\n      }\n    },\n    cancel(reason) {\n      _onFinish(reason);\n      return iterator.return();\n    }\n  }, {\n    highWaterMark: 2\n  })\n}\n","import platform from \"../platform/index.js\";\nimport utils from \"../utils.js\";\nimport AxiosError from \"../core/AxiosError.js\";\nimport composeSignals from \"../helpers/composeSignals.js\";\nimport {trackStream} from \"../helpers/trackStream.js\";\nimport AxiosHeaders from \"../core/AxiosHeaders.js\";\nimport {progressEventReducer, progressEventDecorator, asyncDecorator} from \"../helpers/progressEventReducer.js\";\nimport resolveConfig from \"../helpers/resolveConfig.js\";\nimport settle from \"../core/settle.js\";\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n    ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n    async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n  try {\n    return !!fn(...args);\n  } catch (e) {\n    return false\n  }\n}\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n  let duplexAccessed = false;\n\n  const hasContentType = new Request(platform.origin, {\n    body: new ReadableStream(),\n    method: 'POST',\n    get duplex() {\n      duplexAccessed = true;\n      return 'half';\n    },\n  }).headers.has('Content-Type');\n\n  return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n  test(() => utils.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n  stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n  ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n    !resolvers[type] && (resolvers[type] = utils.isFunction(res[type]) ? (res) => res[type]() :\n      (_, config) => {\n        throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n      })\n  });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n  if (body == null) {\n    return 0;\n  }\n\n  if(utils.isBlob(body)) {\n    return body.size;\n  }\n\n  if(utils.isSpecCompliantForm(body)) {\n    const _request = new Request(platform.origin, {\n      method: 'POST',\n      body,\n    });\n    return (await _request.arrayBuffer()).byteLength;\n  }\n\n  if(utils.isArrayBufferView(body) || utils.isArrayBuffer(body)) {\n    return body.byteLength;\n  }\n\n  if(utils.isURLSearchParams(body)) {\n    body = body + '';\n  }\n\n  if(utils.isString(body)) {\n    return (await encodeText(body)).byteLength;\n  }\n}\n\nconst resolveBodyLength = async (headers, body) => {\n  const length = utils.toFiniteNumber(headers.getContentLength());\n\n  return length == null ? getBodyLength(body) : length;\n}\n\nexport default isFetchSupported && (async (config) => {\n  let {\n    url,\n    method,\n    data,\n    signal,\n    cancelToken,\n    timeout,\n    onDownloadProgress,\n    onUploadProgress,\n    responseType,\n    headers,\n    withCredentials = 'same-origin',\n    fetchOptions\n  } = resolveConfig(config);\n\n  responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n  let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n  let request;\n\n  const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n      composedSignal.unsubscribe();\n  });\n\n  let requestContentLength;\n\n  try {\n    if (\n      onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n      (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n    ) {\n      let _request = new Request(url, {\n        method: 'POST',\n        body: data,\n        duplex: \"half\"\n      });\n\n      let contentTypeHeader;\n\n      if (utils.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n        headers.setContentType(contentTypeHeader)\n      }\n\n      if (_request.body) {\n        const [onProgress, flush] = progressEventDecorator(\n          requestContentLength,\n          progressEventReducer(asyncDecorator(onUploadProgress))\n        );\n\n        data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n      }\n    }\n\n    if (!utils.isString(withCredentials)) {\n      withCredentials = withCredentials ? 'include' : 'omit';\n    }\n\n    // Cloudflare Workers throws when credentials are defined\n    // see https://github.com/cloudflare/workerd/issues/902\n    const isCredentialsSupported = \"credentials\" in Request.prototype;\n    request = new Request(url, {\n      ...fetchOptions,\n      signal: composedSignal,\n      method: method.toUpperCase(),\n      headers: headers.normalize().toJSON(),\n      body: data,\n      duplex: \"half\",\n      credentials: isCredentialsSupported ? withCredentials : undefined\n    });\n\n    let response = await fetch(request);\n\n    const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n    if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n      const options = {};\n\n      ['status', 'statusText', 'headers'].forEach(prop => {\n        options[prop] = response[prop];\n      });\n\n      const responseContentLength = utils.toFiniteNumber(response.headers.get('content-length'));\n\n      const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n        responseContentLength,\n        progressEventReducer(asyncDecorator(onDownloadProgress), true)\n      ) || [];\n\n      response = new Response(\n        trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n          flush && flush();\n          unsubscribe && unsubscribe();\n        }),\n        options\n      );\n    }\n\n    responseType = responseType || 'text';\n\n    let responseData = await resolvers[utils.findKey(resolvers, responseType) || 'text'](response, config);\n\n    !isStreamResponse && unsubscribe && unsubscribe();\n\n    return await new Promise((resolve, reject) => {\n      settle(resolve, reject, {\n        data: responseData,\n        headers: AxiosHeaders.from(response.headers),\n        status: response.status,\n        statusText: response.statusText,\n        config,\n        request\n      })\n    })\n  } catch (err) {\n    unsubscribe && unsubscribe();\n\n    if (err && err.name === 'TypeError' && /Load failed|fetch/i.test(err.message)) {\n      throw Object.assign(\n        new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n        {\n          cause: err.cause || err\n        }\n      )\n    }\n\n    throw AxiosError.from(err, err && err.code, config, request);\n  }\n});\n\n\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport fetchAdapter from './fetch.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n  http: httpAdapter,\n  xhr: xhrAdapter,\n  fetch: fetchAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n  if (fn) {\n    try {\n      Object.defineProperty(fn, 'name', {value});\n    } catch (e) {\n      // eslint-disable-next-line no-empty\n    }\n    Object.defineProperty(fn, 'adapterName', {value});\n  }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils.isFunction(adapter) || adapter === null || adapter === false;\n\nexport default {\n  getAdapter: (adapters) => {\n    adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n    const {length} = adapters;\n    let nameOrAdapter;\n    let adapter;\n\n    const rejectedReasons = {};\n\n    for (let i = 0; i < length; i++) {\n      nameOrAdapter = adapters[i];\n      let id;\n\n      adapter = nameOrAdapter;\n\n      if (!isResolvedHandle(nameOrAdapter)) {\n        adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n        if (adapter === undefined) {\n          throw new AxiosError(`Unknown adapter '${id}'`);\n        }\n      }\n\n      if (adapter) {\n        break;\n      }\n\n      rejectedReasons[id || '#' + i] = adapter;\n    }\n\n    if (!adapter) {\n\n      const reasons = Object.entries(rejectedReasons)\n        .map(([id, state]) => `adapter ${id} ` +\n          (state === false ? 'is not supported by the environment' : 'is not available in the build')\n        );\n\n      let s = length ?\n        (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n        'as no adapter specified';\n\n      throw new AxiosError(\n        `There is no suitable adapter to dispatch the request ` + s,\n        'ERR_NOT_SUPPORT'\n      );\n    }\n\n    return adapter;\n  },\n  adapters: knownAdapters\n}\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n  if (config.cancelToken) {\n    config.cancelToken.throwIfRequested();\n  }\n\n  if (config.signal && config.signal.aborted) {\n    throw new CanceledError(null, config);\n  }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n  throwIfCancellationRequested(config);\n\n  config.headers = AxiosHeaders.from(config.headers);\n\n  // Transform request data\n  config.data = transformData.call(\n    config,\n    config.transformRequest\n  );\n\n  if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n    config.headers.setContentType('application/x-www-form-urlencoded', false);\n  }\n\n  const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n  return adapter(config).then(function onAdapterResolution(response) {\n    throwIfCancellationRequested(config);\n\n    // Transform response data\n    response.data = transformData.call(\n      config,\n      config.transformResponse,\n      response\n    );\n\n    response.headers = AxiosHeaders.from(response.headers);\n\n    return response;\n  }, function onAdapterRejection(reason) {\n    if (!isCancel(reason)) {\n      throwIfCancellationRequested(config);\n\n      // Transform response data\n      if (reason && reason.response) {\n        reason.response.data = transformData.call(\n          config,\n          config.transformResponse,\n          reason.response\n        );\n        reason.response.headers = AxiosHeaders.from(reason.response.headers);\n      }\n    }\n\n    return Promise.reject(reason);\n  });\n}\n","export const VERSION = \"1.9.0\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n  validators[type] = function validator(thing) {\n    return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n  };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n  function formatMessage(opt, desc) {\n    return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n  }\n\n  // eslint-disable-next-line func-names\n  return (value, opt, opts) => {\n    if (validator === false) {\n      throw new AxiosError(\n        formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n        AxiosError.ERR_DEPRECATED\n      );\n    }\n\n    if (version && !deprecatedWarnings[opt]) {\n      deprecatedWarnings[opt] = true;\n      // eslint-disable-next-line no-console\n      console.warn(\n        formatMessage(\n          opt,\n          ' has been deprecated since v' + version + ' and will be removed in the near future'\n        )\n      );\n    }\n\n    return validator ? validator(value, opt, opts) : true;\n  };\n};\n\nvalidators.spelling = function spelling(correctSpelling) {\n  return (value, opt) => {\n    // eslint-disable-next-line no-console\n    console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);\n    return true;\n  }\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n  if (typeof options !== 'object') {\n    throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n  }\n  const keys = Object.keys(options);\n  let i = keys.length;\n  while (i-- > 0) {\n    const opt = keys[i];\n    const validator = schema[opt];\n    if (validator) {\n      const value = options[opt];\n      const result = value === undefined || validator(value, opt, options);\n      if (result !== true) {\n        throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n      }\n      continue;\n    }\n    if (allowUnknown !== true) {\n      throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n    }\n  }\n}\n\nexport default {\n  assertOptions,\n  validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n  constructor(instanceConfig) {\n    this.defaults = instanceConfig || {};\n    this.interceptors = {\n      request: new InterceptorManager(),\n      response: new InterceptorManager()\n    };\n  }\n\n  /**\n   * Dispatch a request\n   *\n   * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n   * @param {?Object} config\n   *\n   * @returns {Promise} The Promise to be fulfilled\n   */\n  async request(configOrUrl, config) {\n    try {\n      return await this._request(configOrUrl, config);\n    } catch (err) {\n      if (err instanceof Error) {\n        let dummy = {};\n\n        Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());\n\n        // slice off the Error: ... line\n        const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n        try {\n          if (!err.stack) {\n            err.stack = stack;\n            // match without the 2 top stack lines\n          } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n            err.stack += '\\n' + stack\n          }\n        } catch (e) {\n          // ignore the case where \"stack\" is an un-writable property\n        }\n      }\n\n      throw err;\n    }\n  }\n\n  _request(configOrUrl, config) {\n    /*eslint no-param-reassign:0*/\n    // Allow for axios('example/url'[, config]) a la fetch API\n    if (typeof configOrUrl === 'string') {\n      config = config || {};\n      config.url = configOrUrl;\n    } else {\n      config = configOrUrl || {};\n    }\n\n    config = mergeConfig(this.defaults, config);\n\n    const {transitional, paramsSerializer, headers} = config;\n\n    if (transitional !== undefined) {\n      validator.assertOptions(transitional, {\n        silentJSONParsing: validators.transitional(validators.boolean),\n        forcedJSONParsing: validators.transitional(validators.boolean),\n        clarifyTimeoutError: validators.transitional(validators.boolean)\n      }, false);\n    }\n\n    if (paramsSerializer != null) {\n      if (utils.isFunction(paramsSerializer)) {\n        config.paramsSerializer = {\n          serialize: paramsSerializer\n        }\n      } else {\n        validator.assertOptions(paramsSerializer, {\n          encode: validators.function,\n          serialize: validators.function\n        }, true);\n      }\n    }\n\n    // Set config.allowAbsoluteUrls\n    if (config.allowAbsoluteUrls !== undefined) {\n      // do nothing\n    } else if (this.defaults.allowAbsoluteUrls !== undefined) {\n      config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;\n    } else {\n      config.allowAbsoluteUrls = true;\n    }\n\n    validator.assertOptions(config, {\n      baseUrl: validators.spelling('baseURL'),\n      withXsrfToken: validators.spelling('withXSRFToken')\n    }, true);\n\n    // Set config.method\n    config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n    // Flatten headers\n    let contextHeaders = headers && utils.merge(\n      headers.common,\n      headers[config.method]\n    );\n\n    headers && utils.forEach(\n      ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n      (method) => {\n        delete headers[method];\n      }\n    );\n\n    config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n    // filter out skipped interceptors\n    const requestInterceptorChain = [];\n    let synchronousRequestInterceptors = true;\n    this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n      if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n        return;\n      }\n\n      synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n      requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    const responseInterceptorChain = [];\n    this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n      responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n    });\n\n    let promise;\n    let i = 0;\n    let len;\n\n    if (!synchronousRequestInterceptors) {\n      const chain = [dispatchRequest.bind(this), undefined];\n      chain.unshift.apply(chain, requestInterceptorChain);\n      chain.push.apply(chain, responseInterceptorChain);\n      len = chain.length;\n\n      promise = Promise.resolve(config);\n\n      while (i < len) {\n        promise = promise.then(chain[i++], chain[i++]);\n      }\n\n      return promise;\n    }\n\n    len = requestInterceptorChain.length;\n\n    let newConfig = config;\n\n    i = 0;\n\n    while (i < len) {\n      const onFulfilled = requestInterceptorChain[i++];\n      const onRejected = requestInterceptorChain[i++];\n      try {\n        newConfig = onFulfilled(newConfig);\n      } catch (error) {\n        onRejected.call(this, error);\n        break;\n      }\n    }\n\n    try {\n      promise = dispatchRequest.call(this, newConfig);\n    } catch (error) {\n      return Promise.reject(error);\n    }\n\n    i = 0;\n    len = responseInterceptorChain.length;\n\n    while (i < len) {\n      promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n    }\n\n    return promise;\n  }\n\n  getUri(config) {\n    config = mergeConfig(this.defaults, config);\n    const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);\n    return buildURL(fullPath, config.params, config.paramsSerializer);\n  }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n  /*eslint func-names:0*/\n  Axios.prototype[method] = function(url, config) {\n    return this.request(mergeConfig(config || {}, {\n      method,\n      url,\n      data: (config || {}).data\n    }));\n  };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n  /*eslint func-names:0*/\n\n  function generateHTTPMethod(isForm) {\n    return function httpMethod(url, data, config) {\n      return this.request(mergeConfig(config || {}, {\n        method,\n        headers: isForm ? {\n          'Content-Type': 'multipart/form-data'\n        } : {},\n        url,\n        data\n      }));\n    };\n  }\n\n  Axios.prototype[method] = generateHTTPMethod();\n\n  Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n  constructor(executor) {\n    if (typeof executor !== 'function') {\n      throw new TypeError('executor must be a function.');\n    }\n\n    let resolvePromise;\n\n    this.promise = new Promise(function promiseExecutor(resolve) {\n      resolvePromise = resolve;\n    });\n\n    const token = this;\n\n    // eslint-disable-next-line func-names\n    this.promise.then(cancel => {\n      if (!token._listeners) return;\n\n      let i = token._listeners.length;\n\n      while (i-- > 0) {\n        token._listeners[i](cancel);\n      }\n      token._listeners = null;\n    });\n\n    // eslint-disable-next-line func-names\n    this.promise.then = onfulfilled => {\n      let _resolve;\n      // eslint-disable-next-line func-names\n      const promise = new Promise(resolve => {\n        token.subscribe(resolve);\n        _resolve = resolve;\n      }).then(onfulfilled);\n\n      promise.cancel = function reject() {\n        token.unsubscribe(_resolve);\n      };\n\n      return promise;\n    };\n\n    executor(function cancel(message, config, request) {\n      if (token.reason) {\n        // Cancellation has already been requested\n        return;\n      }\n\n      token.reason = new CanceledError(message, config, request);\n      resolvePromise(token.reason);\n    });\n  }\n\n  /**\n   * Throws a `CanceledError` if cancellation has been requested.\n   */\n  throwIfRequested() {\n    if (this.reason) {\n      throw this.reason;\n    }\n  }\n\n  /**\n   * Subscribe to the cancel signal\n   */\n\n  subscribe(listener) {\n    if (this.reason) {\n      listener(this.reason);\n      return;\n    }\n\n    if (this._listeners) {\n      this._listeners.push(listener);\n    } else {\n      this._listeners = [listener];\n    }\n  }\n\n  /**\n   * Unsubscribe from the cancel signal\n   */\n\n  unsubscribe(listener) {\n    if (!this._listeners) {\n      return;\n    }\n    const index = this._listeners.indexOf(listener);\n    if (index !== -1) {\n      this._listeners.splice(index, 1);\n    }\n  }\n\n  toAbortSignal() {\n    const controller = new AbortController();\n\n    const abort = (err) => {\n      controller.abort(err);\n    };\n\n    this.subscribe(abort);\n\n    controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n    return controller.signal;\n  }\n\n  /**\n   * Returns an object that contains a new `CancelToken` and a function that, when called,\n   * cancels the `CancelToken`.\n   */\n  static source() {\n    let cancel;\n    const token = new CancelToken(function executor(c) {\n      cancel = c;\n    });\n    return {\n      token,\n      cancel\n    };\n  }\n}\n\nexport default CancelToken;\n","const HttpStatusCode = {\n  Continue: 100,\n  SwitchingProtocols: 101,\n  Processing: 102,\n  EarlyHints: 103,\n  Ok: 200,\n  Created: 201,\n  Accepted: 202,\n  NonAuthoritativeInformation: 203,\n  NoContent: 204,\n  ResetContent: 205,\n  PartialContent: 206,\n  MultiStatus: 207,\n  AlreadyReported: 208,\n  ImUsed: 226,\n  MultipleChoices: 300,\n  MovedPermanently: 301,\n  Found: 302,\n  SeeOther: 303,\n  NotModified: 304,\n  UseProxy: 305,\n  Unused: 306,\n  TemporaryRedirect: 307,\n  PermanentRedirect: 308,\n  BadRequest: 400,\n  Unauthorized: 401,\n  PaymentRequired: 402,\n  Forbidden: 403,\n  NotFound: 404,\n  MethodNotAllowed: 405,\n  NotAcceptable: 406,\n  ProxyAuthenticationRequired: 407,\n  RequestTimeout: 408,\n  Conflict: 409,\n  Gone: 410,\n  LengthRequired: 411,\n  PreconditionFailed: 412,\n  PayloadTooLarge: 413,\n  UriTooLong: 414,\n  UnsupportedMediaType: 415,\n  RangeNotSatisfiable: 416,\n  ExpectationFailed: 417,\n  ImATeapot: 418,\n  MisdirectedRequest: 421,\n  UnprocessableEntity: 422,\n  Locked: 423,\n  FailedDependency: 424,\n  TooEarly: 425,\n  UpgradeRequired: 426,\n  PreconditionRequired: 428,\n  TooManyRequests: 429,\n  RequestHeaderFieldsTooLarge: 431,\n  UnavailableForLegalReasons: 451,\n  InternalServerError: 500,\n  NotImplemented: 501,\n  BadGateway: 502,\n  ServiceUnavailable: 503,\n  GatewayTimeout: 504,\n  HttpVersionNotSupported: 505,\n  VariantAlsoNegotiates: 506,\n  InsufficientStorage: 507,\n  LoopDetected: 508,\n  NotExtended: 510,\n  NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n  HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport adapters from './adapters/adapters.js';\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n  const context = new Axios(defaultConfig);\n  const instance = bind(Axios.prototype.request, context);\n\n  // Copy axios.prototype to instance\n  utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n  // Copy context to instance\n  utils.extend(instance, context, null, {allOwnKeys: true});\n\n  // Factory for creating new instances\n  instance.create = function create(instanceConfig) {\n    return createInstance(mergeConfig(defaultConfig, instanceConfig));\n  };\n\n  return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n  return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n *  ```js\n *  function f(x, y, z) {}\n *  var args = [1, 2, 3];\n *  f.apply(null, args);\n *  ```\n *\n * With `spread` this example can be re-written.\n *\n *  ```js\n *  spread(function(x, y, z) {})([1, 2, 3]);\n *  ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n  return function wrap(arr) {\n    return callback.apply(null, arr);\n  };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n  return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","// src/api/auth.js\r\nimport axios from 'axios';\r\n\r\n// 创建并导出 axios 实例\r\nexport const api = axios.create({\r\n  baseURL: 'http://localhost:8088',\r\n  timeout: 5000,\r\n});\r\n\r\n// 请求拦截器\r\napi.interceptors.request.use(config => {\r\n  const token = localStorage.getItem('token');\r\n  if (token) {\r\n    config.headers.Authorization = `Bearer ${token}`;\r\n  }\r\n  return config;\r\n});\r\n\r\nexport const login = async (username, password) => {\r\n  const response = await api.post('/user/login', null, {\r\n    params: { username, password }\r\n  });\r\n  if (response.data.code === 200 && response.data.data.token) {\r\n    localStorage.setItem('token', response.data.data.token);\r\n  }\r\n  return response;\r\n};\r\n\r\nexport const register = (username, password, code) => {\r\n  return api.post('/user/regist', null, {\r\n    params: { username, password, code }\r\n  });\r\n};\r\n\r\nexport const getUserInfo = async () => {\r\n  try {\r\n    const response = await api.get('/user/userInfo');\r\n    if (response.data.code === 200) {\r\n      return response.data.data; \r\n    }\r\n    throw new Error(response.data.message || '获取用户信息失败');\r\n  } catch (error) {\r\n    console.error('获取用户信息失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const isAdmin = async () => {\r\n  try {\r\n    const userInfo = await getUserInfo();\r\n    return userInfo.authority === 'ADMIN';\r\n  } catch (error) {\r\n    console.error('检查管理员权限失败:', error);\r\n    return false;\r\n  }\r\n};\r\n","// src/api/torrent.js\r\nimport { api } from './auth'; // 复用已有的axios实例\r\n\r\n/**\r\n * 创建并上传一个种子\r\n * @param {File} file 种子文件 (.torrent)\r\n * @param {Object} bodyObj 包含种子信息的对象，格式如下：\r\n * {\r\n *   torrentName: \"测试下载\",\r\n *   description: \"A high-quality 1080p version of Example Movie.\",\r\n *   category: \"电影\",\r\n *   region: \"USA\",\r\n *   resolution: \"1080p\",\r\n *   subtitle: \"English\",\r\n *   filePath: \"D:/大学/大三_下/torrentFrom/[电影天堂www.dytt89.com]两杆大烟枪BD中英双字.mp4.torrent\"\r\n * }\r\n */\r\nexport async function createTorrent(file, bodyObj) {\r\n  const formData = new FormData();\r\n  formData.append('file', file);\r\n\r\n  // 关键修改：将JSON字符串转换为Blob对象，并设置正确的Content-Type\r\n  formData.append('body', new Blob([JSON.stringify(bodyObj)], {\r\n    type: 'application/json'\r\n  }));\r\n\r\n  try {\r\n    const response = await api.post('/torrent', formData, {\r\n      headers: {\r\n      }\r\n    });\r\n    return response.data;\r\n  } catch (error) {\r\n    console.error('上传种子失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n/**\r\n * 下载种子文件\r\n * @param {number} torrentId 种子ID\r\n * @param {string} downloadPath 下载路径\r\n */\r\nexport async function downloadTorrent(torrentId, downloadPath) {\r\n  try {\r\n    const response = await api.get(`/torrent/downloadTorrent`, {\r\n      params: {\r\n        id: torrentId,\r\n        downloadPath: downloadPath\r\n      }\r\n    });\r\n    return response.data;\r\n  } catch (error) {\r\n    console.error('下载种子失败:', error);\r\n    throw error;\r\n  }\r\n}\r\n\r\n/**\r\n * 获取下载进度\r\n */\r\nexport async function getDownloadProgress() {\r\n  try {\r\n    const response = await api.get('/torrent/getProgress');\r\n    return response.data;\r\n  } catch (error) {\r\n    console.error('获取下载进度失败:', error);\r\n    throw error;\r\n  }\r\n}\r\n\r\nexport const getTorrents = (page = 1, size = 5) => {\r\n  return api.get('/torrent', {\r\n    params: { page, size }\r\n  });\r\n};\r\n\r\nexport const getTorrentDetail = (torrentId) => {\r\n  return api.get(`/torrent/${torrentId}`).then(response => {\r\n    // 确保数据结构一致\r\n    if (response.data && response.data.data) {\r\n      return {\r\n        ...response,\r\n        data: {\r\n          ...response.data,\r\n          data: {\r\n            torrent: response.data.data.torrent, // 直接使用后端返回的格式化数据\r\n            comments: response.data.data.comments || []\r\n          }\r\n        }\r\n      };\r\n    }\r\n    return response;\r\n  });\r\n};\r\n\r\nexport const likeTorrent = (torrentId) => {\r\n  return api.post(`/torrent/${torrentId}/like`);\r\n};\r\n\r\nexport const addTorrentComment = (torrentId, commentData) => {\r\n  return api.post(`/torrent/${torrentId}/comments`, commentData);\r\n};\r\n\r\nexport const deleteTorrent = (torrentId) => {\r\n  return api.delete(`/torrent/deleteTorrent/${torrentId}`);\r\n};\r\n\r\n// // 上传种子接口\r\n// export const uploadTorrent = async (torrentFile, torrentData, onProgress) => {\r\n//   // 1. 基础验证\r\n//   if (!torrentFile || !torrentFile.name.endsWith('.torrent')) {\r\n//     throw new Error('请选择有效的.torrent文件');\r\n//   }\r\n\r\n//   // 2. 构建FormData\r\n//   const formData = new FormData();\r\n//   formData.append('file', torrentFile);\r\n  \r\n//   // 确保JSON内容使用正确的Content-Type\r\n//   const metadataBlob = new Blob(\r\n//     [JSON.stringify(torrentData)], \r\n//     { type: 'application/json' }\r\n//   );\r\n//   formData.append('body', metadataBlob);\r\n\r\n//   // 3. 获取认证token（根据你的实际存储方式调整）\r\n//   const token = localStorage.getItem('token') || '';\r\n\r\n//   try {\r\n//     const response = await api.post('/api/torrents', formData, {\r\n//       headers: {\r\n//         'Authorization': `Bearer ${token}`,\r\n//       },\r\n//       onUploadProgress: (progressEvent) => {\r\n//         if (onProgress && progressEvent.total) {\r\n//           const percent = Math.round((progressEvent.loaded * 100) / progressEvent.total);\r\n//           onProgress(percent);\r\n//         }\r\n//       }\r\n//     });\r\n\r\n//     return response.data;\r\n//   } catch (error) {\r\n//     console.error('上传失败:', error);\r\n    \r\n//     // 增强错误处理\r\n//     let errorMessage = '上传失败';\r\n//     if (error.response) {\r\n//       errorMessage = error.response.data?.message || \r\n//                      `服务器错误: ${error.response.status}`;\r\n//     } else if (error.request) {\r\n//       errorMessage = '网络错误，请检查连接';\r\n//     }\r\n\r\n//     throw new Error(errorMessage);\r\n//   }\r\n// };\r\n\r\nexport const searchTorrents = (keyword, page = 1, size = 5) => {\r\n  return api.get('/torrent/search', {\r\n    params: { keyword, page, size }\r\n  });\r\n};","// src/api/helpPost.js\r\nimport { api } from './auth'; // 复用已有的axios实例\r\n\r\nexport const createHelpPost = (title, content, authorId, selectedImage) => {\r\n  // 创建 FormData 对象\r\n  const formData = new FormData();\r\n  formData.append('title', title);\r\n  formData.append('content', content);\r\n  formData.append('authorId', authorId);\r\n  \r\n  // 如果有图片，添加到 FormData\r\n  if (selectedImage) {\r\n    formData.append('image', selectedImage);\r\n  }\r\n\r\n  return api.post('/help/posts', formData);\r\n};\r\n\r\nexport const getHelpPosts = (page = 1, size = 5) => {\r\n  return api.get('/help/posts', {\r\n    params: { page, size }\r\n  });\r\n};\r\n\r\nexport const getHelpPostDetail = (postId) => {\r\n  return api.get(`/help/posts/${postId}`);\r\n};\r\n\r\nexport const likeHelpPost = (postId, data) => {\r\n  return api.post(`/help/posts/${postId}/like`, null, {\r\n    params: data\r\n  });\r\n};\r\n\r\nexport const addHelpPostComment = (postId, commentData) => {\r\n  \r\n\r\n  return api.post(`/help/posts/${postId}/comments`, commentData);\r\n};\r\n\r\nexport const deleteHelpPost = (postId, authorId) => {\r\n  return api.delete(`/help/posts/${postId}`, {\r\n    params: { authorId }\r\n  });\r\n};\r\n\r\n\r\nexport const searchHelpPosts = (keyword, page = 1, size = 5) => {\r\n  return api.get('/help/posts/search', {\r\n    params: { keyword, page, size }\r\n  });\r\n};","// src/api/requestPost.js\r\nimport { api } from './auth'; // 复用已有的axios实例\r\n\r\nexport const createRequestPost = (title, content, authorId, selectedImage) => {\r\n  // 创建 FormData 对象\r\n  const formData = new FormData();\r\n  formData.append('title', title);\r\n  formData.append('content', content);\r\n  formData.append('authorId', authorId);\r\n  \r\n  // 如果有图片，添加到 FormData\r\n  if (selectedImage) {\r\n    formData.append('image', selectedImage);\r\n  }\r\n\r\n  return api.post('/request/posts', formData);\r\n};\r\n\r\nexport const getRequestPosts = (page = 1, size = 5) => {\r\n  return api.get('/request/posts', {\r\n    params: { page, size }\r\n  });\r\n};\r\n\r\nexport const getRequestPostDetail = (postId) => {\r\n  return api.get(`/request/posts/${postId}`);\r\n};\r\n\r\nexport const likeRequestPost = (postId, data) => {\r\n  return api.post(`/request/posts/${postId}/like`, null, {\r\n    params: data\r\n  });\r\n};\r\n\r\nexport const addRequestPostComment = (postId, commentData) => {\r\n  \r\n\r\n  return api.post(`/request/posts/${postId}/comments`, commentData);\r\n};\r\n\r\nexport const deleteRequestPost = (postId, authorId) => {\r\n  return api.delete(`/request/posts/${postId}`, {\r\n    params: { authorId }\r\n  });\r\n};\r\n\r\n\r\nexport const searchRequestPosts = (keyword, page = 1, size = 5) => {\r\n  return api.get('/request/posts/search', {\r\n    params: { keyword, page, size }\r\n  });\r\n};","function _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nexport { _arrayLikeToArray as default };","function _iterableToArray(r) {\n  if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n  }\n}\nexport { _unsupportedIterableToArray as default };","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nfunction _toConsumableArray(r) {\n  return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nexport { _toConsumableArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _arrayWithoutHoles(r) {\n  if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nexport { _arrayWithoutHoles as default };","function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableSpread as default };","import React from 'react';\nexport const AppConfigContext = /*#__PURE__*/React.createContext({});\nconst AppContext = /*#__PURE__*/React.createContext({\n  message: {},\n  notification: {},\n  modal: {}\n});\nexport default AppContext;","import * as React from 'react';\nexport const defaultPrefixCls = 'ant';\nexport const defaultIconPrefixCls = 'anticon';\nexport const Variants = ['outlined', 'borderless', 'filled', 'underlined'];\nconst defaultGetPrefixCls = (suffixCls, customizePrefixCls) => {\n  if (customizePrefixCls) {\n    return customizePrefixCls;\n  }\n  return suffixCls ? `${defaultPrefixCls}-${suffixCls}` : defaultPrefixCls;\n};\n// zombieJ: 🚨 Do not pass `defaultRenderEmpty` here since it will cause circular dependency.\nexport const ConfigContext = /*#__PURE__*/React.createContext({\n  // We provide a default function for Context without provider\n  getPrefixCls: defaultGetPrefixCls,\n  iconPrefixCls: defaultIconPrefixCls\n});\nexport const {\n  Consumer: ConfigConsumer\n} = ConfigContext;\nconst EMPTY_OBJECT = {};\n/**\n * Get ConfigProvider configured component props.\n * This help to reduce bundle size for saving `?.` operator.\n * Do not use as `useMemo` deps since we do not cache the object here.\n *\n * NOTE: not refactor this with `useMemo` since memo will cost another memory space,\n * which will waste both compare calculation & memory.\n */\nexport function useComponentConfig(propName) {\n  const context = React.useContext(ConfigContext);\n  const {\n    getPrefixCls,\n    direction,\n    getPopupContainer\n  } = context;\n  const propValue = context[propName];\n  return Object.assign(Object.assign({\n    classNames: EMPTY_OBJECT,\n    styles: EMPTY_OBJECT\n  }, propValue), {\n    getPrefixCls,\n    direction,\n    getPopupContainer\n  });\n}","function _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n  return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","function _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = !0,\n      o = !1;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) {\n        if (Object(t) !== t) return;\n        f = !1;\n      } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = !0, n = r;\n    } finally {\n      try {\n        if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nexport { _iterableToArrayLimit as default };","/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n  // 'm' and 'r' are mixing constants generated offline.\n  // They're not really 'magic', they just happen to work well.\n  // const m = 0x5bd1e995;\n  // const r = 24;\n  // Initialize the hash\n  var h = 0; // Mix 4 bytes at a time into the hash\n\n  var k,\n      i = 0,\n      len = str.length;\n\n  for (; len >= 4; ++i, len -= 4) {\n    k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n    k =\n    /* Math.imul(k, m): */\n    (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n    k ^=\n    /* k >>> r: */\n    k >>> 24;\n    h =\n    /* Math.imul(k, m): */\n    (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n    /* Math.imul(h, m): */\n    (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  } // Handle the last few bytes of the input array\n\n\n  switch (len) {\n    case 3:\n      h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n    case 2:\n      h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n    case 1:\n      h ^= str.charCodeAt(i) & 0xff;\n      h =\n      /* Math.imul(h, m): */\n      (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  } // Do a few final mixes of the hash to ensure the last few\n  // bytes are well-incorporated.\n\n\n  h ^= h >>> 13;\n  h =\n  /* Math.imul(h, m): */\n  (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n  return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\nexport default murmur2;\n","export default function canUseDom() {\n  return !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n}","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport canUseDom from \"./canUseDom\";\nimport contains from \"./contains\";\nvar APPEND_ORDER = 'data-rc-order';\nvar APPEND_PRIORITY = 'data-rc-priority';\nvar MARK_KEY = \"rc-util-key\";\nvar containerCache = new Map();\nfunction getMark() {\n  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n    mark = _ref.mark;\n  if (mark) {\n    return mark.startsWith('data-') ? mark : \"data-\".concat(mark);\n  }\n  return MARK_KEY;\n}\nfunction getContainer(option) {\n  if (option.attachTo) {\n    return option.attachTo;\n  }\n  var head = document.querySelector('head');\n  return head || document.body;\n}\nfunction getOrder(prepend) {\n  if (prepend === 'queue') {\n    return 'prependQueue';\n  }\n  return prepend ? 'prepend' : 'append';\n}\n\n/**\n * Find style which inject by rc-util\n */\nfunction findStyles(container) {\n  return Array.from((containerCache.get(container) || container).children).filter(function (node) {\n    return node.tagName === 'STYLE';\n  });\n}\nexport function injectCSS(css) {\n  var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  if (!canUseDom()) {\n    return null;\n  }\n  var csp = option.csp,\n    prepend = option.prepend,\n    _option$priority = option.priority,\n    priority = _option$priority === void 0 ? 0 : _option$priority;\n  var mergedOrder = getOrder(prepend);\n  var isPrependQueue = mergedOrder === 'prependQueue';\n  var styleNode = document.createElement('style');\n  styleNode.setAttribute(APPEND_ORDER, mergedOrder);\n  if (isPrependQueue && priority) {\n    styleNode.setAttribute(APPEND_PRIORITY, \"\".concat(priority));\n  }\n  if (csp !== null && csp !== void 0 && csp.nonce) {\n    styleNode.nonce = csp === null || csp === void 0 ? void 0 : csp.nonce;\n  }\n  styleNode.innerHTML = css;\n  var container = getContainer(option);\n  var firstChild = container.firstChild;\n  if (prepend) {\n    // If is queue `prepend`, it will prepend first style and then append rest style\n    if (isPrependQueue) {\n      var existStyle = (option.styles || findStyles(container)).filter(function (node) {\n        // Ignore style which not injected by rc-util with prepend\n        if (!['prepend', 'prependQueue'].includes(node.getAttribute(APPEND_ORDER))) {\n          return false;\n        }\n\n        // Ignore style which priority less then new style\n        var nodePriority = Number(node.getAttribute(APPEND_PRIORITY) || 0);\n        return priority >= nodePriority;\n      });\n      if (existStyle.length) {\n        container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);\n        return styleNode;\n      }\n    }\n\n    // Use `insertBefore` as `prepend`\n    container.insertBefore(styleNode, firstChild);\n  } else {\n    container.appendChild(styleNode);\n  }\n  return styleNode;\n}\nfunction findExistNode(key) {\n  var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var container = getContainer(option);\n  return (option.styles || findStyles(container)).find(function (node) {\n    return node.getAttribute(getMark(option)) === key;\n  });\n}\nexport function removeCSS(key) {\n  var option = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var existNode = findExistNode(key, option);\n  if (existNode) {\n    var container = getContainer(option);\n    container.removeChild(existNode);\n  }\n}\n\n/**\n * qiankun will inject `appendChild` to insert into other\n */\nfunction syncRealContainer(container, option) {\n  var cachedRealContainer = containerCache.get(container);\n\n  // Find real container when not cached or cached container removed\n  if (!cachedRealContainer || !contains(document, cachedRealContainer)) {\n    var placeholderStyle = injectCSS('', option);\n    var parentNode = placeholderStyle.parentNode;\n    containerCache.set(container, parentNode);\n    container.removeChild(placeholderStyle);\n  }\n}\n\n/**\n * manually clear container cache to avoid global cache in unit testes\n */\nexport function clearContainerCache() {\n  containerCache.clear();\n}\nexport function updateCSS(css, key) {\n  var originOption = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var container = getContainer(originOption);\n  var styles = findStyles(container);\n  var option = _objectSpread(_objectSpread({}, originOption), {}, {\n    styles: styles\n  });\n\n  // Sync real parent\n  syncRealContainer(container, option);\n  var existNode = findExistNode(key, option);\n  if (existNode) {\n    var _option$csp, _option$csp2;\n    if ((_option$csp = option.csp) !== null && _option$csp !== void 0 && _option$csp.nonce && existNode.nonce !== ((_option$csp2 = option.csp) === null || _option$csp2 === void 0 ? void 0 : _option$csp2.nonce)) {\n      var _option$csp3;\n      existNode.nonce = (_option$csp3 = option.csp) === null || _option$csp3 === void 0 ? void 0 : _option$csp3.nonce;\n    }\n    if (existNode.innerHTML !== css) {\n      existNode.innerHTML = css;\n    }\n    return existNode;\n  }\n  var newNode = injectCSS(css, option);\n  newNode.setAttribute(getMark(option), key);\n  return newNode;\n}","export default function contains(root, n) {\n  if (!root) {\n    return false;\n  }\n\n  // Use native if support\n  if (root.contains) {\n    return root.contains(n);\n  }\n\n  // `document.contains` not support with IE11\n  var node = n;\n  while (node) {\n    if (node === root) {\n      return true;\n    }\n    node = node.parentNode;\n  }\n  return false;\n}","import * as React from 'react';\nexport default function useMemo(getValue, condition, shouldUpdate) {\n  var cacheRef = React.useRef({});\n  if (!('value' in cacheRef.current) || shouldUpdate(cacheRef.current.condition, condition)) {\n    cacheRef.current.value = getValue();\n    cacheRef.current.condition = condition;\n  }\n  return cacheRef.current.value;\n}","/* eslint-disable no-console */\nvar warned = {};\nvar preWarningFns = [];\n\n/**\n * Pre warning enable you to parse content before console.error.\n * Modify to null will prevent warning.\n */\nexport var preMessage = function preMessage(fn) {\n  preWarningFns.push(fn);\n};\n\n/**\n * Warning if condition not match.\n * @param valid Condition\n * @param message Warning message\n * @example\n * ```js\n * warning(false, 'some error'); // print some error\n * warning(true, 'some error'); // print nothing\n * warning(1 === 2, 'some error'); // print some error\n * ```\n */\nexport function warning(valid, message) {\n  if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) {\n    var finalMessage = preWarningFns.reduce(function (msg, preMessageFn) {\n      return preMessageFn(msg !== null && msg !== void 0 ? msg : '', 'warning');\n    }, message);\n    if (finalMessage) {\n      console.error(\"Warning: \".concat(finalMessage));\n    }\n  }\n}\n\n/** @see Similar to {@link warning} */\nexport function note(valid, message) {\n  if (process.env.NODE_ENV !== 'production' && !valid && console !== undefined) {\n    var finalMessage = preWarningFns.reduce(function (msg, preMessageFn) {\n      return preMessageFn(msg !== null && msg !== void 0 ? msg : '', 'note');\n    }, message);\n    if (finalMessage) {\n      console.warn(\"Note: \".concat(finalMessage));\n    }\n  }\n}\nexport function resetWarned() {\n  warned = {};\n}\nexport function call(method, valid, message) {\n  if (!valid && !warned[message]) {\n    method(false, message);\n    warned[message] = true;\n  }\n}\n\n/** @see Same as {@link warning}, but only warn once for the same message */\nexport function warningOnce(valid, message) {\n  call(warning, valid, message);\n}\n\n/** @see Same as {@link warning}, but only warn once for the same message */\nexport function noteOnce(valid, message) {\n  call(note, valid, message);\n}\nwarningOnce.preMessage = preMessage;\nwarningOnce.resetWarned = resetWarned;\nwarningOnce.noteOnce = noteOnce;\nexport default warningOnce;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport warning from \"./warning\";\n\n/**\n * Deeply compares two object literals.\n * @param obj1 object 1\n * @param obj2 object 2\n * @param shallow shallow compare\n * @returns\n */\nfunction isEqual(obj1, obj2) {\n  var shallow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  // https://github.com/mapbox/mapbox-gl-js/pull/5979/files#diff-fde7145050c47cc3a306856efd5f9c3016e86e859de9afbd02c879be5067e58f\n  var refSet = new Set();\n  function deepEqual(a, b) {\n    var level = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n    var circular = refSet.has(a);\n    warning(!circular, 'Warning: There may be circular references');\n    if (circular) {\n      return false;\n    }\n    if (a === b) {\n      return true;\n    }\n    if (shallow && level > 1) {\n      return false;\n    }\n    refSet.add(a);\n    var newLevel = level + 1;\n    if (Array.isArray(a)) {\n      if (!Array.isArray(b) || a.length !== b.length) {\n        return false;\n      }\n      for (var i = 0; i < a.length; i++) {\n        if (!deepEqual(a[i], b[i], newLevel)) {\n          return false;\n        }\n      }\n      return true;\n    }\n    if (a && b && _typeof(a) === 'object' && _typeof(b) === 'object') {\n      var keys = Object.keys(a);\n      if (keys.length !== Object.keys(b).length) {\n        return false;\n      }\n      return keys.every(function (key) {\n        return deepEqual(a[key], b[key], newLevel);\n      });\n    }\n    // other\n    return false;\n  }\n  return deepEqual(obj1, obj2);\n}\nexport default isEqual;","function _classCallCheck(a, n) {\n  if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexport { _classCallCheck as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(e, r) {\n  for (var t = 0; t < r.length; t++) {\n    var o = r[t];\n    o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n  }\n}\nfunction _createClass(e, r, t) {\n  return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n    writable: !1\n  }), e;\n}\nexport { _createClass as default };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\n// [times, realValue]\n\nvar SPLIT = '%';\n\n/** Connect key with `SPLIT` */\nexport function pathKey(keys) {\n  return keys.join(SPLIT);\n}\nvar Entity = /*#__PURE__*/function () {\n  function Entity(instanceId) {\n    _classCallCheck(this, Entity);\n    _defineProperty(this, \"instanceId\", void 0);\n    /** @private Internal cache map. Do not access this directly */\n    _defineProperty(this, \"cache\", new Map());\n    this.instanceId = instanceId;\n  }\n  _createClass(Entity, [{\n    key: \"get\",\n    value: function get(keys) {\n      return this.opGet(pathKey(keys));\n    }\n\n    /** A fast get cache with `get` concat. */\n  }, {\n    key: \"opGet\",\n    value: function opGet(keyPathStr) {\n      return this.cache.get(keyPathStr) || null;\n    }\n  }, {\n    key: \"update\",\n    value: function update(keys, valueFn) {\n      return this.opUpdate(pathKey(keys), valueFn);\n    }\n\n    /** A fast get cache with `get` concat. */\n  }, {\n    key: \"opUpdate\",\n    value: function opUpdate(keyPathStr, valueFn) {\n      var prevValue = this.cache.get(keyPathStr);\n      var nextValue = valueFn(prevValue);\n      if (nextValue === null) {\n        this.cache.delete(keyPathStr);\n      } else {\n        this.cache.set(keyPathStr, nextValue);\n      }\n    }\n  }]);\n  return Entity;\n}();\nexport default Entity;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nvar _excluded = [\"children\"];\nimport useMemo from \"rc-util/es/hooks/useMemo\";\nimport isEqual from \"rc-util/es/isEqual\";\nimport * as React from 'react';\nimport CacheEntity from \"./Cache\";\nexport var ATTR_TOKEN = 'data-token-hash';\nexport var ATTR_MARK = 'data-css-hash';\nexport var ATTR_CACHE_PATH = 'data-cache-path';\n\n// Mark css-in-js instance in style element\nexport var CSS_IN_JS_INSTANCE = '__cssinjs_instance__';\nexport function createCache() {\n  var cssinjsInstanceId = Math.random().toString(12).slice(2);\n\n  // Tricky SSR: Move all inline style to the head.\n  // PS: We do not recommend tricky mode.\n  if (typeof document !== 'undefined' && document.head && document.body) {\n    var styles = document.body.querySelectorAll(\"style[\".concat(ATTR_MARK, \"]\")) || [];\n    var firstChild = document.head.firstChild;\n    Array.from(styles).forEach(function (style) {\n      style[CSS_IN_JS_INSTANCE] = style[CSS_IN_JS_INSTANCE] || cssinjsInstanceId;\n\n      // Not force move if no head\n      if (style[CSS_IN_JS_INSTANCE] === cssinjsInstanceId) {\n        document.head.insertBefore(style, firstChild);\n      }\n    });\n\n    // Deduplicate of moved styles\n    var styleHash = {};\n    Array.from(document.querySelectorAll(\"style[\".concat(ATTR_MARK, \"]\"))).forEach(function (style) {\n      var hash = style.getAttribute(ATTR_MARK);\n      if (styleHash[hash]) {\n        if (style[CSS_IN_JS_INSTANCE] === cssinjsInstanceId) {\n          var _style$parentNode;\n          (_style$parentNode = style.parentNode) === null || _style$parentNode === void 0 || _style$parentNode.removeChild(style);\n        }\n      } else {\n        styleHash[hash] = true;\n      }\n    });\n  }\n  return new CacheEntity(cssinjsInstanceId);\n}\nvar StyleContext = /*#__PURE__*/React.createContext({\n  hashPriority: 'low',\n  cache: createCache(),\n  defaultCache: true\n});\nexport var StyleProvider = function StyleProvider(props) {\n  var children = props.children,\n    restProps = _objectWithoutProperties(props, _excluded);\n  var parentContext = React.useContext(StyleContext);\n  var context = useMemo(function () {\n    var mergedContext = _objectSpread({}, parentContext);\n    Object.keys(restProps).forEach(function (key) {\n      var value = restProps[key];\n      if (restProps[key] !== undefined) {\n        mergedContext[key] = value;\n      }\n    });\n    var cache = restProps.cache;\n    mergedContext.cache = mergedContext.cache || createCache();\n    mergedContext.defaultCache = !cache && parentContext.defaultCache;\n    return mergedContext;\n  }, [parentContext, restProps], function (prev, next) {\n    return !isEqual(prev[0], next[0], true) || !isEqual(prev[1], next[1], true);\n  });\n  return /*#__PURE__*/React.createElement(StyleContext.Provider, {\n    value: context\n  }, children);\n};\nexport default StyleContext;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport AbstractCalculator from \"./calculator\";\nvar CALC_UNIT = 'CALC_UNIT';\nvar regexp = new RegExp(CALC_UNIT, 'g');\nfunction unit(value) {\n  if (typeof value === 'number') {\n    return \"\".concat(value).concat(CALC_UNIT);\n  }\n  return value;\n}\nvar CSSCalculator = /*#__PURE__*/function (_AbstractCalculator) {\n  _inherits(CSSCalculator, _AbstractCalculator);\n  var _super = _createSuper(CSSCalculator);\n  function CSSCalculator(num, unitlessCssVar) {\n    var _this;\n    _classCallCheck(this, CSSCalculator);\n    _this = _super.call(this);\n    _defineProperty(_assertThisInitialized(_this), \"result\", '');\n    _defineProperty(_assertThisInitialized(_this), \"unitlessCssVar\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"lowPriority\", void 0);\n    var numType = _typeof(num);\n    _this.unitlessCssVar = unitlessCssVar;\n    if (num instanceof CSSCalculator) {\n      _this.result = \"(\".concat(num.result, \")\");\n    } else if (numType === 'number') {\n      _this.result = unit(num);\n    } else if (numType === 'string') {\n      _this.result = num;\n    }\n    return _this;\n  }\n  _createClass(CSSCalculator, [{\n    key: \"add\",\n    value: function add(num) {\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" + \").concat(num.getResult());\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" + \").concat(unit(num));\n      }\n      this.lowPriority = true;\n      return this;\n    }\n  }, {\n    key: \"sub\",\n    value: function sub(num) {\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" - \").concat(num.getResult());\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" - \").concat(unit(num));\n      }\n      this.lowPriority = true;\n      return this;\n    }\n  }, {\n    key: \"mul\",\n    value: function mul(num) {\n      if (this.lowPriority) {\n        this.result = \"(\".concat(this.result, \")\");\n      }\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" * \").concat(num.getResult(true));\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" * \").concat(num);\n      }\n      this.lowPriority = false;\n      return this;\n    }\n  }, {\n    key: \"div\",\n    value: function div(num) {\n      if (this.lowPriority) {\n        this.result = \"(\".concat(this.result, \")\");\n      }\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" / \").concat(num.getResult(true));\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" / \").concat(num);\n      }\n      this.lowPriority = false;\n      return this;\n    }\n  }, {\n    key: \"getResult\",\n    value: function getResult(force) {\n      return this.lowPriority || force ? \"(\".concat(this.result, \")\") : this.result;\n    }\n  }, {\n    key: \"equal\",\n    value: function equal(options) {\n      var _this2 = this;\n      var _ref = options || {},\n        cssUnit = _ref.unit;\n      var mergedUnit = true;\n      if (typeof cssUnit === 'boolean') {\n        mergedUnit = cssUnit;\n      } else if (Array.from(this.unitlessCssVar).some(function (cssVar) {\n        return _this2.result.includes(cssVar);\n      })) {\n        mergedUnit = false;\n      }\n      this.result = this.result.replace(regexp, mergedUnit ? 'px' : '');\n      if (typeof this.lowPriority !== 'undefined') {\n        return \"calc(\".concat(this.result, \")\");\n      }\n      return this.result;\n    }\n  }]);\n  return CSSCalculator;\n}(AbstractCalculator);\nexport { CSSCalculator as default };","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\n// ================================== Cache ==================================\n\nexport function sameDerivativeOption(left, right) {\n  if (left.length !== right.length) {\n    return false;\n  }\n  for (var i = 0; i < left.length; i++) {\n    if (left[i] !== right[i]) {\n      return false;\n    }\n  }\n  return true;\n}\nvar ThemeCache = /*#__PURE__*/function () {\n  function ThemeCache() {\n    _classCallCheck(this, ThemeCache);\n    _defineProperty(this, \"cache\", void 0);\n    _defineProperty(this, \"keys\", void 0);\n    _defineProperty(this, \"cacheCallTimes\", void 0);\n    this.cache = new Map();\n    this.keys = [];\n    this.cacheCallTimes = 0;\n  }\n  _createClass(ThemeCache, [{\n    key: \"size\",\n    value: function size() {\n      return this.keys.length;\n    }\n  }, {\n    key: \"internalGet\",\n    value: function internalGet(derivativeOption) {\n      var _cache2, _cache3;\n      var updateCallTimes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n      var cache = {\n        map: this.cache\n      };\n      derivativeOption.forEach(function (derivative) {\n        if (!cache) {\n          cache = undefined;\n        } else {\n          var _cache;\n          cache = (_cache = cache) === null || _cache === void 0 || (_cache = _cache.map) === null || _cache === void 0 ? void 0 : _cache.get(derivative);\n        }\n      });\n      if ((_cache2 = cache) !== null && _cache2 !== void 0 && _cache2.value && updateCallTimes) {\n        cache.value[1] = this.cacheCallTimes++;\n      }\n      return (_cache3 = cache) === null || _cache3 === void 0 ? void 0 : _cache3.value;\n    }\n  }, {\n    key: \"get\",\n    value: function get(derivativeOption) {\n      var _this$internalGet;\n      return (_this$internalGet = this.internalGet(derivativeOption, true)) === null || _this$internalGet === void 0 ? void 0 : _this$internalGet[0];\n    }\n  }, {\n    key: \"has\",\n    value: function has(derivativeOption) {\n      return !!this.internalGet(derivativeOption);\n    }\n  }, {\n    key: \"set\",\n    value: function set(derivativeOption, value) {\n      var _this = this;\n      // New cache\n      if (!this.has(derivativeOption)) {\n        if (this.size() + 1 > ThemeCache.MAX_CACHE_SIZE + ThemeCache.MAX_CACHE_OFFSET) {\n          var _this$keys$reduce = this.keys.reduce(function (result, key) {\n              var _result = _slicedToArray(result, 2),\n                callTimes = _result[1];\n              if (_this.internalGet(key)[1] < callTimes) {\n                return [key, _this.internalGet(key)[1]];\n              }\n              return result;\n            }, [this.keys[0], this.cacheCallTimes]),\n            _this$keys$reduce2 = _slicedToArray(_this$keys$reduce, 1),\n            targetKey = _this$keys$reduce2[0];\n          this.delete(targetKey);\n        }\n        this.keys.push(derivativeOption);\n      }\n      var cache = this.cache;\n      derivativeOption.forEach(function (derivative, index) {\n        if (index === derivativeOption.length - 1) {\n          cache.set(derivative, {\n            value: [value, _this.cacheCallTimes++]\n          });\n        } else {\n          var cacheValue = cache.get(derivative);\n          if (!cacheValue) {\n            cache.set(derivative, {\n              map: new Map()\n            });\n          } else if (!cacheValue.map) {\n            cacheValue.map = new Map();\n          }\n          cache = cache.get(derivative).map;\n        }\n      });\n    }\n  }, {\n    key: \"deleteByPath\",\n    value: function deleteByPath(currentCache, derivatives) {\n      var cache = currentCache.get(derivatives[0]);\n      if (derivatives.length === 1) {\n        var _cache$value;\n        if (!cache.map) {\n          currentCache.delete(derivatives[0]);\n        } else {\n          currentCache.set(derivatives[0], {\n            map: cache.map\n          });\n        }\n        return (_cache$value = cache.value) === null || _cache$value === void 0 ? void 0 : _cache$value[0];\n      }\n      var result = this.deleteByPath(cache.map, derivatives.slice(1));\n      if ((!cache.map || cache.map.size === 0) && !cache.value) {\n        currentCache.delete(derivatives[0]);\n      }\n      return result;\n    }\n  }, {\n    key: \"delete\",\n    value: function _delete(derivativeOption) {\n      // If cache exists\n      if (this.has(derivativeOption)) {\n        this.keys = this.keys.filter(function (item) {\n          return !sameDerivativeOption(item, derivativeOption);\n        });\n        return this.deleteByPath(this.cache, derivativeOption);\n      }\n      return undefined;\n    }\n  }]);\n  return ThemeCache;\n}();\n_defineProperty(ThemeCache, \"MAX_CACHE_SIZE\", 20);\n_defineProperty(ThemeCache, \"MAX_CACHE_OFFSET\", 5);\nexport { ThemeCache as default };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport { warning } from \"rc-util/es/warning\";\nvar uuid = 0;\n\n/**\n * Theme with algorithms to derive tokens from design tokens.\n * Use `createTheme` first which will help to manage the theme instance cache.\n */\nvar Theme = /*#__PURE__*/function () {\n  function Theme(derivatives) {\n    _classCallCheck(this, Theme);\n    _defineProperty(this, \"derivatives\", void 0);\n    _defineProperty(this, \"id\", void 0);\n    this.derivatives = Array.isArray(derivatives) ? derivatives : [derivatives];\n    this.id = uuid;\n    if (derivatives.length === 0) {\n      warning(derivatives.length > 0, '[Ant Design CSS-in-JS] Theme should have at least one derivative function.');\n    }\n    uuid += 1;\n  }\n  _createClass(Theme, [{\n    key: \"getDerivativeToken\",\n    value: function getDerivativeToken(token) {\n      return this.derivatives.reduce(function (result, derivative) {\n        return derivative(token, result);\n      }, undefined);\n    }\n  }]);\n  return Theme;\n}();\nexport { Theme as default };","import ThemeCache from \"./ThemeCache\";\nimport Theme from \"./Theme\";\nvar cacheThemes = new ThemeCache();\n\n/**\n * Same as new Theme, but will always return same one if `derivative` not changed.\n */\nexport default function createTheme(derivatives) {\n  var derivativeArr = Array.isArray(derivatives) ? derivatives : [derivatives];\n  // Create new theme if not exist\n  if (!cacheThemes.has(derivativeArr)) {\n    cacheThemes.set(derivativeArr, new Theme(derivativeArr));\n  }\n\n  // Get theme from cache and return\n  return cacheThemes.get(derivativeArr);\n}","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport hash from '@emotion/hash';\nimport canUseDom from \"rc-util/es/Dom/canUseDom\";\nimport { removeCSS, updateCSS } from \"rc-util/es/Dom/dynamicCSS\";\nimport { ATTR_MARK, ATTR_TOKEN } from \"../StyleContext\";\nimport { Theme } from \"../theme\";\n\n// Create a cache for memo concat\n\nvar resultCache = new WeakMap();\nvar RESULT_VALUE = {};\nexport function memoResult(callback, deps) {\n  var current = resultCache;\n  for (var i = 0; i < deps.length; i += 1) {\n    var dep = deps[i];\n    if (!current.has(dep)) {\n      current.set(dep, new WeakMap());\n    }\n    current = current.get(dep);\n  }\n  if (!current.has(RESULT_VALUE)) {\n    current.set(RESULT_VALUE, callback());\n  }\n  return current.get(RESULT_VALUE);\n}\n\n// Create a cache here to avoid always loop generate\nvar flattenTokenCache = new WeakMap();\n\n/**\n * Flatten token to string, this will auto cache the result when token not change\n */\nexport function flattenToken(token) {\n  var str = flattenTokenCache.get(token) || '';\n  if (!str) {\n    Object.keys(token).forEach(function (key) {\n      var value = token[key];\n      str += key;\n      if (value instanceof Theme) {\n        str += value.id;\n      } else if (value && _typeof(value) === 'object') {\n        str += flattenToken(value);\n      } else {\n        str += value;\n      }\n    });\n\n    // https://github.com/ant-design/ant-design/issues/48386\n    // Should hash the string to avoid style tag name too long\n    str = hash(str);\n\n    // Put in cache\n    flattenTokenCache.set(token, str);\n  }\n  return str;\n}\n\n/**\n * Convert derivative token to key string\n */\nexport function token2key(token, salt) {\n  return hash(\"\".concat(salt, \"_\").concat(flattenToken(token)));\n}\nvar randomSelectorKey = \"random-\".concat(Date.now(), \"-\").concat(Math.random()).replace(/\\./g, '');\n\n// Magic `content` for detect selector support\nvar checkContent = '_bAmBoO_';\nfunction supportSelector(styleStr, handleElement, supportCheck) {\n  if (canUseDom()) {\n    var _getComputedStyle$con, _ele$parentNode;\n    updateCSS(styleStr, randomSelectorKey);\n    var _ele = document.createElement('div');\n    _ele.style.position = 'fixed';\n    _ele.style.left = '0';\n    _ele.style.top = '0';\n    handleElement === null || handleElement === void 0 || handleElement(_ele);\n    document.body.appendChild(_ele);\n    if (process.env.NODE_ENV !== 'production') {\n      _ele.innerHTML = 'Test';\n      _ele.style.zIndex = '9999999';\n    }\n    var support = supportCheck ? supportCheck(_ele) : (_getComputedStyle$con = getComputedStyle(_ele).content) === null || _getComputedStyle$con === void 0 ? void 0 : _getComputedStyle$con.includes(checkContent);\n    (_ele$parentNode = _ele.parentNode) === null || _ele$parentNode === void 0 || _ele$parentNode.removeChild(_ele);\n    removeCSS(randomSelectorKey);\n    return support;\n  }\n  return false;\n}\nvar canLayer = undefined;\nexport function supportLayer() {\n  if (canLayer === undefined) {\n    canLayer = supportSelector(\"@layer \".concat(randomSelectorKey, \" { .\").concat(randomSelectorKey, \" { content: \\\"\").concat(checkContent, \"\\\"!important; } }\"), function (ele) {\n      ele.className = randomSelectorKey;\n    });\n  }\n  return canLayer;\n}\nvar canWhere = undefined;\nexport function supportWhere() {\n  if (canWhere === undefined) {\n    canWhere = supportSelector(\":where(.\".concat(randomSelectorKey, \") { content: \\\"\").concat(checkContent, \"\\\"!important; }\"), function (ele) {\n      ele.className = randomSelectorKey;\n    });\n  }\n  return canWhere;\n}\nvar canLogic = undefined;\nexport function supportLogicProps() {\n  if (canLogic === undefined) {\n    canLogic = supportSelector(\".\".concat(randomSelectorKey, \" { inset-block: 93px !important; }\"), function (ele) {\n      ele.className = randomSelectorKey;\n    }, function (ele) {\n      return getComputedStyle(ele).bottom === '93px';\n    });\n  }\n  return canLogic;\n}\nexport var isClientSide = canUseDom();\nexport function unit(num) {\n  if (typeof num === 'number') {\n    return \"\".concat(num, \"px\");\n  }\n  return num;\n}\nexport function toStyleStr(style, tokenKey, styleId) {\n  var _objectSpread2;\n  var customizeAttrs = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n  var plain = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n  if (plain) {\n    return style;\n  }\n  var attrs = _objectSpread(_objectSpread({}, customizeAttrs), {}, (_objectSpread2 = {}, _defineProperty(_objectSpread2, ATTR_TOKEN, tokenKey), _defineProperty(_objectSpread2, ATTR_MARK, styleId), _objectSpread2));\n  var attrStr = Object.keys(attrs).map(function (attr) {\n    var val = attrs[attr];\n    return val ? \"\".concat(attr, \"=\\\"\").concat(val, \"\\\"\") : null;\n  }).filter(function (v) {\n    return v;\n  }).join(' ');\n  return \"<style \".concat(attrStr, \">\").concat(style, \"</style>\");\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nexport var token2CSSVar = function token2CSSVar(token) {\n  var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n  return \"--\".concat(prefix ? \"\".concat(prefix, \"-\") : '').concat(token).replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/([A-Z]+)([A-Z][a-z0-9]+)/g, '$1-$2').replace(/([a-z])([A-Z0-9])/g, '$1-$2').toLowerCase();\n};\nexport var serializeCSSVar = function serializeCSSVar(cssVars, hashId, options) {\n  if (!Object.keys(cssVars).length) {\n    return '';\n  }\n  return \".\".concat(hashId).concat(options !== null && options !== void 0 && options.scope ? \".\".concat(options.scope) : '', \"{\").concat(Object.entries(cssVars).map(function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 2),\n      key = _ref2[0],\n      value = _ref2[1];\n    return \"\".concat(key, \":\").concat(value, \";\");\n  }).join(''), \"}\");\n};\nexport var transformToken = function transformToken(token, themeKey, config) {\n  var cssVars = {};\n  var result = {};\n  Object.entries(token).forEach(function (_ref3) {\n    var _config$preserve, _config$ignore;\n    var _ref4 = _slicedToArray(_ref3, 2),\n      key = _ref4[0],\n      value = _ref4[1];\n    if (config !== null && config !== void 0 && (_config$preserve = config.preserve) !== null && _config$preserve !== void 0 && _config$preserve[key]) {\n      result[key] = value;\n    } else if ((typeof value === 'string' || typeof value === 'number') && !(config !== null && config !== void 0 && (_config$ignore = config.ignore) !== null && _config$ignore !== void 0 && _config$ignore[key])) {\n      var _config$unitless;\n      var cssVar = token2CSSVar(key, config === null || config === void 0 ? void 0 : config.prefix);\n      cssVars[cssVar] = typeof value === 'number' && !(config !== null && config !== void 0 && (_config$unitless = config.unitless) !== null && _config$unitless !== void 0 && _config$unitless[key]) ? \"\".concat(value, \"px\") : String(value);\n      result[key] = \"var(\".concat(cssVar, \")\");\n    }\n  });\n  return [result, serializeCSSVar(cssVars, themeKey, {\n    scope: config === null || config === void 0 ? void 0 : config.scope\n  })];\n};","import * as React from 'react';\nimport canUseDom from \"../Dom/canUseDom\";\n\n/**\n * Wrap `React.useLayoutEffect` which will not throw warning message in test env\n */\nvar useInternalLayoutEffect = process.env.NODE_ENV !== 'test' && canUseDom() ? React.useLayoutEffect : React.useEffect;\nvar useLayoutEffect = function useLayoutEffect(callback, deps) {\n  var firstMountRef = React.useRef(true);\n  useInternalLayoutEffect(function () {\n    return callback(firstMountRef.current);\n  }, deps);\n\n  // We tell react that first mount has passed\n  useInternalLayoutEffect(function () {\n    firstMountRef.current = false;\n    return function () {\n      firstMountRef.current = true;\n    };\n  }, []);\n};\nexport var useLayoutUpdateEffect = function useLayoutUpdateEffect(callback, deps) {\n  useLayoutEffect(function (firstMount) {\n    if (!firstMount) {\n      return callback();\n    }\n  }, deps);\n};\nexport default useLayoutEffect;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\n// import canUseDom from 'rc-util/lib/Dom/canUseDom';\nimport useLayoutEffect from \"rc-util/es/hooks/useLayoutEffect\";\nimport * as React from 'react';\n\n// We need fully clone React function here\n// to avoid webpack warning React 17 do not export `useId`\nvar fullClone = _objectSpread({}, React);\nvar useInsertionEffect = fullClone.useInsertionEffect;\n/**\n * Polyfill `useInsertionEffect` for React < 18\n * @param renderEffect will be executed in `useMemo`, and do not have callback\n * @param effect will be executed in `useLayoutEffect`\n * @param deps\n */\nvar useInsertionEffectPolyfill = function useInsertionEffectPolyfill(renderEffect, effect, deps) {\n  React.useMemo(renderEffect, deps);\n  useLayoutEffect(function () {\n    return effect(true);\n  }, deps);\n};\n\n/**\n * Compatible `useInsertionEffect`\n * will use `useInsertionEffect` if React version >= 18,\n * otherwise use `useInsertionEffectPolyfill`.\n */\nvar useCompatibleInsertionEffect = useInsertionEffect ? function (renderEffect, effect, deps) {\n  return useInsertionEffect(function () {\n    renderEffect();\n    return effect();\n  }, deps);\n} : useInsertionEffectPolyfill;\nexport default useCompatibleInsertionEffect;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport { warning } from \"rc-util/es/warning\";\nimport * as React from 'react';\nvar fullClone = _objectSpread({}, React);\nvar useInsertionEffect = fullClone.useInsertionEffect;\n\n// DO NOT register functions in useEffect cleanup function, or functions that registered will never be called.\nvar useCleanupRegister = function useCleanupRegister(deps) {\n  var effectCleanups = [];\n  var cleanupFlag = false;\n  function register(fn) {\n    if (cleanupFlag) {\n      if (process.env.NODE_ENV !== 'production') {\n        warning(false, '[Ant Design CSS-in-JS] You are registering a cleanup function after unmount, which will not have any effect.');\n      }\n      return;\n    }\n    effectCleanups.push(fn);\n  }\n  React.useEffect(function () {\n    // Compatible with strict mode\n    cleanupFlag = false;\n    return function () {\n      cleanupFlag = true;\n      if (effectCleanups.length) {\n        effectCleanups.forEach(function (fn) {\n          return fn();\n        });\n      }\n    };\n  }, deps);\n  return register;\n};\nvar useRun = function useRun() {\n  return function (fn) {\n    fn();\n  };\n};\n\n// Only enable register in React 18\nvar useEffectCleanupRegister = typeof useInsertionEffect !== 'undefined' ? useCleanupRegister : useRun;\nexport default useEffectCleanupRegister;","function useProdHMR() {\n  return false;\n}\nvar webpackHMR = false;\nfunction useDevHMR() {\n  return webpackHMR;\n}\nexport default process.env.NODE_ENV === 'production' ? useProdHMR : useDevHMR;\n\n// Webpack `module.hot.accept` do not support any deps update trigger\n// We have to hack handler to force mark as HRM\nif (process.env.NODE_ENV !== 'production' && typeof module !== 'undefined' && module && module.hot && typeof window !== 'undefined') {\n  // Use `globalThis` first, and `window` for older browsers\n  // const win = globalThis as any;\n  var win = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : null;\n  if (win && typeof win.webpackHotUpdate === 'function') {\n    var originWebpackHotUpdate = win.webpackHotUpdate;\n    win.webpackHotUpdate = function () {\n      webpackHMR = true;\n      setTimeout(function () {\n        webpackHMR = false;\n      }, 0);\n      return originWebpackHotUpdate.apply(void 0, arguments);\n    };\n  }\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport * as React from 'react';\nimport { pathKey } from \"../Cache\";\nimport StyleContext from \"../StyleContext\";\nimport useCompatibleInsertionEffect from \"./useCompatibleInsertionEffect\";\nimport useEffectCleanupRegister from \"./useEffectCleanupRegister\";\nimport useHMR from \"./useHMR\";\nexport default function useGlobalCache(prefix, keyPath, cacheFn, onCacheRemove,\n// Add additional effect trigger by `useInsertionEffect`\nonCacheEffect) {\n  var _React$useContext = React.useContext(StyleContext),\n    globalCache = _React$useContext.cache;\n  var fullPath = [prefix].concat(_toConsumableArray(keyPath));\n  var fullPathStr = pathKey(fullPath);\n  var register = useEffectCleanupRegister([fullPathStr]);\n  var HMRUpdate = useHMR();\n  var buildCache = function buildCache(updater) {\n    globalCache.opUpdate(fullPathStr, function (prevCache) {\n      var _ref = prevCache || [undefined, undefined],\n        _ref2 = _slicedToArray(_ref, 2),\n        _ref2$ = _ref2[0],\n        times = _ref2$ === void 0 ? 0 : _ref2$,\n        cache = _ref2[1];\n\n      // HMR should always ignore cache since developer may change it\n      var tmpCache = cache;\n      if (process.env.NODE_ENV !== 'production' && cache && HMRUpdate) {\n        onCacheRemove === null || onCacheRemove === void 0 || onCacheRemove(tmpCache, HMRUpdate);\n        tmpCache = null;\n      }\n      var mergedCache = tmpCache || cacheFn();\n      var data = [times, mergedCache];\n\n      // Call updater if need additional logic\n      return updater ? updater(data) : data;\n    });\n  };\n\n  // Create cache\n  React.useMemo(function () {\n    buildCache();\n  }, /* eslint-disable react-hooks/exhaustive-deps */\n  [fullPathStr]\n  /* eslint-enable */);\n\n  var cacheEntity = globalCache.opGet(fullPathStr);\n\n  // HMR clean the cache but not trigger `useMemo` again\n  // Let's fallback of this\n  // ref https://github.com/ant-design/cssinjs/issues/127\n  if (process.env.NODE_ENV !== 'production' && !cacheEntity) {\n    buildCache();\n    cacheEntity = globalCache.opGet(fullPathStr);\n  }\n  var cacheContent = cacheEntity[1];\n\n  // Remove if no need anymore\n  useCompatibleInsertionEffect(function () {\n    onCacheEffect === null || onCacheEffect === void 0 || onCacheEffect(cacheContent);\n  }, function (polyfill) {\n    // It's bad to call build again in effect.\n    // But we have to do this since StrictMode will call effect twice\n    // which will clear cache on the first time.\n    buildCache(function (_ref3) {\n      var _ref4 = _slicedToArray(_ref3, 2),\n        times = _ref4[0],\n        cache = _ref4[1];\n      if (polyfill && times === 0) {\n        onCacheEffect === null || onCacheEffect === void 0 || onCacheEffect(cacheContent);\n      }\n      return [times + 1, cache];\n    });\n    return function () {\n      globalCache.opUpdate(fullPathStr, function (prevCache) {\n        var _ref5 = prevCache || [],\n          _ref6 = _slicedToArray(_ref5, 2),\n          _ref6$ = _ref6[0],\n          times = _ref6$ === void 0 ? 0 : _ref6$,\n          cache = _ref6[1];\n        var nextCount = times - 1;\n        if (nextCount === 0) {\n          // Always remove styles in useEffect callback\n          register(function () {\n            // With polyfill, registered callback will always be called synchronously\n            // But without polyfill, it will be called in effect clean up,\n            // And by that time this cache is cleaned up.\n            if (polyfill || !globalCache.opGet(fullPathStr)) {\n              onCacheRemove === null || onCacheRemove === void 0 || onCacheRemove(cache, false);\n            }\n          });\n          return null;\n        }\n        return [times - 1, cache];\n      });\n    };\n  }, [fullPathStr]);\n  return cacheContent;\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport hash from '@emotion/hash';\nimport { updateCSS } from \"rc-util/es/Dom/dynamicCSS\";\nimport { useContext } from 'react';\nimport StyleContext, { ATTR_MARK, ATTR_TOKEN, CSS_IN_JS_INSTANCE } from \"../StyleContext\";\nimport { flattenToken, memoResult, token2key, toStyleStr } from \"../util\";\nimport { transformToken } from \"../util/css-variables\";\nimport useGlobalCache from \"./useGlobalCache\";\nvar EMPTY_OVERRIDE = {};\n\n// Generate different prefix to make user selector break in production env.\n// This helps developer not to do style override directly on the hash id.\nvar hashPrefix = process.env.NODE_ENV !== 'production' ? 'css-dev-only-do-not-override' : 'css';\nvar tokenKeys = new Map();\nfunction recordCleanToken(tokenKey) {\n  tokenKeys.set(tokenKey, (tokenKeys.get(tokenKey) || 0) + 1);\n}\nfunction removeStyleTags(key, instanceId) {\n  if (typeof document !== 'undefined') {\n    var styles = document.querySelectorAll(\"style[\".concat(ATTR_TOKEN, \"=\\\"\").concat(key, \"\\\"]\"));\n    styles.forEach(function (style) {\n      if (style[CSS_IN_JS_INSTANCE] === instanceId) {\n        var _style$parentNode;\n        (_style$parentNode = style.parentNode) === null || _style$parentNode === void 0 || _style$parentNode.removeChild(style);\n      }\n    });\n  }\n}\nvar TOKEN_THRESHOLD = 0;\n\n// Remove will check current keys first\nfunction cleanTokenStyle(tokenKey, instanceId) {\n  tokenKeys.set(tokenKey, (tokenKeys.get(tokenKey) || 0) - 1);\n  var tokenKeyList = Array.from(tokenKeys.keys());\n  var cleanableKeyList = tokenKeyList.filter(function (key) {\n    var count = tokenKeys.get(key) || 0;\n    return count <= 0;\n  });\n\n  // Should keep tokens under threshold for not to insert style too often\n  if (tokenKeyList.length - cleanableKeyList.length > TOKEN_THRESHOLD) {\n    cleanableKeyList.forEach(function (key) {\n      removeStyleTags(key, instanceId);\n      tokenKeys.delete(key);\n    });\n  }\n}\nexport var getComputedToken = function getComputedToken(originToken, overrideToken, theme, format) {\n  var derivativeToken = theme.getDerivativeToken(originToken);\n\n  // Merge with override\n  var mergedDerivativeToken = _objectSpread(_objectSpread({}, derivativeToken), overrideToken);\n\n  // Format if needed\n  if (format) {\n    mergedDerivativeToken = format(mergedDerivativeToken);\n  }\n  return mergedDerivativeToken;\n};\nexport var TOKEN_PREFIX = 'token';\n/**\n * Cache theme derivative token as global shared one\n * @param theme Theme entity\n * @param tokens List of tokens, used for cache. Please do not dynamic generate object directly\n * @param option Additional config\n * @returns Call Theme.getDerivativeToken(tokenObject) to get token\n */\nexport default function useCacheToken(theme, tokens) {\n  var option = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  var _useContext = useContext(StyleContext),\n    instanceId = _useContext.cache.instanceId,\n    container = _useContext.container;\n  var _option$salt = option.salt,\n    salt = _option$salt === void 0 ? '' : _option$salt,\n    _option$override = option.override,\n    override = _option$override === void 0 ? EMPTY_OVERRIDE : _option$override,\n    formatToken = option.formatToken,\n    compute = option.getComputedToken,\n    cssVar = option.cssVar;\n\n  // Basic - We do basic cache here\n  var mergedToken = memoResult(function () {\n    return Object.assign.apply(Object, [{}].concat(_toConsumableArray(tokens)));\n  }, tokens);\n  var tokenStr = flattenToken(mergedToken);\n  var overrideTokenStr = flattenToken(override);\n  var cssVarStr = cssVar ? flattenToken(cssVar) : '';\n  var cachedToken = useGlobalCache(TOKEN_PREFIX, [salt, theme.id, tokenStr, overrideTokenStr, cssVarStr], function () {\n    var _cssVar$key;\n    var mergedDerivativeToken = compute ? compute(mergedToken, override, theme) : getComputedToken(mergedToken, override, theme, formatToken);\n\n    // Replace token value with css variables\n    var actualToken = _objectSpread({}, mergedDerivativeToken);\n    var cssVarsStr = '';\n    if (!!cssVar) {\n      var _transformToken = transformToken(mergedDerivativeToken, cssVar.key, {\n        prefix: cssVar.prefix,\n        ignore: cssVar.ignore,\n        unitless: cssVar.unitless,\n        preserve: cssVar.preserve\n      });\n      var _transformToken2 = _slicedToArray(_transformToken, 2);\n      mergedDerivativeToken = _transformToken2[0];\n      cssVarsStr = _transformToken2[1];\n    }\n\n    // Optimize for `useStyleRegister` performance\n    var tokenKey = token2key(mergedDerivativeToken, salt);\n    mergedDerivativeToken._tokenKey = tokenKey;\n    actualToken._tokenKey = token2key(actualToken, salt);\n    var themeKey = (_cssVar$key = cssVar === null || cssVar === void 0 ? void 0 : cssVar.key) !== null && _cssVar$key !== void 0 ? _cssVar$key : tokenKey;\n    mergedDerivativeToken._themeKey = themeKey;\n    recordCleanToken(themeKey);\n    var hashId = \"\".concat(hashPrefix, \"-\").concat(hash(tokenKey));\n    mergedDerivativeToken._hashId = hashId; // Not used\n\n    return [mergedDerivativeToken, hashId, actualToken, cssVarsStr, (cssVar === null || cssVar === void 0 ? void 0 : cssVar.key) || ''];\n  }, function (cache) {\n    // Remove token will remove all related style\n    cleanTokenStyle(cache[0]._themeKey, instanceId);\n  }, function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 4),\n      token = _ref2[0],\n      cssVarsStr = _ref2[3];\n    if (cssVar && cssVarsStr) {\n      var style = updateCSS(cssVarsStr, hash(\"css-variables-\".concat(token._themeKey)), {\n        mark: ATTR_MARK,\n        prepend: 'queue',\n        attachTo: container,\n        priority: -999\n      });\n      style[CSS_IN_JS_INSTANCE] = instanceId;\n\n      // Used for `useCacheToken` to remove on batch when token removed\n      style.setAttribute(ATTR_TOKEN, token._themeKey);\n    }\n  });\n  return cachedToken;\n}\nexport var extract = function extract(cache, effectStyles, options) {\n  var _cache = _slicedToArray(cache, 5),\n    realToken = _cache[2],\n    styleStr = _cache[3],\n    cssVarKey = _cache[4];\n  var _ref3 = options || {},\n    plain = _ref3.plain;\n  if (!styleStr) {\n    return null;\n  }\n  var styleId = realToken._tokenKey;\n  var order = -999;\n\n  // ====================== Style ======================\n  // Used for rc-util\n  var sharedAttrs = {\n    'data-rc-order': 'prependQueue',\n    'data-rc-priority': \"\".concat(order)\n  };\n  var styleText = toStyleStr(styleStr, cssVarKey, styleId, sharedAttrs, plain);\n  return [order, styleId, styleText];\n};","function _extends() {\n  return _extends = Object.assign ? Object.assign.bind() : function (n) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n    }\n    return n;\n  }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","var unitlessKeys = {\n  animationIterationCount: 1,\n  borderImageOutset: 1,\n  borderImageSlice: 1,\n  borderImageWidth: 1,\n  boxFlex: 1,\n  boxFlexGroup: 1,\n  boxOrdinalGroup: 1,\n  columnCount: 1,\n  columns: 1,\n  flex: 1,\n  flexGrow: 1,\n  flexPositive: 1,\n  flexShrink: 1,\n  flexNegative: 1,\n  flexOrder: 1,\n  gridRow: 1,\n  gridRowEnd: 1,\n  gridRowSpan: 1,\n  gridRowStart: 1,\n  gridColumn: 1,\n  gridColumnEnd: 1,\n  gridColumnSpan: 1,\n  gridColumnStart: 1,\n  msGridRow: 1,\n  msGridRowSpan: 1,\n  msGridColumn: 1,\n  msGridColumnSpan: 1,\n  fontWeight: 1,\n  lineHeight: 1,\n  opacity: 1,\n  order: 1,\n  orphans: 1,\n  tabSize: 1,\n  widows: 1,\n  zIndex: 1,\n  zoom: 1,\n  WebkitLineClamp: 1,\n  // SVG-related properties\n  fillOpacity: 1,\n  floodOpacity: 1,\n  stopOpacity: 1,\n  strokeDasharray: 1,\n  strokeDashoffset: 1,\n  strokeMiterlimit: 1,\n  strokeOpacity: 1,\n  strokeWidth: 1\n};\n\nexport default unitlessKeys;\n","export var MS = '-ms-'\nexport var MOZ = '-moz-'\nexport var WEBKIT = '-webkit-'\n\nexport var COMMENT = 'comm'\nexport var RULESET = 'rule'\nexport var DECLARATION = 'decl'\n\nexport var PAGE = '@page'\nexport var MEDIA = '@media'\nexport var IMPORT = '@import'\nexport var CHARSET = '@charset'\nexport var VIEWPORT = '@viewport'\nexport var SUPPORTS = '@supports'\nexport var DOCUMENT = '@document'\nexport var NAMESPACE = '@namespace'\nexport var KEYFRAMES = '@keyframes'\nexport var FONT_FACE = '@font-face'\nexport var COUNTER_STYLE = '@counter-style'\nexport var FONT_FEATURE_VALUES = '@font-feature-values'\nexport var LAYER = '@layer'\nexport var SCOPE = '@scope'\n","/**\n * @param {number}\n * @return {number}\n */\nexport var abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nexport var from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nexport var assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nexport function hash (value, length) {\n\treturn charat(value, 0) ^ 45 ? (((((((length << 2) ^ charat(value, 0)) << 2) ^ charat(value, 1)) << 2) ^ charat(value, 2)) << 2) ^ charat(value, 3) : 0\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nexport function trim (value) {\n\treturn value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nexport function match (value, pattern) {\n\treturn (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nexport function replace (value, pattern, replacement) {\n\treturn value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @param {number} position\n * @return {number}\n */\nexport function indexof (value, search, position) {\n\treturn value.indexOf(search, position)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nexport function charat (value, index) {\n\treturn value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function substr (value, begin, end) {\n\treturn value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nexport function strlen (value) {\n\treturn value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nexport function sizeof (value) {\n\treturn value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nexport function append (value, array) {\n\treturn array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nexport function combine (array, callback) {\n\treturn array.map(callback).join('')\n}\n\n/**\n * @param {string[]} array\n * @param {RegExp} pattern\n * @return {string[]}\n */\nexport function filter (array, pattern) {\n\treturn array.filter(function (value) { return !match(value, pattern) })\n}\n","import {IMPORT, LAYER, COMMENT, RULESET, DECLARATION, KEYFRAMES, NAMESPACE} from './Enum.js'\nimport {strlen} from './Utility.js'\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function serialize (children, callback) {\n\tvar output = ''\n\n\tfor (var i = 0; i < children.length; i++)\n\t\toutput += callback(children[i], i, children, callback) || ''\n\n\treturn output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function stringify (element, index, children, callback) {\n\tswitch (element.type) {\n\t\tcase LAYER: if (element.children.length) break\n\t\tcase IMPORT: case NAMESPACE: case DECLARATION: return element.return = element.return || element.value\n\t\tcase COMMENT: return ''\n\t\tcase KEYFRAMES: return element.return = element.value + '{' + serialize(element.children, callback) + '}'\n\t\tcase RULESET: if (!strlen(element.value = element.props.join(','))) return ''\n\t}\n\n\treturn strlen(children = serialize(element.children, callback)) ? element.return = element.value + '{' + children + '}' : ''\n}\n","import {from, trim, charat, strlen, substr, append, assign} from './Utility.js'\n\nexport var line = 1\nexport var column = 1\nexport var length = 0\nexport var position = 0\nexport var character = 0\nexport var characters = ''\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {object[]} siblings\n * @param {number} length\n */\nexport function node (value, root, parent, type, props, children, length, siblings) {\n\treturn {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: '', siblings: siblings}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nexport function copy (root, props) {\n\treturn assign(node('', null, null, '', null, null, 0, root.siblings), root, {length: -root.length}, props)\n}\n\n/**\n * @param {object} root\n */\nexport function lift (root) {\n\twhile (root.root)\n\t\troot = copy(root.root, {children: [root]})\n\n\tappend(root, root.siblings)\n}\n\n/**\n * @return {number}\n */\nexport function char () {\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function prev () {\n\tcharacter = position > 0 ? charat(characters, --position) : 0\n\n\tif (column--, character === 10)\n\t\tcolumn = 1, line--\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function next () {\n\tcharacter = position < length ? charat(characters, position++) : 0\n\n\tif (column++, character === 10)\n\t\tcolumn = 1, line++\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function peek () {\n\treturn charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nexport function caret () {\n\treturn position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function slice (begin, end) {\n\treturn substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function token (type) {\n\tswitch (type) {\n\t\t// \\0 \\t \\n \\r \\s whitespace token\n\t\tcase 0: case 9: case 10: case 13: case 32:\n\t\t\treturn 5\n\t\t// ! + , / > @ ~ isolate token\n\t\tcase 33: case 43: case 44: case 47: case 62: case 64: case 126:\n\t\t// ; { } breakpoint token\n\t\tcase 59: case 123: case 125:\n\t\t\treturn 4\n\t\t// : accompanied token\n\t\tcase 58:\n\t\t\treturn 3\n\t\t// \" ' ( [ opening delimit token\n\t\tcase 34: case 39: case 40: case 91:\n\t\t\treturn 2\n\t\t// ) ] closing delimit token\n\t\tcase 41: case 93:\n\t\t\treturn 1\n\t}\n\n\treturn 0\n}\n\n/**\n * @param {string} value\n * @return {any[]}\n */\nexport function alloc (value) {\n\treturn line = column = 1, length = strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nexport function dealloc (value) {\n\treturn characters = '', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function delimit (type) {\n\treturn trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nexport function tokenize (value) {\n\treturn dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function whitespace (type) {\n\twhile (character = peek())\n\t\tif (character < 33)\n\t\t\tnext()\n\t\telse\n\t\t\tbreak\n\n\treturn token(type) > 2 || token(character) > 3 ? '' : ' '\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nexport function tokenizer (children) {\n\twhile (next())\n\t\tswitch (token(character)) {\n\t\t\tcase 0: append(identifier(position - 1), children)\n\t\t\t\tbreak\n\t\t\tcase 2: append(delimit(character), children)\n\t\t\t\tbreak\n\t\t\tdefault: append(from(character), children)\n\t\t}\n\n\treturn children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nexport function escaping (index, count) {\n\twhile (--count && next())\n\t\t// not 0-9 A-F a-f\n\t\tif (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n\t\t\tbreak\n\n\treturn slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function delimiter (type) {\n\twhile (next())\n\t\tswitch (character) {\n\t\t\t// ] ) \" '\n\t\t\tcase type:\n\t\t\t\treturn position\n\t\t\t// \" '\n\t\t\tcase 34: case 39:\n\t\t\t\tif (type !== 34 && type !== 39)\n\t\t\t\t\tdelimiter(character)\n\t\t\t\tbreak\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (type === 41)\n\t\t\t\t\tdelimiter(type)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tnext()\n\t\t\t\tbreak\n\t\t}\n\n\treturn position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nexport function commenter (type, index) {\n\twhile (next())\n\t\t// //\n\t\tif (type + character === 47 + 10)\n\t\t\tbreak\n\t\t// /*\n\t\telse if (type + character === 42 + 42 && peek() === 47)\n\t\t\tbreak\n\n\treturn '/*' + slice(index, position - 1) + '*' + from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nexport function identifier (index) {\n\twhile (!token(peek()))\n\t\tnext()\n\n\treturn slice(index, position)\n}\n","import {COMMENT, RULESET, DECLARATION} from './Enum.js'\nimport {abs, charat, trim, from, sizeof, strlen, substr, append, replace, indexof} from './Utility.js'\nimport {node, char, prev, next, peek, token, caret, alloc, dealloc, delimit, whitespace, escaping, identifier, commenter} from './Tokenizer.js'\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nexport function compile (value) {\n\treturn dealloc(parse('', null, null, null, [''], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nexport function parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n\tvar index = 0\n\tvar offset = 0\n\tvar length = pseudo\n\tvar atrule = 0\n\tvar property = 0\n\tvar previous = 0\n\tvar variable = 1\n\tvar scanning = 1\n\tvar ampersand = 1\n\tvar character = 0\n\tvar type = ''\n\tvar props = rules\n\tvar children = rulesets\n\tvar reference = rule\n\tvar characters = type\n\n\twhile (scanning)\n\t\tswitch (previous = character, character = next()) {\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (previous != 108 && charat(characters, length - 1) == 58) {\n\t\t\t\t\tif (indexof(characters += replace(delimit(character), '&', '&\\f'), '&\\f', abs(index ? points[index - 1] : 0)) != -1)\n\t\t\t\t\t\tampersand = -1\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t// \" ' [\n\t\t\tcase 34: case 39: case 91:\n\t\t\t\tcharacters += delimit(character)\n\t\t\t\tbreak\n\t\t\t// \\t \\n \\r \\s\n\t\t\tcase 9: case 10: case 13: case 32:\n\t\t\t\tcharacters += whitespace(previous)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tcharacters += escaping(caret() - 1, 7)\n\t\t\t\tcontinue\n\t\t\t// /\n\t\t\tcase 47:\n\t\t\t\tswitch (peek()) {\n\t\t\t\t\tcase 42: case 47:\n\t\t\t\t\t\tappend(comment(commenter(next(), caret()), root, parent, declarations), declarations)\n\t\t\t\t\t\tif ((token(previous || 1) == 5 || token(peek() || 1) == 5) && strlen(characters) && substr(characters, -1, void 0) !== ' ') characters += ' '\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcharacters += '/'\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// {\n\t\t\tcase 123 * variable:\n\t\t\t\tpoints[index++] = strlen(characters) * ampersand\n\t\t\t// } ; \\0\n\t\t\tcase 125 * variable: case 59: case 0:\n\t\t\t\tswitch (character) {\n\t\t\t\t\t// \\0 }\n\t\t\t\t\tcase 0: case 125: scanning = 0\n\t\t\t\t\t// ;\n\t\t\t\t\tcase 59 + offset: if (ampersand == -1) characters = replace(characters, /\\f/g, '')\n\t\t\t\t\t\tif (property > 0 && (strlen(characters) - length || (variable === 0 && previous === 47)))\n\t\t\t\t\t\t\tappend(property > 32 ? declaration(characters + ';', rule, parent, length - 1, declarations) : declaration(replace(characters, ' ', '') + ';', rule, parent, length - 2, declarations), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @ ;\n\t\t\t\t\tcase 59: characters += ';'\n\t\t\t\t\t// { rule/at-rule\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tappend(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length, rulesets), rulesets)\n\n\t\t\t\t\t\tif (character === 123)\n\t\t\t\t\t\t\tif (offset === 0)\n\t\t\t\t\t\t\t\tparse(characters, root, reference, reference, props, rulesets, length, points, children)\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tswitch (atrule) {\n\t\t\t\t\t\t\t\t\t// c(ontainer)\n\t\t\t\t\t\t\t\t\tcase 99:\n\t\t\t\t\t\t\t\t\t\tif (charat(characters, 3) === 110) break\n\t\t\t\t\t\t\t\t\t// l(ayer)\n\t\t\t\t\t\t\t\t\tcase 108:\n\t\t\t\t\t\t\t\t\t\tif (charat(characters, 2) === 97) break\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\toffset = 0\n\t\t\t\t\t\t\t\t\t// d(ocument) m(edia) s(upports)\n\t\t\t\t\t\t\t\t\tcase 100: case 109: case 115:\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (offset) parse(value, reference, reference, rule && append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length, children), children), rules, children, length, points, rule ? props : children)\n\t\t\t\t\t\t\t\telse parse(characters, reference, reference, reference, [''], children, 0, points, children)\n\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = offset = property = 0, variable = ampersand = 1, type = characters = '', length = pseudo\n\t\t\t\tbreak\n\t\t\t// :\n\t\t\tcase 58:\n\t\t\t\tlength = 1 + strlen(characters), property = previous\n\t\t\tdefault:\n\t\t\t\tif (variable < 1)\n\t\t\t\t\tif (character == 123)\n\t\t\t\t\t\t--variable\n\t\t\t\t\telse if (character == 125 && variable++ == 0 && prev() == 125)\n\t\t\t\t\t\tcontinue\n\n\t\t\t\tswitch (characters += from(character), character * variable) {\n\t\t\t\t\t// &\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tampersand = offset > 0 ? 1 : (characters += '\\f', -1)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// ,\n\t\t\t\t\tcase 44:\n\t\t\t\t\t\tpoints[index++] = (strlen(characters) - 1) * ampersand, ampersand = 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @\n\t\t\t\t\tcase 64:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (peek() === 45)\n\t\t\t\t\t\t\tcharacters += delimit(next())\n\n\t\t\t\t\t\tatrule = peek(), offset = length = strlen(type = characters += identifier(caret())), character++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// -\n\t\t\t\t\tcase 45:\n\t\t\t\t\t\tif (previous === 45 && strlen(characters) == 2)\n\t\t\t\t\t\t\tvariable = 0\n\t\t\t\t}\n\t\t}\n\n\treturn rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @param {object[]} siblings\n * @return {object}\n */\nexport function ruleset (value, root, parent, index, offset, rules, points, type, props, children, length, siblings) {\n\tvar post = offset - 1\n\tvar rule = offset === 0 ? rules : ['']\n\tvar size = sizeof(rule)\n\n\tfor (var i = 0, j = 0, k = 0; i < index; ++i)\n\t\tfor (var x = 0, y = substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n\t\t\tif (z = trim(j > 0 ? rule[x] + ' ' + y : replace(y, /&\\f/g, rule[x])))\n\t\t\t\tprops[k++] = z\n\n\treturn node(value, root, parent, offset === 0 ? RULESET : type, props, children, length, siblings)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @param {object[]} siblings\n * @return {object}\n */\nexport function comment (value, root, parent, siblings) {\n\treturn node(value, root, parent, COMMENT, from(char()), substr(value, 2, -2), 0, siblings)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @param {object[]} siblings\n * @return {object}\n */\nexport function declaration (value, root, parent, length, siblings) {\n\treturn node(value, root, parent, DECLARATION, substr(value, 0, length), substr(value, length + 1, -1), length, siblings)\n}\n","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport canUseDom from \"rc-util/es/Dom/canUseDom\";\nimport { ATTR_MARK } from \"../StyleContext\";\nexport var ATTR_CACHE_MAP = 'data-ant-cssinjs-cache-path';\n\n/**\n * This marks style from the css file.\n * Which means not exist in `<style />` tag.\n */\nexport var CSS_FILE_STYLE = '_FILE_STYLE__';\nexport function serialize(cachePathMap) {\n  return Object.keys(cachePathMap).map(function (path) {\n    var hash = cachePathMap[path];\n    return \"\".concat(path, \":\").concat(hash);\n  }).join(';');\n}\nvar cachePathMap;\nvar fromCSSFile = true;\n\n/**\n * @private Test usage only. Can save remove if no need.\n */\nexport function reset(mockCache) {\n  var fromFile = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n  cachePathMap = mockCache;\n  fromCSSFile = fromFile;\n}\nexport function prepare() {\n  if (!cachePathMap) {\n    cachePathMap = {};\n    if (canUseDom()) {\n      var div = document.createElement('div');\n      div.className = ATTR_CACHE_MAP;\n      div.style.position = 'fixed';\n      div.style.visibility = 'hidden';\n      div.style.top = '-9999px';\n      document.body.appendChild(div);\n      var content = getComputedStyle(div).content || '';\n      content = content.replace(/^\"/, '').replace(/\"$/, '');\n\n      // Fill data\n      content.split(';').forEach(function (item) {\n        var _item$split = item.split(':'),\n          _item$split2 = _slicedToArray(_item$split, 2),\n          path = _item$split2[0],\n          hash = _item$split2[1];\n        cachePathMap[path] = hash;\n      });\n\n      // Remove inline record style\n      var inlineMapStyle = document.querySelector(\"style[\".concat(ATTR_CACHE_MAP, \"]\"));\n      if (inlineMapStyle) {\n        var _inlineMapStyle$paren;\n        fromCSSFile = false;\n        (_inlineMapStyle$paren = inlineMapStyle.parentNode) === null || _inlineMapStyle$paren === void 0 || _inlineMapStyle$paren.removeChild(inlineMapStyle);\n      }\n      document.body.removeChild(div);\n    }\n  }\n}\nexport function existPath(path) {\n  prepare();\n  return !!cachePathMap[path];\n}\nexport function getStyleAndHash(path) {\n  var hash = cachePathMap[path];\n  var styleStr = null;\n  if (hash && canUseDom()) {\n    if (fromCSSFile) {\n      styleStr = CSS_FILE_STYLE;\n    } else {\n      var _style = document.querySelector(\"style[\".concat(ATTR_MARK, \"=\\\"\").concat(cachePathMap[path], \"\\\"]\"));\n      if (_style) {\n        styleStr = _style.innerHTML;\n      } else {\n        // Clean up since not exist anymore\n        delete cachePathMap[path];\n      }\n    }\n  }\n  return [styleStr, hash];\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport hash from '@emotion/hash';\nimport { removeCSS, updateCSS } from \"rc-util/es/Dom/dynamicCSS\";\nimport * as React from 'react';\n// @ts-ignore\nimport unitless from '@emotion/unitless';\nimport { compile, serialize, stringify } from 'stylis';\nimport { contentQuotesLinter, hashedAnimationLinter } from \"../linters\";\nimport StyleContext, { ATTR_CACHE_PATH, ATTR_MARK, ATTR_TOKEN, CSS_IN_JS_INSTANCE } from \"../StyleContext\";\nimport { isClientSide, toStyleStr } from \"../util\";\nimport { CSS_FILE_STYLE, existPath, getStyleAndHash } from \"../util/cacheMapUtil\";\nimport useGlobalCache from \"./useGlobalCache\";\nvar SKIP_CHECK = '_skip_check_';\nvar MULTI_VALUE = '_multi_value_';\n// ============================================================================\n// ==                                 Parser                                 ==\n// ============================================================================\n// Preprocessor style content to browser support one\nexport function normalizeStyle(styleStr) {\n  var serialized = serialize(compile(styleStr), stringify);\n  return serialized.replace(/\\{%%%\\:[^;];}/g, ';');\n}\nfunction isCompoundCSSProperty(value) {\n  return _typeof(value) === 'object' && value && (SKIP_CHECK in value || MULTI_VALUE in value);\n}\n\n// 注入 hash 值\nfunction injectSelectorHash(key, hashId, hashPriority) {\n  if (!hashId) {\n    return key;\n  }\n  var hashClassName = \".\".concat(hashId);\n  var hashSelector = hashPriority === 'low' ? \":where(\".concat(hashClassName, \")\") : hashClassName;\n\n  // 注入 hashId\n  var keys = key.split(',').map(function (k) {\n    var _firstPath$match;\n    var fullPath = k.trim().split(/\\s+/);\n\n    // 如果 Selector 第一个是 HTML Element，那我们就插到它的后面。反之，就插到最前面。\n    var firstPath = fullPath[0] || '';\n    var htmlElement = ((_firstPath$match = firstPath.match(/^\\w+/)) === null || _firstPath$match === void 0 ? void 0 : _firstPath$match[0]) || '';\n    firstPath = \"\".concat(htmlElement).concat(hashSelector).concat(firstPath.slice(htmlElement.length));\n    return [firstPath].concat(_toConsumableArray(fullPath.slice(1))).join(' ');\n  });\n  return keys.join(',');\n}\n// Parse CSSObject to style content\nexport var parseStyle = function parseStyle(interpolation) {\n  var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {\n      root: true,\n      parentSelectors: []\n    },\n    root = _ref.root,\n    injectHash = _ref.injectHash,\n    parentSelectors = _ref.parentSelectors;\n  var hashId = config.hashId,\n    layer = config.layer,\n    path = config.path,\n    hashPriority = config.hashPriority,\n    _config$transformers = config.transformers,\n    transformers = _config$transformers === void 0 ? [] : _config$transformers,\n    _config$linters = config.linters,\n    linters = _config$linters === void 0 ? [] : _config$linters;\n  var styleStr = '';\n  var effectStyle = {};\n  function parseKeyframes(keyframes) {\n    var animationName = keyframes.getName(hashId);\n    if (!effectStyle[animationName]) {\n      var _parseStyle = parseStyle(keyframes.style, config, {\n          root: false,\n          parentSelectors: parentSelectors\n        }),\n        _parseStyle2 = _slicedToArray(_parseStyle, 1),\n        _parsedStr = _parseStyle2[0];\n      effectStyle[animationName] = \"@keyframes \".concat(keyframes.getName(hashId)).concat(_parsedStr);\n    }\n  }\n  function flattenList(list) {\n    var fullList = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n    list.forEach(function (item) {\n      if (Array.isArray(item)) {\n        flattenList(item, fullList);\n      } else if (item) {\n        fullList.push(item);\n      }\n    });\n    return fullList;\n  }\n  var flattenStyleList = flattenList(Array.isArray(interpolation) ? interpolation : [interpolation]);\n  flattenStyleList.forEach(function (originStyle) {\n    // Only root level can use raw string\n    var style = typeof originStyle === 'string' && !root ? {} : originStyle;\n    if (typeof style === 'string') {\n      styleStr += \"\".concat(style, \"\\n\");\n    } else if (style._keyframe) {\n      // Keyframe\n      parseKeyframes(style);\n    } else {\n      var mergedStyle = transformers.reduce(function (prev, trans) {\n        var _trans$visit;\n        return (trans === null || trans === void 0 || (_trans$visit = trans.visit) === null || _trans$visit === void 0 ? void 0 : _trans$visit.call(trans, prev)) || prev;\n      }, style);\n\n      // Normal CSSObject\n      Object.keys(mergedStyle).forEach(function (key) {\n        var value = mergedStyle[key];\n        if (_typeof(value) === 'object' && value && (key !== 'animationName' || !value._keyframe) && !isCompoundCSSProperty(value)) {\n          var subInjectHash = false;\n\n          // 当成嵌套对象来处理\n          var mergedKey = key.trim();\n          // Whether treat child as root. In most case it is false.\n          var nextRoot = false;\n\n          // 拆分多个选择器\n          if ((root || injectHash) && hashId) {\n            if (mergedKey.startsWith('@')) {\n              // 略过媒体查询，交给子节点继续插入 hashId\n              subInjectHash = true;\n            } else if (mergedKey === '&') {\n              // 抹掉 root selector 上的单个 &\n              mergedKey = injectSelectorHash('', hashId, hashPriority);\n            } else {\n              // 注入 hashId\n              mergedKey = injectSelectorHash(key, hashId, hashPriority);\n            }\n          } else if (root && !hashId && (mergedKey === '&' || mergedKey === '')) {\n            // In case of `{ '&': { a: { color: 'red' } } }` or `{ '': { a: { color: 'red' } } }` without hashId,\n            // we will get `&{a:{color:red;}}` or `{a:{color:red;}}` string for stylis to compile.\n            // But it does not conform to stylis syntax,\n            // and finally we will get `{color:red;}` as css, which is wrong.\n            // So we need to remove key in root, and treat child `{ a: { color: 'red' } }` as root.\n            mergedKey = '';\n            nextRoot = true;\n          }\n          var _parseStyle3 = parseStyle(value, config, {\n              root: nextRoot,\n              injectHash: subInjectHash,\n              parentSelectors: [].concat(_toConsumableArray(parentSelectors), [mergedKey])\n            }),\n            _parseStyle4 = _slicedToArray(_parseStyle3, 2),\n            _parsedStr2 = _parseStyle4[0],\n            childEffectStyle = _parseStyle4[1];\n          effectStyle = _objectSpread(_objectSpread({}, effectStyle), childEffectStyle);\n          styleStr += \"\".concat(mergedKey).concat(_parsedStr2);\n        } else {\n          var _value;\n          function appendStyle(cssKey, cssValue) {\n            if (process.env.NODE_ENV !== 'production' && (_typeof(value) !== 'object' || !(value !== null && value !== void 0 && value[SKIP_CHECK]))) {\n              [contentQuotesLinter, hashedAnimationLinter].concat(_toConsumableArray(linters)).forEach(function (linter) {\n                return linter(cssKey, cssValue, {\n                  path: path,\n                  hashId: hashId,\n                  parentSelectors: parentSelectors\n                });\n              });\n            }\n\n            // 如果是样式则直接插入\n            var styleName = cssKey.replace(/[A-Z]/g, function (match) {\n              return \"-\".concat(match.toLowerCase());\n            });\n\n            // Auto suffix with px\n            var formatValue = cssValue;\n            if (!unitless[cssKey] && typeof formatValue === 'number' && formatValue !== 0) {\n              formatValue = \"\".concat(formatValue, \"px\");\n            }\n\n            // handle animationName & Keyframe value\n            if (cssKey === 'animationName' && cssValue !== null && cssValue !== void 0 && cssValue._keyframe) {\n              parseKeyframes(cssValue);\n              formatValue = cssValue.getName(hashId);\n            }\n            styleStr += \"\".concat(styleName, \":\").concat(formatValue, \";\");\n          }\n          var actualValue = (_value = value === null || value === void 0 ? void 0 : value.value) !== null && _value !== void 0 ? _value : value;\n          if (_typeof(value) === 'object' && value !== null && value !== void 0 && value[MULTI_VALUE] && Array.isArray(actualValue)) {\n            actualValue.forEach(function (item) {\n              appendStyle(key, item);\n            });\n          } else {\n            appendStyle(key, actualValue);\n          }\n        }\n      });\n    }\n  });\n  if (!root) {\n    styleStr = \"{\".concat(styleStr, \"}\");\n  } else if (layer) {\n    // fixme: https://github.com/thysultan/stylis/pull/339\n    if (styleStr) {\n      styleStr = \"@layer \".concat(layer.name, \" {\").concat(styleStr, \"}\");\n    }\n    if (layer.dependencies) {\n      effectStyle[\"@layer \".concat(layer.name)] = layer.dependencies.map(function (deps) {\n        return \"@layer \".concat(deps, \", \").concat(layer.name, \";\");\n      }).join('\\n');\n    }\n  }\n  return [styleStr, effectStyle];\n};\n\n// ============================================================================\n// ==                                Register                                ==\n// ============================================================================\nexport function uniqueHash(path, styleStr) {\n  return hash(\"\".concat(path.join('%')).concat(styleStr));\n}\nfunction Empty() {\n  return null;\n}\nexport var STYLE_PREFIX = 'style';\n/**\n * Register a style to the global style sheet.\n */\nexport default function useStyleRegister(info, styleFn) {\n  var token = info.token,\n    path = info.path,\n    hashId = info.hashId,\n    layer = info.layer,\n    nonce = info.nonce,\n    clientOnly = info.clientOnly,\n    _info$order = info.order,\n    order = _info$order === void 0 ? 0 : _info$order;\n  var _React$useContext = React.useContext(StyleContext),\n    autoClear = _React$useContext.autoClear,\n    mock = _React$useContext.mock,\n    defaultCache = _React$useContext.defaultCache,\n    hashPriority = _React$useContext.hashPriority,\n    container = _React$useContext.container,\n    ssrInline = _React$useContext.ssrInline,\n    transformers = _React$useContext.transformers,\n    linters = _React$useContext.linters,\n    cache = _React$useContext.cache,\n    enableLayer = _React$useContext.layer;\n  var tokenKey = token._tokenKey;\n  var fullPath = [tokenKey];\n  if (enableLayer) {\n    fullPath.push('layer');\n  }\n  fullPath.push.apply(fullPath, _toConsumableArray(path));\n\n  // Check if need insert style\n  var isMergedClientSide = isClientSide;\n  if (process.env.NODE_ENV !== 'production' && mock !== undefined) {\n    isMergedClientSide = mock === 'client';\n  }\n  var _useGlobalCache = useGlobalCache(STYLE_PREFIX, fullPath,\n    // Create cache if needed\n    function () {\n      var cachePath = fullPath.join('|');\n\n      // Get style from SSR inline style directly\n      if (existPath(cachePath)) {\n        var _getStyleAndHash = getStyleAndHash(cachePath),\n          _getStyleAndHash2 = _slicedToArray(_getStyleAndHash, 2),\n          inlineCacheStyleStr = _getStyleAndHash2[0],\n          styleHash = _getStyleAndHash2[1];\n        if (inlineCacheStyleStr) {\n          return [inlineCacheStyleStr, tokenKey, styleHash, {}, clientOnly, order];\n        }\n      }\n\n      // Generate style\n      var styleObj = styleFn();\n      var _parseStyle5 = parseStyle(styleObj, {\n          hashId: hashId,\n          hashPriority: hashPriority,\n          layer: enableLayer ? layer : undefined,\n          path: path.join('-'),\n          transformers: transformers,\n          linters: linters\n        }),\n        _parseStyle6 = _slicedToArray(_parseStyle5, 2),\n        parsedStyle = _parseStyle6[0],\n        effectStyle = _parseStyle6[1];\n      var styleStr = normalizeStyle(parsedStyle);\n      var styleId = uniqueHash(fullPath, styleStr);\n      return [styleStr, tokenKey, styleId, effectStyle, clientOnly, order];\n    },\n    // Remove cache if no need\n    function (_ref2, fromHMR) {\n      var _ref3 = _slicedToArray(_ref2, 3),\n        styleId = _ref3[2];\n      if ((fromHMR || autoClear) && isClientSide) {\n        removeCSS(styleId, {\n          mark: ATTR_MARK\n        });\n      }\n    },\n    // Effect: Inject style here\n    function (_ref4) {\n      var _ref5 = _slicedToArray(_ref4, 4),\n        styleStr = _ref5[0],\n        _ = _ref5[1],\n        styleId = _ref5[2],\n        effectStyle = _ref5[3];\n      if (isMergedClientSide && styleStr !== CSS_FILE_STYLE) {\n        var mergedCSSConfig = {\n          mark: ATTR_MARK,\n          prepend: enableLayer ? false : 'queue',\n          attachTo: container,\n          priority: order\n        };\n        var nonceStr = typeof nonce === 'function' ? nonce() : nonce;\n        if (nonceStr) {\n          mergedCSSConfig.csp = {\n            nonce: nonceStr\n          };\n        }\n\n        // ================= Split Effect Style =================\n        // We will split effectStyle here since @layer should be at the top level\n        var effectLayerKeys = [];\n        var effectRestKeys = [];\n        Object.keys(effectStyle).forEach(function (key) {\n          if (key.startsWith('@layer')) {\n            effectLayerKeys.push(key);\n          } else {\n            effectRestKeys.push(key);\n          }\n        });\n\n        // ================= Inject Layer Style =================\n        // Inject layer style\n        effectLayerKeys.forEach(function (effectKey) {\n          updateCSS(normalizeStyle(effectStyle[effectKey]), \"_layer-\".concat(effectKey), _objectSpread(_objectSpread({}, mergedCSSConfig), {}, {\n            prepend: true\n          }));\n        });\n\n        // ==================== Inject Style ====================\n        // Inject style\n        var style = updateCSS(styleStr, styleId, mergedCSSConfig);\n        style[CSS_IN_JS_INSTANCE] = cache.instanceId;\n\n        // Used for `useCacheToken` to remove on batch when token removed\n        style.setAttribute(ATTR_TOKEN, tokenKey);\n\n        // Debug usage. Dev only\n        if (process.env.NODE_ENV !== 'production') {\n          style.setAttribute(ATTR_CACHE_PATH, fullPath.join('|'));\n        }\n\n        // ================ Inject Effect Style =================\n        // Inject client side effect style\n        effectRestKeys.forEach(function (effectKey) {\n          updateCSS(normalizeStyle(effectStyle[effectKey]), \"_effect-\".concat(effectKey), mergedCSSConfig);\n        });\n      }\n    }),\n    _useGlobalCache2 = _slicedToArray(_useGlobalCache, 3),\n    cachedStyleStr = _useGlobalCache2[0],\n    cachedTokenKey = _useGlobalCache2[1],\n    cachedStyleId = _useGlobalCache2[2];\n  return function (node) {\n    var styleNode;\n    if (!ssrInline || isMergedClientSide || !defaultCache) {\n      styleNode = /*#__PURE__*/React.createElement(Empty, null);\n    } else {\n      var _ref6;\n      styleNode = /*#__PURE__*/React.createElement(\"style\", _extends({}, (_ref6 = {}, _defineProperty(_ref6, ATTR_TOKEN, cachedTokenKey), _defineProperty(_ref6, ATTR_MARK, cachedStyleId), _ref6), {\n        dangerouslySetInnerHTML: {\n          __html: cachedStyleStr\n        }\n      }));\n    }\n    return /*#__PURE__*/React.createElement(React.Fragment, null, styleNode, node);\n  };\n}\nexport var extract = function extract(cache, effectStyles, options) {\n  var _cache = _slicedToArray(cache, 6),\n    styleStr = _cache[0],\n    tokenKey = _cache[1],\n    styleId = _cache[2],\n    effectStyle = _cache[3],\n    clientOnly = _cache[4],\n    order = _cache[5];\n  var _ref7 = options || {},\n    plain = _ref7.plain;\n\n  // Skip client only style\n  if (clientOnly) {\n    return null;\n  }\n  var keyStyleText = styleStr;\n\n  // ====================== Share ======================\n  // Used for rc-util\n  var sharedAttrs = {\n    'data-rc-order': 'prependQueue',\n    'data-rc-priority': \"\".concat(order)\n  };\n\n  // ====================== Style ======================\n  keyStyleText = toStyleStr(styleStr, tokenKey, styleId, sharedAttrs, plain);\n\n  // =============== Create effect style ===============\n  if (effectStyle) {\n    Object.keys(effectStyle).forEach(function (effectKey) {\n      // Effect style can be reused\n      if (!effectStyles[effectKey]) {\n        effectStyles[effectKey] = true;\n        var effectStyleStr = normalizeStyle(effectStyle[effectKey]);\n        var effectStyleHTML = toStyleStr(effectStyleStr, tokenKey, \"_effect-\".concat(effectKey), sharedAttrs, plain);\n        if (effectKey.startsWith('@layer')) {\n          keyStyleText = effectStyleHTML + keyStyleText;\n        } else {\n          keyStyleText += effectStyleHTML;\n        }\n      }\n    });\n  }\n  return [order, styleId, keyStyleText];\n};","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport { removeCSS, updateCSS } from \"rc-util/es/Dom/dynamicCSS\";\nimport { useContext } from 'react';\nimport StyleContext, { ATTR_MARK, ATTR_TOKEN, CSS_IN_JS_INSTANCE } from \"../StyleContext\";\nimport { isClientSide, toStyleStr } from \"../util\";\nimport { transformToken } from \"../util/css-variables\";\nimport useGlobalCache from \"./useGlobalCache\";\nimport { uniqueHash } from \"./useStyleRegister\";\nexport var CSS_VAR_PREFIX = 'cssVar';\nvar useCSSVarRegister = function useCSSVarRegister(config, fn) {\n  var key = config.key,\n    prefix = config.prefix,\n    unitless = config.unitless,\n    ignore = config.ignore,\n    token = config.token,\n    _config$scope = config.scope,\n    scope = _config$scope === void 0 ? '' : _config$scope;\n  var _useContext = useContext(StyleContext),\n    instanceId = _useContext.cache.instanceId,\n    container = _useContext.container;\n  var tokenKey = token._tokenKey;\n  var stylePath = [].concat(_toConsumableArray(config.path), [key, scope, tokenKey]);\n  var cache = useGlobalCache(CSS_VAR_PREFIX, stylePath, function () {\n    var originToken = fn();\n    var _transformToken = transformToken(originToken, key, {\n        prefix: prefix,\n        unitless: unitless,\n        ignore: ignore,\n        scope: scope\n      }),\n      _transformToken2 = _slicedToArray(_transformToken, 2),\n      mergedToken = _transformToken2[0],\n      cssVarsStr = _transformToken2[1];\n    var styleId = uniqueHash(stylePath, cssVarsStr);\n    return [mergedToken, cssVarsStr, styleId, key];\n  }, function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 3),\n      styleId = _ref2[2];\n    if (isClientSide) {\n      removeCSS(styleId, {\n        mark: ATTR_MARK\n      });\n    }\n  }, function (_ref3) {\n    var _ref4 = _slicedToArray(_ref3, 3),\n      cssVarsStr = _ref4[1],\n      styleId = _ref4[2];\n    if (!cssVarsStr) {\n      return;\n    }\n    var style = updateCSS(cssVarsStr, styleId, {\n      mark: ATTR_MARK,\n      prepend: 'queue',\n      attachTo: container,\n      priority: -999\n    });\n    style[CSS_IN_JS_INSTANCE] = instanceId;\n\n    // Used for `useCacheToken` to remove on batch when token removed\n    style.setAttribute(ATTR_TOKEN, key);\n  });\n  return cache;\n};\nexport var extract = function extract(cache, effectStyles, options) {\n  var _cache = _slicedToArray(cache, 4),\n    styleStr = _cache[1],\n    styleId = _cache[2],\n    cssVarKey = _cache[3];\n  var _ref5 = options || {},\n    plain = _ref5.plain;\n  if (!styleStr) {\n    return null;\n  }\n  var order = -999;\n\n  // ====================== Style ======================\n  // Used for rc-util\n  var sharedAttrs = {\n    'data-rc-order': 'prependQueue',\n    'data-rc-priority': \"\".concat(order)\n  };\n  var styleText = toStyleStr(styleStr, cssVarKey, styleId, sharedAttrs, plain);\n  return [order, styleId, styleText];\n};\nexport default useCSSVarRegister;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nvar _ExtractStyleFns;\nimport { extract as tokenExtractStyle, TOKEN_PREFIX } from \"./hooks/useCacheToken\";\nimport { CSS_VAR_PREFIX, extract as cssVarExtractStyle } from \"./hooks/useCSSVarRegister\";\nimport { extract as styleExtractStyle, STYLE_PREFIX } from \"./hooks/useStyleRegister\";\nimport { toStyleStr } from \"./util\";\nimport { ATTR_CACHE_MAP, serialize as serializeCacheMap } from \"./util/cacheMapUtil\";\nvar ExtractStyleFns = (_ExtractStyleFns = {}, _defineProperty(_ExtractStyleFns, STYLE_PREFIX, styleExtractStyle), _defineProperty(_ExtractStyleFns, TOKEN_PREFIX, tokenExtractStyle), _defineProperty(_ExtractStyleFns, CSS_VAR_PREFIX, cssVarExtractStyle), _ExtractStyleFns);\nfunction isNotNull(value) {\n  return value !== null;\n}\nexport default function extractStyle(cache, options) {\n  var _ref = typeof options === 'boolean' ? {\n      plain: options\n    } : options || {},\n    _ref$plain = _ref.plain,\n    plain = _ref$plain === void 0 ? false : _ref$plain,\n    _ref$types = _ref.types,\n    types = _ref$types === void 0 ? ['style', 'token', 'cssVar'] : _ref$types;\n  var matchPrefixRegexp = new RegExp(\"^(\".concat((typeof types === 'string' ? [types] : types).join('|'), \")%\"));\n\n  // prefix with `style` is used for `useStyleRegister` to cache style context\n  var styleKeys = Array.from(cache.cache.keys()).filter(function (key) {\n    return matchPrefixRegexp.test(key);\n  });\n\n  // Common effect styles like animation\n  var effectStyles = {};\n\n  // Mapping of cachePath to style hash\n  var cachePathMap = {};\n  var styleText = '';\n  styleKeys.map(function (key) {\n    var cachePath = key.replace(matchPrefixRegexp, '').replace(/%/g, '|');\n    var _key$split = key.split('%'),\n      _key$split2 = _slicedToArray(_key$split, 1),\n      prefix = _key$split2[0];\n    var extractFn = ExtractStyleFns[prefix];\n    var extractedStyle = extractFn(cache.cache.get(key)[1], effectStyles, {\n      plain: plain\n    });\n    if (!extractedStyle) {\n      return null;\n    }\n    var _extractedStyle = _slicedToArray(extractedStyle, 3),\n      order = _extractedStyle[0],\n      styleId = _extractedStyle[1],\n      styleStr = _extractedStyle[2];\n    if (key.startsWith('style')) {\n      cachePathMap[cachePath] = styleId;\n    }\n    return [order, styleStr];\n  }).filter(isNotNull).sort(function (_ref2, _ref3) {\n    var _ref4 = _slicedToArray(_ref2, 1),\n      o1 = _ref4[0];\n    var _ref5 = _slicedToArray(_ref3, 1),\n      o2 = _ref5[0];\n    return o1 - o2;\n  }).forEach(function (_ref6) {\n    var _ref7 = _slicedToArray(_ref6, 2),\n      style = _ref7[1];\n    styleText += style;\n  });\n\n  // ==================== Fill Cache Path ====================\n  styleText += toStyleStr(\".\".concat(ATTR_CACHE_MAP, \"{content:\\\"\").concat(serializeCacheMap(cachePathMap), \"\\\";}\"), undefined, undefined, _defineProperty({}, ATTR_CACHE_MAP, ATTR_CACHE_MAP), plain);\n  return styleText;\n}","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nvar Keyframe = /*#__PURE__*/function () {\n  function Keyframe(name, style) {\n    _classCallCheck(this, Keyframe);\n    _defineProperty(this, \"name\", void 0);\n    _defineProperty(this, \"style\", void 0);\n    _defineProperty(this, \"_keyframe\", true);\n    this.name = name;\n    this.style = style;\n  }\n  _createClass(Keyframe, [{\n    key: \"getName\",\n    value: function getName() {\n      var hashId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n      return hashId ? \"\".concat(hashId, \"-\").concat(this.name) : this.name;\n    }\n  }]);\n  return Keyframe;\n}();\nexport default Keyframe;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nfunction splitValues(value) {\n  if (typeof value === 'number') {\n    return [[value], false];\n  }\n  var rawStyle = String(value).trim();\n  var importantCells = rawStyle.match(/(.*)(!important)/);\n  var splitStyle = (importantCells ? importantCells[1] : rawStyle).trim().split(/\\s+/);\n\n  // Combine styles split in brackets, like `calc(1px + 2px)`\n  var temp = [];\n  var brackets = 0;\n  return [splitStyle.reduce(function (list, item) {\n    if (item.includes('(') || item.includes(')')) {\n      var left = item.split('(').length - 1;\n      var right = item.split(')').length - 1;\n      brackets += left - right;\n    }\n    if (brackets >= 0) temp.push(item);\n    if (brackets === 0) {\n      list.push(temp.join(' '));\n      temp = [];\n    }\n    return list;\n  }, []), !!importantCells];\n}\nfunction noSplit(list) {\n  list.notSplit = true;\n  return list;\n}\nvar keyMap = {\n  // Inset\n  inset: ['top', 'right', 'bottom', 'left'],\n  insetBlock: ['top', 'bottom'],\n  insetBlockStart: ['top'],\n  insetBlockEnd: ['bottom'],\n  insetInline: ['left', 'right'],\n  insetInlineStart: ['left'],\n  insetInlineEnd: ['right'],\n  // Margin\n  marginBlock: ['marginTop', 'marginBottom'],\n  marginBlockStart: ['marginTop'],\n  marginBlockEnd: ['marginBottom'],\n  marginInline: ['marginLeft', 'marginRight'],\n  marginInlineStart: ['marginLeft'],\n  marginInlineEnd: ['marginRight'],\n  // Padding\n  paddingBlock: ['paddingTop', 'paddingBottom'],\n  paddingBlockStart: ['paddingTop'],\n  paddingBlockEnd: ['paddingBottom'],\n  paddingInline: ['paddingLeft', 'paddingRight'],\n  paddingInlineStart: ['paddingLeft'],\n  paddingInlineEnd: ['paddingRight'],\n  // Border\n  borderBlock: noSplit(['borderTop', 'borderBottom']),\n  borderBlockStart: noSplit(['borderTop']),\n  borderBlockEnd: noSplit(['borderBottom']),\n  borderInline: noSplit(['borderLeft', 'borderRight']),\n  borderInlineStart: noSplit(['borderLeft']),\n  borderInlineEnd: noSplit(['borderRight']),\n  // Border width\n  borderBlockWidth: ['borderTopWidth', 'borderBottomWidth'],\n  borderBlockStartWidth: ['borderTopWidth'],\n  borderBlockEndWidth: ['borderBottomWidth'],\n  borderInlineWidth: ['borderLeftWidth', 'borderRightWidth'],\n  borderInlineStartWidth: ['borderLeftWidth'],\n  borderInlineEndWidth: ['borderRightWidth'],\n  // Border style\n  borderBlockStyle: ['borderTopStyle', 'borderBottomStyle'],\n  borderBlockStartStyle: ['borderTopStyle'],\n  borderBlockEndStyle: ['borderBottomStyle'],\n  borderInlineStyle: ['borderLeftStyle', 'borderRightStyle'],\n  borderInlineStartStyle: ['borderLeftStyle'],\n  borderInlineEndStyle: ['borderRightStyle'],\n  // Border color\n  borderBlockColor: ['borderTopColor', 'borderBottomColor'],\n  borderBlockStartColor: ['borderTopColor'],\n  borderBlockEndColor: ['borderBottomColor'],\n  borderInlineColor: ['borderLeftColor', 'borderRightColor'],\n  borderInlineStartColor: ['borderLeftColor'],\n  borderInlineEndColor: ['borderRightColor'],\n  // Border radius\n  borderStartStartRadius: ['borderTopLeftRadius'],\n  borderStartEndRadius: ['borderTopRightRadius'],\n  borderEndStartRadius: ['borderBottomLeftRadius'],\n  borderEndEndRadius: ['borderBottomRightRadius']\n};\nfunction wrapImportantAndSkipCheck(value, important) {\n  var parsedValue = value;\n  if (important) {\n    parsedValue = \"\".concat(parsedValue, \" !important\");\n  }\n  return {\n    _skip_check_: true,\n    value: parsedValue\n  };\n}\n\n/**\n * Convert css logical properties to legacy properties.\n * Such as: `margin-block-start` to `margin-top`.\n * Transform list:\n * - inset\n * - margin\n * - padding\n * - border\n */\nvar transform = {\n  visit: function visit(cssObj) {\n    var clone = {};\n    Object.keys(cssObj).forEach(function (key) {\n      var value = cssObj[key];\n      var matchValue = keyMap[key];\n      if (matchValue && (typeof value === 'number' || typeof value === 'string')) {\n        var _splitValues = splitValues(value),\n          _splitValues2 = _slicedToArray(_splitValues, 2),\n          _values = _splitValues2[0],\n          _important = _splitValues2[1];\n        if (matchValue.length && matchValue.notSplit) {\n          // not split means always give same value like border\n          matchValue.forEach(function (matchKey) {\n            clone[matchKey] = wrapImportantAndSkipCheck(value, _important);\n          });\n        } else if (matchValue.length === 1) {\n          // Handle like `marginBlockStart` => `marginTop`\n          clone[matchValue[0]] = wrapImportantAndSkipCheck(_values[0], _important);\n        } else if (matchValue.length === 2) {\n          // Handle like `marginBlock` => `marginTop` & `marginBottom`\n          matchValue.forEach(function (matchKey, index) {\n            var _values$index;\n            clone[matchKey] = wrapImportantAndSkipCheck((_values$index = _values[index]) !== null && _values$index !== void 0 ? _values$index : _values[0], _important);\n          });\n        } else if (matchValue.length === 4) {\n          // Handle like `inset` => `top` & `right` & `bottom` & `left`\n          matchValue.forEach(function (matchKey, index) {\n            var _ref, _values$index2;\n            clone[matchKey] = wrapImportantAndSkipCheck((_ref = (_values$index2 = _values[index]) !== null && _values$index2 !== void 0 ? _values$index2 : _values[index - 2]) !== null && _ref !== void 0 ? _ref : _values[0], _important);\n          });\n        } else {\n          clone[key] = value;\n        }\n      } else {\n        clone[key] = value;\n      }\n    });\n    return clone;\n  }\n};\nexport default transform;","import { createContext } from 'react';\nvar IconContext = /*#__PURE__*/createContext({});\nexport default IconContext;","export default function get(entity, path) {\n  var current = entity;\n  for (var i = 0; i < path.length; i += 1) {\n    if (current === null || current === undefined) {\n      return undefined;\n    }\n    current = current[path[i]];\n  }\n  return current;\n}","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _toArray from \"@babel/runtime/helpers/esm/toArray\";\nimport get from \"./get\";\nfunction internalSet(entity, paths, value, removeIfUndefined) {\n  if (!paths.length) {\n    return value;\n  }\n  var _paths = _toArray(paths),\n    path = _paths[0],\n    restPath = _paths.slice(1);\n  var clone;\n  if (!entity && typeof path === 'number') {\n    clone = [];\n  } else if (Array.isArray(entity)) {\n    clone = _toConsumableArray(entity);\n  } else {\n    clone = _objectSpread({}, entity);\n  }\n\n  // Delete prop if `removeIfUndefined` and value is undefined\n  if (removeIfUndefined && value === undefined && restPath.length === 1) {\n    delete clone[path][restPath[0]];\n  } else {\n    clone[path] = internalSet(clone[path], restPath, value, removeIfUndefined);\n  }\n  return clone;\n}\nexport default function set(entity, paths, value) {\n  var removeIfUndefined = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n  // Do nothing if `removeIfUndefined` and parent object not exist\n  if (paths.length && removeIfUndefined && value === undefined && !get(entity, paths.slice(0, -1))) {\n    return entity;\n  }\n  return internalSet(entity, paths, value, removeIfUndefined);\n}\nfunction isObject(obj) {\n  return _typeof(obj) === 'object' && obj !== null && Object.getPrototypeOf(obj) === Object.prototype;\n}\nfunction createEmpty(source) {\n  return Array.isArray(source) ? [] : {};\n}\nvar keys = typeof Reflect === 'undefined' ? Object.keys : Reflect.ownKeys;\n\n/**\n * Merge objects which will create\n */\nexport function merge() {\n  for (var _len = arguments.length, sources = new Array(_len), _key = 0; _key < _len; _key++) {\n    sources[_key] = arguments[_key];\n  }\n  var clone = createEmpty(sources[0]);\n  sources.forEach(function (src) {\n    function internalMerge(path, parentLoopSet) {\n      var loopSet = new Set(parentLoopSet);\n      var value = get(src, path);\n      var isArr = Array.isArray(value);\n      if (isArr || isObject(value)) {\n        // Only add not loop obj\n        if (!loopSet.has(value)) {\n          loopSet.add(value);\n          var originValue = get(clone, path);\n          if (isArr) {\n            // Array will always be override\n            clone = set(clone, path, []);\n          } else if (!originValue || _typeof(originValue) !== 'object') {\n            // Init container if not exist\n            clone = set(clone, path, createEmpty(value));\n          }\n          keys(value).forEach(function (key) {\n            internalMerge([].concat(_toConsumableArray(path), [key]), loopSet);\n          });\n        }\n      } else {\n        clone = set(clone, path, value);\n      }\n    }\n    internalMerge([]);\n  });\n  return clone;\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _toArray(r) {\n  return arrayWithHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableRest();\n}\nexport { _toArray as default };","import * as React from 'react';\nimport rcWarning, { resetWarned as rcResetWarned } from \"rc-util/es/warning\";\nexport function noop() {}\nlet deprecatedWarnList = null;\nexport function resetWarned() {\n  deprecatedWarnList = null;\n  rcResetWarned();\n}\n// eslint-disable-next-line import/no-mutable-exports\nlet warning = noop;\nif (process.env.NODE_ENV !== 'production') {\n  warning = (valid, component, message) => {\n    rcWarning(valid, `[antd: ${component}] ${message}`);\n    // StrictMode will inject console which will not throw warning in React 17.\n    if (process.env.NODE_ENV === 'test') {\n      resetWarned();\n    }\n  };\n}\nexport const WarningContext = /*#__PURE__*/React.createContext({});\n/**\n * This is a hook but we not named as `useWarning`\n * since this is only used in development.\n * We should always wrap this in `if (process.env.NODE_ENV !== 'production')` condition\n */\nexport const devUseWarning = process.env.NODE_ENV !== 'production' ? component => {\n  const {\n    strict\n  } = React.useContext(WarningContext);\n  const typeWarning = (valid, type, message) => {\n    if (!valid) {\n      if (strict === false && type === 'deprecated') {\n        const existWarning = deprecatedWarnList;\n        if (!deprecatedWarnList) {\n          deprecatedWarnList = {};\n        }\n        deprecatedWarnList[component] = deprecatedWarnList[component] || [];\n        if (!deprecatedWarnList[component].includes(message || '')) {\n          deprecatedWarnList[component].push(message || '');\n        }\n        // Warning for the first time\n        if (!existWarning) {\n          console.warn('[antd] There exists deprecated usage in your code:', deprecatedWarnList);\n        }\n      } else {\n        process.env.NODE_ENV !== \"production\" ? warning(valid, component, message) : void 0;\n      }\n    }\n  };\n  typeWarning.deprecated = (valid, oldProp, newProp, message) => {\n    typeWarning(valid, 'deprecated', `\\`${oldProp}\\` is deprecated. Please use \\`${newProp}\\` instead.${message ? ` ${message}` : ''}`);\n  };\n  return typeWarning;\n} : () => {\n  const noopWarning = () => {};\n  noopWarning.deprecated = noop;\n  return noopWarning;\n};\nexport default warning;","\"use client\";\n\nimport { createContext } from 'react';\n// ZombieJ: We export single file here since\n// ConfigProvider use this which will make loop deps\n// to import whole `rc-field-form`\nexport default /*#__PURE__*/createContext(undefined);","var locale = {\n  // Options\n  items_per_page: '/ page',\n  jump_to: 'Go to',\n  jump_to_confirm: 'confirm',\n  page: 'Page',\n  // Pagination\n  prev_page: 'Previous Page',\n  next_page: 'Next Page',\n  prev_5: 'Previous 5 Pages',\n  next_5: 'Next 5 Pages',\n  prev_3: 'Previous 3 Pages',\n  next_3: 'Next 3 Pages',\n  page_size: 'Page Size'\n};\nexport default locale;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport { commonLocale } from \"./common\";\nvar locale = _objectSpread(_objectSpread({}, commonLocale), {}, {\n  locale: 'en_US',\n  today: 'Today',\n  now: 'Now',\n  backToToday: 'Back to today',\n  ok: 'OK',\n  clear: 'Clear',\n  week: 'Week',\n  month: 'Month',\n  year: 'Year',\n  timeSelect: 'select time',\n  dateSelect: 'select date',\n  weekSelect: 'Choose a week',\n  monthSelect: 'Choose a month',\n  yearSelect: 'Choose a year',\n  decadeSelect: 'Choose a decade',\n  dateFormat: 'M/D/YYYY',\n  dateTimeFormat: 'M/D/YYYY HH:mm:ss',\n  previousMonth: 'Previous month (PageUp)',\n  nextMonth: 'Next month (PageDown)',\n  previousYear: 'Last year (Control + left)',\n  nextYear: 'Next year (Control + right)',\n  previousDecade: 'Last decade',\n  nextDecade: 'Next decade',\n  previousCentury: 'Last century',\n  nextCentury: 'Next century'\n});\nexport default locale;","export var commonLocale = {\n  yearFormat: 'YYYY',\n  dayFormat: 'D',\n  cellMeridiemFormat: 'A',\n  monthBeforeYear: true\n};","const locale = {\n  placeholder: 'Select time',\n  rangePlaceholder: ['Start time', 'End time']\n};\nexport default locale;","import CalendarLocale from \"rc-picker/es/locale/en_US\";\nimport TimePickerLocale from '../../time-picker/locale/en_US';\n// Merge into a locale object\nconst locale = {\n  lang: Object.assign({\n    placeholder: 'Select date',\n    yearPlaceholder: 'Select year',\n    quarterPlaceholder: 'Select quarter',\n    monthPlaceholder: 'Select month',\n    weekPlaceholder: 'Select week',\n    rangePlaceholder: ['Start date', 'End date'],\n    rangeYearPlaceholder: ['Start year', 'End year'],\n    rangeQuarterPlaceholder: ['Start quarter', 'End quarter'],\n    rangeMonthPlaceholder: ['Start month', 'End month'],\n    rangeWeekPlaceholder: ['Start week', 'End week']\n  }, CalendarLocale),\n  timePickerLocale: Object.assign({}, TimePickerLocale)\n};\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nexport default locale;","import Pagination from \"rc-pagination/es/locale/en_US\";\nimport Calendar from '../calendar/locale/en_US';\nimport DatePicker from '../date-picker/locale/en_US';\nimport TimePicker from '../time-picker/locale/en_US';\nconst typeTemplate = '${label} is not a valid ${type}';\nconst localeValues = {\n  locale: 'en',\n  Pagination,\n  DatePicker,\n  TimePicker,\n  Calendar,\n  global: {\n    placeholder: 'Please select',\n    close: 'Close'\n  },\n  Table: {\n    filterTitle: 'Filter menu',\n    filterConfirm: 'OK',\n    filterReset: 'Reset',\n    filterEmptyText: 'No filters',\n    filterCheckAll: 'Select all items',\n    filterSearchPlaceholder: 'Search in filters',\n    emptyText: 'No data',\n    selectAll: 'Select current page',\n    selectInvert: 'Invert current page',\n    selectNone: 'Clear all data',\n    selectionAll: 'Select all data',\n    sortTitle: 'Sort',\n    expand: 'Expand row',\n    collapse: 'Collapse row',\n    triggerDesc: 'Click to sort descending',\n    triggerAsc: 'Click to sort ascending',\n    cancelSort: 'Click to cancel sorting'\n  },\n  Tour: {\n    Next: 'Next',\n    Previous: 'Previous',\n    Finish: 'Finish'\n  },\n  Modal: {\n    okText: 'OK',\n    cancelText: 'Cancel',\n    justOkText: 'OK'\n  },\n  Popconfirm: {\n    okText: 'OK',\n    cancelText: 'Cancel'\n  },\n  Transfer: {\n    titles: ['', ''],\n    searchPlaceholder: 'Search here',\n    itemUnit: 'item',\n    itemsUnit: 'items',\n    remove: 'Remove',\n    selectCurrent: 'Select current page',\n    removeCurrent: 'Remove current page',\n    selectAll: 'Select all data',\n    deselectAll: 'Deselect all data',\n    removeAll: 'Remove all data',\n    selectInvert: 'Invert current page'\n  },\n  Upload: {\n    uploading: 'Uploading...',\n    removeFile: 'Remove file',\n    uploadError: 'Upload error',\n    previewFile: 'Preview file',\n    downloadFile: 'Download file'\n  },\n  Empty: {\n    description: 'No data'\n  },\n  Icon: {\n    icon: 'icon'\n  },\n  Text: {\n    edit: 'Edit',\n    copy: 'Copy',\n    copied: 'Copied',\n    expand: 'Expand',\n    collapse: 'Collapse'\n  },\n  Form: {\n    optional: '(optional)',\n    defaultValidateMessages: {\n      default: 'Field validation error for ${label}',\n      required: 'Please enter ${label}',\n      enum: '${label} must be one of [${enum}]',\n      whitespace: '${label} cannot be a blank character',\n      date: {\n        format: '${label} date format is invalid',\n        parse: '${label} cannot be converted to a date',\n        invalid: '${label} is an invalid date'\n      },\n      types: {\n        string: typeTemplate,\n        method: typeTemplate,\n        array: typeTemplate,\n        object: typeTemplate,\n        number: typeTemplate,\n        date: typeTemplate,\n        boolean: typeTemplate,\n        integer: typeTemplate,\n        float: typeTemplate,\n        regexp: typeTemplate,\n        email: typeTemplate,\n        url: typeTemplate,\n        hex: typeTemplate\n      },\n      string: {\n        len: '${label} must be ${len} characters',\n        min: '${label} must be at least ${min} characters',\n        max: '${label} must be up to ${max} characters',\n        range: '${label} must be between ${min}-${max} characters'\n      },\n      number: {\n        len: '${label} must be equal to ${len}',\n        min: '${label} must be minimum ${min}',\n        max: '${label} must be maximum ${max}',\n        range: '${label} must be between ${min}-${max}'\n      },\n      array: {\n        len: 'Must be ${len} ${label}',\n        min: 'At least ${min} ${label}',\n        max: 'At most ${max} ${label}',\n        range: 'The amount of ${label} must be between ${min}-${max}'\n      },\n      pattern: {\n        mismatch: '${label} does not match the pattern ${pattern}'\n      }\n    }\n  },\n  Image: {\n    preview: 'Preview'\n  },\n  QRCode: {\n    expired: 'QR code expired',\n    refresh: 'Refresh',\n    scanned: 'Scanned'\n  },\n  ColorPicker: {\n    presetEmpty: 'Empty',\n    transparent: 'Transparent',\n    singleColor: 'Single',\n    gradientColor: 'Gradient'\n  }\n};\nexport default localeValues;","import defaultLocale from '../locale/en_US';\nlet runtimeLocale = Object.assign({}, defaultLocale.Modal);\nlet localeList = [];\nconst generateLocale = () => localeList.reduce((merged, locale) => Object.assign(Object.assign({}, merged), locale), defaultLocale.Modal);\nexport function changeConfirmLocale(newLocale) {\n  if (newLocale) {\n    const cloneLocale = Object.assign({}, newLocale);\n    localeList.push(cloneLocale);\n    runtimeLocale = generateLocale();\n    return () => {\n      localeList = localeList.filter(locale => locale !== cloneLocale);\n      runtimeLocale = generateLocale();\n    };\n  }\n  runtimeLocale = Object.assign({}, defaultLocale.Modal);\n}\nexport function getConfirmLocale() {\n  return runtimeLocale;\n}","import { createContext } from 'react';\nconst LocaleContext = /*#__PURE__*/createContext(undefined);\nexport default LocaleContext;","\"use client\";\n\nimport * as React from 'react';\nimport { devUseWarning } from '../_util/warning';\nimport { changeConfirmLocale } from '../modal/locale';\nimport LocaleContext from './context';\nexport { default as useLocale } from './useLocale';\nexport const ANT_MARK = 'internalMark';\nconst LocaleProvider = props => {\n  const {\n    locale = {},\n    children,\n    _ANT_MARK__\n  } = props;\n  if (process.env.NODE_ENV !== 'production') {\n    const warning = devUseWarning('LocaleProvider');\n    process.env.NODE_ENV !== \"production\" ? warning(_ANT_MARK__ === ANT_MARK, 'deprecated', '`LocaleProvider` is deprecated. Please use `locale` with `ConfigProvider` instead: http://u.ant.design/locale') : void 0;\n  }\n  React.useEffect(() => {\n    const clearLocale = changeConfirmLocale(locale === null || locale === void 0 ? void 0 : locale.Modal);\n    return clearLocale;\n  }, [locale]);\n  const getMemoizedContextValue = React.useMemo(() => Object.assign(Object.assign({}, locale), {\n    exist: true\n  }), [locale]);\n  return /*#__PURE__*/React.createElement(LocaleContext.Provider, {\n    value: getMemoizedContextValue\n  }, children);\n};\nif (process.env.NODE_ENV !== 'production') {\n  LocaleProvider.displayName = 'LocaleProvider';\n}\nexport default LocaleProvider;","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nconst round = Math.round;\n\n/**\n * Support format, alpha unit will check the % mark:\n * - rgba(102, 204, 255, .5)      -> [102, 204, 255, 0.5]\n * - rgb(102 204 255 / .5)        -> [102, 204, 255, 0.5]\n * - rgb(100%, 50%, 0% / 50%)     -> [255, 128, 0, 0.5]\n * - hsl(270, 60, 40, .5)         -> [270, 60, 40, 0.5]\n * - hsl(270deg 60% 40% / 50%)   -> [270, 60, 40, 0.5]\n *\n * When `base` is provided, the percentage value will be divided by `base`.\n */\nfunction splitColorStr(str, parseNum) {\n  const match = str\n  // Remove str before `(`\n  .replace(/^[^(]*\\((.*)/, '$1')\n  // Remove str after `)`\n  .replace(/\\).*/, '').match(/\\d*\\.?\\d+%?/g) || [];\n  const numList = match.map(item => parseFloat(item));\n  for (let i = 0; i < 3; i += 1) {\n    numList[i] = parseNum(numList[i] || 0, match[i] || '', i);\n  }\n\n  // For alpha. 50% should be 0.5\n  if (match[3]) {\n    numList[3] = match[3].includes('%') ? numList[3] / 100 : numList[3];\n  } else {\n    // By default, alpha is 1\n    numList[3] = 1;\n  }\n  return numList;\n}\nconst parseHSVorHSL = (num, _, index) => index === 0 ? num : num / 100;\n\n/** round and limit number to integer between 0-255 */\nfunction limitRange(value, max) {\n  const mergedMax = max || 255;\n  if (value > mergedMax) {\n    return mergedMax;\n  }\n  if (value < 0) {\n    return 0;\n  }\n  return value;\n}\nexport class FastColor {\n  constructor(input) {\n    /**\n     * All FastColor objects are valid. So isValid is always true. This property is kept to be compatible with TinyColor.\n     */\n    _defineProperty(this, \"isValid\", true);\n    /**\n     * Red, R in RGB\n     */\n    _defineProperty(this, \"r\", 0);\n    /**\n     * Green, G in RGB\n     */\n    _defineProperty(this, \"g\", 0);\n    /**\n     * Blue, B in RGB\n     */\n    _defineProperty(this, \"b\", 0);\n    /**\n     * Alpha/Opacity, A in RGBA/HSLA\n     */\n    _defineProperty(this, \"a\", 1);\n    // HSV privates\n    _defineProperty(this, \"_h\", void 0);\n    _defineProperty(this, \"_s\", void 0);\n    _defineProperty(this, \"_l\", void 0);\n    _defineProperty(this, \"_v\", void 0);\n    // intermediate variables to calculate HSL/HSV\n    _defineProperty(this, \"_max\", void 0);\n    _defineProperty(this, \"_min\", void 0);\n    _defineProperty(this, \"_brightness\", void 0);\n    /**\n     * Always check 3 char in the object to determine the format.\n     * We not use function in check to save bundle size.\n     * e.g. 'rgb' -> { r: 0, g: 0, b: 0 }.\n     */\n    function matchFormat(str) {\n      return str[0] in input && str[1] in input && str[2] in input;\n    }\n    if (!input) {\n      // Do nothing since already initialized\n    } else if (typeof input === 'string') {\n      const trimStr = input.trim();\n      function matchPrefix(prefix) {\n        return trimStr.startsWith(prefix);\n      }\n      if (/^#?[A-F\\d]{3,8}$/i.test(trimStr)) {\n        this.fromHexString(trimStr);\n      } else if (matchPrefix('rgb')) {\n        this.fromRgbString(trimStr);\n      } else if (matchPrefix('hsl')) {\n        this.fromHslString(trimStr);\n      } else if (matchPrefix('hsv') || matchPrefix('hsb')) {\n        this.fromHsvString(trimStr);\n      }\n    } else if (input instanceof FastColor) {\n      this.r = input.r;\n      this.g = input.g;\n      this.b = input.b;\n      this.a = input.a;\n      this._h = input._h;\n      this._s = input._s;\n      this._l = input._l;\n      this._v = input._v;\n    } else if (matchFormat('rgb')) {\n      this.r = limitRange(input.r);\n      this.g = limitRange(input.g);\n      this.b = limitRange(input.b);\n      this.a = typeof input.a === 'number' ? limitRange(input.a, 1) : 1;\n    } else if (matchFormat('hsl')) {\n      this.fromHsl(input);\n    } else if (matchFormat('hsv')) {\n      this.fromHsv(input);\n    } else {\n      throw new Error('@ant-design/fast-color: unsupported input ' + JSON.stringify(input));\n    }\n  }\n\n  // ======================= Setter =======================\n\n  setR(value) {\n    return this._sc('r', value);\n  }\n  setG(value) {\n    return this._sc('g', value);\n  }\n  setB(value) {\n    return this._sc('b', value);\n  }\n  setA(value) {\n    return this._sc('a', value, 1);\n  }\n  setHue(value) {\n    const hsv = this.toHsv();\n    hsv.h = value;\n    return this._c(hsv);\n  }\n\n  // ======================= Getter =======================\n  /**\n   * Returns the perceived luminance of a color, from 0-1.\n   * @see http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n   */\n  getLuminance() {\n    function adjustGamma(raw) {\n      const val = raw / 255;\n      return val <= 0.03928 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);\n    }\n    const R = adjustGamma(this.r);\n    const G = adjustGamma(this.g);\n    const B = adjustGamma(this.b);\n    return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n  }\n  getHue() {\n    if (typeof this._h === 'undefined') {\n      const delta = this.getMax() - this.getMin();\n      if (delta === 0) {\n        this._h = 0;\n      } else {\n        this._h = round(60 * (this.r === this.getMax() ? (this.g - this.b) / delta + (this.g < this.b ? 6 : 0) : this.g === this.getMax() ? (this.b - this.r) / delta + 2 : (this.r - this.g) / delta + 4));\n      }\n    }\n    return this._h;\n  }\n  getSaturation() {\n    if (typeof this._s === 'undefined') {\n      const delta = this.getMax() - this.getMin();\n      if (delta === 0) {\n        this._s = 0;\n      } else {\n        this._s = delta / this.getMax();\n      }\n    }\n    return this._s;\n  }\n  getLightness() {\n    if (typeof this._l === 'undefined') {\n      this._l = (this.getMax() + this.getMin()) / 510;\n    }\n    return this._l;\n  }\n  getValue() {\n    if (typeof this._v === 'undefined') {\n      this._v = this.getMax() / 255;\n    }\n    return this._v;\n  }\n\n  /**\n   * Returns the perceived brightness of the color, from 0-255.\n   * Note: this is not the b of HSB\n   * @see http://www.w3.org/TR/AERT#color-contrast\n   */\n  getBrightness() {\n    if (typeof this._brightness === 'undefined') {\n      this._brightness = (this.r * 299 + this.g * 587 + this.b * 114) / 1000;\n    }\n    return this._brightness;\n  }\n\n  // ======================== Func ========================\n\n  darken(amount = 10) {\n    const h = this.getHue();\n    const s = this.getSaturation();\n    let l = this.getLightness() - amount / 100;\n    if (l < 0) {\n      l = 0;\n    }\n    return this._c({\n      h,\n      s,\n      l,\n      a: this.a\n    });\n  }\n  lighten(amount = 10) {\n    const h = this.getHue();\n    const s = this.getSaturation();\n    let l = this.getLightness() + amount / 100;\n    if (l > 1) {\n      l = 1;\n    }\n    return this._c({\n      h,\n      s,\n      l,\n      a: this.a\n    });\n  }\n\n  /**\n   * Mix the current color a given amount with another color, from 0 to 100.\n   * 0 means no mixing (return current color).\n   */\n  mix(input, amount = 50) {\n    const color = this._c(input);\n    const p = amount / 100;\n    const calc = key => (color[key] - this[key]) * p + this[key];\n    const rgba = {\n      r: round(calc('r')),\n      g: round(calc('g')),\n      b: round(calc('b')),\n      a: round(calc('a') * 100) / 100\n    };\n    return this._c(rgba);\n  }\n\n  /**\n   * Mix the color with pure white, from 0 to 100.\n   * Providing 0 will do nothing, providing 100 will always return white.\n   */\n  tint(amount = 10) {\n    return this.mix({\n      r: 255,\n      g: 255,\n      b: 255,\n      a: 1\n    }, amount);\n  }\n\n  /**\n   * Mix the color with pure black, from 0 to 100.\n   * Providing 0 will do nothing, providing 100 will always return black.\n   */\n  shade(amount = 10) {\n    return this.mix({\n      r: 0,\n      g: 0,\n      b: 0,\n      a: 1\n    }, amount);\n  }\n  onBackground(background) {\n    const bg = this._c(background);\n    const alpha = this.a + bg.a * (1 - this.a);\n    const calc = key => {\n      return round((this[key] * this.a + bg[key] * bg.a * (1 - this.a)) / alpha);\n    };\n    return this._c({\n      r: calc('r'),\n      g: calc('g'),\n      b: calc('b'),\n      a: alpha\n    });\n  }\n\n  // ======================= Status =======================\n  isDark() {\n    return this.getBrightness() < 128;\n  }\n  isLight() {\n    return this.getBrightness() >= 128;\n  }\n\n  // ======================== MISC ========================\n  equals(other) {\n    return this.r === other.r && this.g === other.g && this.b === other.b && this.a === other.a;\n  }\n  clone() {\n    return this._c(this);\n  }\n\n  // ======================= Format =======================\n  toHexString() {\n    let hex = '#';\n    const rHex = (this.r || 0).toString(16);\n    hex += rHex.length === 2 ? rHex : '0' + rHex;\n    const gHex = (this.g || 0).toString(16);\n    hex += gHex.length === 2 ? gHex : '0' + gHex;\n    const bHex = (this.b || 0).toString(16);\n    hex += bHex.length === 2 ? bHex : '0' + bHex;\n    if (typeof this.a === 'number' && this.a >= 0 && this.a < 1) {\n      const aHex = round(this.a * 255).toString(16);\n      hex += aHex.length === 2 ? aHex : '0' + aHex;\n    }\n    return hex;\n  }\n\n  /** CSS support color pattern */\n  toHsl() {\n    return {\n      h: this.getHue(),\n      s: this.getSaturation(),\n      l: this.getLightness(),\n      a: this.a\n    };\n  }\n\n  /** CSS support color pattern */\n  toHslString() {\n    const h = this.getHue();\n    const s = round(this.getSaturation() * 100);\n    const l = round(this.getLightness() * 100);\n    return this.a !== 1 ? `hsla(${h},${s}%,${l}%,${this.a})` : `hsl(${h},${s}%,${l}%)`;\n  }\n\n  /** Same as toHsb */\n  toHsv() {\n    return {\n      h: this.getHue(),\n      s: this.getSaturation(),\n      v: this.getValue(),\n      a: this.a\n    };\n  }\n  toRgb() {\n    return {\n      r: this.r,\n      g: this.g,\n      b: this.b,\n      a: this.a\n    };\n  }\n  toRgbString() {\n    return this.a !== 1 ? `rgba(${this.r},${this.g},${this.b},${this.a})` : `rgb(${this.r},${this.g},${this.b})`;\n  }\n  toString() {\n    return this.toRgbString();\n  }\n\n  // ====================== Privates ======================\n  /** Return a new FastColor object with one channel changed */\n  _sc(rgb, value, max) {\n    const clone = this.clone();\n    clone[rgb] = limitRange(value, max);\n    return clone;\n  }\n  _c(input) {\n    return new this.constructor(input);\n  }\n  getMax() {\n    if (typeof this._max === 'undefined') {\n      this._max = Math.max(this.r, this.g, this.b);\n    }\n    return this._max;\n  }\n  getMin() {\n    if (typeof this._min === 'undefined') {\n      this._min = Math.min(this.r, this.g, this.b);\n    }\n    return this._min;\n  }\n  fromHexString(trimStr) {\n    const withoutPrefix = trimStr.replace('#', '');\n    function connectNum(index1, index2) {\n      return parseInt(withoutPrefix[index1] + withoutPrefix[index2 || index1], 16);\n    }\n    if (withoutPrefix.length < 6) {\n      // #rgb or #rgba\n      this.r = connectNum(0);\n      this.g = connectNum(1);\n      this.b = connectNum(2);\n      this.a = withoutPrefix[3] ? connectNum(3) / 255 : 1;\n    } else {\n      // #rrggbb or #rrggbbaa\n      this.r = connectNum(0, 1);\n      this.g = connectNum(2, 3);\n      this.b = connectNum(4, 5);\n      this.a = withoutPrefix[6] ? connectNum(6, 7) / 255 : 1;\n    }\n  }\n  fromHsl({\n    h,\n    s,\n    l,\n    a\n  }) {\n    this._h = h % 360;\n    this._s = s;\n    this._l = l;\n    this.a = typeof a === 'number' ? a : 1;\n    if (s <= 0) {\n      const rgb = round(l * 255);\n      this.r = rgb;\n      this.g = rgb;\n      this.b = rgb;\n    }\n    let r = 0,\n      g = 0,\n      b = 0;\n    const huePrime = h / 60;\n    const chroma = (1 - Math.abs(2 * l - 1)) * s;\n    const secondComponent = chroma * (1 - Math.abs(huePrime % 2 - 1));\n    if (huePrime >= 0 && huePrime < 1) {\n      r = chroma;\n      g = secondComponent;\n    } else if (huePrime >= 1 && huePrime < 2) {\n      r = secondComponent;\n      g = chroma;\n    } else if (huePrime >= 2 && huePrime < 3) {\n      g = chroma;\n      b = secondComponent;\n    } else if (huePrime >= 3 && huePrime < 4) {\n      g = secondComponent;\n      b = chroma;\n    } else if (huePrime >= 4 && huePrime < 5) {\n      r = secondComponent;\n      b = chroma;\n    } else if (huePrime >= 5 && huePrime < 6) {\n      r = chroma;\n      b = secondComponent;\n    }\n    const lightnessModification = l - chroma / 2;\n    this.r = round((r + lightnessModification) * 255);\n    this.g = round((g + lightnessModification) * 255);\n    this.b = round((b + lightnessModification) * 255);\n  }\n  fromHsv({\n    h,\n    s,\n    v,\n    a\n  }) {\n    this._h = h % 360;\n    this._s = s;\n    this._v = v;\n    this.a = typeof a === 'number' ? a : 1;\n    const vv = round(v * 255);\n    this.r = vv;\n    this.g = vv;\n    this.b = vv;\n    if (s <= 0) {\n      return;\n    }\n    const hh = h / 60;\n    const i = Math.floor(hh);\n    const ff = hh - i;\n    const p = round(v * (1.0 - s) * 255);\n    const q = round(v * (1.0 - s * ff) * 255);\n    const t = round(v * (1.0 - s * (1.0 - ff)) * 255);\n    switch (i) {\n      case 0:\n        this.g = t;\n        this.b = p;\n        break;\n      case 1:\n        this.r = q;\n        this.b = p;\n        break;\n      case 2:\n        this.r = p;\n        this.b = t;\n        break;\n      case 3:\n        this.r = p;\n        this.g = q;\n        break;\n      case 4:\n        this.r = t;\n        this.g = p;\n        break;\n      case 5:\n      default:\n        this.g = p;\n        this.b = q;\n        break;\n    }\n  }\n  fromHsvString(trimStr) {\n    const cells = splitColorStr(trimStr, parseHSVorHSL);\n    this.fromHsv({\n      h: cells[0],\n      s: cells[1],\n      v: cells[2],\n      a: cells[3]\n    });\n  }\n  fromHslString(trimStr) {\n    const cells = splitColorStr(trimStr, parseHSVorHSL);\n    this.fromHsl({\n      h: cells[0],\n      s: cells[1],\n      l: cells[2],\n      a: cells[3]\n    });\n  }\n  fromRgbString(trimStr) {\n    const cells = splitColorStr(trimStr, (num, txt) =>\n    // Convert percentage to number. e.g. 50% -> 128\n    txt.includes('%') ? round(num / 100 * 255) : num);\n    this.r = cells[0];\n    this.g = cells[1];\n    this.b = cells[2];\n    this.a = cells[3];\n  }\n}","import { FastColor } from '@ant-design/fast-color';\nvar hueStep = 2; // 色相阶梯\nvar saturationStep = 0.16; // 饱和度阶梯，浅色部分\nvar saturationStep2 = 0.05; // 饱和度阶梯，深色部分\nvar brightnessStep1 = 0.05; // 亮度阶梯，浅色部分\nvar brightnessStep2 = 0.15; // 亮度阶梯，深色部分\nvar lightColorCount = 5; // 浅色数量，主色上\nvar darkColorCount = 4; // 深色数量，主色下\n\n// 暗色主题颜色映射关系表\nvar darkColorMap = [{\n  index: 7,\n  amount: 15\n}, {\n  index: 6,\n  amount: 25\n}, {\n  index: 5,\n  amount: 30\n}, {\n  index: 5,\n  amount: 45\n}, {\n  index: 5,\n  amount: 65\n}, {\n  index: 5,\n  amount: 85\n}, {\n  index: 4,\n  amount: 90\n}, {\n  index: 3,\n  amount: 95\n}, {\n  index: 2,\n  amount: 97\n}, {\n  index: 1,\n  amount: 98\n}];\nfunction getHue(hsv, i, light) {\n  var hue;\n  // 根据色相不同，色相转向不同\n  if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {\n    hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i;\n  } else {\n    hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i;\n  }\n  if (hue < 0) {\n    hue += 360;\n  } else if (hue >= 360) {\n    hue -= 360;\n  }\n  return hue;\n}\nfunction getSaturation(hsv, i, light) {\n  // grey color don't change saturation\n  if (hsv.h === 0 && hsv.s === 0) {\n    return hsv.s;\n  }\n  var saturation;\n  if (light) {\n    saturation = hsv.s - saturationStep * i;\n  } else if (i === darkColorCount) {\n    saturation = hsv.s + saturationStep;\n  } else {\n    saturation = hsv.s + saturationStep2 * i;\n  }\n  // 边界值修正\n  if (saturation > 1) {\n    saturation = 1;\n  }\n  // 第一格的 s 限制在 0.06-0.1 之间\n  if (light && i === lightColorCount && saturation > 0.1) {\n    saturation = 0.1;\n  }\n  if (saturation < 0.06) {\n    saturation = 0.06;\n  }\n  return Math.round(saturation * 100) / 100;\n}\nfunction getValue(hsv, i, light) {\n  var value;\n  if (light) {\n    value = hsv.v + brightnessStep1 * i;\n  } else {\n    value = hsv.v - brightnessStep2 * i;\n  }\n  // Clamp value between 0 and 1\n  value = Math.max(0, Math.min(1, value));\n  return Math.round(value * 100) / 100;\n}\nexport default function generate(color) {\n  var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  var patterns = [];\n  var pColor = new FastColor(color);\n  var hsv = pColor.toHsv();\n  for (var i = lightColorCount; i > 0; i -= 1) {\n    var c = new FastColor({\n      h: getHue(hsv, i, true),\n      s: getSaturation(hsv, i, true),\n      v: getValue(hsv, i, true)\n    });\n    patterns.push(c);\n  }\n  patterns.push(pColor);\n  for (var _i = 1; _i <= darkColorCount; _i += 1) {\n    var _c = new FastColor({\n      h: getHue(hsv, _i),\n      s: getSaturation(hsv, _i),\n      v: getValue(hsv, _i)\n    });\n    patterns.push(_c);\n  }\n\n  // dark theme patterns\n  if (opts.theme === 'dark') {\n    return darkColorMap.map(function (_ref) {\n      var index = _ref.index,\n        amount = _ref.amount;\n      return new FastColor(opts.backgroundColor || '#141414').mix(patterns[index], amount).toHexString();\n    });\n  }\n  return patterns.map(function (c) {\n    return c.toHexString();\n  });\n}","// Generated by script. Do NOT modify!\n\nexport var presetPrimaryColors = {\n  \"red\": \"#F5222D\",\n  \"volcano\": \"#FA541C\",\n  \"orange\": \"#FA8C16\",\n  \"gold\": \"#FAAD14\",\n  \"yellow\": \"#FADB14\",\n  \"lime\": \"#A0D911\",\n  \"green\": \"#52C41A\",\n  \"cyan\": \"#13C2C2\",\n  \"blue\": \"#1677FF\",\n  \"geekblue\": \"#2F54EB\",\n  \"purple\": \"#722ED1\",\n  \"magenta\": \"#EB2F96\",\n  \"grey\": \"#666666\"\n};\nexport var red = [\"#fff1f0\", \"#ffccc7\", \"#ffa39e\", \"#ff7875\", \"#ff4d4f\", \"#f5222d\", \"#cf1322\", \"#a8071a\", \"#820014\", \"#5c0011\"];\nred.primary = red[5];\nexport var volcano = [\"#fff2e8\", \"#ffd8bf\", \"#ffbb96\", \"#ff9c6e\", \"#ff7a45\", \"#fa541c\", \"#d4380d\", \"#ad2102\", \"#871400\", \"#610b00\"];\nvolcano.primary = volcano[5];\nexport var orange = [\"#fff7e6\", \"#ffe7ba\", \"#ffd591\", \"#ffc069\", \"#ffa940\", \"#fa8c16\", \"#d46b08\", \"#ad4e00\", \"#873800\", \"#612500\"];\norange.primary = orange[5];\nexport var gold = [\"#fffbe6\", \"#fff1b8\", \"#ffe58f\", \"#ffd666\", \"#ffc53d\", \"#faad14\", \"#d48806\", \"#ad6800\", \"#874d00\", \"#613400\"];\ngold.primary = gold[5];\nexport var yellow = [\"#feffe6\", \"#ffffb8\", \"#fffb8f\", \"#fff566\", \"#ffec3d\", \"#fadb14\", \"#d4b106\", \"#ad8b00\", \"#876800\", \"#614700\"];\nyellow.primary = yellow[5];\nexport var lime = [\"#fcffe6\", \"#f4ffb8\", \"#eaff8f\", \"#d3f261\", \"#bae637\", \"#a0d911\", \"#7cb305\", \"#5b8c00\", \"#3f6600\", \"#254000\"];\nlime.primary = lime[5];\nexport var green = [\"#f6ffed\", \"#d9f7be\", \"#b7eb8f\", \"#95de64\", \"#73d13d\", \"#52c41a\", \"#389e0d\", \"#237804\", \"#135200\", \"#092b00\"];\ngreen.primary = green[5];\nexport var cyan = [\"#e6fffb\", \"#b5f5ec\", \"#87e8de\", \"#5cdbd3\", \"#36cfc9\", \"#13c2c2\", \"#08979c\", \"#006d75\", \"#00474f\", \"#002329\"];\ncyan.primary = cyan[5];\nexport var blue = [\"#e6f4ff\", \"#bae0ff\", \"#91caff\", \"#69b1ff\", \"#4096ff\", \"#1677ff\", \"#0958d9\", \"#003eb3\", \"#002c8c\", \"#001d66\"];\nblue.primary = blue[5];\nexport var geekblue = [\"#f0f5ff\", \"#d6e4ff\", \"#adc6ff\", \"#85a5ff\", \"#597ef7\", \"#2f54eb\", \"#1d39c4\", \"#10239e\", \"#061178\", \"#030852\"];\ngeekblue.primary = geekblue[5];\nexport var purple = [\"#f9f0ff\", \"#efdbff\", \"#d3adf7\", \"#b37feb\", \"#9254de\", \"#722ed1\", \"#531dab\", \"#391085\", \"#22075e\", \"#120338\"];\npurple.primary = purple[5];\nexport var magenta = [\"#fff0f6\", \"#ffd6e7\", \"#ffadd2\", \"#ff85c0\", \"#f759ab\", \"#eb2f96\", \"#c41d7f\", \"#9e1068\", \"#780650\", \"#520339\"];\nmagenta.primary = magenta[5];\nexport var grey = [\"#a6a6a6\", \"#999999\", \"#8c8c8c\", \"#808080\", \"#737373\", \"#666666\", \"#404040\", \"#1a1a1a\", \"#000000\", \"#000000\"];\ngrey.primary = grey[5];\nexport var gray = grey;\nexport var presetPalettes = {\n  red: red,\n  volcano: volcano,\n  orange: orange,\n  gold: gold,\n  yellow: yellow,\n  lime: lime,\n  green: green,\n  cyan: cyan,\n  blue: blue,\n  geekblue: geekblue,\n  purple: purple,\n  magenta: magenta,\n  grey: grey\n};\nexport var redDark = [\"#2a1215\", \"#431418\", \"#58181c\", \"#791a1f\", \"#a61d24\", \"#d32029\", \"#e84749\", \"#f37370\", \"#f89f9a\", \"#fac8c3\"];\nredDark.primary = redDark[5];\nexport var volcanoDark = [\"#2b1611\", \"#441d12\", \"#592716\", \"#7c3118\", \"#aa3e19\", \"#d84a1b\", \"#e87040\", \"#f3956a\", \"#f8b692\", \"#fad4bc\"];\nvolcanoDark.primary = volcanoDark[5];\nexport var orangeDark = [\"#2b1d11\", \"#442a11\", \"#593815\", \"#7c4a15\", \"#aa6215\", \"#d87a16\", \"#e89a3c\", \"#f3b765\", \"#f8cf8d\", \"#fae3b7\"];\norangeDark.primary = orangeDark[5];\nexport var goldDark = [\"#2b2111\", \"#443111\", \"#594214\", \"#7c5914\", \"#aa7714\", \"#d89614\", \"#e8b339\", \"#f3cc62\", \"#f8df8b\", \"#faedb5\"];\ngoldDark.primary = goldDark[5];\nexport var yellowDark = [\"#2b2611\", \"#443b11\", \"#595014\", \"#7c6e14\", \"#aa9514\", \"#d8bd14\", \"#e8d639\", \"#f3ea62\", \"#f8f48b\", \"#fafab5\"];\nyellowDark.primary = yellowDark[5];\nexport var limeDark = [\"#1f2611\", \"#2e3c10\", \"#3e4f13\", \"#536d13\", \"#6f9412\", \"#8bbb11\", \"#a9d134\", \"#c9e75d\", \"#e4f88b\", \"#f0fab5\"];\nlimeDark.primary = limeDark[5];\nexport var greenDark = [\"#162312\", \"#1d3712\", \"#274916\", \"#306317\", \"#3c8618\", \"#49aa19\", \"#6abe39\", \"#8fd460\", \"#b2e58b\", \"#d5f2bb\"];\ngreenDark.primary = greenDark[5];\nexport var cyanDark = [\"#112123\", \"#113536\", \"#144848\", \"#146262\", \"#138585\", \"#13a8a8\", \"#33bcb7\", \"#58d1c9\", \"#84e2d8\", \"#b2f1e8\"];\ncyanDark.primary = cyanDark[5];\nexport var blueDark = [\"#111a2c\", \"#112545\", \"#15325b\", \"#15417e\", \"#1554ad\", \"#1668dc\", \"#3c89e8\", \"#65a9f3\", \"#8dc5f8\", \"#b7dcfa\"];\nblueDark.primary = blueDark[5];\nexport var geekblueDark = [\"#131629\", \"#161d40\", \"#1c2755\", \"#203175\", \"#263ea0\", \"#2b4acb\", \"#5273e0\", \"#7f9ef3\", \"#a8c1f8\", \"#d2e0fa\"];\ngeekblueDark.primary = geekblueDark[5];\nexport var purpleDark = [\"#1a1325\", \"#24163a\", \"#301c4d\", \"#3e2069\", \"#51258f\", \"#642ab5\", \"#854eca\", \"#ab7ae0\", \"#cda8f0\", \"#ebd7fa\"];\npurpleDark.primary = purpleDark[5];\nexport var magentaDark = [\"#291321\", \"#40162f\", \"#551c3b\", \"#75204f\", \"#a02669\", \"#cb2b83\", \"#e0529c\", \"#f37fb7\", \"#f8a8cc\", \"#fad2e3\"];\nmagentaDark.primary = magentaDark[5];\nexport var greyDark = [\"#151515\", \"#1f1f1f\", \"#2d2d2d\", \"#393939\", \"#494949\", \"#5a5a5a\", \"#6a6a6a\", \"#7b7b7b\", \"#888888\", \"#969696\"];\ngreyDark.primary = greyDark[5];\nexport var presetDarkPalettes = {\n  red: redDark,\n  volcano: volcanoDark,\n  orange: orangeDark,\n  gold: goldDark,\n  yellow: yellowDark,\n  lime: limeDark,\n  green: greenDark,\n  cyan: cyanDark,\n  blue: blueDark,\n  geekblue: geekblueDark,\n  purple: purpleDark,\n  magenta: magentaDark,\n  grey: greyDark\n};","export const defaultPresetColors = {\n  blue: '#1677FF',\n  purple: '#722ED1',\n  cyan: '#13C2C2',\n  green: '#52C41A',\n  magenta: '#EB2F96',\n  /**\n   * @deprecated Use magenta instead\n   */\n  pink: '#EB2F96',\n  red: '#F5222D',\n  orange: '#FA8C16',\n  yellow: '#FADB14',\n  volcano: '#FA541C',\n  geekblue: '#2F54EB',\n  gold: '#FAAD14',\n  lime: '#A0D911'\n};\nconst seedToken = Object.assign(Object.assign({}, defaultPresetColors), {\n  // Color\n  colorPrimary: '#1677ff',\n  colorSuccess: '#52c41a',\n  colorWarning: '#faad14',\n  colorError: '#ff4d4f',\n  colorInfo: '#1677ff',\n  colorLink: '',\n  colorTextBase: '',\n  colorBgBase: '',\n  // Font\n  fontFamily: `-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,\n'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',\n'Noto Color Emoji'`,\n  fontFamilyCode: `'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace`,\n  fontSize: 14,\n  // Line\n  lineWidth: 1,\n  lineType: 'solid',\n  // Motion\n  motionUnit: 0.1,\n  motionBase: 0,\n  motionEaseOutCirc: 'cubic-bezier(0.08, 0.82, 0.17, 1)',\n  motionEaseInOutCirc: 'cubic-bezier(0.78, 0.14, 0.15, 0.86)',\n  motionEaseOut: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n  motionEaseInOut: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n  motionEaseOutBack: 'cubic-bezier(0.12, 0.4, 0.29, 1.46)',\n  motionEaseInBack: 'cubic-bezier(0.71, -0.46, 0.88, 0.6)',\n  motionEaseInQuint: 'cubic-bezier(0.755, 0.05, 0.855, 0.06)',\n  motionEaseOutQuint: 'cubic-bezier(0.23, 1, 0.32, 1)',\n  // Radius\n  borderRadius: 6,\n  // Size\n  sizeUnit: 4,\n  sizeStep: 4,\n  sizePopupArrow: 16,\n  // Control Base\n  controlHeight: 32,\n  // zIndex\n  zIndexBase: 0,\n  zIndexPopupBase: 1000,\n  // Image\n  opacityImage: 1,\n  // Wireframe\n  wireframe: false,\n  // Motion\n  motion: true\n});\nexport default seedToken;","const genRadius = radiusBase => {\n  let radiusLG = radiusBase;\n  let radiusSM = radiusBase;\n  let radiusXS = radiusBase;\n  let radiusOuter = radiusBase;\n  // radiusLG\n  if (radiusBase < 6 && radiusBase >= 5) {\n    radiusLG = radiusBase + 1;\n  } else if (radiusBase < 16 && radiusBase >= 6) {\n    radiusLG = radiusBase + 2;\n  } else if (radiusBase >= 16) {\n    radiusLG = 16;\n  }\n  // radiusSM\n  if (radiusBase < 7 && radiusBase >= 5) {\n    radiusSM = 4;\n  } else if (radiusBase < 8 && radiusBase >= 7) {\n    radiusSM = 5;\n  } else if (radiusBase < 14 && radiusBase >= 8) {\n    radiusSM = 6;\n  } else if (radiusBase < 16 && radiusBase >= 14) {\n    radiusSM = 7;\n  } else if (radiusBase >= 16) {\n    radiusSM = 8;\n  }\n  // radiusXS\n  if (radiusBase < 6 && radiusBase >= 2) {\n    radiusXS = 1;\n  } else if (radiusBase >= 6) {\n    radiusXS = 2;\n  }\n  // radiusOuter\n  if (radiusBase > 4 && radiusBase < 8) {\n    radiusOuter = 4;\n  } else if (radiusBase >= 8) {\n    radiusOuter = 6;\n  }\n  return {\n    borderRadius: radiusBase,\n    borderRadiusXS: radiusXS,\n    borderRadiusSM: radiusSM,\n    borderRadiusLG: radiusLG,\n    borderRadiusOuter: radiusOuter\n  };\n};\nexport default genRadius;","const genControlHeight = token => {\n  const {\n    controlHeight\n  } = token;\n  return {\n    controlHeightSM: controlHeight * 0.75,\n    controlHeightXS: controlHeight * 0.5,\n    controlHeightLG: controlHeight * 1.25\n  };\n};\nexport default genControlHeight;","import genFontSizes from './genFontSizes';\nconst genFontMapToken = fontSize => {\n  const fontSizePairs = genFontSizes(fontSize);\n  const fontSizes = fontSizePairs.map(pair => pair.size);\n  const lineHeights = fontSizePairs.map(pair => pair.lineHeight);\n  const fontSizeMD = fontSizes[1];\n  const fontSizeSM = fontSizes[0];\n  const fontSizeLG = fontSizes[2];\n  const lineHeight = lineHeights[1];\n  const lineHeightSM = lineHeights[0];\n  const lineHeightLG = lineHeights[2];\n  return {\n    fontSizeSM,\n    fontSize: fontSizeMD,\n    fontSizeLG,\n    fontSizeXL: fontSizes[3],\n    fontSizeHeading1: fontSizes[6],\n    fontSizeHeading2: fontSizes[5],\n    fontSizeHeading3: fontSizes[4],\n    fontSizeHeading4: fontSizes[3],\n    fontSizeHeading5: fontSizes[2],\n    lineHeight,\n    lineHeightLG,\n    lineHeightSM,\n    fontHeight: Math.round(lineHeight * fontSizeMD),\n    fontHeightLG: Math.round(lineHeightLG * fontSizeLG),\n    fontHeightSM: Math.round(lineHeightSM * fontSizeSM),\n    lineHeightHeading1: lineHeights[6],\n    lineHeightHeading2: lineHeights[5],\n    lineHeightHeading3: lineHeights[4],\n    lineHeightHeading4: lineHeights[3],\n    lineHeightHeading5: lineHeights[2]\n  };\n};\nexport default genFontMapToken;","export function getLineHeight(fontSize) {\n  return (fontSize + 8) / fontSize;\n}\n// https://zhuanlan.zhihu.com/p/32746810\nexport default function getFontSizes(base) {\n  const fontSizes = Array.from({\n    length: 10\n  }).map((_, index) => {\n    const i = index - 1;\n    const baseSize = base * Math.pow(Math.E, i / 5);\n    const intSize = index > 1 ? Math.floor(baseSize) : Math.ceil(baseSize);\n    // Convert to even\n    return Math.floor(intSize / 2) * 2;\n  });\n  fontSizes[1] = base;\n  return fontSizes.map(size => ({\n    size,\n    lineHeight: getLineHeight(size)\n  }));\n}","import { FastColor } from '@ant-design/fast-color';\nexport const getAlphaColor = (baseColor, alpha) => new FastColor(baseColor).setA(alpha).toRgbString();\nexport const getSolidColor = (baseColor, brightness) => {\n  const instance = new FastColor(baseColor);\n  return instance.darken(brightness).toHexString();\n};","import { generate } from '@ant-design/colors';\nimport { getAlphaColor, getSolidColor } from './colorAlgorithm';\nexport const generateColorPalettes = baseColor => {\n  const colors = generate(baseColor);\n  return {\n    1: colors[0],\n    2: colors[1],\n    3: colors[2],\n    4: colors[3],\n    5: colors[4],\n    6: colors[5],\n    7: colors[6],\n    8: colors[4],\n    9: colors[5],\n    10: colors[6]\n    // 8: colors[7],\n    // 9: colors[8],\n    // 10: colors[9],\n  };\n};\nexport const generateNeutralColorPalettes = (bgBaseColor, textBaseColor) => {\n  const colorBgBase = bgBaseColor || '#fff';\n  const colorTextBase = textBaseColor || '#000';\n  return {\n    colorBgBase,\n    colorTextBase,\n    colorText: getAlphaColor(colorTextBase, 0.88),\n    colorTextSecondary: getAlphaColor(colorTextBase, 0.65),\n    colorTextTertiary: getAlphaColor(colorTextBase, 0.45),\n    colorTextQuaternary: getAlphaColor(colorTextBase, 0.25),\n    colorFill: getAlphaColor(colorTextBase, 0.15),\n    colorFillSecondary: getAlphaColor(colorTextBase, 0.06),\n    colorFillTertiary: getAlphaColor(colorTextBase, 0.04),\n    colorFillQuaternary: getAlphaColor(colorTextBase, 0.02),\n    colorBgSolid: getAlphaColor(colorTextBase, 1),\n    colorBgSolidHover: getAlphaColor(colorTextBase, 0.75),\n    colorBgSolidActive: getAlphaColor(colorTextBase, 0.95),\n    colorBgLayout: getSolidColor(colorBgBase, 4),\n    colorBgContainer: getSolidColor(colorBgBase, 0),\n    colorBgElevated: getSolidColor(colorBgBase, 0),\n    colorBgSpotlight: getAlphaColor(colorTextBase, 0.85),\n    colorBgBlur: 'transparent',\n    colorBorder: getSolidColor(colorBgBase, 15),\n    colorBorderSecondary: getSolidColor(colorBgBase, 6)\n  };\n};","import { createTheme } from '@ant-design/cssinjs';\nimport defaultDerivative from './index';\nconst defaultTheme = createTheme(defaultDerivative);\nexport default defaultTheme;","import { generate, presetPalettes, presetPrimaryColors } from '@ant-design/colors';\nimport { defaultPresetColors } from '../seed';\nimport genColorMapToken from '../shared/genColorMapToken';\nimport genCommonMapToken from '../shared/genCommonMapToken';\nimport genControlHeight from '../shared/genControlHeight';\nimport genFontMapToken from '../shared/genFontMapToken';\nimport genSizeMapToken from '../shared/genSizeMapToken';\nimport { generateColorPalettes, generateNeutralColorPalettes } from './colors';\nexport default function derivative(token) {\n  // pink is deprecated name of magenta, keep this for backwards compatibility\n  presetPrimaryColors.pink = presetPrimaryColors.magenta;\n  presetPalettes.pink = presetPalettes.magenta;\n  const colorPalettes = Object.keys(defaultPresetColors).map(colorKey => {\n    const colors = token[colorKey] === presetPrimaryColors[colorKey] ? presetPalettes[colorKey] : generate(token[colorKey]);\n    return Array.from({\n      length: 10\n    }, () => 1).reduce((prev, _, i) => {\n      prev[`${colorKey}-${i + 1}`] = colors[i];\n      prev[`${colorKey}${i + 1}`] = colors[i];\n      return prev;\n    }, {});\n  }).reduce((prev, cur) => {\n    // biome-ignore lint/style/noParameterAssign: it is a reduce\n    prev = Object.assign(Object.assign({}, prev), cur);\n    return prev;\n  }, {});\n  return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, token), colorPalettes), genColorMapToken(token, {\n    generateColorPalettes,\n    generateNeutralColorPalettes\n  })), genFontMapToken(token.fontSize)), genSizeMapToken(token)), genControlHeight(token)), genCommonMapToken(token));\n}","import { FastColor } from '@ant-design/fast-color';\nexport default function genColorMapToken(seed, {\n  generateColorPalettes,\n  generateNeutralColorPalettes\n}) {\n  const {\n    colorSuccess: colorSuccessBase,\n    colorWarning: colorWarningBase,\n    colorError: colorErrorBase,\n    colorInfo: colorInfoBase,\n    colorPrimary: colorPrimaryBase,\n    colorBgBase,\n    colorTextBase\n  } = seed;\n  const primaryColors = generateColorPalettes(colorPrimaryBase);\n  const successColors = generateColorPalettes(colorSuccessBase);\n  const warningColors = generateColorPalettes(colorWarningBase);\n  const errorColors = generateColorPalettes(colorErrorBase);\n  const infoColors = generateColorPalettes(colorInfoBase);\n  const neutralColors = generateNeutralColorPalettes(colorBgBase, colorTextBase);\n  // Color Link\n  const colorLink = seed.colorLink || seed.colorInfo;\n  const linkColors = generateColorPalettes(colorLink);\n  const colorErrorBgFilledHover = new FastColor(errorColors[1]).mix(new FastColor(errorColors[3]), 50).toHexString();\n  return Object.assign(Object.assign({}, neutralColors), {\n    colorPrimaryBg: primaryColors[1],\n    colorPrimaryBgHover: primaryColors[2],\n    colorPrimaryBorder: primaryColors[3],\n    colorPrimaryBorderHover: primaryColors[4],\n    colorPrimaryHover: primaryColors[5],\n    colorPrimary: primaryColors[6],\n    colorPrimaryActive: primaryColors[7],\n    colorPrimaryTextHover: primaryColors[8],\n    colorPrimaryText: primaryColors[9],\n    colorPrimaryTextActive: primaryColors[10],\n    colorSuccessBg: successColors[1],\n    colorSuccessBgHover: successColors[2],\n    colorSuccessBorder: successColors[3],\n    colorSuccessBorderHover: successColors[4],\n    colorSuccessHover: successColors[4],\n    colorSuccess: successColors[6],\n    colorSuccessActive: successColors[7],\n    colorSuccessTextHover: successColors[8],\n    colorSuccessText: successColors[9],\n    colorSuccessTextActive: successColors[10],\n    colorErrorBg: errorColors[1],\n    colorErrorBgHover: errorColors[2],\n    colorErrorBgFilledHover,\n    colorErrorBgActive: errorColors[3],\n    colorErrorBorder: errorColors[3],\n    colorErrorBorderHover: errorColors[4],\n    colorErrorHover: errorColors[5],\n    colorError: errorColors[6],\n    colorErrorActive: errorColors[7],\n    colorErrorTextHover: errorColors[8],\n    colorErrorText: errorColors[9],\n    colorErrorTextActive: errorColors[10],\n    colorWarningBg: warningColors[1],\n    colorWarningBgHover: warningColors[2],\n    colorWarningBorder: warningColors[3],\n    colorWarningBorderHover: warningColors[4],\n    colorWarningHover: warningColors[4],\n    colorWarning: warningColors[6],\n    colorWarningActive: warningColors[7],\n    colorWarningTextHover: warningColors[8],\n    colorWarningText: warningColors[9],\n    colorWarningTextActive: warningColors[10],\n    colorInfoBg: infoColors[1],\n    colorInfoBgHover: infoColors[2],\n    colorInfoBorder: infoColors[3],\n    colorInfoBorderHover: infoColors[4],\n    colorInfoHover: infoColors[4],\n    colorInfo: infoColors[6],\n    colorInfoActive: infoColors[7],\n    colorInfoTextHover: infoColors[8],\n    colorInfoText: infoColors[9],\n    colorInfoTextActive: infoColors[10],\n    colorLinkHover: linkColors[4],\n    colorLink: linkColors[6],\n    colorLinkActive: linkColors[7],\n    colorBgMask: new FastColor('#000').setA(0.45).toRgbString(),\n    colorWhite: '#fff'\n  });\n}","export default function genSizeMapToken(token) {\n  const {\n    sizeUnit,\n    sizeStep\n  } = token;\n  return {\n    sizeXXL: sizeUnit * (sizeStep + 8),\n    // 48\n    sizeXL: sizeUnit * (sizeStep + 4),\n    // 32\n    sizeLG: sizeUnit * (sizeStep + 2),\n    // 24\n    sizeMD: sizeUnit * (sizeStep + 1),\n    // 20\n    sizeMS: sizeUnit * sizeStep,\n    // 16\n    size: sizeUnit * sizeStep,\n    // 16\n    sizeSM: sizeUnit * (sizeStep - 1),\n    // 12\n    sizeXS: sizeUnit * (sizeStep - 2),\n    // 8\n    sizeXXS: sizeUnit * (sizeStep - 3) // 4\n  };\n}","import genRadius from './genRadius';\nexport default function genCommonMapToken(token) {\n  const {\n    motionUnit,\n    motionBase,\n    borderRadius,\n    lineWidth\n  } = token;\n  return Object.assign({\n    // motion\n    motionDurationFast: `${(motionBase + motionUnit).toFixed(1)}s`,\n    motionDurationMid: `${(motionBase + motionUnit * 2).toFixed(1)}s`,\n    motionDurationSlow: `${(motionBase + motionUnit * 3).toFixed(1)}s`,\n    // line\n    lineWidthBold: lineWidth + 1\n  }, genRadius(borderRadius));\n}","import React from 'react';\nimport defaultSeedToken from './themes/seed';\nexport { default as defaultTheme } from './themes/default/theme';\n// ================================ Context =================================\n// To ensure snapshot stable. We disable hashed in test env.\nexport const defaultConfig = {\n  token: defaultSeedToken,\n  override: {\n    override: defaultSeedToken\n  },\n  hashed: true\n};\nexport const DesignTokenContext = /*#__PURE__*/React.createContext(defaultConfig);","import { generate } from '@ant-design/colors';\nimport { FastColor } from '@ant-design/fast-color';\nimport canUseDom from \"rc-util/es/Dom/canUseDom\";\nimport { updateCSS } from \"rc-util/es/Dom/dynamicCSS\";\nimport warning from '../_util/warning';\nconst dynamicStyleMark = `-ant-${Date.now()}-${Math.random()}`;\nexport function getStyle(globalPrefixCls, theme) {\n  const variables = {};\n  const formatColor = (color, updater) => {\n    let clone = color.clone();\n    clone = (updater === null || updater === void 0 ? void 0 : updater(clone)) || clone;\n    return clone.toRgbString();\n  };\n  const fillColor = (colorVal, type) => {\n    const baseColor = new FastColor(colorVal);\n    const colorPalettes = generate(baseColor.toRgbString());\n    variables[`${type}-color`] = formatColor(baseColor);\n    variables[`${type}-color-disabled`] = colorPalettes[1];\n    variables[`${type}-color-hover`] = colorPalettes[4];\n    variables[`${type}-color-active`] = colorPalettes[6];\n    variables[`${type}-color-outline`] = baseColor.clone().setA(0.2).toRgbString();\n    variables[`${type}-color-deprecated-bg`] = colorPalettes[0];\n    variables[`${type}-color-deprecated-border`] = colorPalettes[2];\n  };\n  // ================ Primary Color ================\n  if (theme.primaryColor) {\n    fillColor(theme.primaryColor, 'primary');\n    const primaryColor = new FastColor(theme.primaryColor);\n    const primaryColors = generate(primaryColor.toRgbString());\n    // Legacy - We should use semantic naming standard\n    primaryColors.forEach((color, index) => {\n      variables[`primary-${index + 1}`] = color;\n    });\n    // Deprecated\n    variables['primary-color-deprecated-l-35'] = formatColor(primaryColor, c => c.lighten(35));\n    variables['primary-color-deprecated-l-20'] = formatColor(primaryColor, c => c.lighten(20));\n    variables['primary-color-deprecated-t-20'] = formatColor(primaryColor, c => c.tint(20));\n    variables['primary-color-deprecated-t-50'] = formatColor(primaryColor, c => c.tint(50));\n    variables['primary-color-deprecated-f-12'] = formatColor(primaryColor, c => c.setA(c.a * 0.12));\n    const primaryActiveColor = new FastColor(primaryColors[0]);\n    variables['primary-color-active-deprecated-f-30'] = formatColor(primaryActiveColor, c => c.setA(c.a * 0.3));\n    variables['primary-color-active-deprecated-d-02'] = formatColor(primaryActiveColor, c => c.darken(2));\n  }\n  // ================ Success Color ================\n  if (theme.successColor) {\n    fillColor(theme.successColor, 'success');\n  }\n  // ================ Warning Color ================\n  if (theme.warningColor) {\n    fillColor(theme.warningColor, 'warning');\n  }\n  // ================= Error Color =================\n  if (theme.errorColor) {\n    fillColor(theme.errorColor, 'error');\n  }\n  // ================= Info Color ==================\n  if (theme.infoColor) {\n    fillColor(theme.infoColor, 'info');\n  }\n  // Convert to css variables\n  const cssList = Object.keys(variables).map(key => `--${globalPrefixCls}-${key}: ${variables[key]};`);\n  return `\n  :root {\n    ${cssList.join('\\n')}\n  }\n  `.trim();\n}\nexport function registerTheme(globalPrefixCls, theme) {\n  const style = getStyle(globalPrefixCls, theme);\n  if (canUseDom()) {\n    updateCSS(style, `${dynamicStyleMark}-dynamic-theme`);\n  } else {\n    process.env.NODE_ENV !== \"production\" ? warning(false, 'ConfigProvider', 'SSR do not support dynamic theme with css variables.') : void 0;\n  }\n}","\"use client\";\n\nimport * as React from 'react';\nconst DisabledContext = /*#__PURE__*/React.createContext(false);\nexport const DisabledContextProvider = ({\n  children,\n  disabled\n}) => {\n  const originDisabled = React.useContext(DisabledContext);\n  return /*#__PURE__*/React.createElement(DisabledContext.Provider, {\n    value: disabled !== null && disabled !== void 0 ? disabled : originDisabled\n  }, children);\n};\nexport default DisabledContext;","\"use client\";\n\nimport * as React from 'react';\nconst SizeContext = /*#__PURE__*/React.createContext(undefined);\nexport const SizeContextProvider = ({\n  children,\n  size\n}) => {\n  const originSize = React.useContext(SizeContext);\n  return /*#__PURE__*/React.createElement(SizeContext.Provider, {\n    value: size || originSize\n  }, children);\n};\nexport default SizeContext;","import { useContext } from 'react';\nimport DisabledContext from '../DisabledContext';\nimport SizeContext from '../SizeContext';\nfunction useConfig() {\n  const componentDisabled = useContext(DisabledContext);\n  const componentSize = useContext(SizeContext);\n  return {\n    componentDisabled,\n    componentSize\n  };\n}\nexport default useConfig;","import * as React from 'react';\nconst fullClone = Object.assign({}, React);\nconst {\n  useId\n} = fullClone;\nconst useEmptyId = () => '';\nconst useThemeKey = typeof useId === 'undefined' ? useEmptyId : useId;\nexport default useThemeKey;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nexport function isDOM(node) {\n  // https://developer.mozilla.org/en-US/docs/Web/API/Element\n  // Since XULElement is also subclass of Element, we only need HTMLElement and SVGElement\n  return node instanceof HTMLElement || node instanceof SVGElement;\n}\n\n/**\n * Retrieves a DOM node via a ref, and does not invoke `findDOMNode`.\n */\nexport function getDOM(node) {\n  if (node && _typeof(node) === 'object' && isDOM(node.nativeElement)) {\n    return node.nativeElement;\n  }\n  if (isDOM(node)) {\n    return node;\n  }\n  return null;\n}\n\n/**\n * Return if a node is a DOM node. Else will return by `findDOMNode`\n */\nexport default function findDOMNode(node) {\n  var domNode = getDOM(node);\n  if (domNode) {\n    return domNode;\n  }\n  if (node instanceof React.Component) {\n    var _ReactDOM$findDOMNode;\n    return (_ReactDOM$findDOMNode = ReactDOM.findDOMNode) === null || _ReactDOM$findDOMNode === void 0 ? void 0 : _ReactDOM$findDOMNode.call(ReactDOM, node);\n  }\n  return null;\n}","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nvar REACT_ELEMENT_TYPE_18 = Symbol.for('react.element');\nvar REACT_ELEMENT_TYPE_19 = Symbol.for('react.transitional.element');\nvar REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');\n\n/**\n * Compatible with React 18 or 19 to check if node is a Fragment.\n */\nexport default function isFragment(object) {\n  return (\n    // Base object type\n    object && _typeof(object) === 'object' && (\n    // React Element type\n    object.$$typeof === REACT_ELEMENT_TYPE_18 || object.$$typeof === REACT_ELEMENT_TYPE_19) &&\n    // React Fragment type\n    object.type === REACT_FRAGMENT_TYPE\n  );\n}","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport { isValidElement, version } from 'react';\nimport { ForwardRef, isMemo } from 'react-is';\nimport useMemo from \"./hooks/useMemo\";\nimport isFragment from \"./React/isFragment\";\nvar ReactMajorVersion = Number(version.split('.')[0]);\nexport var fillRef = function fillRef(ref, node) {\n  if (typeof ref === 'function') {\n    ref(node);\n  } else if (_typeof(ref) === 'object' && ref && 'current' in ref) {\n    ref.current = node;\n  }\n};\n\n/**\n * Merge refs into one ref function to support ref passing.\n */\nexport var composeRef = function composeRef() {\n  for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {\n    refs[_key] = arguments[_key];\n  }\n  var refList = refs.filter(Boolean);\n  if (refList.length <= 1) {\n    return refList[0];\n  }\n  return function (node) {\n    refs.forEach(function (ref) {\n      fillRef(ref, node);\n    });\n  };\n};\nexport var useComposeRef = function useComposeRef() {\n  for (var _len2 = arguments.length, refs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    refs[_key2] = arguments[_key2];\n  }\n  return useMemo(function () {\n    return composeRef.apply(void 0, refs);\n  }, refs, function (prev, next) {\n    return prev.length !== next.length || prev.every(function (ref, i) {\n      return ref !== next[i];\n    });\n  });\n};\nexport var supportRef = function supportRef(nodeOrComponent) {\n  var _type$prototype, _nodeOrComponent$prot;\n  if (!nodeOrComponent) {\n    return false;\n  }\n\n  // React 19 no need `forwardRef` anymore. So just pass if is a React element.\n  if (isReactElement(nodeOrComponent) && ReactMajorVersion >= 19) {\n    return true;\n  }\n  var type = isMemo(nodeOrComponent) ? nodeOrComponent.type.type : nodeOrComponent.type;\n\n  // Function component node\n  if (typeof type === 'function' && !((_type$prototype = type.prototype) !== null && _type$prototype !== void 0 && _type$prototype.render) && type.$$typeof !== ForwardRef) {\n    return false;\n  }\n\n  // Class component\n  if (typeof nodeOrComponent === 'function' && !((_nodeOrComponent$prot = nodeOrComponent.prototype) !== null && _nodeOrComponent$prot !== void 0 && _nodeOrComponent$prot.render) && nodeOrComponent.$$typeof !== ForwardRef) {\n    return false;\n  }\n  return true;\n};\nfunction isReactElement(node) {\n  return /*#__PURE__*/isValidElement(node) && !isFragment(node);\n}\nexport var supportNodeRef = function supportNodeRef(node) {\n  return isReactElement(node) && supportRef(node);\n};\n\n/**\n * In React 19. `ref` is not a property from node.\n * But a property from `props.ref`.\n * To check if `props.ref` exist or fallback to `ref`.\n */\nexport var getNodeRef = function getNodeRef(node) {\n  if (node && isReactElement(node)) {\n    var ele = node;\n\n    // Source from:\n    // https://github.com/mui/material-ui/blob/master/packages/mui-utils/src/getReactNodeRef/getReactNodeRef.ts\n    return ele.props.propertyIsEnumerable('ref') ? ele.props.ref : ele.ref;\n  }\n  return null;\n};","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nfunction _objectWithoutProperties(e, t) {\n  if (null == e) return {};\n  var o,\n    r,\n    i = objectWithoutPropertiesLoose(e, t);\n  if (Object.getOwnPropertySymbols) {\n    var n = Object.getOwnPropertySymbols(e);\n    for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n  }\n  return i;\n}\nexport { _objectWithoutProperties as default };","function _objectWithoutPropertiesLoose(r, e) {\n  if (null == r) return {};\n  var t = {};\n  for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n    if (-1 !== e.indexOf(n)) continue;\n    t[n] = r[n];\n  }\n  return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nvar _excluded = [\"children\"];\nimport * as React from 'react';\nexport var Context = /*#__PURE__*/React.createContext({});\nexport default function MotionProvider(_ref) {\n  var children = _ref.children,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return /*#__PURE__*/React.createElement(Context.Provider, {\n    value: props\n  }, children);\n}","function _setPrototypeOf(t, e) {\n  return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n    return t.__proto__ = e, t;\n  }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inherits(t, e) {\n  if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n  t.prototype = Object.create(e && e.prototype, {\n    constructor: {\n      value: t,\n      writable: !0,\n      configurable: !0\n    }\n  }), Object.defineProperty(t, \"prototype\", {\n    writable: !1\n  }), e && setPrototypeOf(t, e);\n}\nexport { _inherits as default };","function _getPrototypeOf(t) {\n  return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n    return t.__proto__ || Object.getPrototypeOf(t);\n  }, _getPrototypeOf(t);\n}\nexport { _getPrototypeOf as default };","function _isNativeReflectConstruct() {\n  try {\n    var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n  } catch (t) {}\n  return (_isNativeReflectConstruct = function _isNativeReflectConstruct() {\n    return !!t;\n  })();\n}\nexport { _isNativeReflectConstruct as default };","function _assertThisInitialized(e) {\n  if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  return e;\n}\nexport { _assertThisInitialized as default };","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nimport possibleConstructorReturn from \"./possibleConstructorReturn.js\";\nfunction _createSuper(t) {\n  var r = isNativeReflectConstruct();\n  return function () {\n    var e,\n      o = getPrototypeOf(t);\n    if (r) {\n      var s = getPrototypeOf(this).constructor;\n      e = Reflect.construct(o, arguments, s);\n    } else e = o.apply(this, arguments);\n    return possibleConstructorReturn(this, e);\n  };\n}\nexport { _createSuper as default };","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nfunction _possibleConstructorReturn(t, e) {\n  if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e;\n  if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n  return assertThisInitialized(t);\n}\nexport { _possibleConstructorReturn as default };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport * as React from 'react';\nvar DomWrapper = /*#__PURE__*/function (_React$Component) {\n  _inherits(DomWrapper, _React$Component);\n  var _super = _createSuper(DomWrapper);\n  function DomWrapper() {\n    _classCallCheck(this, DomWrapper);\n    return _super.apply(this, arguments);\n  }\n  _createClass(DomWrapper, [{\n    key: \"render\",\n    value: function render() {\n      return this.props.children;\n    }\n  }]);\n  return DomWrapper;\n}(React.Component);\nexport default DomWrapper;","import * as React from 'react';\nexport default function useEvent(callback) {\n  var fnRef = React.useRef();\n  fnRef.current = callback;\n  var memoFn = React.useCallback(function () {\n    var _fnRef$current;\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return (_fnRef$current = fnRef.current) === null || _fnRef$current === void 0 ? void 0 : _fnRef$current.call.apply(_fnRef$current, [fnRef].concat(args));\n  }, []);\n  return memoFn;\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\n/**\n * Same as React.useState but `setState` accept `ignoreDestroy` param to not to setState after destroyed.\n * We do not make this auto is to avoid real memory leak.\n * Developer should confirm it's safe to ignore themselves.\n */\nexport default function useSafeState(defaultValue) {\n  var destroyRef = React.useRef(false);\n  var _React$useState = React.useState(defaultValue),\n    _React$useState2 = _slicedToArray(_React$useState, 2),\n    value = _React$useState2[0],\n    setValue = _React$useState2[1];\n  React.useEffect(function () {\n    destroyRef.current = false;\n    return function () {\n      destroyRef.current = true;\n    };\n  }, []);\n  function safeSetState(updater, ignoreDestroy) {\n    if (ignoreDestroy && destroyRef.current) {\n      return;\n    }\n    setValue(updater);\n  }\n  return [value, safeSetState];\n}","export var STATUS_NONE = 'none';\nexport var STATUS_APPEAR = 'appear';\nexport var STATUS_ENTER = 'enter';\nexport var STATUS_LEAVE = 'leave';\nexport var STEP_NONE = 'none';\nexport var STEP_PREPARE = 'prepare';\nexport var STEP_START = 'start';\nexport var STEP_ACTIVE = 'active';\nexport var STEP_ACTIVATED = 'end';\n/**\n * Used for disabled motion case.\n * Prepare stage will still work but start & active will be skipped.\n */\nexport var STEP_PREPARED = 'prepared';","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport canUseDOM from \"rc-util/es/Dom/canUseDom\";\n// ================= Transition =================\n// Event wrapper. Copy from react source code\nfunction makePrefixMap(styleProp, eventName) {\n  var prefixes = {};\n  prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n  prefixes[\"Webkit\".concat(styleProp)] = \"webkit\".concat(eventName);\n  prefixes[\"Moz\".concat(styleProp)] = \"moz\".concat(eventName);\n  prefixes[\"ms\".concat(styleProp)] = \"MS\".concat(eventName);\n  prefixes[\"O\".concat(styleProp)] = \"o\".concat(eventName.toLowerCase());\n  return prefixes;\n}\nexport function getVendorPrefixes(domSupport, win) {\n  var prefixes = {\n    animationend: makePrefixMap('Animation', 'AnimationEnd'),\n    transitionend: makePrefixMap('Transition', 'TransitionEnd')\n  };\n  if (domSupport) {\n    if (!('AnimationEvent' in win)) {\n      delete prefixes.animationend.animation;\n    }\n    if (!('TransitionEvent' in win)) {\n      delete prefixes.transitionend.transition;\n    }\n  }\n  return prefixes;\n}\nvar vendorPrefixes = getVendorPrefixes(canUseDOM(), typeof window !== 'undefined' ? window : {});\nvar style = {};\nif (canUseDOM()) {\n  var _document$createEleme = document.createElement('div');\n  style = _document$createEleme.style;\n}\nvar prefixedEventNames = {};\nexport function getVendorPrefixedEventName(eventName) {\n  if (prefixedEventNames[eventName]) {\n    return prefixedEventNames[eventName];\n  }\n  var prefixMap = vendorPrefixes[eventName];\n  if (prefixMap) {\n    var stylePropList = Object.keys(prefixMap);\n    var len = stylePropList.length;\n    for (var i = 0; i < len; i += 1) {\n      var styleProp = stylePropList[i];\n      if (Object.prototype.hasOwnProperty.call(prefixMap, styleProp) && styleProp in style) {\n        prefixedEventNames[eventName] = prefixMap[styleProp];\n        return prefixedEventNames[eventName];\n      }\n    }\n  }\n  return '';\n}\nvar internalAnimationEndName = getVendorPrefixedEventName('animationend');\nvar internalTransitionEndName = getVendorPrefixedEventName('transitionend');\nexport var supportTransition = !!(internalAnimationEndName && internalTransitionEndName);\nexport var animationEndName = internalAnimationEndName || 'animationend';\nexport var transitionEndName = internalTransitionEndName || 'transitionend';\nexport function getTransitionName(transitionName, transitionType) {\n  if (!transitionName) return null;\n  if (_typeof(transitionName) === 'object') {\n    var type = transitionType.replace(/-\\w/g, function (match) {\n      return match[1].toUpperCase();\n    });\n    return transitionName[type];\n  }\n  return \"\".concat(transitionName, \"-\").concat(transitionType);\n}","import canUseDom from \"rc-util/es/Dom/canUseDom\";\nimport { useEffect, useLayoutEffect } from 'react';\n\n// It's safe to use `useLayoutEffect` but the warning is annoying\nvar useIsomorphicLayoutEffect = canUseDom() ? useLayoutEffect : useEffect;\nexport default useIsomorphicLayoutEffect;","var raf = function raf(callback) {\n  return +setTimeout(callback, 16);\n};\nvar caf = function caf(num) {\n  return clearTimeout(num);\n};\nif (typeof window !== 'undefined' && 'requestAnimationFrame' in window) {\n  raf = function raf(callback) {\n    return window.requestAnimationFrame(callback);\n  };\n  caf = function caf(handle) {\n    return window.cancelAnimationFrame(handle);\n  };\n}\nvar rafUUID = 0;\nvar rafIds = new Map();\nfunction cleanup(id) {\n  rafIds.delete(id);\n}\nvar wrapperRaf = function wrapperRaf(callback) {\n  var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  rafUUID += 1;\n  var id = rafUUID;\n  function callRef(leftTimes) {\n    if (leftTimes === 0) {\n      // Clean up\n      cleanup(id);\n\n      // Trigger\n      callback();\n    } else {\n      // Next raf\n      var realId = raf(function () {\n        callRef(leftTimes - 1);\n      });\n\n      // Bind real raf id\n      rafIds.set(id, realId);\n    }\n  }\n  callRef(times);\n  return id;\n};\nwrapperRaf.cancel = function (id) {\n  var realId = rafIds.get(id);\n  cleanup(id);\n  return caf(realId);\n};\nif (process.env.NODE_ENV !== 'production') {\n  wrapperRaf.ids = function () {\n    return rafIds;\n  };\n}\nexport default wrapperRaf;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport useState from \"rc-util/es/hooks/useState\";\nimport * as React from 'react';\nimport { STEP_ACTIVATED, STEP_ACTIVE, STEP_NONE, STEP_PREPARE, STEP_PREPARED, STEP_START } from \"../interface\";\nimport useIsomorphicLayoutEffect from \"./useIsomorphicLayoutEffect\";\nimport useNextFrame from \"./useNextFrame\";\nvar FULL_STEP_QUEUE = [STEP_PREPARE, STEP_START, STEP_ACTIVE, STEP_ACTIVATED];\nvar SIMPLE_STEP_QUEUE = [STEP_PREPARE, STEP_PREPARED];\n\n/** Skip current step */\nexport var SkipStep = false;\n/** Current step should be update in */\nexport var DoStep = true;\nexport function isActive(step) {\n  return step === STEP_ACTIVE || step === STEP_ACTIVATED;\n}\nexport default (function (status, prepareOnly, callback) {\n  var _useState = useState(STEP_NONE),\n    _useState2 = _slicedToArray(_useState, 2),\n    step = _useState2[0],\n    setStep = _useState2[1];\n  var _useNextFrame = useNextFrame(),\n    _useNextFrame2 = _slicedToArray(_useNextFrame, 2),\n    nextFrame = _useNextFrame2[0],\n    cancelNextFrame = _useNextFrame2[1];\n  function startQueue() {\n    setStep(STEP_PREPARE, true);\n  }\n  var STEP_QUEUE = prepareOnly ? SIMPLE_STEP_QUEUE : FULL_STEP_QUEUE;\n  useIsomorphicLayoutEffect(function () {\n    if (step !== STEP_NONE && step !== STEP_ACTIVATED) {\n      var index = STEP_QUEUE.indexOf(step);\n      var nextStep = STEP_QUEUE[index + 1];\n      var result = callback(step);\n      if (result === SkipStep) {\n        // Skip when no needed\n        setStep(nextStep, true);\n      } else if (nextStep) {\n        // Do as frame for step update\n        nextFrame(function (info) {\n          function doNext() {\n            // Skip since current queue is ood\n            if (info.isCanceled()) return;\n            setStep(nextStep, true);\n          }\n          if (result === true) {\n            doNext();\n          } else {\n            // Only promise should be async\n            Promise.resolve(result).then(doNext);\n          }\n        });\n      }\n    }\n  }, [status, step]);\n  React.useEffect(function () {\n    return function () {\n      cancelNextFrame();\n    };\n  }, []);\n  return [startQueue, step];\n});","import raf from \"rc-util/es/raf\";\nimport * as React from 'react';\nexport default (function () {\n  var nextFrameRef = React.useRef(null);\n  function cancelNextFrame() {\n    raf.cancel(nextFrameRef.current);\n  }\n  function nextFrame(callback) {\n    var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n    cancelNextFrame();\n    var nextFrameId = raf(function () {\n      if (delay <= 1) {\n        callback({\n          isCanceled: function isCanceled() {\n            return nextFrameId !== nextFrameRef.current;\n          }\n        });\n      } else {\n        nextFrame(callback, delay - 1);\n      }\n    });\n    nextFrameRef.current = nextFrameId;\n  }\n  React.useEffect(function () {\n    return function () {\n      cancelNextFrame();\n    };\n  }, []);\n  return [nextFrame, cancelNextFrame];\n});","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport { useEvent } from 'rc-util';\nimport useState from \"rc-util/es/hooks/useState\";\nimport useSyncState from \"rc-util/es/hooks/useSyncState\";\nimport * as React from 'react';\nimport { useEffect, useRef } from 'react';\nimport { STATUS_APPEAR, STATUS_ENTER, STATUS_LEAVE, STATUS_NONE, STEP_ACTIVE, STEP_PREPARE, STEP_PREPARED, STEP_START } from \"../interface\";\nimport useDomMotionEvents from \"./useDomMotionEvents\";\nimport useIsomorphicLayoutEffect from \"./useIsomorphicLayoutEffect\";\nimport useStepQueue, { DoStep, isActive, SkipStep } from \"./useStepQueue\";\nexport default function useStatus(supportMotion, visible, getElement, _ref) {\n  var _ref$motionEnter = _ref.motionEnter,\n    motionEnter = _ref$motionEnter === void 0 ? true : _ref$motionEnter,\n    _ref$motionAppear = _ref.motionAppear,\n    motionAppear = _ref$motionAppear === void 0 ? true : _ref$motionAppear,\n    _ref$motionLeave = _ref.motionLeave,\n    motionLeave = _ref$motionLeave === void 0 ? true : _ref$motionLeave,\n    motionDeadline = _ref.motionDeadline,\n    motionLeaveImmediately = _ref.motionLeaveImmediately,\n    onAppearPrepare = _ref.onAppearPrepare,\n    onEnterPrepare = _ref.onEnterPrepare,\n    onLeavePrepare = _ref.onLeavePrepare,\n    onAppearStart = _ref.onAppearStart,\n    onEnterStart = _ref.onEnterStart,\n    onLeaveStart = _ref.onLeaveStart,\n    onAppearActive = _ref.onAppearActive,\n    onEnterActive = _ref.onEnterActive,\n    onLeaveActive = _ref.onLeaveActive,\n    onAppearEnd = _ref.onAppearEnd,\n    onEnterEnd = _ref.onEnterEnd,\n    onLeaveEnd = _ref.onLeaveEnd,\n    onVisibleChanged = _ref.onVisibleChanged;\n  // Used for outer render usage to avoid `visible: false & status: none` to render nothing\n  var _useState = useState(),\n    _useState2 = _slicedToArray(_useState, 2),\n    asyncVisible = _useState2[0],\n    setAsyncVisible = _useState2[1];\n  var _useSyncState = useSyncState(STATUS_NONE),\n    _useSyncState2 = _slicedToArray(_useSyncState, 2),\n    getStatus = _useSyncState2[0],\n    setStatus = _useSyncState2[1];\n  var _useState3 = useState(null),\n    _useState4 = _slicedToArray(_useState3, 2),\n    style = _useState4[0],\n    setStyle = _useState4[1];\n  var currentStatus = getStatus();\n  var mountedRef = useRef(false);\n  var deadlineRef = useRef(null);\n\n  // =========================== Dom Node ===========================\n  function getDomElement() {\n    return getElement();\n  }\n\n  // ========================== Motion End ==========================\n  var activeRef = useRef(false);\n\n  /**\n   * Clean up status & style\n   */\n  function updateMotionEndStatus() {\n    setStatus(STATUS_NONE);\n    setStyle(null, true);\n  }\n  var onInternalMotionEnd = useEvent(function (event) {\n    var status = getStatus();\n    // Do nothing since not in any transition status.\n    // This may happen when `motionDeadline` trigger.\n    if (status === STATUS_NONE) {\n      return;\n    }\n    var element = getDomElement();\n    if (event && !event.deadline && event.target !== element) {\n      // event exists\n      // not initiated by deadline\n      // transitionEnd not fired by inner elements\n      return;\n    }\n    var currentActive = activeRef.current;\n    var canEnd;\n    if (status === STATUS_APPEAR && currentActive) {\n      canEnd = onAppearEnd === null || onAppearEnd === void 0 ? void 0 : onAppearEnd(element, event);\n    } else if (status === STATUS_ENTER && currentActive) {\n      canEnd = onEnterEnd === null || onEnterEnd === void 0 ? void 0 : onEnterEnd(element, event);\n    } else if (status === STATUS_LEAVE && currentActive) {\n      canEnd = onLeaveEnd === null || onLeaveEnd === void 0 ? void 0 : onLeaveEnd(element, event);\n    }\n\n    // Only update status when `canEnd` and not destroyed\n    if (currentActive && canEnd !== false) {\n      updateMotionEndStatus();\n    }\n  });\n  var _useDomMotionEvents = useDomMotionEvents(onInternalMotionEnd),\n    _useDomMotionEvents2 = _slicedToArray(_useDomMotionEvents, 1),\n    patchMotionEvents = _useDomMotionEvents2[0];\n\n  // ============================= Step =============================\n  var getEventHandlers = function getEventHandlers(targetStatus) {\n    switch (targetStatus) {\n      case STATUS_APPEAR:\n        return _defineProperty(_defineProperty(_defineProperty({}, STEP_PREPARE, onAppearPrepare), STEP_START, onAppearStart), STEP_ACTIVE, onAppearActive);\n      case STATUS_ENTER:\n        return _defineProperty(_defineProperty(_defineProperty({}, STEP_PREPARE, onEnterPrepare), STEP_START, onEnterStart), STEP_ACTIVE, onEnterActive);\n      case STATUS_LEAVE:\n        return _defineProperty(_defineProperty(_defineProperty({}, STEP_PREPARE, onLeavePrepare), STEP_START, onLeaveStart), STEP_ACTIVE, onLeaveActive);\n      default:\n        return {};\n    }\n  };\n  var eventHandlers = React.useMemo(function () {\n    return getEventHandlers(currentStatus);\n  }, [currentStatus]);\n  var _useStepQueue = useStepQueue(currentStatus, !supportMotion, function (newStep) {\n      // Only prepare step can be skip\n      if (newStep === STEP_PREPARE) {\n        var onPrepare = eventHandlers[STEP_PREPARE];\n        if (!onPrepare) {\n          return SkipStep;\n        }\n        return onPrepare(getDomElement());\n      }\n\n      // Rest step is sync update\n      if (step in eventHandlers) {\n        var _eventHandlers$step;\n        setStyle(((_eventHandlers$step = eventHandlers[step]) === null || _eventHandlers$step === void 0 ? void 0 : _eventHandlers$step.call(eventHandlers, getDomElement(), null)) || null);\n      }\n      if (step === STEP_ACTIVE && currentStatus !== STATUS_NONE) {\n        // Patch events when motion needed\n        patchMotionEvents(getDomElement());\n        if (motionDeadline > 0) {\n          clearTimeout(deadlineRef.current);\n          deadlineRef.current = setTimeout(function () {\n            onInternalMotionEnd({\n              deadline: true\n            });\n          }, motionDeadline);\n        }\n      }\n      if (step === STEP_PREPARED) {\n        updateMotionEndStatus();\n      }\n      return DoStep;\n    }),\n    _useStepQueue2 = _slicedToArray(_useStepQueue, 2),\n    startStep = _useStepQueue2[0],\n    step = _useStepQueue2[1];\n  var active = isActive(step);\n  activeRef.current = active;\n\n  // ============================ Status ============================\n  var visibleRef = useRef(null);\n\n  // Update with new status\n  useIsomorphicLayoutEffect(function () {\n    // When use Suspense, the `visible` will repeat trigger,\n    // But not real change of the `visible`, we need to skip it.\n    // https://github.com/ant-design/ant-design/issues/44379\n    if (mountedRef.current && visibleRef.current === visible) {\n      return;\n    }\n    setAsyncVisible(visible);\n    var isMounted = mountedRef.current;\n    mountedRef.current = true;\n\n    // if (!supportMotion) {\n    //   return;\n    // }\n\n    var nextStatus;\n\n    // Appear\n    if (!isMounted && visible && motionAppear) {\n      nextStatus = STATUS_APPEAR;\n    }\n\n    // Enter\n    if (isMounted && visible && motionEnter) {\n      nextStatus = STATUS_ENTER;\n    }\n\n    // Leave\n    if (isMounted && !visible && motionLeave || !isMounted && motionLeaveImmediately && !visible && motionLeave) {\n      nextStatus = STATUS_LEAVE;\n    }\n    var nextEventHandlers = getEventHandlers(nextStatus);\n\n    // Update to next status\n    if (nextStatus && (supportMotion || nextEventHandlers[STEP_PREPARE])) {\n      setStatus(nextStatus);\n      startStep();\n    } else {\n      // Set back in case no motion but prev status has prepare step\n      setStatus(STATUS_NONE);\n    }\n    visibleRef.current = visible;\n  }, [visible]);\n\n  // ============================ Effect ============================\n  // Reset when motion changed\n  useEffect(function () {\n    if (\n    // Cancel appear\n    currentStatus === STATUS_APPEAR && !motionAppear ||\n    // Cancel enter\n    currentStatus === STATUS_ENTER && !motionEnter ||\n    // Cancel leave\n    currentStatus === STATUS_LEAVE && !motionLeave) {\n      setStatus(STATUS_NONE);\n    }\n  }, [motionAppear, motionEnter, motionLeave]);\n  useEffect(function () {\n    return function () {\n      mountedRef.current = false;\n      clearTimeout(deadlineRef.current);\n    };\n  }, []);\n\n  // Trigger `onVisibleChanged`\n  var firstMountChangeRef = React.useRef(false);\n  useEffect(function () {\n    // [visible & motion not end] => [!visible & motion end] still need trigger onVisibleChanged\n    if (asyncVisible) {\n      firstMountChangeRef.current = true;\n    }\n    if (asyncVisible !== undefined && currentStatus === STATUS_NONE) {\n      // Skip first render is invisible since it's nothing changed\n      if (firstMountChangeRef.current || asyncVisible) {\n        onVisibleChanged === null || onVisibleChanged === void 0 || onVisibleChanged(asyncVisible);\n      }\n      firstMountChangeRef.current = true;\n    }\n  }, [asyncVisible, currentStatus]);\n\n  // ============================ Styles ============================\n  var mergedStyle = style;\n  if (eventHandlers[STEP_PREPARE] && step === STEP_START) {\n    mergedStyle = _objectSpread({\n      transition: 'none'\n    }, mergedStyle);\n  }\n  return [currentStatus, step, mergedStyle, asyncVisible !== null && asyncVisible !== void 0 ? asyncVisible : visible];\n}","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\nimport useEvent from \"./useEvent\";\n/**\n * Same as React.useState but will always get latest state.\n * This is useful when React merge multiple state updates into one.\n * e.g. onTransitionEnd trigger multiple event at once will be merged state update in React.\n */\nexport default function useSyncState(defaultValue) {\n  var _React$useReducer = React.useReducer(function (x) {\n      return x + 1;\n    }, 0),\n    _React$useReducer2 = _slicedToArray(_React$useReducer, 2),\n    forceUpdate = _React$useReducer2[1];\n  var currentValueRef = React.useRef(defaultValue);\n  var getValue = useEvent(function () {\n    return currentValueRef.current;\n  });\n  var setValue = useEvent(function (updater) {\n    currentValueRef.current = typeof updater === 'function' ? updater(currentValueRef.current) : updater;\n    forceUpdate();\n  });\n  return [getValue, setValue];\n}","import * as React from 'react';\nimport { useRef } from 'react';\nimport { animationEndName, transitionEndName } from \"../util/motion\";\nexport default (function (onInternalMotionEnd) {\n  var cacheElementRef = useRef();\n\n  // Remove events\n  function removeMotionEvents(element) {\n    if (element) {\n      element.removeEventListener(transitionEndName, onInternalMotionEnd);\n      element.removeEventListener(animationEndName, onInternalMotionEnd);\n    }\n  }\n\n  // Patch events\n  function patchMotionEvents(element) {\n    if (cacheElementRef.current && cacheElementRef.current !== element) {\n      removeMotionEvents(cacheElementRef.current);\n    }\n    if (element && element !== cacheElementRef.current) {\n      element.addEventListener(transitionEndName, onInternalMotionEnd);\n      element.addEventListener(animationEndName, onInternalMotionEnd);\n\n      // Save as cache in case dom removed trigger by `motionDeadline`\n      cacheElementRef.current = element;\n    }\n  }\n\n  // Clean up when removed\n  React.useEffect(function () {\n    return function () {\n      removeMotionEvents(cacheElementRef.current);\n    };\n  }, []);\n  return [patchMotionEvents, removeMotionEvents];\n});","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\n/* eslint-disable react/default-props-match-prop-types, react/no-multi-comp, react/prop-types */\nimport classNames from 'classnames';\nimport findDOMNode from \"rc-util/es/Dom/findDOMNode\";\nimport { fillRef, getNodeRef, supportRef } from \"rc-util/es/ref\";\nimport * as React from 'react';\nimport { useRef } from 'react';\nimport { Context } from \"./context\";\nimport DomWrapper from \"./DomWrapper\";\nimport useStatus from \"./hooks/useStatus\";\nimport { isActive } from \"./hooks/useStepQueue\";\nimport { STATUS_NONE, STEP_PREPARE, STEP_START } from \"./interface\";\nimport { getTransitionName, supportTransition } from \"./util/motion\";\n/**\n * `transitionSupport` is used for none transition test case.\n * Default we use browser transition event support check.\n */\nexport function genCSSMotion(config) {\n  var transitionSupport = config;\n  if (_typeof(config) === 'object') {\n    transitionSupport = config.transitionSupport;\n  }\n  function isSupportTransition(props, contextMotion) {\n    return !!(props.motionName && transitionSupport && contextMotion !== false);\n  }\n  var CSSMotion = /*#__PURE__*/React.forwardRef(function (props, ref) {\n    var _props$visible = props.visible,\n      visible = _props$visible === void 0 ? true : _props$visible,\n      _props$removeOnLeave = props.removeOnLeave,\n      removeOnLeave = _props$removeOnLeave === void 0 ? true : _props$removeOnLeave,\n      forceRender = props.forceRender,\n      children = props.children,\n      motionName = props.motionName,\n      leavedClassName = props.leavedClassName,\n      eventProps = props.eventProps;\n    var _React$useContext = React.useContext(Context),\n      contextMotion = _React$useContext.motion;\n    var supportMotion = isSupportTransition(props, contextMotion);\n\n    // Ref to the react node, it may be a HTMLElement\n    var nodeRef = useRef();\n    // Ref to the dom wrapper in case ref can not pass to HTMLElement\n    var wrapperNodeRef = useRef();\n    function getDomElement() {\n      try {\n        // Here we're avoiding call for findDOMNode since it's deprecated\n        // in strict mode. We're calling it only when node ref is not\n        // an instance of DOM HTMLElement. Otherwise use\n        // findDOMNode as a final resort\n        return nodeRef.current instanceof HTMLElement ? nodeRef.current : findDOMNode(wrapperNodeRef.current);\n      } catch (e) {\n        // Only happen when `motionDeadline` trigger but element removed.\n        return null;\n      }\n    }\n    var _useStatus = useStatus(supportMotion, visible, getDomElement, props),\n      _useStatus2 = _slicedToArray(_useStatus, 4),\n      status = _useStatus2[0],\n      statusStep = _useStatus2[1],\n      statusStyle = _useStatus2[2],\n      mergedVisible = _useStatus2[3];\n\n    // Record whether content has rendered\n    // Will return null for un-rendered even when `removeOnLeave={false}`\n    var renderedRef = React.useRef(mergedVisible);\n    if (mergedVisible) {\n      renderedRef.current = true;\n    }\n\n    // ====================== Refs ======================\n    var setNodeRef = React.useCallback(function (node) {\n      nodeRef.current = node;\n      fillRef(ref, node);\n    }, [ref]);\n\n    // ===================== Render =====================\n    var motionChildren;\n    var mergedProps = _objectSpread(_objectSpread({}, eventProps), {}, {\n      visible: visible\n    });\n    if (!children) {\n      // No children\n      motionChildren = null;\n    } else if (status === STATUS_NONE) {\n      // Stable children\n      if (mergedVisible) {\n        motionChildren = children(_objectSpread({}, mergedProps), setNodeRef);\n      } else if (!removeOnLeave && renderedRef.current && leavedClassName) {\n        motionChildren = children(_objectSpread(_objectSpread({}, mergedProps), {}, {\n          className: leavedClassName\n        }), setNodeRef);\n      } else if (forceRender || !removeOnLeave && !leavedClassName) {\n        motionChildren = children(_objectSpread(_objectSpread({}, mergedProps), {}, {\n          style: {\n            display: 'none'\n          }\n        }), setNodeRef);\n      } else {\n        motionChildren = null;\n      }\n    } else {\n      // In motion\n      var statusSuffix;\n      if (statusStep === STEP_PREPARE) {\n        statusSuffix = 'prepare';\n      } else if (isActive(statusStep)) {\n        statusSuffix = 'active';\n      } else if (statusStep === STEP_START) {\n        statusSuffix = 'start';\n      }\n      var motionCls = getTransitionName(motionName, \"\".concat(status, \"-\").concat(statusSuffix));\n      motionChildren = children(_objectSpread(_objectSpread({}, mergedProps), {}, {\n        className: classNames(getTransitionName(motionName, status), _defineProperty(_defineProperty({}, motionCls, motionCls && statusSuffix), motionName, typeof motionName === 'string')),\n        style: statusStyle\n      }), setNodeRef);\n    }\n\n    // Auto inject ref if child node not have `ref` props\n    if ( /*#__PURE__*/React.isValidElement(motionChildren) && supportRef(motionChildren)) {\n      var originNodeRef = getNodeRef(motionChildren);\n      if (!originNodeRef) {\n        motionChildren = /*#__PURE__*/React.cloneElement(motionChildren, {\n          ref: setNodeRef\n        });\n      }\n    }\n    return /*#__PURE__*/React.createElement(DomWrapper, {\n      ref: wrapperNodeRef\n    }, motionChildren);\n  });\n  CSSMotion.displayName = 'CSSMotion';\n  return CSSMotion;\n}\nexport default genCSSMotion(supportTransition);","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nexport var STATUS_ADD = 'add';\nexport var STATUS_KEEP = 'keep';\nexport var STATUS_REMOVE = 'remove';\nexport var STATUS_REMOVED = 'removed';\nexport function wrapKeyToObject(key) {\n  var keyObj;\n  if (key && _typeof(key) === 'object' && 'key' in key) {\n    keyObj = key;\n  } else {\n    keyObj = {\n      key: key\n    };\n  }\n  return _objectSpread(_objectSpread({}, keyObj), {}, {\n    key: String(keyObj.key)\n  });\n}\nexport function parseKeys() {\n  var keys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  return keys.map(wrapKeyToObject);\n}\nexport function diffKeys() {\n  var prevKeys = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n  var currentKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n  var list = [];\n  var currentIndex = 0;\n  var currentLen = currentKeys.length;\n  var prevKeyObjects = parseKeys(prevKeys);\n  var currentKeyObjects = parseKeys(currentKeys);\n\n  // Check prev keys to insert or keep\n  prevKeyObjects.forEach(function (keyObj) {\n    var hit = false;\n    for (var i = currentIndex; i < currentLen; i += 1) {\n      var currentKeyObj = currentKeyObjects[i];\n      if (currentKeyObj.key === keyObj.key) {\n        // New added keys should add before current key\n        if (currentIndex < i) {\n          list = list.concat(currentKeyObjects.slice(currentIndex, i).map(function (obj) {\n            return _objectSpread(_objectSpread({}, obj), {}, {\n              status: STATUS_ADD\n            });\n          }));\n          currentIndex = i;\n        }\n        list.push(_objectSpread(_objectSpread({}, currentKeyObj), {}, {\n          status: STATUS_KEEP\n        }));\n        currentIndex += 1;\n        hit = true;\n        break;\n      }\n    }\n\n    // If not hit, it means key is removed\n    if (!hit) {\n      list.push(_objectSpread(_objectSpread({}, keyObj), {}, {\n        status: STATUS_REMOVE\n      }));\n    }\n  });\n\n  // Add rest to the list\n  if (currentIndex < currentLen) {\n    list = list.concat(currentKeyObjects.slice(currentIndex).map(function (obj) {\n      return _objectSpread(_objectSpread({}, obj), {}, {\n        status: STATUS_ADD\n      });\n    }));\n  }\n\n  /**\n   * Merge same key when it remove and add again:\n   *    [1 - add, 2 - keep, 1 - remove] -> [1 - keep, 2 - keep]\n   */\n  var keys = {};\n  list.forEach(function (_ref) {\n    var key = _ref.key;\n    keys[key] = (keys[key] || 0) + 1;\n  });\n  var duplicatedKeys = Object.keys(keys).filter(function (key) {\n    return keys[key] > 1;\n  });\n  duplicatedKeys.forEach(function (matchKey) {\n    // Remove `STATUS_REMOVE` node.\n    list = list.filter(function (_ref2) {\n      var key = _ref2.key,\n        status = _ref2.status;\n      return key !== matchKey || status !== STATUS_REMOVE;\n    });\n\n    // Update `STATUS_ADD` to `STATUS_KEEP`\n    list.forEach(function (node) {\n      if (node.key === matchKey) {\n        // eslint-disable-next-line no-param-reassign\n        node.status = STATUS_KEEP;\n      }\n    });\n  });\n  return list;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nvar _excluded = [\"component\", \"children\", \"onVisibleChanged\", \"onAllRemoved\"],\n  _excluded2 = [\"status\"];\n/* eslint react/prop-types: 0 */\nimport * as React from 'react';\nimport OriginCSSMotion from \"./CSSMotion\";\nimport { diffKeys, parseKeys, STATUS_ADD, STATUS_KEEP, STATUS_REMOVE, STATUS_REMOVED } from \"./util/diff\";\nimport { supportTransition } from \"./util/motion\";\nvar MOTION_PROP_NAMES = ['eventProps', 'visible', 'children', 'motionName', 'motionAppear', 'motionEnter', 'motionLeave', 'motionLeaveImmediately', 'motionDeadline', 'removeOnLeave', 'leavedClassName', 'onAppearPrepare', 'onAppearStart', 'onAppearActive', 'onAppearEnd', 'onEnterStart', 'onEnterActive', 'onEnterEnd', 'onLeaveStart', 'onLeaveActive', 'onLeaveEnd'];\n/**\n * Generate a CSSMotionList component with config\n * @param transitionSupport No need since CSSMotionList no longer depends on transition support\n * @param CSSMotion CSSMotion component\n */\nexport function genCSSMotionList(transitionSupport) {\n  var CSSMotion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : OriginCSSMotion;\n  var CSSMotionList = /*#__PURE__*/function (_React$Component) {\n    _inherits(CSSMotionList, _React$Component);\n    var _super = _createSuper(CSSMotionList);\n    function CSSMotionList() {\n      var _this;\n      _classCallCheck(this, CSSMotionList);\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      _this = _super.call.apply(_super, [this].concat(args));\n      _defineProperty(_assertThisInitialized(_this), \"state\", {\n        keyEntities: []\n      });\n      // ZombieJ: Return the count of rest keys. It's safe to refactor if need more info.\n      _defineProperty(_assertThisInitialized(_this), \"removeKey\", function (removeKey) {\n        _this.setState(function (prevState) {\n          var nextKeyEntities = prevState.keyEntities.map(function (entity) {\n            if (entity.key !== removeKey) return entity;\n            return _objectSpread(_objectSpread({}, entity), {}, {\n              status: STATUS_REMOVED\n            });\n          });\n          return {\n            keyEntities: nextKeyEntities\n          };\n        }, function () {\n          var keyEntities = _this.state.keyEntities;\n          var restKeysCount = keyEntities.filter(function (_ref) {\n            var status = _ref.status;\n            return status !== STATUS_REMOVED;\n          }).length;\n          if (restKeysCount === 0 && _this.props.onAllRemoved) {\n            _this.props.onAllRemoved();\n          }\n        });\n      });\n      return _this;\n    }\n    _createClass(CSSMotionList, [{\n      key: \"render\",\n      value: function render() {\n        var _this2 = this;\n        var keyEntities = this.state.keyEntities;\n        var _this$props = this.props,\n          component = _this$props.component,\n          children = _this$props.children,\n          _onVisibleChanged = _this$props.onVisibleChanged,\n          onAllRemoved = _this$props.onAllRemoved,\n          restProps = _objectWithoutProperties(_this$props, _excluded);\n        var Component = component || React.Fragment;\n        var motionProps = {};\n        MOTION_PROP_NAMES.forEach(function (prop) {\n          motionProps[prop] = restProps[prop];\n          delete restProps[prop];\n        });\n        delete restProps.keys;\n        return /*#__PURE__*/React.createElement(Component, restProps, keyEntities.map(function (_ref2, index) {\n          var status = _ref2.status,\n            eventProps = _objectWithoutProperties(_ref2, _excluded2);\n          var visible = status === STATUS_ADD || status === STATUS_KEEP;\n          return /*#__PURE__*/React.createElement(CSSMotion, _extends({}, motionProps, {\n            key: eventProps.key,\n            visible: visible,\n            eventProps: eventProps,\n            onVisibleChanged: function onVisibleChanged(changedVisible) {\n              _onVisibleChanged === null || _onVisibleChanged === void 0 || _onVisibleChanged(changedVisible, {\n                key: eventProps.key\n              });\n              if (!changedVisible) {\n                _this2.removeKey(eventProps.key);\n              }\n            }\n          }), function (props, ref) {\n            return children(_objectSpread(_objectSpread({}, props), {}, {\n              index: index\n            }), ref);\n          });\n        }));\n      }\n    }], [{\n      key: \"getDerivedStateFromProps\",\n      value: function getDerivedStateFromProps(_ref3, _ref4) {\n        var keys = _ref3.keys;\n        var keyEntities = _ref4.keyEntities;\n        var parsedKeyObjects = parseKeys(keys);\n        var mixedKeyEntities = diffKeys(keyEntities, parsedKeyObjects);\n        return {\n          keyEntities: mixedKeyEntities.filter(function (entity) {\n            var prevEntity = keyEntities.find(function (_ref5) {\n              var key = _ref5.key;\n              return entity.key === key;\n            });\n\n            // Remove if already mark as removed\n            if (prevEntity && prevEntity.status === STATUS_REMOVED && entity.status === STATUS_REMOVE) {\n              return false;\n            }\n            return true;\n          })\n        };\n      }\n    }]);\n    return CSSMotionList;\n  }(React.Component);\n  _defineProperty(CSSMotionList, \"defaultProps\", {\n    component: 'div'\n  });\n  return CSSMotionList;\n}\nexport default genCSSMotionList(supportTransition);","import { FastColor } from '@ant-design/fast-color';\nfunction isStableColor(color) {\n  return color >= 0 && color <= 255;\n}\nfunction getAlphaColor(frontColor, backgroundColor) {\n  const {\n    r: fR,\n    g: fG,\n    b: fB,\n    a: originAlpha\n  } = new FastColor(frontColor).toRgb();\n  if (originAlpha < 1) {\n    return frontColor;\n  }\n  const {\n    r: bR,\n    g: bG,\n    b: bB\n  } = new FastColor(backgroundColor).toRgb();\n  for (let fA = 0.01; fA <= 1; fA += 0.01) {\n    const r = Math.round((fR - bR * (1 - fA)) / fA);\n    const g = Math.round((fG - bG * (1 - fA)) / fA);\n    const b = Math.round((fB - bB * (1 - fA)) / fA);\n    if (isStableColor(r) && isStableColor(g) && isStableColor(b)) {\n      return new FastColor({\n        r,\n        g,\n        b,\n        a: Math.round(fA * 100) / 100\n      }).toRgbString();\n    }\n  }\n  // fallback\n  /* istanbul ignore next */\n  return new FastColor({\n    r: fR,\n    g: fG,\n    b: fB,\n    a: 1\n  }).toRgbString();\n}\nexport default getAlphaColor;","var __rest = this && this.__rest || function (s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n};\nimport { FastColor } from '@ant-design/fast-color';\nimport seedToken from '../themes/seed';\nimport getAlphaColor from './getAlphaColor';\n/**\n * Seed (designer) > Derivative (designer) > Alias (developer).\n *\n * Merge seed & derivative & override token and generate alias token for developer.\n */\nexport default function formatToken(derivativeToken) {\n  const {\n      override\n    } = derivativeToken,\n    restToken = __rest(derivativeToken, [\"override\"]);\n  const overrideTokens = Object.assign({}, override);\n  Object.keys(seedToken).forEach(token => {\n    delete overrideTokens[token];\n  });\n  const mergedToken = Object.assign(Object.assign({}, restToken), overrideTokens);\n  const screenXS = 480;\n  const screenSM = 576;\n  const screenMD = 768;\n  const screenLG = 992;\n  const screenXL = 1200;\n  const screenXXL = 1600;\n  // Motion\n  if (mergedToken.motion === false) {\n    const fastDuration = '0s';\n    mergedToken.motionDurationFast = fastDuration;\n    mergedToken.motionDurationMid = fastDuration;\n    mergedToken.motionDurationSlow = fastDuration;\n  }\n  // Generate alias token\n  const aliasToken = Object.assign(Object.assign(Object.assign({}, mergedToken), {\n    // ============== Background ============== //\n    colorFillContent: mergedToken.colorFillSecondary,\n    colorFillContentHover: mergedToken.colorFill,\n    colorFillAlter: mergedToken.colorFillQuaternary,\n    colorBgContainerDisabled: mergedToken.colorFillTertiary,\n    // ============== Split ============== //\n    colorBorderBg: mergedToken.colorBgContainer,\n    colorSplit: getAlphaColor(mergedToken.colorBorderSecondary, mergedToken.colorBgContainer),\n    // ============== Text ============== //\n    colorTextPlaceholder: mergedToken.colorTextQuaternary,\n    colorTextDisabled: mergedToken.colorTextQuaternary,\n    colorTextHeading: mergedToken.colorText,\n    colorTextLabel: mergedToken.colorTextSecondary,\n    colorTextDescription: mergedToken.colorTextTertiary,\n    colorTextLightSolid: mergedToken.colorWhite,\n    colorHighlight: mergedToken.colorError,\n    colorBgTextHover: mergedToken.colorFillSecondary,\n    colorBgTextActive: mergedToken.colorFill,\n    colorIcon: mergedToken.colorTextTertiary,\n    colorIconHover: mergedToken.colorText,\n    colorErrorOutline: getAlphaColor(mergedToken.colorErrorBg, mergedToken.colorBgContainer),\n    colorWarningOutline: getAlphaColor(mergedToken.colorWarningBg, mergedToken.colorBgContainer),\n    // Font\n    fontSizeIcon: mergedToken.fontSizeSM,\n    // Line\n    lineWidthFocus: mergedToken.lineWidth * 3,\n    // Control\n    lineWidth: mergedToken.lineWidth,\n    controlOutlineWidth: mergedToken.lineWidth * 2,\n    // Checkbox size and expand icon size\n    controlInteractiveSize: mergedToken.controlHeight / 2,\n    controlItemBgHover: mergedToken.colorFillTertiary,\n    controlItemBgActive: mergedToken.colorPrimaryBg,\n    controlItemBgActiveHover: mergedToken.colorPrimaryBgHover,\n    controlItemBgActiveDisabled: mergedToken.colorFill,\n    controlTmpOutline: mergedToken.colorFillQuaternary,\n    controlOutline: getAlphaColor(mergedToken.colorPrimaryBg, mergedToken.colorBgContainer),\n    lineType: mergedToken.lineType,\n    borderRadius: mergedToken.borderRadius,\n    borderRadiusXS: mergedToken.borderRadiusXS,\n    borderRadiusSM: mergedToken.borderRadiusSM,\n    borderRadiusLG: mergedToken.borderRadiusLG,\n    fontWeightStrong: 600,\n    opacityLoading: 0.65,\n    linkDecoration: 'none',\n    linkHoverDecoration: 'none',\n    linkFocusDecoration: 'none',\n    controlPaddingHorizontal: 12,\n    controlPaddingHorizontalSM: 8,\n    paddingXXS: mergedToken.sizeXXS,\n    paddingXS: mergedToken.sizeXS,\n    paddingSM: mergedToken.sizeSM,\n    padding: mergedToken.size,\n    paddingMD: mergedToken.sizeMD,\n    paddingLG: mergedToken.sizeLG,\n    paddingXL: mergedToken.sizeXL,\n    paddingContentHorizontalLG: mergedToken.sizeLG,\n    paddingContentVerticalLG: mergedToken.sizeMS,\n    paddingContentHorizontal: mergedToken.sizeMS,\n    paddingContentVertical: mergedToken.sizeSM,\n    paddingContentHorizontalSM: mergedToken.size,\n    paddingContentVerticalSM: mergedToken.sizeXS,\n    marginXXS: mergedToken.sizeXXS,\n    marginXS: mergedToken.sizeXS,\n    marginSM: mergedToken.sizeSM,\n    margin: mergedToken.size,\n    marginMD: mergedToken.sizeMD,\n    marginLG: mergedToken.sizeLG,\n    marginXL: mergedToken.sizeXL,\n    marginXXL: mergedToken.sizeXXL,\n    boxShadow: `\n      0 6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 9px 28px 8px rgba(0, 0, 0, 0.05)\n    `,\n    boxShadowSecondary: `\n      0 6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 9px 28px 8px rgba(0, 0, 0, 0.05)\n    `,\n    boxShadowTertiary: `\n      0 1px 2px 0 rgba(0, 0, 0, 0.03),\n      0 1px 6px -1px rgba(0, 0, 0, 0.02),\n      0 2px 4px 0 rgba(0, 0, 0, 0.02)\n    `,\n    screenXS,\n    screenXSMin: screenXS,\n    screenXSMax: screenSM - 1,\n    screenSM,\n    screenSMMin: screenSM,\n    screenSMMax: screenMD - 1,\n    screenMD,\n    screenMDMin: screenMD,\n    screenMDMax: screenLG - 1,\n    screenLG,\n    screenLGMin: screenLG,\n    screenLGMax: screenXL - 1,\n    screenXL,\n    screenXLMin: screenXL,\n    screenXLMax: screenXXL - 1,\n    screenXXL,\n    screenXXLMin: screenXXL,\n    boxShadowPopoverArrow: '2px 2px 5px rgba(0, 0, 0, 0.05)',\n    boxShadowCard: `\n      0 1px 2px -2px ${new FastColor('rgba(0, 0, 0, 0.16)').toRgbString()},\n      0 3px 6px 0 ${new FastColor('rgba(0, 0, 0, 0.12)').toRgbString()},\n      0 5px 12px 4px ${new FastColor('rgba(0, 0, 0, 0.09)').toRgbString()}\n    `,\n    boxShadowDrawerRight: `\n      -6px 0 16px 0 rgba(0, 0, 0, 0.08),\n      -3px 0 6px -4px rgba(0, 0, 0, 0.12),\n      -9px 0 28px 8px rgba(0, 0, 0, 0.05)\n    `,\n    boxShadowDrawerLeft: `\n      6px 0 16px 0 rgba(0, 0, 0, 0.08),\n      3px 0 6px -4px rgba(0, 0, 0, 0.12),\n      9px 0 28px 8px rgba(0, 0, 0, 0.05)\n    `,\n    boxShadowDrawerUp: `\n      0 6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 9px 28px 8px rgba(0, 0, 0, 0.05)\n    `,\n    boxShadowDrawerDown: `\n      0 -6px 16px 0 rgba(0, 0, 0, 0.08),\n      0 -3px 6px -4px rgba(0, 0, 0, 0.12),\n      0 -9px 28px 8px rgba(0, 0, 0, 0.05)\n    `,\n    boxShadowTabsOverflowLeft: 'inset 10px 0 8px -8px rgba(0, 0, 0, 0.08)',\n    boxShadowTabsOverflowRight: 'inset -10px 0 8px -8px rgba(0, 0, 0, 0.08)',\n    boxShadowTabsOverflowTop: 'inset 0 10px 8px -8px rgba(0, 0, 0, 0.08)',\n    boxShadowTabsOverflowBottom: 'inset 0 -10px 8px -8px rgba(0, 0, 0, 0.08)'\n  }), overrideTokens);\n  return aliasToken;\n}","var __rest = this && this.__rest || function (s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n};\nimport React from 'react';\nimport { useCacheToken } from '@ant-design/cssinjs';\nimport version from '../version';\nimport { defaultTheme, DesignTokenContext } from './context';\nimport defaultSeedToken from './themes/seed';\nimport formatToken from './util/alias';\nexport const unitless = {\n  lineHeight: true,\n  lineHeightSM: true,\n  lineHeightLG: true,\n  lineHeightHeading1: true,\n  lineHeightHeading2: true,\n  lineHeightHeading3: true,\n  lineHeightHeading4: true,\n  lineHeightHeading5: true,\n  opacityLoading: true,\n  fontWeightStrong: true,\n  zIndexPopupBase: true,\n  zIndexBase: true,\n  opacityImage: true\n};\nexport const ignore = {\n  size: true,\n  sizeSM: true,\n  sizeLG: true,\n  sizeMD: true,\n  sizeXS: true,\n  sizeXXS: true,\n  sizeMS: true,\n  sizeXL: true,\n  sizeXXL: true,\n  sizeUnit: true,\n  sizeStep: true,\n  motionBase: true,\n  motionUnit: true\n};\nconst preserve = {\n  screenXS: true,\n  screenXSMin: true,\n  screenXSMax: true,\n  screenSM: true,\n  screenSMMin: true,\n  screenSMMax: true,\n  screenMD: true,\n  screenMDMin: true,\n  screenMDMax: true,\n  screenLG: true,\n  screenLGMin: true,\n  screenLGMax: true,\n  screenXL: true,\n  screenXLMin: true,\n  screenXLMax: true,\n  screenXXL: true,\n  screenXXLMin: true\n};\nexport const getComputedToken = (originToken, overrideToken, theme) => {\n  const derivativeToken = theme.getDerivativeToken(originToken);\n  const {\n      override\n    } = overrideToken,\n    components = __rest(overrideToken, [\"override\"]);\n  // Merge with override\n  let mergedDerivativeToken = Object.assign(Object.assign({}, derivativeToken), {\n    override\n  });\n  // Format if needed\n  mergedDerivativeToken = formatToken(mergedDerivativeToken);\n  if (components) {\n    Object.entries(components).forEach(([key, value]) => {\n      const {\n          theme: componentTheme\n        } = value,\n        componentTokens = __rest(value, [\"theme\"]);\n      let mergedComponentToken = componentTokens;\n      if (componentTheme) {\n        mergedComponentToken = getComputedToken(Object.assign(Object.assign({}, mergedDerivativeToken), componentTokens), {\n          override: componentTokens\n        }, componentTheme);\n      }\n      mergedDerivativeToken[key] = mergedComponentToken;\n    });\n  }\n  return mergedDerivativeToken;\n};\n// ================================== Hook ==================================\nexport default function useToken() {\n  const {\n    token: rootDesignToken,\n    hashed,\n    theme,\n    override,\n    cssVar\n  } = React.useContext(DesignTokenContext);\n  const salt = `${version}-${hashed || ''}`;\n  const mergedTheme = theme || defaultTheme;\n  const [token, hashId, realToken] = useCacheToken(mergedTheme, [defaultSeedToken, rootDesignToken], {\n    salt,\n    override,\n    getComputedToken,\n    // formatToken will not be consumed after 1.15.0 with getComputedToken.\n    // But token will break if @ant-design/cssinjs is under 1.15.0 without it\n    formatToken,\n    cssVar: cssVar && {\n      prefix: cssVar.prefix,\n      key: cssVar.key,\n      unitless,\n      ignore,\n      preserve\n    }\n  });\n  return [mergedTheme, realToken, hashed ? hashId : '', token, cssVar];\n}","export default '5.25.4';","\"use client\";\n\nimport * as React from 'react';\nimport { Provider as MotionProvider } from 'rc-motion';\nimport { useToken } from '../theme/internal';\nexport default function MotionWrapper(props) {\n  const {\n    children\n  } = props;\n  const [, token] = useToken();\n  const {\n    motion\n  } = token;\n  const needWrapMotionProviderRef = React.useRef(false);\n  needWrapMotionProviderRef.current = needWrapMotionProviderRef.current || motion === false;\n  if (needWrapMotionProviderRef.current) {\n    return /*#__PURE__*/React.createElement(MotionProvider, {\n      motion: motion\n    }, children);\n  }\n  return children;\n}","\"use client\";\n\nimport * as React from 'react';\nimport { devUseWarning } from '../_util/warning';\n/**\n * Warning for ConfigProviderProps.\n * This will be empty function in production.\n */\nconst PropWarning = /*#__PURE__*/React.memo(({\n  dropdownMatchSelectWidth\n}) => {\n  const warning = devUseWarning('ConfigProvider');\n  warning.deprecated(dropdownMatchSelectWidth === undefined, 'dropdownMatchSelectWidth', 'popupMatchSelectWidth');\n  return null;\n});\nif (process.env.NODE_ENV !== 'production') {\n  PropWarning.displayName = 'PropWarning';\n}\nexport default process.env.NODE_ENV !== 'production' ? PropWarning : () => null;","\"use client\";\n\nimport { unit } from '@ant-design/cssinjs';\nexport const textEllipsis = {\n  overflow: 'hidden',\n  whiteSpace: 'nowrap',\n  textOverflow: 'ellipsis'\n};\nexport const resetComponent = (token, needInheritFontFamily = false) => ({\n  boxSizing: 'border-box',\n  margin: 0,\n  padding: 0,\n  color: token.colorText,\n  fontSize: token.fontSize,\n  // font-variant: @font-variant-base;\n  lineHeight: token.lineHeight,\n  listStyle: 'none',\n  // font-feature-settings: @font-feature-settings-base;\n  fontFamily: needInheritFontFamily ? 'inherit' : token.fontFamily\n});\nexport const resetIcon = () => ({\n  display: 'inline-flex',\n  alignItems: 'center',\n  color: 'inherit',\n  fontStyle: 'normal',\n  lineHeight: 0,\n  textAlign: 'center',\n  textTransform: 'none',\n  // for SVG icon, see https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4\n  verticalAlign: '-0.125em',\n  textRendering: 'optimizeLegibility',\n  '-webkit-font-smoothing': 'antialiased',\n  '-moz-osx-font-smoothing': 'grayscale',\n  '> *': {\n    lineHeight: 1\n  },\n  svg: {\n    display: 'inline-block'\n  }\n});\nexport const clearFix = () => ({\n  // https://github.com/ant-design/ant-design/issues/21301#issuecomment-583955229\n  '&::before': {\n    display: 'table',\n    content: '\"\"'\n  },\n  '&::after': {\n    // https://github.com/ant-design/ant-design/issues/21864\n    display: 'table',\n    clear: 'both',\n    content: '\"\"'\n  }\n});\nexport const genLinkStyle = token => ({\n  a: {\n    color: token.colorLink,\n    textDecoration: token.linkDecoration,\n    backgroundColor: 'transparent',\n    // remove the gray background on active links in IE 10.\n    outline: 'none',\n    cursor: 'pointer',\n    transition: `color ${token.motionDurationSlow}`,\n    '-webkit-text-decoration-skip': 'objects',\n    // remove gaps in links underline in iOS 8+ and Safari 8+.\n    '&:hover': {\n      color: token.colorLinkHover\n    },\n    '&:active': {\n      color: token.colorLinkActive\n    },\n    '&:active, &:hover': {\n      textDecoration: token.linkHoverDecoration,\n      outline: 0\n    },\n    // https://github.com/ant-design/ant-design/issues/22503\n    '&:focus': {\n      textDecoration: token.linkFocusDecoration,\n      outline: 0\n    },\n    '&[disabled]': {\n      color: token.colorTextDisabled,\n      cursor: 'not-allowed'\n    }\n  }\n});\nexport const genCommonStyle = (token, componentPrefixCls, rootCls, resetFont) => {\n  const prefixSelector = `[class^=\"${componentPrefixCls}\"], [class*=\" ${componentPrefixCls}\"]`;\n  const rootPrefixSelector = rootCls ? `.${rootCls}` : prefixSelector;\n  const resetStyle = {\n    boxSizing: 'border-box',\n    '&::before, &::after': {\n      boxSizing: 'border-box'\n    }\n  };\n  let resetFontStyle = {};\n  if (resetFont !== false) {\n    resetFontStyle = {\n      fontFamily: token.fontFamily,\n      fontSize: token.fontSize\n    };\n  }\n  return {\n    [rootPrefixSelector]: Object.assign(Object.assign(Object.assign({}, resetFontStyle), resetStyle), {\n      [prefixSelector]: resetStyle\n    })\n  };\n};\nexport const genFocusOutline = (token, offset) => ({\n  outline: `${unit(token.lineWidthFocus)} solid ${token.colorPrimaryBorder}`,\n  outlineOffset: offset !== null && offset !== void 0 ? offset : 1,\n  transition: 'outline-offset 0s, outline 0s'\n});\nexport const genFocusStyle = (token, offset) => ({\n  '&:focus-visible': Object.assign({}, genFocusOutline(token, offset))\n});\nexport const genIconStyle = iconPrefixCls => ({\n  [`.${iconPrefixCls}`]: Object.assign(Object.assign({}, resetIcon()), {\n    [`.${iconPrefixCls} .${iconPrefixCls}-icon`]: {\n      display: 'block'\n    }\n  })\n});\nexport const operationUnit = token => Object.assign(Object.assign({\n  // FIXME: This use link but is a operation unit. Seems should be a colorPrimary.\n  // And Typography use this to generate link style which should not do this.\n  color: token.colorLink,\n  textDecoration: token.linkDecoration,\n  outline: 'none',\n  cursor: 'pointer',\n  transition: `all ${token.motionDurationSlow}`,\n  border: 0,\n  padding: 0,\n  background: 'none',\n  userSelect: 'none'\n}, genFocusStyle(token)), {\n  '&:focus, &:hover': {\n    color: token.colorLinkHover\n  },\n  '&:active': {\n    color: token.colorLinkActive\n  }\n});","import { useStyleRegister } from '@ant-design/cssinjs';\nimport { genIconStyle } from '../../style';\nimport useToken from '../useToken';\nconst useResetIconStyle = (iconPrefixCls, csp) => {\n  const [theme, token] = useToken();\n  // Generate style for icons\n  return useStyleRegister({\n    theme,\n    token,\n    hashId: '',\n    path: ['ant-design-icons', iconPrefixCls],\n    nonce: () => csp === null || csp === void 0 ? void 0 : csp.nonce,\n    layer: {\n      name: 'antd'\n    }\n  }, () => [genIconStyle(iconPrefixCls)]);\n};\nexport default useResetIconStyle;","\"use client\";\n\nvar __rest = this && this.__rest || function (s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n};\nimport * as React from 'react';\nimport { createTheme, StyleContext as CssInJsStyleContext } from '@ant-design/cssinjs';\nimport IconContext from \"@ant-design/icons/es/components/Context\";\nimport useMemo from \"rc-util/es/hooks/useMemo\";\nimport { merge } from \"rc-util/es/utils/set\";\nimport warning, { devUseWarning, WarningContext } from '../_util/warning';\nimport ValidateMessagesContext from '../form/validateMessagesContext';\nimport LocaleProvider, { ANT_MARK } from '../locale';\nimport LocaleContext from '../locale/context';\nimport defaultLocale from '../locale/en_US';\nimport { defaultTheme, DesignTokenContext } from '../theme/context';\nimport defaultSeedToken from '../theme/themes/seed';\nimport { ConfigConsumer, ConfigContext, defaultIconPrefixCls, defaultPrefixCls, Variants } from './context';\nimport { registerTheme } from './cssVariables';\nimport { DisabledContextProvider } from './DisabledContext';\nimport useConfig from './hooks/useConfig';\nimport useTheme from './hooks/useTheme';\nimport MotionWrapper from './MotionWrapper';\nimport PropWarning from './PropWarning';\nimport SizeContext, { SizeContextProvider } from './SizeContext';\nimport useStyle from './style';\nexport { Variants };\n/**\n * Since too many feedback using static method like `Modal.confirm` not getting theme, we record the\n * theme register info here to help developer get warning info.\n */\nlet existThemeConfig = false;\nexport const warnContext = process.env.NODE_ENV !== 'production' ? componentName => {\n  process.env.NODE_ENV !== \"production\" ? warning(!existThemeConfig, componentName, `Static function can not consume context like dynamic theme. Please use 'App' component instead.`) : void 0;\n} : /* istanbul ignore next */\nnull;\nexport { ConfigConsumer, ConfigContext, defaultPrefixCls, defaultIconPrefixCls };\nexport const configConsumerProps = ['getTargetContainer', 'getPopupContainer', 'rootPrefixCls', 'getPrefixCls', 'renderEmpty', 'csp', 'autoInsertSpaceInButton', 'locale'];\n// These props is used by `useContext` directly in sub component\nconst PASSED_PROPS = ['getTargetContainer', 'getPopupContainer', 'renderEmpty', 'input', 'pagination', 'form', 'select', 'button'];\nlet globalPrefixCls;\nlet globalIconPrefixCls;\nlet globalTheme;\nlet globalHolderRender;\nfunction getGlobalPrefixCls() {\n  return globalPrefixCls || defaultPrefixCls;\n}\nfunction getGlobalIconPrefixCls() {\n  return globalIconPrefixCls || defaultIconPrefixCls;\n}\nfunction isLegacyTheme(theme) {\n  return Object.keys(theme).some(key => key.endsWith('Color'));\n}\nconst setGlobalConfig = props => {\n  const {\n    prefixCls,\n    iconPrefixCls,\n    theme,\n    holderRender\n  } = props;\n  if (prefixCls !== undefined) {\n    globalPrefixCls = prefixCls;\n  }\n  if (iconPrefixCls !== undefined) {\n    globalIconPrefixCls = iconPrefixCls;\n  }\n  if ('holderRender' in props) {\n    globalHolderRender = holderRender;\n  }\n  if (theme) {\n    if (isLegacyTheme(theme)) {\n      process.env.NODE_ENV !== \"production\" ? warning(false, 'ConfigProvider', '`config` of css variable theme is not work in v5. Please use new `theme` config instead.') : void 0;\n      registerTheme(getGlobalPrefixCls(), theme);\n    } else {\n      globalTheme = theme;\n    }\n  }\n};\nexport const globalConfig = () => ({\n  getPrefixCls: (suffixCls, customizePrefixCls) => {\n    if (customizePrefixCls) {\n      return customizePrefixCls;\n    }\n    return suffixCls ? `${getGlobalPrefixCls()}-${suffixCls}` : getGlobalPrefixCls();\n  },\n  getIconPrefixCls: getGlobalIconPrefixCls,\n  getRootPrefixCls: () => {\n    // If Global prefixCls provided, use this\n    if (globalPrefixCls) {\n      return globalPrefixCls;\n    }\n    // Fallback to default prefixCls\n    return getGlobalPrefixCls();\n  },\n  getTheme: () => globalTheme,\n  holderRender: globalHolderRender\n});\nconst ProviderChildren = props => {\n  const {\n    children,\n    csp: customCsp,\n    autoInsertSpaceInButton,\n    alert,\n    anchor,\n    form,\n    locale,\n    componentSize,\n    direction,\n    space,\n    splitter,\n    virtual,\n    dropdownMatchSelectWidth,\n    popupMatchSelectWidth,\n    popupOverflow,\n    legacyLocale,\n    parentContext,\n    iconPrefixCls: customIconPrefixCls,\n    theme,\n    componentDisabled,\n    segmented,\n    statistic,\n    spin,\n    calendar,\n    carousel,\n    cascader,\n    collapse,\n    typography,\n    checkbox,\n    descriptions,\n    divider,\n    drawer,\n    skeleton,\n    steps,\n    image,\n    layout,\n    list,\n    mentions,\n    modal,\n    progress,\n    result,\n    slider,\n    breadcrumb,\n    menu,\n    pagination,\n    input,\n    textArea,\n    empty,\n    badge,\n    radio,\n    rate,\n    switch: SWITCH,\n    transfer,\n    avatar,\n    message,\n    tag,\n    table,\n    card,\n    tabs,\n    timeline,\n    timePicker,\n    upload,\n    notification,\n    tree,\n    colorPicker,\n    datePicker,\n    rangePicker,\n    flex,\n    wave,\n    dropdown,\n    warning: warningConfig,\n    tour,\n    tooltip,\n    popover,\n    popconfirm,\n    floatButtonGroup,\n    variant,\n    inputNumber,\n    treeSelect\n  } = props;\n  // =================================== Context ===================================\n  const getPrefixCls = React.useCallback((suffixCls, customizePrefixCls) => {\n    const {\n      prefixCls\n    } = props;\n    if (customizePrefixCls) {\n      return customizePrefixCls;\n    }\n    const mergedPrefixCls = prefixCls || parentContext.getPrefixCls('');\n    return suffixCls ? `${mergedPrefixCls}-${suffixCls}` : mergedPrefixCls;\n  }, [parentContext.getPrefixCls, props.prefixCls]);\n  const iconPrefixCls = customIconPrefixCls || parentContext.iconPrefixCls || defaultIconPrefixCls;\n  const csp = customCsp || parentContext.csp;\n  useStyle(iconPrefixCls, csp);\n  const mergedTheme = useTheme(theme, parentContext.theme, {\n    prefixCls: getPrefixCls('')\n  });\n  if (process.env.NODE_ENV !== 'production') {\n    existThemeConfig = existThemeConfig || !!mergedTheme;\n  }\n  const baseConfig = {\n    csp,\n    autoInsertSpaceInButton,\n    alert,\n    anchor,\n    locale: locale || legacyLocale,\n    direction,\n    space,\n    splitter,\n    virtual,\n    popupMatchSelectWidth: popupMatchSelectWidth !== null && popupMatchSelectWidth !== void 0 ? popupMatchSelectWidth : dropdownMatchSelectWidth,\n    popupOverflow,\n    getPrefixCls,\n    iconPrefixCls,\n    theme: mergedTheme,\n    segmented,\n    statistic,\n    spin,\n    calendar,\n    carousel,\n    cascader,\n    collapse,\n    typography,\n    checkbox,\n    descriptions,\n    divider,\n    drawer,\n    skeleton,\n    steps,\n    image,\n    input,\n    textArea,\n    layout,\n    list,\n    mentions,\n    modal,\n    progress,\n    result,\n    slider,\n    breadcrumb,\n    menu,\n    pagination,\n    empty,\n    badge,\n    radio,\n    rate,\n    switch: SWITCH,\n    transfer,\n    avatar,\n    message,\n    tag,\n    table,\n    card,\n    tabs,\n    timeline,\n    timePicker,\n    upload,\n    notification,\n    tree,\n    colorPicker,\n    datePicker,\n    rangePicker,\n    flex,\n    wave,\n    dropdown,\n    warning: warningConfig,\n    tour,\n    tooltip,\n    popover,\n    popconfirm,\n    floatButtonGroup,\n    variant,\n    inputNumber,\n    treeSelect\n  };\n  if (process.env.NODE_ENV !== 'production') {\n    const warningFn = devUseWarning('ConfigProvider');\n    warningFn(!('autoInsertSpaceInButton' in props), 'deprecated', '`autoInsertSpaceInButton` is deprecated. Please use `{ button: { autoInsertSpace: boolean }}` instead.');\n  }\n  const config = Object.assign({}, parentContext);\n  Object.keys(baseConfig).forEach(key => {\n    if (baseConfig[key] !== undefined) {\n      config[key] = baseConfig[key];\n    }\n  });\n  // Pass the props used by `useContext` directly with child component.\n  // These props should merged into `config`.\n  PASSED_PROPS.forEach(propName => {\n    const propValue = props[propName];\n    if (propValue) {\n      config[propName] = propValue;\n    }\n  });\n  if (typeof autoInsertSpaceInButton !== 'undefined') {\n    // merge deprecated api\n    config.button = Object.assign({\n      autoInsertSpace: autoInsertSpaceInButton\n    }, config.button);\n  }\n  // https://github.com/ant-design/ant-design/issues/27617\n  const memoedConfig = useMemo(() => config, config, (prevConfig, currentConfig) => {\n    const prevKeys = Object.keys(prevConfig);\n    const currentKeys = Object.keys(currentConfig);\n    return prevKeys.length !== currentKeys.length || prevKeys.some(key => prevConfig[key] !== currentConfig[key]);\n  });\n  const {\n    layer\n  } = React.useContext(CssInJsStyleContext);\n  const memoIconContextValue = React.useMemo(() => ({\n    prefixCls: iconPrefixCls,\n    csp,\n    layer: layer ? 'antd' : undefined\n  }), [iconPrefixCls, csp, layer]);\n  let childNode = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(PropWarning, {\n    dropdownMatchSelectWidth: dropdownMatchSelectWidth\n  }), children);\n  const validateMessages = React.useMemo(() => {\n    var _a, _b, _c, _d;\n    return merge(((_a = defaultLocale.Form) === null || _a === void 0 ? void 0 : _a.defaultValidateMessages) || {}, ((_c = (_b = memoedConfig.locale) === null || _b === void 0 ? void 0 : _b.Form) === null || _c === void 0 ? void 0 : _c.defaultValidateMessages) || {}, ((_d = memoedConfig.form) === null || _d === void 0 ? void 0 : _d.validateMessages) || {}, (form === null || form === void 0 ? void 0 : form.validateMessages) || {});\n  }, [memoedConfig, form === null || form === void 0 ? void 0 : form.validateMessages]);\n  if (Object.keys(validateMessages).length > 0) {\n    childNode = /*#__PURE__*/React.createElement(ValidateMessagesContext.Provider, {\n      value: validateMessages\n    }, childNode);\n  }\n  if (locale) {\n    childNode = /*#__PURE__*/React.createElement(LocaleProvider, {\n      locale: locale,\n      _ANT_MARK__: ANT_MARK\n    }, childNode);\n  }\n  if (iconPrefixCls || csp) {\n    childNode = /*#__PURE__*/React.createElement(IconContext.Provider, {\n      value: memoIconContextValue\n    }, childNode);\n  }\n  if (componentSize) {\n    childNode = /*#__PURE__*/React.createElement(SizeContextProvider, {\n      size: componentSize\n    }, childNode);\n  }\n  // =================================== Motion ===================================\n  childNode = /*#__PURE__*/React.createElement(MotionWrapper, null, childNode);\n  // ================================ Dynamic theme ================================\n  const memoTheme = React.useMemo(() => {\n    const _a = mergedTheme || {},\n      {\n        algorithm,\n        token,\n        components,\n        cssVar\n      } = _a,\n      rest = __rest(_a, [\"algorithm\", \"token\", \"components\", \"cssVar\"]);\n    const themeObj = algorithm && (!Array.isArray(algorithm) || algorithm.length > 0) ? createTheme(algorithm) : defaultTheme;\n    const parsedComponents = {};\n    Object.entries(components || {}).forEach(([componentName, componentToken]) => {\n      const parsedToken = Object.assign({}, componentToken);\n      if ('algorithm' in parsedToken) {\n        if (parsedToken.algorithm === true) {\n          parsedToken.theme = themeObj;\n        } else if (Array.isArray(parsedToken.algorithm) || typeof parsedToken.algorithm === 'function') {\n          parsedToken.theme = createTheme(parsedToken.algorithm);\n        }\n        delete parsedToken.algorithm;\n      }\n      parsedComponents[componentName] = parsedToken;\n    });\n    const mergedToken = Object.assign(Object.assign({}, defaultSeedToken), token);\n    return Object.assign(Object.assign({}, rest), {\n      theme: themeObj,\n      token: mergedToken,\n      components: parsedComponents,\n      override: Object.assign({\n        override: mergedToken\n      }, parsedComponents),\n      cssVar: cssVar\n    });\n  }, [mergedTheme]);\n  if (theme) {\n    childNode = /*#__PURE__*/React.createElement(DesignTokenContext.Provider, {\n      value: memoTheme\n    }, childNode);\n  }\n  // ================================== Warning ===================================\n  if (memoedConfig.warning) {\n    childNode = /*#__PURE__*/React.createElement(WarningContext.Provider, {\n      value: memoedConfig.warning\n    }, childNode);\n  }\n  // =================================== Render ===================================\n  if (componentDisabled !== undefined) {\n    childNode = /*#__PURE__*/React.createElement(DisabledContextProvider, {\n      disabled: componentDisabled\n    }, childNode);\n  }\n  return /*#__PURE__*/React.createElement(ConfigContext.Provider, {\n    value: memoedConfig\n  }, childNode);\n};\nconst ConfigProvider = props => {\n  const context = React.useContext(ConfigContext);\n  const antLocale = React.useContext(LocaleContext);\n  return /*#__PURE__*/React.createElement(ProviderChildren, Object.assign({\n    parentContext: context,\n    legacyLocale: antLocale\n  }, props));\n};\nConfigProvider.ConfigContext = ConfigContext;\nConfigProvider.SizeContext = SizeContext;\nConfigProvider.config = setGlobalConfig;\nConfigProvider.useConfig = useConfig;\nObject.defineProperty(ConfigProvider, 'SizeContext', {\n  get: () => {\n    process.env.NODE_ENV !== \"production\" ? warning(false, 'ConfigProvider', 'ConfigProvider.SizeContext is deprecated. Please use `ConfigProvider.useConfig().componentSize` instead.') : void 0;\n    return SizeContext;\n  }\n});\nif (process.env.NODE_ENV !== 'production') {\n  ConfigProvider.displayName = 'ConfigProvider';\n}\nexport default ConfigProvider;","import useMemo from \"rc-util/es/hooks/useMemo\";\nimport isEqual from \"rc-util/es/isEqual\";\nimport { devUseWarning } from '../../_util/warning';\nimport { defaultConfig } from '../../theme/internal';\nimport useThemeKey from './useThemeKey';\nexport default function useTheme(theme, parentTheme, config) {\n  var _a, _b;\n  const warning = devUseWarning('ConfigProvider');\n  const themeConfig = theme || {};\n  const parentThemeConfig = themeConfig.inherit === false || !parentTheme ? Object.assign(Object.assign({}, defaultConfig), {\n    hashed: (_a = parentTheme === null || parentTheme === void 0 ? void 0 : parentTheme.hashed) !== null && _a !== void 0 ? _a : defaultConfig.hashed,\n    cssVar: parentTheme === null || parentTheme === void 0 ? void 0 : parentTheme.cssVar\n  }) : parentTheme;\n  const themeKey = useThemeKey();\n  if (process.env.NODE_ENV !== 'production') {\n    const cssVarEnabled = themeConfig.cssVar || parentThemeConfig.cssVar;\n    const validKey = !!(typeof themeConfig.cssVar === 'object' && ((_b = themeConfig.cssVar) === null || _b === void 0 ? void 0 : _b.key) || themeKey);\n    process.env.NODE_ENV !== \"production\" ? warning(!cssVarEnabled || validKey, 'breaking', 'Missing key in `cssVar` config. Please upgrade to React 18 or set `cssVar.key` manually in each ConfigProvider inside `cssVar` enabled ConfigProvider.') : void 0;\n  }\n  return useMemo(() => {\n    var _a, _b;\n    if (!theme) {\n      return parentTheme;\n    }\n    // Override\n    const mergedComponents = Object.assign({}, parentThemeConfig.components);\n    Object.keys(theme.components || {}).forEach(componentName => {\n      mergedComponents[componentName] = Object.assign(Object.assign({}, mergedComponents[componentName]), theme.components[componentName]);\n    });\n    const cssVarKey = `css-var-${themeKey.replace(/:/g, '')}`;\n    const mergedCssVar = ((_a = themeConfig.cssVar) !== null && _a !== void 0 ? _a : parentThemeConfig.cssVar) && Object.assign(Object.assign(Object.assign({\n      prefix: config === null || config === void 0 ? void 0 : config.prefixCls\n    }, typeof parentThemeConfig.cssVar === 'object' ? parentThemeConfig.cssVar : {}), typeof themeConfig.cssVar === 'object' ? themeConfig.cssVar : {}), {\n      key: typeof themeConfig.cssVar === 'object' && ((_b = themeConfig.cssVar) === null || _b === void 0 ? void 0 : _b.key) || cssVarKey\n    });\n    // Base token\n    return Object.assign(Object.assign(Object.assign({}, parentThemeConfig), themeConfig), {\n      token: Object.assign(Object.assign({}, parentThemeConfig.token), themeConfig.token),\n      components: mergedComponents,\n      cssVar: mergedCssVar\n    });\n  }, [themeConfig, parentThemeConfig], (prev, next) => prev.some((prevTheme, index) => {\n    const nextTheme = next[index];\n    return !isEqual(prevTheme, nextTheme, true);\n  }));\n}","import _typeof from \"./typeof.js\";\nfunction _regeneratorRuntime() {\n  \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */\n  _regeneratorRuntime = function _regeneratorRuntime() {\n    return r;\n  };\n  var t,\n    r = {},\n    e = Object.prototype,\n    n = e.hasOwnProperty,\n    o = \"function\" == typeof Symbol ? Symbol : {},\n    i = o.iterator || \"@@iterator\",\n    a = o.asyncIterator || \"@@asyncIterator\",\n    u = o.toStringTag || \"@@toStringTag\";\n  function c(t, r, e, n) {\n    return Object.defineProperty(t, r, {\n      value: e,\n      enumerable: !n,\n      configurable: !n,\n      writable: !n\n    });\n  }\n  try {\n    c({}, \"\");\n  } catch (t) {\n    c = function c(t, r, e) {\n      return t[r] = e;\n    };\n  }\n  function h(r, e, n, o) {\n    var i = e && e.prototype instanceof Generator ? e : Generator,\n      a = Object.create(i.prototype);\n    return c(a, \"_invoke\", function (r, e, n) {\n      var o = 1;\n      return function (i, a) {\n        if (3 === o) throw Error(\"Generator is already running\");\n        if (4 === o) {\n          if (\"throw\" === i) throw a;\n          return {\n            value: t,\n            done: !0\n          };\n        }\n        for (n.method = i, n.arg = a;;) {\n          var u = n.delegate;\n          if (u) {\n            var c = d(u, n);\n            if (c) {\n              if (c === f) continue;\n              return c;\n            }\n          }\n          if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) {\n            if (1 === o) throw o = 4, n.arg;\n            n.dispatchException(n.arg);\n          } else \"return\" === n.method && n.abrupt(\"return\", n.arg);\n          o = 3;\n          var h = s(r, e, n);\n          if (\"normal\" === h.type) {\n            if (o = n.done ? 4 : 2, h.arg === f) continue;\n            return {\n              value: h.arg,\n              done: n.done\n            };\n          }\n          \"throw\" === h.type && (o = 4, n.method = \"throw\", n.arg = h.arg);\n        }\n      };\n    }(r, n, new Context(o || [])), !0), a;\n  }\n  function s(t, r, e) {\n    try {\n      return {\n        type: \"normal\",\n        arg: t.call(r, e)\n      };\n    } catch (t) {\n      return {\n        type: \"throw\",\n        arg: t\n      };\n    }\n  }\n  r.wrap = h;\n  var f = {};\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n  var l = {};\n  c(l, i, function () {\n    return this;\n  });\n  var p = Object.getPrototypeOf,\n    y = p && p(p(x([])));\n  y && y !== e && n.call(y, i) && (l = y);\n  var v = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(l);\n  function g(t) {\n    [\"next\", \"throw\", \"return\"].forEach(function (r) {\n      c(t, r, function (t) {\n        return this._invoke(r, t);\n      });\n    });\n  }\n  function AsyncIterator(t, r) {\n    function e(o, i, a, u) {\n      var c = s(t[o], t, i);\n      if (\"throw\" !== c.type) {\n        var h = c.arg,\n          f = h.value;\n        return f && \"object\" == _typeof(f) && n.call(f, \"__await\") ? r.resolve(f.__await).then(function (t) {\n          e(\"next\", t, a, u);\n        }, function (t) {\n          e(\"throw\", t, a, u);\n        }) : r.resolve(f).then(function (t) {\n          h.value = t, a(h);\n        }, function (t) {\n          return e(\"throw\", t, a, u);\n        });\n      }\n      u(c.arg);\n    }\n    var o;\n    c(this, \"_invoke\", function (t, n) {\n      function i() {\n        return new r(function (r, o) {\n          e(t, n, r, o);\n        });\n      }\n      return o = o ? o.then(i, i) : i();\n    }, !0);\n  }\n  function d(r, e) {\n    var n = e.method,\n      o = r.i[n];\n    if (o === t) return e.delegate = null, \"throw\" === n && r.i[\"return\"] && (e.method = \"return\", e.arg = t, d(r, e), \"throw\" === e.method) || \"return\" !== n && (e.method = \"throw\", e.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), f;\n    var i = s(o, r.i, e.arg);\n    if (\"throw\" === i.type) return e.method = \"throw\", e.arg = i.arg, e.delegate = null, f;\n    var a = i.arg;\n    return a ? a.done ? (e[r.r] = a.value, e.next = r.n, \"return\" !== e.method && (e.method = \"next\", e.arg = t), e.delegate = null, f) : a : (e.method = \"throw\", e.arg = new TypeError(\"iterator result is not an object\"), e.delegate = null, f);\n  }\n  function w(t) {\n    this.tryEntries.push(t);\n  }\n  function m(r) {\n    var e = r[4] || {};\n    e.type = \"normal\", e.arg = t, r[4] = e;\n  }\n  function Context(t) {\n    this.tryEntries = [[-1]], t.forEach(w, this), this.reset(!0);\n  }\n  function x(r) {\n    if (null != r) {\n      var e = r[i];\n      if (e) return e.call(r);\n      if (\"function\" == typeof r.next) return r;\n      if (!isNaN(r.length)) {\n        var o = -1,\n          a = function e() {\n            for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e;\n            return e.value = t, e.done = !0, e;\n          };\n        return a.next = a;\n      }\n    }\n    throw new TypeError(_typeof(r) + \" is not iterable\");\n  }\n  return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, \"constructor\", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), r.isGeneratorFunction = function (t) {\n    var r = \"function\" == typeof t && t.constructor;\n    return !!r && (r === GeneratorFunction || \"GeneratorFunction\" === (r.displayName || r.name));\n  }, r.mark = function (t) {\n    return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, \"GeneratorFunction\")), t.prototype = Object.create(v), t;\n  }, r.awrap = function (t) {\n    return {\n      __await: t\n    };\n  }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () {\n    return this;\n  }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) {\n    void 0 === i && (i = Promise);\n    var a = new AsyncIterator(h(t, e, n, o), i);\n    return r.isGeneratorFunction(e) ? a : a.next().then(function (t) {\n      return t.done ? t.value : a.next();\n    });\n  }, g(v), c(v, u, \"Generator\"), c(v, i, function () {\n    return this;\n  }), c(v, \"toString\", function () {\n    return \"[object Generator]\";\n  }), r.keys = function (t) {\n    var r = Object(t),\n      e = [];\n    for (var n in r) e.unshift(n);\n    return function t() {\n      for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t;\n      return t.done = !0, t;\n    };\n  }, r.values = x, Context.prototype = {\n    constructor: Context,\n    reset: function reset(r) {\n      if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(m), !r) for (var e in this) \"t\" === e.charAt(0) && n.call(this, e) && !isNaN(+e.slice(1)) && (this[e] = t);\n    },\n    stop: function stop() {\n      this.done = !0;\n      var t = this.tryEntries[0][4];\n      if (\"throw\" === t.type) throw t.arg;\n      return this.rval;\n    },\n    dispatchException: function dispatchException(r) {\n      if (this.done) throw r;\n      var e = this;\n      function n(t) {\n        a.type = \"throw\", a.arg = r, e.next = t;\n      }\n      for (var o = e.tryEntries.length - 1; o >= 0; --o) {\n        var i = this.tryEntries[o],\n          a = i[4],\n          u = this.prev,\n          c = i[1],\n          h = i[2];\n        if (-1 === i[0]) return n(\"end\"), !1;\n        if (!c && !h) throw Error(\"try statement without catch or finally\");\n        if (null != i[0] && i[0] <= u) {\n          if (u < c) return this.method = \"next\", this.arg = t, n(c), !0;\n          if (u < h) return n(h), !1;\n        }\n      }\n    },\n    abrupt: function abrupt(t, r) {\n      for (var e = this.tryEntries.length - 1; e >= 0; --e) {\n        var n = this.tryEntries[e];\n        if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) {\n          var o = n;\n          break;\n        }\n      }\n      o && (\"break\" === t || \"continue\" === t) && o[0] <= r && r <= o[2] && (o = null);\n      var i = o ? o[4] : {};\n      return i.type = t, i.arg = r, o ? (this.method = \"next\", this.next = o[2], f) : this.complete(i);\n    },\n    complete: function complete(t, r) {\n      if (\"throw\" === t.type) throw t.arg;\n      return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && r && (this.next = r), f;\n    },\n    finish: function finish(t) {\n      for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n        var e = this.tryEntries[r];\n        if (e[2] === t) return this.complete(e[4], e[3]), m(e), f;\n      }\n    },\n    \"catch\": function _catch(t) {\n      for (var r = this.tryEntries.length - 1; r >= 0; --r) {\n        var e = this.tryEntries[r];\n        if (e[0] === t) {\n          var n = e[4];\n          if (\"throw\" === n.type) {\n            var o = n.arg;\n            m(e);\n          }\n          return o;\n        }\n      }\n      throw Error(\"illegal catch attempt\");\n    },\n    delegateYield: function delegateYield(r, e, n) {\n      return this.delegate = {\n        i: x(r),\n        r: e,\n        n: n\n      }, \"next\" === this.method && (this.arg = t), f;\n    }\n  }, r;\n}\nexport { _regeneratorRuntime as default };","function asyncGeneratorStep(n, t, e, r, o, a, c) {\n  try {\n    var i = n[a](c),\n      u = i.value;\n  } catch (n) {\n    return void e(n);\n  }\n  i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n  return function () {\n    var t = this,\n      e = arguments;\n    return new Promise(function (r, o) {\n      var a = n.apply(t, e);\n      function _next(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n      }\n      function _throw(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n      }\n      _next(void 0);\n    });\n  };\n}\nexport { _asyncToGenerator as default };","import _regeneratorRuntime from \"@babel/runtime/helpers/esm/regeneratorRuntime\";\nimport _asyncToGenerator from \"@babel/runtime/helpers/esm/asyncToGenerator\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport * as ReactDOM from 'react-dom';\n// Let compiler not to search module usage\nvar fullClone = _objectSpread({}, ReactDOM);\nvar version = fullClone.version,\n  reactRender = fullClone.render,\n  unmountComponentAtNode = fullClone.unmountComponentAtNode;\nvar createRoot;\ntry {\n  var mainVersion = Number((version || '').split('.')[0]);\n  if (mainVersion >= 18) {\n    createRoot = fullClone.createRoot;\n  }\n} catch (e) {\n  // Do nothing;\n}\nfunction toggleWarning(skip) {\n  var __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = fullClone.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n  if (__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED && _typeof(__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED) === 'object') {\n    __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.usingClientEntryPoint = skip;\n  }\n}\nvar MARK = '__rc_react_root__';\n\n// ========================== Render ==========================\n\nfunction modernRender(node, container) {\n  toggleWarning(true);\n  var root = container[MARK] || createRoot(container);\n  toggleWarning(false);\n  root.render(node);\n  container[MARK] = root;\n}\nfunction legacyRender(node, container) {\n  reactRender === null || reactRender === void 0 || reactRender(node, container);\n}\n\n/** @private Test usage. Not work in prod */\nexport function _r(node, container) {\n  if (process.env.NODE_ENV !== 'production') {\n    return legacyRender(node, container);\n  }\n}\nexport function render(node, container) {\n  if (createRoot) {\n    modernRender(node, container);\n    return;\n  }\n  legacyRender(node, container);\n}\n\n// ========================= Unmount ==========================\nfunction modernUnmount(_x) {\n  return _modernUnmount.apply(this, arguments);\n}\nfunction _modernUnmount() {\n  _modernUnmount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(container) {\n    return _regeneratorRuntime().wrap(function _callee$(_context) {\n      while (1) switch (_context.prev = _context.next) {\n        case 0:\n          return _context.abrupt(\"return\", Promise.resolve().then(function () {\n            var _container$MARK;\n            (_container$MARK = container[MARK]) === null || _container$MARK === void 0 || _container$MARK.unmount();\n            delete container[MARK];\n          }));\n        case 1:\n        case \"end\":\n          return _context.stop();\n      }\n    }, _callee);\n  }));\n  return _modernUnmount.apply(this, arguments);\n}\nfunction legacyUnmount(container) {\n  unmountComponentAtNode(container);\n}\n\n/** @private Test usage. Not work in prod */\nexport function _u(container) {\n  if (process.env.NODE_ENV !== 'production') {\n    return legacyUnmount(container);\n  }\n}\nexport function unmount(_x2) {\n  return _unmount.apply(this, arguments);\n}\nfunction _unmount() {\n  _unmount = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(container) {\n    return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n      while (1) switch (_context2.prev = _context2.next) {\n        case 0:\n          if (!(createRoot !== undefined)) {\n            _context2.next = 2;\n            break;\n          }\n          return _context2.abrupt(\"return\", modernUnmount(container));\n        case 2:\n          legacyUnmount(container);\n        case 3:\n        case \"end\":\n          return _context2.stop();\n      }\n    }, _callee2);\n  }));\n  return _unmount.apply(this, arguments);\n}","\"use client\";\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { render, unmount } from \"rc-util/es/React/render\";\nimport warning from '../_util/warning';\nconst defaultReactRender = (node, container) => {\n  // TODO: Remove in v6\n  // Warning for React 19\n  if (process.env.NODE_ENV !== 'production') {\n    const majorVersion = parseInt(React.version.split('.')[0], 10);\n    const fullKeys = Object.keys(ReactDOM);\n    process.env.NODE_ENV !== \"production\" ? warning(majorVersion < 19 || fullKeys.includes('createRoot'), 'compatible', 'antd v5 support React is 16 ~ 18. see https://u.ant.design/v5-for-19 for compatible.') : void 0;\n  }\n  render(node, container);\n  return () => {\n    return unmount(container);\n  };\n};\nlet unstableRender = defaultReactRender;\n/**\n * @deprecated Set React render function for compatible usage.\n * This is internal usage only compatible with React 19.\n * And will be removed in next major version.\n */\nexport function unstableSetRender(render) {\n  if (render) {\n    unstableRender = render;\n  }\n  return unstableRender;\n}","// This icon file is generated automatically.\nvar CheckCircleFilled = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 01-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z\" } }] }, \"name\": \"check-circle\", \"theme\": \"filled\" };\nexport default CheckCircleFilled;\n","function getRoot(ele) {\n  var _ele$getRootNode;\n  return ele === null || ele === void 0 || (_ele$getRootNode = ele.getRootNode) === null || _ele$getRootNode === void 0 ? void 0 : _ele$getRootNode.call(ele);\n}\n\n/**\n * Check if is in shadowRoot\n */\nexport function inShadow(ele) {\n  return getRoot(ele) instanceof ShadowRoot;\n}\n\n/**\n * Return shadowRoot if possible\n */\nexport function getShadowRoot(ele) {\n  return inShadow(ele) ? getRoot(ele) : null;\n}","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport { generate as generateColor } from '@ant-design/colors';\nimport { updateCSS } from \"rc-util/es/Dom/dynamicCSS\";\nimport { getShadowRoot } from \"rc-util/es/Dom/shadow\";\nimport warn from \"rc-util/es/warning\";\nimport React, { useContext, useEffect } from 'react';\nimport IconContext from \"./components/Context\";\nfunction camelCase(input) {\n  return input.replace(/-(.)/g, function (match, g) {\n    return g.toUpperCase();\n  });\n}\nexport function warning(valid, message) {\n  warn(valid, \"[@ant-design/icons] \".concat(message));\n}\nexport function isIconDefinition(target) {\n  return _typeof(target) === 'object' && typeof target.name === 'string' && typeof target.theme === 'string' && (_typeof(target.icon) === 'object' || typeof target.icon === 'function');\n}\nexport function normalizeAttrs() {\n  var attrs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  return Object.keys(attrs).reduce(function (acc, key) {\n    var val = attrs[key];\n    switch (key) {\n      case 'class':\n        acc.className = val;\n        delete acc.class;\n        break;\n      default:\n        delete acc[key];\n        acc[camelCase(key)] = val;\n    }\n    return acc;\n  }, {});\n}\nexport function generate(node, key, rootProps) {\n  if (!rootProps) {\n    return /*#__PURE__*/React.createElement(node.tag, _objectSpread({\n      key: key\n    }, normalizeAttrs(node.attrs)), (node.children || []).map(function (child, index) {\n      return generate(child, \"\".concat(key, \"-\").concat(node.tag, \"-\").concat(index));\n    }));\n  }\n  return /*#__PURE__*/React.createElement(node.tag, _objectSpread(_objectSpread({\n    key: key\n  }, normalizeAttrs(node.attrs)), rootProps), (node.children || []).map(function (child, index) {\n    return generate(child, \"\".concat(key, \"-\").concat(node.tag, \"-\").concat(index));\n  }));\n}\nexport function getSecondaryColor(primaryColor) {\n  // choose the second color\n  return generateColor(primaryColor)[0];\n}\nexport function normalizeTwoToneColors(twoToneColor) {\n  if (!twoToneColor) {\n    return [];\n  }\n  return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];\n}\n\n// These props make sure that the SVG behaviours like general text.\n// Reference: https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4\nexport var svgBaseProps = {\n  width: '1em',\n  height: '1em',\n  fill: 'currentColor',\n  'aria-hidden': 'true',\n  focusable: 'false'\n};\nexport var iconStyles = \"\\n.anticon {\\n  display: inline-flex;\\n  align-items: center;\\n  color: inherit;\\n  font-style: normal;\\n  line-height: 0;\\n  text-align: center;\\n  text-transform: none;\\n  vertical-align: -0.125em;\\n  text-rendering: optimizeLegibility;\\n  -webkit-font-smoothing: antialiased;\\n  -moz-osx-font-smoothing: grayscale;\\n}\\n\\n.anticon > * {\\n  line-height: 1;\\n}\\n\\n.anticon svg {\\n  display: inline-block;\\n}\\n\\n.anticon::before {\\n  display: none;\\n}\\n\\n.anticon .anticon-icon {\\n  display: block;\\n}\\n\\n.anticon[tabindex] {\\n  cursor: pointer;\\n}\\n\\n.anticon-spin::before,\\n.anticon-spin {\\n  display: inline-block;\\n  -webkit-animation: loadingCircle 1s infinite linear;\\n  animation: loadingCircle 1s infinite linear;\\n}\\n\\n@-webkit-keyframes loadingCircle {\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n\\n@keyframes loadingCircle {\\n  100% {\\n    -webkit-transform: rotate(360deg);\\n    transform: rotate(360deg);\\n  }\\n}\\n\";\nexport var useInsertStyles = function useInsertStyles(eleRef) {\n  var _useContext = useContext(IconContext),\n    csp = _useContext.csp,\n    prefixCls = _useContext.prefixCls,\n    layer = _useContext.layer;\n  var mergedStyleStr = iconStyles;\n  if (prefixCls) {\n    mergedStyleStr = mergedStyleStr.replace(/anticon/g, prefixCls);\n  }\n  if (layer) {\n    mergedStyleStr = \"@layer \".concat(layer, \" {\\n\").concat(mergedStyleStr, \"\\n}\");\n  }\n  useEffect(function () {\n    var ele = eleRef.current;\n    var shadowRoot = getShadowRoot(ele);\n    updateCSS(mergedStyleStr, '@ant-design-icons', {\n      prepend: !layer,\n      csp: csp,\n      attachTo: shadowRoot\n    });\n  }, []);\n};","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nvar _excluded = [\"icon\", \"className\", \"onClick\", \"style\", \"primaryColor\", \"secondaryColor\"];\nimport * as React from 'react';\nimport { generate, getSecondaryColor, isIconDefinition, warning, useInsertStyles } from \"../utils\";\nvar twoToneColorPalette = {\n  primaryColor: '#333',\n  secondaryColor: '#E6E6E6',\n  calculated: false\n};\nfunction setTwoToneColors(_ref) {\n  var primaryColor = _ref.primaryColor,\n    secondaryColor = _ref.secondaryColor;\n  twoToneColorPalette.primaryColor = primaryColor;\n  twoToneColorPalette.secondaryColor = secondaryColor || getSecondaryColor(primaryColor);\n  twoToneColorPalette.calculated = !!secondaryColor;\n}\nfunction getTwoToneColors() {\n  return _objectSpread({}, twoToneColorPalette);\n}\nvar IconBase = function IconBase(props) {\n  var icon = props.icon,\n    className = props.className,\n    onClick = props.onClick,\n    style = props.style,\n    primaryColor = props.primaryColor,\n    secondaryColor = props.secondaryColor,\n    restProps = _objectWithoutProperties(props, _excluded);\n  var svgRef = React.useRef();\n  var colors = twoToneColorPalette;\n  if (primaryColor) {\n    colors = {\n      primaryColor: primaryColor,\n      secondaryColor: secondaryColor || getSecondaryColor(primaryColor)\n    };\n  }\n  useInsertStyles(svgRef);\n  warning(isIconDefinition(icon), \"icon should be icon definiton, but got \".concat(icon));\n  if (!isIconDefinition(icon)) {\n    return null;\n  }\n  var target = icon;\n  if (target && typeof target.icon === 'function') {\n    target = _objectSpread(_objectSpread({}, target), {}, {\n      icon: target.icon(colors.primaryColor, colors.secondaryColor)\n    });\n  }\n  return generate(target.icon, \"svg-\".concat(target.name), _objectSpread(_objectSpread({\n    className: className,\n    onClick: onClick,\n    style: style,\n    'data-icon': target.name,\n    width: '1em',\n    height: '1em',\n    fill: 'currentColor',\n    'aria-hidden': 'true'\n  }, restProps), {}, {\n    ref: svgRef\n  }));\n};\nIconBase.displayName = 'IconReact';\nIconBase.getTwoToneColors = getTwoToneColors;\nIconBase.setTwoToneColors = setTwoToneColors;\nexport default IconBase;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport ReactIcon from \"./IconBase\";\nimport { normalizeTwoToneColors } from \"../utils\";\nexport function setTwoToneColor(twoToneColor) {\n  var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor),\n    _normalizeTwoToneColo2 = _slicedToArray(_normalizeTwoToneColo, 2),\n    primaryColor = _normalizeTwoToneColo2[0],\n    secondaryColor = _normalizeTwoToneColo2[1];\n  return ReactIcon.setTwoToneColors({\n    primaryColor: primaryColor,\n    secondaryColor: secondaryColor\n  });\n}\nexport function getTwoToneColor() {\n  var colors = ReactIcon.getTwoToneColors();\n  if (!colors.calculated) {\n    return colors.primaryColor;\n  }\n  return [colors.primaryColor, colors.secondaryColor];\n}","'use client';\n\nimport _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nvar _excluded = [\"className\", \"icon\", \"spin\", \"rotate\", \"tabIndex\", \"onClick\", \"twoToneColor\"];\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { blue } from '@ant-design/colors';\nimport Context from \"./Context\";\nimport ReactIcon from \"./IconBase\";\nimport { getTwoToneColor, setTwoToneColor } from \"./twoTonePrimaryColor\";\nimport { normalizeTwoToneColors } from \"../utils\";\n// Initial setting\n// should move it to antd main repo?\nsetTwoToneColor(blue.primary);\n\n// https://github.com/DefinitelyTyped/DefinitelyTyped/issues/34757#issuecomment-488848720\n\nvar Icon = /*#__PURE__*/React.forwardRef(function (props, ref) {\n  var className = props.className,\n    icon = props.icon,\n    spin = props.spin,\n    rotate = props.rotate,\n    tabIndex = props.tabIndex,\n    onClick = props.onClick,\n    twoToneColor = props.twoToneColor,\n    restProps = _objectWithoutProperties(props, _excluded);\n  var _React$useContext = React.useContext(Context),\n    _React$useContext$pre = _React$useContext.prefixCls,\n    prefixCls = _React$useContext$pre === void 0 ? 'anticon' : _React$useContext$pre,\n    rootClassName = _React$useContext.rootClassName;\n  var classString = classNames(rootClassName, prefixCls, _defineProperty(_defineProperty({}, \"\".concat(prefixCls, \"-\").concat(icon.name), !!icon.name), \"\".concat(prefixCls, \"-spin\"), !!spin || icon.name === 'loading'), className);\n  var iconTabIndex = tabIndex;\n  if (iconTabIndex === undefined && onClick) {\n    iconTabIndex = -1;\n  }\n  var svgStyle = rotate ? {\n    msTransform: \"rotate(\".concat(rotate, \"deg)\"),\n    transform: \"rotate(\".concat(rotate, \"deg)\")\n  } : undefined;\n  var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor),\n    _normalizeTwoToneColo2 = _slicedToArray(_normalizeTwoToneColo, 2),\n    primaryColor = _normalizeTwoToneColo2[0],\n    secondaryColor = _normalizeTwoToneColo2[1];\n  return /*#__PURE__*/React.createElement(\"span\", _extends({\n    role: \"img\",\n    \"aria-label\": icon.name\n  }, restProps, {\n    ref: ref,\n    tabIndex: iconTabIndex,\n    onClick: onClick,\n    className: classString\n  }), /*#__PURE__*/React.createElement(ReactIcon, {\n    icon: icon,\n    primaryColor: primaryColor,\n    secondaryColor: secondaryColor,\n    style: svgStyle\n  }));\n});\nIcon.displayName = 'AntdIcon';\nIcon.getTwoToneColor = getTwoToneColor;\nIcon.setTwoToneColor = setTwoToneColor;\nexport default Icon;","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport CheckCircleFilledSvg from \"@ant-design/icons-svg/es/asn/CheckCircleFilled\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar CheckCircleFilled = function CheckCircleFilled(props, ref) {\n  return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n    ref: ref,\n    icon: CheckCircleFilledSvg\n  }));\n};\n\n/**![check-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0xOTMuNSAzMDEuN2wtMjEwLjYgMjkyYTMxLjggMzEuOCAwIDAxLTUxLjcgMEwzMTguNSA0ODQuOWMtMy44LTUuMyAwLTEyLjcgNi41LTEyLjdoNDYuOWMxMC4yIDAgMTkuOSA0LjkgMjUuOSAxMy4zbDcxLjIgOTguOCAxNTcuMi0yMThjNi04LjMgMTUuNi0xMy4zIDI1LjktMTMuM0g2OTljNi41IDAgMTAuMyA3LjQgNi41IDEyLjd6IiAvPjwvc3ZnPg==) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(CheckCircleFilled);\nif (process.env.NODE_ENV !== 'production') {\n  RefIcon.displayName = 'CheckCircleFilled';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar CloseCircleFilled = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"fill-rule\": \"evenodd\", \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M512 64c247.4 0 448 200.6 448 448S759.4 960 512 960 64 759.4 64 512 264.6 64 512 64zm127.98 274.82h-.04l-.08.06L512 466.75 384.14 338.88c-.04-.05-.06-.06-.08-.06a.12.12 0 00-.07 0c-.03 0-.05.01-.09.05l-45.02 45.02a.2.2 0 00-.05.09.12.12 0 000 .07v.02a.27.27 0 00.06.06L466.75 512 338.88 639.86c-.05.04-.06.06-.06.08a.12.12 0 000 .07c0 .03.01.05.05.09l45.02 45.02a.2.2 0 00.09.05.12.12 0 00.07 0c.02 0 .04-.01.08-.05L512 557.25l127.86 127.87c.04.04.06.05.08.05a.12.12 0 00.07 0c.03 0 .05-.01.09-.05l45.02-45.02a.2.2 0 00.05-.09.12.12 0 000-.07v-.02a.27.27 0 00-.05-.06L557.25 512l127.87-127.86c.04-.04.05-.06.05-.08a.12.12 0 000-.07c0-.03-.01-.05-.05-.09l-45.02-45.02a.2.2 0 00-.09-.05.12.12 0 00-.07 0z\" } }] }, \"name\": \"close-circle\", \"theme\": \"filled\" };\nexport default CloseCircleFilled;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport CloseCircleFilledSvg from \"@ant-design/icons-svg/es/asn/CloseCircleFilled\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar CloseCircleFilled = function CloseCircleFilled(props, ref) {\n  return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n    ref: ref,\n    icon: CloseCircleFilledSvg\n  }));\n};\n\n/**![close-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNTEyIDY0YzI0Ny40IDAgNDQ4IDIwMC42IDQ0OCA0NDhTNzU5LjQgOTYwIDUxMiA5NjAgNjQgNzU5LjQgNjQgNTEyIDI2NC42IDY0IDUxMiA2NHptMTI3Ljk4IDI3NC44MmgtLjA0bC0uMDguMDZMNTEyIDQ2Ni43NSAzODQuMTQgMzM4Ljg4Yy0uMDQtLjA1LS4wNi0uMDYtLjA4LS4wNmEuMTIuMTIgMCAwMC0uMDcgMGMtLjAzIDAtLjA1LjAxLS4wOS4wNWwtNDUuMDIgNDUuMDJhLjIuMiAwIDAwLS4wNS4wOS4xMi4xMiAwIDAwMCAuMDd2LjAyYS4yNy4yNyAwIDAwLjA2LjA2TDQ2Ni43NSA1MTIgMzM4Ljg4IDYzOS44NmMtLjA1LjA0LS4wNi4wNi0uMDYuMDhhLjEyLjEyIDAgMDAwIC4wN2MwIC4wMy4wMS4wNS4wNS4wOWw0NS4wMiA0NS4wMmEuMi4yIDAgMDAuMDkuMDUuMTIuMTIgMCAwMC4wNyAwYy4wMiAwIC4wNC0uMDEuMDgtLjA1TDUxMiA1NTcuMjVsMTI3Ljg2IDEyNy44N2MuMDQuMDQuMDYuMDUuMDguMDVhLjEyLjEyIDAgMDAuMDcgMGMuMDMgMCAuMDUtLjAxLjA5LS4wNWw0NS4wMi00NS4wMmEuMi4yIDAgMDAuMDUtLjA5LjEyLjEyIDAgMDAwLS4wN3YtLjAyYS4yNy4yNyAwIDAwLS4wNS0uMDZMNTU3LjI1IDUxMmwxMjcuODctMTI3Ljg2Yy4wNC0uMDQuMDUtLjA2LjA1LS4wOGEuMTIuMTIgMCAwMDAtLjA3YzAtLjAzLS4wMS0uMDUtLjA1LS4wOWwtNDUuMDItNDUuMDJhLjIuMiAwIDAwLS4wOS0uMDUuMTIuMTIgMCAwMC0uMDcgMHoiIC8+PC9zdmc+) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(CloseCircleFilled);\nif (process.env.NODE_ENV !== 'production') {\n  RefIcon.displayName = 'CloseCircleFilled';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar ExclamationCircleFilled = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 010-96 48.01 48.01 0 010 96z\" } }] }, \"name\": \"exclamation-circle\", \"theme\": \"filled\" };\nexport default ExclamationCircleFilled;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport ExclamationCircleFilledSvg from \"@ant-design/icons-svg/es/asn/ExclamationCircleFilled\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar ExclamationCircleFilled = function ExclamationCircleFilled(props, ref) {\n  return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n    ref: ref,\n    icon: ExclamationCircleFilledSvg\n  }));\n};\n\n/**![exclamation-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0tMzIgMjMyYzAtNC40IDMuNi04IDgtOGg0OGM0LjQgMCA4IDMuNiA4IDh2MjcyYzAgNC40LTMuNiA4LTggOGgtNDhjLTQuNCAwLTgtMy42LTgtOFYyOTZ6bTMyIDQ0MGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(ExclamationCircleFilled);\nif (process.env.NODE_ENV !== 'production') {\n  RefIcon.displayName = 'ExclamationCircleFilled';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar InfoCircleFilled = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 010-96 48.01 48.01 0 010 96z\" } }] }, \"name\": \"info-circle\", \"theme\": \"filled\" };\nexport default InfoCircleFilled;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport InfoCircleFilledSvg from \"@ant-design/icons-svg/es/asn/InfoCircleFilled\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar InfoCircleFilled = function InfoCircleFilled(props, ref) {\n  return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n    ref: ref,\n    icon: InfoCircleFilledSvg\n  }));\n};\n\n/**![info-circle](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjY0IDY0IDg5NiA4OTYiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTUxMiA2NEMyNjQuNiA2NCA2NCAyNjQuNiA2NCA1MTJzMjAwLjYgNDQ4IDQ0OCA0NDggNDQ4LTIwMC42IDQ0OC00NDhTNzU5LjQgNjQgNTEyIDY0em0zMiA2NjRjMCA0LjQtMy42IDgtOCA4aC00OGMtNC40IDAtOC0zLjYtOC04VjQ1NmMwLTQuNCAzLjYtOCA4LThoNDhjNC40IDAgOCAzLjYgOCA4djI3MnptLTMyLTM0NGE0OC4wMSA0OC4wMSAwIDAxMC05NiA0OC4wMSA0OC4wMSAwIDAxMCA5NnoiIC8+PC9zdmc+) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(InfoCircleFilled);\nif (process.env.NODE_ENV !== 'production') {\n  RefIcon.displayName = 'InfoCircleFilled';\n}\nexport default RefIcon;","// This icon file is generated automatically.\nvar LoadingOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"viewBox\": \"0 0 1024 1024\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z\" } }] }, \"name\": \"loading\", \"theme\": \"outlined\" };\nexport default LoadingOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport LoadingOutlinedSvg from \"@ant-design/icons-svg/es/asn/LoadingOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar LoadingOutlined = function LoadingOutlined(props, ref) {\n  return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n    ref: ref,\n    icon: LoadingOutlinedSvg\n  }));\n};\n\n/**![loading](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiIGZvY3VzYWJsZT0iZmFsc2UiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk4OCA1NDhjLTE5LjkgMC0zNi0xNi4xLTM2LTM2IDAtNTkuNC0xMS42LTExNy0zNC42LTE3MS4zYTQ0MC40NSA0NDAuNDUgMCAwMC05NC4zLTEzOS45IDQzNy43MSA0MzcuNzEgMCAwMC0xMzkuOS05NC4zQzYyOSA4My42IDU3MS40IDcyIDUxMiA3MmMtMTkuOSAwLTM2LTE2LjEtMzYtMzZzMTYuMS0zNiAzNi0zNmM2OS4xIDAgMTM2LjIgMTMuNSAxOTkuMyA0MC4zQzc3Mi4zIDY2IDgyNyAxMDMgODc0IDE1MGM0NyA0NyA4My45IDEwMS44IDEwOS43IDE2Mi43IDI2LjcgNjMuMSA0MC4yIDEzMC4yIDQwLjIgMTk5LjMuMSAxOS45LTE2IDM2LTM1LjkgMzZ6IiAvPjwvc3ZnPg==) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(LoadingOutlined);\nif (process.env.NODE_ENV !== 'production') {\n  RefIcon.displayName = 'LoadingOutlined';\n}\nexport default RefIcon;","/**\n * @ignore\n * some key-codes definition and utils from closure-library\n * @author yiminghe@gmail.com\n */\n\nvar KeyCode = {\n  /**\n   * MAC_ENTER\n   */\n  MAC_ENTER: 3,\n  /**\n   * BACKSPACE\n   */\n  BACKSPACE: 8,\n  /**\n   * TAB\n   */\n  TAB: 9,\n  /**\n   * NUMLOCK on FF/Safari Mac\n   */\n  NUM_CENTER: 12,\n  // NUMLOCK on FF/Safari Mac\n  /**\n   * ENTER\n   */\n  ENTER: 13,\n  /**\n   * SHIFT\n   */\n  SHIFT: 16,\n  /**\n   * CTRL\n   */\n  CTRL: 17,\n  /**\n   * ALT\n   */\n  ALT: 18,\n  /**\n   * PAUSE\n   */\n  PAUSE: 19,\n  /**\n   * CAPS_LOCK\n   */\n  CAPS_LOCK: 20,\n  /**\n   * ESC\n   */\n  ESC: 27,\n  /**\n   * SPACE\n   */\n  SPACE: 32,\n  /**\n   * PAGE_UP\n   */\n  PAGE_UP: 33,\n  // also NUM_NORTH_EAST\n  /**\n   * PAGE_DOWN\n   */\n  PAGE_DOWN: 34,\n  // also NUM_SOUTH_EAST\n  /**\n   * END\n   */\n  END: 35,\n  // also NUM_SOUTH_WEST\n  /**\n   * HOME\n   */\n  HOME: 36,\n  // also NUM_NORTH_WEST\n  /**\n   * LEFT\n   */\n  LEFT: 37,\n  // also NUM_WEST\n  /**\n   * UP\n   */\n  UP: 38,\n  // also NUM_NORTH\n  /**\n   * RIGHT\n   */\n  RIGHT: 39,\n  // also NUM_EAST\n  /**\n   * DOWN\n   */\n  DOWN: 40,\n  // also NUM_SOUTH\n  /**\n   * PRINT_SCREEN\n   */\n  PRINT_SCREEN: 44,\n  /**\n   * INSERT\n   */\n  INSERT: 45,\n  // also NUM_INSERT\n  /**\n   * DELETE\n   */\n  DELETE: 46,\n  // also NUM_DELETE\n  /**\n   * ZERO\n   */\n  ZERO: 48,\n  /**\n   * ONE\n   */\n  ONE: 49,\n  /**\n   * TWO\n   */\n  TWO: 50,\n  /**\n   * THREE\n   */\n  THREE: 51,\n  /**\n   * FOUR\n   */\n  FOUR: 52,\n  /**\n   * FIVE\n   */\n  FIVE: 53,\n  /**\n   * SIX\n   */\n  SIX: 54,\n  /**\n   * SEVEN\n   */\n  SEVEN: 55,\n  /**\n   * EIGHT\n   */\n  EIGHT: 56,\n  /**\n   * NINE\n   */\n  NINE: 57,\n  /**\n   * QUESTION_MARK\n   */\n  QUESTION_MARK: 63,\n  // needs localization\n  /**\n   * A\n   */\n  A: 65,\n  /**\n   * B\n   */\n  B: 66,\n  /**\n   * C\n   */\n  C: 67,\n  /**\n   * D\n   */\n  D: 68,\n  /**\n   * E\n   */\n  E: 69,\n  /**\n   * F\n   */\n  F: 70,\n  /**\n   * G\n   */\n  G: 71,\n  /**\n   * H\n   */\n  H: 72,\n  /**\n   * I\n   */\n  I: 73,\n  /**\n   * J\n   */\n  J: 74,\n  /**\n   * K\n   */\n  K: 75,\n  /**\n   * L\n   */\n  L: 76,\n  /**\n   * M\n   */\n  M: 77,\n  /**\n   * N\n   */\n  N: 78,\n  /**\n   * O\n   */\n  O: 79,\n  /**\n   * P\n   */\n  P: 80,\n  /**\n   * Q\n   */\n  Q: 81,\n  /**\n   * R\n   */\n  R: 82,\n  /**\n   * S\n   */\n  S: 83,\n  /**\n   * T\n   */\n  T: 84,\n  /**\n   * U\n   */\n  U: 85,\n  /**\n   * V\n   */\n  V: 86,\n  /**\n   * W\n   */\n  W: 87,\n  /**\n   * X\n   */\n  X: 88,\n  /**\n   * Y\n   */\n  Y: 89,\n  /**\n   * Z\n   */\n  Z: 90,\n  /**\n   * META\n   */\n  META: 91,\n  // WIN_KEY_LEFT\n  /**\n   * WIN_KEY_RIGHT\n   */\n  WIN_KEY_RIGHT: 92,\n  /**\n   * CONTEXT_MENU\n   */\n  CONTEXT_MENU: 93,\n  /**\n   * NUM_ZERO\n   */\n  NUM_ZERO: 96,\n  /**\n   * NUM_ONE\n   */\n  NUM_ONE: 97,\n  /**\n   * NUM_TWO\n   */\n  NUM_TWO: 98,\n  /**\n   * NUM_THREE\n   */\n  NUM_THREE: 99,\n  /**\n   * NUM_FOUR\n   */\n  NUM_FOUR: 100,\n  /**\n   * NUM_FIVE\n   */\n  NUM_FIVE: 101,\n  /**\n   * NUM_SIX\n   */\n  NUM_SIX: 102,\n  /**\n   * NUM_SEVEN\n   */\n  NUM_SEVEN: 103,\n  /**\n   * NUM_EIGHT\n   */\n  NUM_EIGHT: 104,\n  /**\n   * NUM_NINE\n   */\n  NUM_NINE: 105,\n  /**\n   * NUM_MULTIPLY\n   */\n  NUM_MULTIPLY: 106,\n  /**\n   * NUM_PLUS\n   */\n  NUM_PLUS: 107,\n  /**\n   * NUM_MINUS\n   */\n  NUM_MINUS: 109,\n  /**\n   * NUM_PERIOD\n   */\n  NUM_PERIOD: 110,\n  /**\n   * NUM_DIVISION\n   */\n  NUM_DIVISION: 111,\n  /**\n   * F1\n   */\n  F1: 112,\n  /**\n   * F2\n   */\n  F2: 113,\n  /**\n   * F3\n   */\n  F3: 114,\n  /**\n   * F4\n   */\n  F4: 115,\n  /**\n   * F5\n   */\n  F5: 116,\n  /**\n   * F6\n   */\n  F6: 117,\n  /**\n   * F7\n   */\n  F7: 118,\n  /**\n   * F8\n   */\n  F8: 119,\n  /**\n   * F9\n   */\n  F9: 120,\n  /**\n   * F10\n   */\n  F10: 121,\n  /**\n   * F11\n   */\n  F11: 122,\n  /**\n   * F12\n   */\n  F12: 123,\n  /**\n   * NUMLOCK\n   */\n  NUMLOCK: 144,\n  /**\n   * SEMICOLON\n   */\n  SEMICOLON: 186,\n  // needs localization\n  /**\n   * DASH\n   */\n  DASH: 189,\n  // needs localization\n  /**\n   * EQUALS\n   */\n  EQUALS: 187,\n  // needs localization\n  /**\n   * COMMA\n   */\n  COMMA: 188,\n  // needs localization\n  /**\n   * PERIOD\n   */\n  PERIOD: 190,\n  // needs localization\n  /**\n   * SLASH\n   */\n  SLASH: 191,\n  // needs localization\n  /**\n   * APOSTROPHE\n   */\n  APOSTROPHE: 192,\n  // needs localization\n  /**\n   * SINGLE_QUOTE\n   */\n  SINGLE_QUOTE: 222,\n  // needs localization\n  /**\n   * OPEN_SQUARE_BRACKET\n   */\n  OPEN_SQUARE_BRACKET: 219,\n  // needs localization\n  /**\n   * BACKSLASH\n   */\n  BACKSLASH: 220,\n  // needs localization\n  /**\n   * CLOSE_SQUARE_BRACKET\n   */\n  CLOSE_SQUARE_BRACKET: 221,\n  // needs localization\n  /**\n   * WIN_KEY\n   */\n  WIN_KEY: 224,\n  /**\n   * MAC_FF_META\n   */\n  MAC_FF_META: 224,\n  // Firefox (Gecko) fires this for the meta key instead of 91\n  /**\n   * WIN_IME\n   */\n  WIN_IME: 229,\n  // ======================== Function ========================\n  /**\n   * whether text and modified key is entered at the same time.\n   */\n  isTextModifyingKeyEvent: function isTextModifyingKeyEvent(e) {\n    var keyCode = e.keyCode;\n    if (e.altKey && !e.ctrlKey || e.metaKey ||\n    // Function keys don't generate text\n    keyCode >= KeyCode.F1 && keyCode <= KeyCode.F12) {\n      return false;\n    }\n\n    // The following keys are quite harmless, even in combination with\n    // CTRL, ALT or SHIFT.\n    switch (keyCode) {\n      case KeyCode.ALT:\n      case KeyCode.CAPS_LOCK:\n      case KeyCode.CONTEXT_MENU:\n      case KeyCode.CTRL:\n      case KeyCode.DOWN:\n      case KeyCode.END:\n      case KeyCode.ESC:\n      case KeyCode.HOME:\n      case KeyCode.INSERT:\n      case KeyCode.LEFT:\n      case KeyCode.MAC_FF_META:\n      case KeyCode.META:\n      case KeyCode.NUMLOCK:\n      case KeyCode.NUM_CENTER:\n      case KeyCode.PAGE_DOWN:\n      case KeyCode.PAGE_UP:\n      case KeyCode.PAUSE:\n      case KeyCode.PRINT_SCREEN:\n      case KeyCode.RIGHT:\n      case KeyCode.SHIFT:\n      case KeyCode.UP:\n      case KeyCode.WIN_KEY:\n      case KeyCode.WIN_KEY_RIGHT:\n        return false;\n      default:\n        return true;\n    }\n  },\n  /**\n   * whether character is entered.\n   */\n  isCharacterKey: function isCharacterKey(keyCode) {\n    if (keyCode >= KeyCode.ZERO && keyCode <= KeyCode.NINE) {\n      return true;\n    }\n    if (keyCode >= KeyCode.NUM_ZERO && keyCode <= KeyCode.NUM_MULTIPLY) {\n      return true;\n    }\n    if (keyCode >= KeyCode.A && keyCode <= KeyCode.Z) {\n      return true;\n    }\n\n    // Safari sends zero key code for non-latin characters.\n    if (window.navigator.userAgent.indexOf('WebKit') !== -1 && keyCode === 0) {\n      return true;\n    }\n    switch (keyCode) {\n      case KeyCode.SPACE:\n      case KeyCode.QUESTION_MARK:\n      case KeyCode.NUM_PLUS:\n      case KeyCode.NUM_MINUS:\n      case KeyCode.NUM_PERIOD:\n      case KeyCode.NUM_DIVISION:\n      case KeyCode.SEMICOLON:\n      case KeyCode.DASH:\n      case KeyCode.EQUALS:\n      case KeyCode.COMMA:\n      case KeyCode.PERIOD:\n      case KeyCode.SLASH:\n      case KeyCode.APOSTROPHE:\n      case KeyCode.SINGLE_QUOTE:\n      case KeyCode.OPEN_SQUARE_BRACKET:\n      case KeyCode.BACKSLASH:\n      case KeyCode.CLOSE_SQUARE_BRACKET:\n        return true;\n      default:\n        return false;\n    }\n  }\n};\nexport default KeyCode;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nvar attributes = \"accept acceptCharset accessKey action allowFullScreen allowTransparency\\n    alt async autoComplete autoFocus autoPlay capture cellPadding cellSpacing challenge\\n    charSet checked classID className colSpan cols content contentEditable contextMenu\\n    controls coords crossOrigin data dateTime default defer dir disabled download draggable\\n    encType form formAction formEncType formMethod formNoValidate formTarget frameBorder\\n    headers height hidden high href hrefLang htmlFor httpEquiv icon id inputMode integrity\\n    is keyParams keyType kind label lang list loop low manifest marginHeight marginWidth max maxLength media\\n    mediaGroup method min minLength multiple muted name noValidate nonce open\\n    optimum pattern placeholder poster preload radioGroup readOnly rel required\\n    reversed role rowSpan rows sandbox scope scoped scrolling seamless selected\\n    shape size sizes span spellCheck src srcDoc srcLang srcSet start step style\\n    summary tabIndex target title type useMap value width wmode wrap\";\nvar eventsName = \"onCopy onCut onPaste onCompositionEnd onCompositionStart onCompositionUpdate onKeyDown\\n    onKeyPress onKeyUp onFocus onBlur onChange onInput onSubmit onClick onContextMenu onDoubleClick\\n    onDrag onDragEnd onDragEnter onDragExit onDragLeave onDragOver onDragStart onDrop onMouseDown\\n    onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp onSelect onTouchCancel\\n    onTouchEnd onTouchMove onTouchStart onScroll onWheel onAbort onCanPlay onCanPlayThrough\\n    onDurationChange onEmptied onEncrypted onEnded onError onLoadedData onLoadedMetadata\\n    onLoadStart onPause onPlay onPlaying onProgress onRateChange onSeeked onSeeking onStalled onSuspend onTimeUpdate onVolumeChange onWaiting onLoad onError\";\nvar propList = \"\".concat(attributes, \" \").concat(eventsName).split(/[\\s\\n]+/);\n\n/* eslint-enable max-len */\nvar ariaPrefix = 'aria-';\nvar dataPrefix = 'data-';\nfunction match(key, prefix) {\n  return key.indexOf(prefix) === 0;\n}\n/**\n * Picker props from exist props with filter\n * @param props Passed props\n * @param ariaOnly boolean | { aria?: boolean; data?: boolean; attr?: boolean; } filter config\n */\nexport default function pickAttrs(props) {\n  var ariaOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n  var mergedConfig;\n  if (ariaOnly === false) {\n    mergedConfig = {\n      aria: true,\n      data: true,\n      attr: true\n    };\n  } else if (ariaOnly === true) {\n    mergedConfig = {\n      aria: true\n    };\n  } else {\n    mergedConfig = _objectSpread({}, ariaOnly);\n  }\n  var attrs = {};\n  Object.keys(props).forEach(function (key) {\n    if (\n    // Aria\n    mergedConfig.aria && (key === 'role' || match(key, ariaPrefix)) ||\n    // Data\n    mergedConfig.data && match(key, dataPrefix) ||\n    // Attr\n    mergedConfig.attr && propList.includes(key)) {\n      attrs[key] = props[key];\n    }\n  });\n  return attrs;\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport classNames from 'classnames';\nimport KeyCode from \"rc-util/es/KeyCode\";\nimport * as React from 'react';\nimport pickAttrs from \"rc-util/es/pickAttrs\";\nvar Notify = /*#__PURE__*/React.forwardRef(function (props, ref) {\n  var prefixCls = props.prefixCls,\n    style = props.style,\n    className = props.className,\n    _props$duration = props.duration,\n    duration = _props$duration === void 0 ? 4.5 : _props$duration,\n    showProgress = props.showProgress,\n    _props$pauseOnHover = props.pauseOnHover,\n    pauseOnHover = _props$pauseOnHover === void 0 ? true : _props$pauseOnHover,\n    eventKey = props.eventKey,\n    content = props.content,\n    closable = props.closable,\n    _props$closeIcon = props.closeIcon,\n    closeIcon = _props$closeIcon === void 0 ? 'x' : _props$closeIcon,\n    divProps = props.props,\n    onClick = props.onClick,\n    onNoticeClose = props.onNoticeClose,\n    times = props.times,\n    forcedHovering = props.hovering;\n  var _React$useState = React.useState(false),\n    _React$useState2 = _slicedToArray(_React$useState, 2),\n    hovering = _React$useState2[0],\n    setHovering = _React$useState2[1];\n  var _React$useState3 = React.useState(0),\n    _React$useState4 = _slicedToArray(_React$useState3, 2),\n    percent = _React$useState4[0],\n    setPercent = _React$useState4[1];\n  var _React$useState5 = React.useState(0),\n    _React$useState6 = _slicedToArray(_React$useState5, 2),\n    spentTime = _React$useState6[0],\n    setSpentTime = _React$useState6[1];\n  var mergedHovering = forcedHovering || hovering;\n  var mergedShowProgress = duration > 0 && showProgress;\n\n  // ======================== Close =========================\n  var onInternalClose = function onInternalClose() {\n    onNoticeClose(eventKey);\n  };\n  var onCloseKeyDown = function onCloseKeyDown(e) {\n    if (e.key === 'Enter' || e.code === 'Enter' || e.keyCode === KeyCode.ENTER) {\n      onInternalClose();\n    }\n  };\n\n  // ======================== Effect ========================\n  React.useEffect(function () {\n    if (!mergedHovering && duration > 0) {\n      var start = Date.now() - spentTime;\n      var timeout = setTimeout(function () {\n        onInternalClose();\n      }, duration * 1000 - spentTime);\n      return function () {\n        if (pauseOnHover) {\n          clearTimeout(timeout);\n        }\n        setSpentTime(Date.now() - start);\n      };\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [duration, mergedHovering, times]);\n  React.useEffect(function () {\n    if (!mergedHovering && mergedShowProgress && (pauseOnHover || spentTime === 0)) {\n      var start = performance.now();\n      var animationFrame;\n      var calculate = function calculate() {\n        cancelAnimationFrame(animationFrame);\n        animationFrame = requestAnimationFrame(function (timestamp) {\n          var runtime = timestamp + spentTime - start;\n          var progress = Math.min(runtime / (duration * 1000), 1);\n          setPercent(progress * 100);\n          if (progress < 1) {\n            calculate();\n          }\n        });\n      };\n      calculate();\n      return function () {\n        if (pauseOnHover) {\n          cancelAnimationFrame(animationFrame);\n        }\n      };\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [duration, spentTime, mergedHovering, mergedShowProgress, times]);\n\n  // ======================== Closable ========================\n  var closableObj = React.useMemo(function () {\n    if (_typeof(closable) === 'object' && closable !== null) {\n      return closable;\n    }\n    if (closable) {\n      return {\n        closeIcon: closeIcon\n      };\n    }\n    return {};\n  }, [closable, closeIcon]);\n  var ariaProps = pickAttrs(closableObj, true);\n\n  // ======================== Progress ========================\n  var validPercent = 100 - (!percent || percent < 0 ? 0 : percent > 100 ? 100 : percent);\n\n  // ======================== Render ========================\n  var noticePrefixCls = \"\".concat(prefixCls, \"-notice\");\n  return /*#__PURE__*/React.createElement(\"div\", _extends({}, divProps, {\n    ref: ref,\n    className: classNames(noticePrefixCls, className, _defineProperty({}, \"\".concat(noticePrefixCls, \"-closable\"), closable)),\n    style: style,\n    onMouseEnter: function onMouseEnter(e) {\n      var _divProps$onMouseEnte;\n      setHovering(true);\n      divProps === null || divProps === void 0 || (_divProps$onMouseEnte = divProps.onMouseEnter) === null || _divProps$onMouseEnte === void 0 || _divProps$onMouseEnte.call(divProps, e);\n    },\n    onMouseLeave: function onMouseLeave(e) {\n      var _divProps$onMouseLeav;\n      setHovering(false);\n      divProps === null || divProps === void 0 || (_divProps$onMouseLeav = divProps.onMouseLeave) === null || _divProps$onMouseLeav === void 0 || _divProps$onMouseLeav.call(divProps, e);\n    },\n    onClick: onClick\n  }), /*#__PURE__*/React.createElement(\"div\", {\n    className: \"\".concat(noticePrefixCls, \"-content\")\n  }, content), closable && /*#__PURE__*/React.createElement(\"a\", _extends({\n    tabIndex: 0,\n    className: \"\".concat(noticePrefixCls, \"-close\"),\n    onKeyDown: onCloseKeyDown,\n    \"aria-label\": \"Close\"\n  }, ariaProps, {\n    onClick: function onClick(e) {\n      e.preventDefault();\n      e.stopPropagation();\n      onInternalClose();\n    }\n  }), closableObj.closeIcon), mergedShowProgress && /*#__PURE__*/React.createElement(\"progress\", {\n    className: \"\".concat(noticePrefixCls, \"-progress\"),\n    max: \"100\",\n    value: validPercent\n  }, validPercent + '%'));\n});\nexport default Notify;","import React from 'react';\nexport var NotificationContext = /*#__PURE__*/React.createContext({});\nvar NotificationProvider = function NotificationProvider(_ref) {\n  var children = _ref.children,\n    classNames = _ref.classNames;\n  return /*#__PURE__*/React.createElement(NotificationContext.Provider, {\n    value: {\n      classNames: classNames\n    }\n  }, children);\n};\nexport default NotificationProvider;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nvar DEFAULT_OFFSET = 8;\nvar DEFAULT_THRESHOLD = 3;\nvar DEFAULT_GAP = 16;\nvar useStack = function useStack(config) {\n  var result = {\n    offset: DEFAULT_OFFSET,\n    threshold: DEFAULT_THRESHOLD,\n    gap: DEFAULT_GAP\n  };\n  if (config && _typeof(config) === 'object') {\n    var _config$offset, _config$threshold, _config$gap;\n    result.offset = (_config$offset = config.offset) !== null && _config$offset !== void 0 ? _config$offset : DEFAULT_OFFSET;\n    result.threshold = (_config$threshold = config.threshold) !== null && _config$threshold !== void 0 ? _config$threshold : DEFAULT_THRESHOLD;\n    result.gap = (_config$gap = config.gap) !== null && _config$gap !== void 0 ? _config$gap : DEFAULT_GAP;\n  }\n  return [!!config, result];\n};\nexport default useStack;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nvar _excluded = [\"className\", \"style\", \"classNames\", \"styles\"];\nimport React, { useContext, useEffect, useRef, useState } from 'react';\nimport clsx from 'classnames';\nimport { CSSMotionList } from 'rc-motion';\nimport Notice from \"./Notice\";\nimport { NotificationContext } from \"./NotificationProvider\";\nimport useStack from \"./hooks/useStack\";\nvar NoticeList = function NoticeList(props) {\n  var configList = props.configList,\n    placement = props.placement,\n    prefixCls = props.prefixCls,\n    className = props.className,\n    style = props.style,\n    motion = props.motion,\n    onAllNoticeRemoved = props.onAllNoticeRemoved,\n    onNoticeClose = props.onNoticeClose,\n    stackConfig = props.stack;\n  var _useContext = useContext(NotificationContext),\n    ctxCls = _useContext.classNames;\n  var dictRef = useRef({});\n  var _useState = useState(null),\n    _useState2 = _slicedToArray(_useState, 2),\n    latestNotice = _useState2[0],\n    setLatestNotice = _useState2[1];\n  var _useState3 = useState([]),\n    _useState4 = _slicedToArray(_useState3, 2),\n    hoverKeys = _useState4[0],\n    setHoverKeys = _useState4[1];\n  var keys = configList.map(function (config) {\n    return {\n      config: config,\n      key: String(config.key)\n    };\n  });\n  var _useStack = useStack(stackConfig),\n    _useStack2 = _slicedToArray(_useStack, 2),\n    stack = _useStack2[0],\n    _useStack2$ = _useStack2[1],\n    offset = _useStack2$.offset,\n    threshold = _useStack2$.threshold,\n    gap = _useStack2$.gap;\n  var expanded = stack && (hoverKeys.length > 0 || keys.length <= threshold);\n  var placementMotion = typeof motion === 'function' ? motion(placement) : motion;\n\n  // Clean hover key\n  useEffect(function () {\n    if (stack && hoverKeys.length > 1) {\n      setHoverKeys(function (prev) {\n        return prev.filter(function (key) {\n          return keys.some(function (_ref) {\n            var dataKey = _ref.key;\n            return key === dataKey;\n          });\n        });\n      });\n    }\n  }, [hoverKeys, keys, stack]);\n\n  // Force update latest notice\n  useEffect(function () {\n    var _keys;\n    if (stack && dictRef.current[(_keys = keys[keys.length - 1]) === null || _keys === void 0 ? void 0 : _keys.key]) {\n      var _keys2;\n      setLatestNotice(dictRef.current[(_keys2 = keys[keys.length - 1]) === null || _keys2 === void 0 ? void 0 : _keys2.key]);\n    }\n  }, [keys, stack]);\n  return /*#__PURE__*/React.createElement(CSSMotionList, _extends({\n    key: placement,\n    className: clsx(prefixCls, \"\".concat(prefixCls, \"-\").concat(placement), ctxCls === null || ctxCls === void 0 ? void 0 : ctxCls.list, className, _defineProperty(_defineProperty({}, \"\".concat(prefixCls, \"-stack\"), !!stack), \"\".concat(prefixCls, \"-stack-expanded\"), expanded)),\n    style: style,\n    keys: keys,\n    motionAppear: true\n  }, placementMotion, {\n    onAllRemoved: function onAllRemoved() {\n      onAllNoticeRemoved(placement);\n    }\n  }), function (_ref2, nodeRef) {\n    var config = _ref2.config,\n      motionClassName = _ref2.className,\n      motionStyle = _ref2.style,\n      motionIndex = _ref2.index;\n    var _ref3 = config,\n      key = _ref3.key,\n      times = _ref3.times;\n    var strKey = String(key);\n    var _ref4 = config,\n      configClassName = _ref4.className,\n      configStyle = _ref4.style,\n      configClassNames = _ref4.classNames,\n      configStyles = _ref4.styles,\n      restConfig = _objectWithoutProperties(_ref4, _excluded);\n    var dataIndex = keys.findIndex(function (item) {\n      return item.key === strKey;\n    });\n\n    // If dataIndex is -1, that means this notice has been removed in data, but still in dom\n    // Should minus (motionIndex - 1) to get the correct index because keys.length is not the same as dom length\n    var stackStyle = {};\n    if (stack) {\n      var index = keys.length - 1 - (dataIndex > -1 ? dataIndex : motionIndex - 1);\n      var transformX = placement === 'top' || placement === 'bottom' ? '-50%' : '0';\n      if (index > 0) {\n        var _dictRef$current$strK, _dictRef$current$strK2, _dictRef$current$strK3;\n        stackStyle.height = expanded ? (_dictRef$current$strK = dictRef.current[strKey]) === null || _dictRef$current$strK === void 0 ? void 0 : _dictRef$current$strK.offsetHeight : latestNotice === null || latestNotice === void 0 ? void 0 : latestNotice.offsetHeight;\n\n        // Transform\n        var verticalOffset = 0;\n        for (var i = 0; i < index; i++) {\n          var _dictRef$current$keys;\n          verticalOffset += ((_dictRef$current$keys = dictRef.current[keys[keys.length - 1 - i].key]) === null || _dictRef$current$keys === void 0 ? void 0 : _dictRef$current$keys.offsetHeight) + gap;\n        }\n        var transformY = (expanded ? verticalOffset : index * offset) * (placement.startsWith('top') ? 1 : -1);\n        var scaleX = !expanded && latestNotice !== null && latestNotice !== void 0 && latestNotice.offsetWidth && (_dictRef$current$strK2 = dictRef.current[strKey]) !== null && _dictRef$current$strK2 !== void 0 && _dictRef$current$strK2.offsetWidth ? ((latestNotice === null || latestNotice === void 0 ? void 0 : latestNotice.offsetWidth) - offset * 2 * (index < 3 ? index : 3)) / ((_dictRef$current$strK3 = dictRef.current[strKey]) === null || _dictRef$current$strK3 === void 0 ? void 0 : _dictRef$current$strK3.offsetWidth) : 1;\n        stackStyle.transform = \"translate3d(\".concat(transformX, \", \").concat(transformY, \"px, 0) scaleX(\").concat(scaleX, \")\");\n      } else {\n        stackStyle.transform = \"translate3d(\".concat(transformX, \", 0, 0)\");\n      }\n    }\n    return /*#__PURE__*/React.createElement(\"div\", {\n      ref: nodeRef,\n      className: clsx(\"\".concat(prefixCls, \"-notice-wrapper\"), motionClassName, configClassNames === null || configClassNames === void 0 ? void 0 : configClassNames.wrapper),\n      style: _objectSpread(_objectSpread(_objectSpread({}, motionStyle), stackStyle), configStyles === null || configStyles === void 0 ? void 0 : configStyles.wrapper),\n      onMouseEnter: function onMouseEnter() {\n        return setHoverKeys(function (prev) {\n          return prev.includes(strKey) ? prev : [].concat(_toConsumableArray(prev), [strKey]);\n        });\n      },\n      onMouseLeave: function onMouseLeave() {\n        return setHoverKeys(function (prev) {\n          return prev.filter(function (k) {\n            return k !== strKey;\n          });\n        });\n      }\n    }, /*#__PURE__*/React.createElement(Notice, _extends({}, restConfig, {\n      ref: function ref(node) {\n        if (dataIndex > -1) {\n          dictRef.current[strKey] = node;\n        } else {\n          delete dictRef.current[strKey];\n        }\n      },\n      prefixCls: prefixCls,\n      classNames: configClassNames,\n      styles: configStyles,\n      className: clsx(configClassName, ctxCls === null || ctxCls === void 0 ? void 0 : ctxCls.notice),\n      style: configStyle,\n      times: times,\n      key: key,\n      eventKey: key,\n      onNoticeClose: onNoticeClose,\n      hovering: stack && hoverKeys.length > 0\n    })));\n  });\n};\nif (process.env.NODE_ENV !== 'production') {\n  NoticeList.displayName = 'NoticeList';\n}\nexport default NoticeList;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport NoticeList from \"./NoticeList\";\n// ant-notification ant-notification-topRight\nvar Notifications = /*#__PURE__*/React.forwardRef(function (props, ref) {\n  var _props$prefixCls = props.prefixCls,\n    prefixCls = _props$prefixCls === void 0 ? 'rc-notification' : _props$prefixCls,\n    container = props.container,\n    motion = props.motion,\n    maxCount = props.maxCount,\n    className = props.className,\n    style = props.style,\n    onAllRemoved = props.onAllRemoved,\n    stack = props.stack,\n    renderNotifications = props.renderNotifications;\n  var _React$useState = React.useState([]),\n    _React$useState2 = _slicedToArray(_React$useState, 2),\n    configList = _React$useState2[0],\n    setConfigList = _React$useState2[1];\n\n  // ======================== Close =========================\n  var onNoticeClose = function onNoticeClose(key) {\n    var _config$onClose;\n    // Trigger close event\n    var config = configList.find(function (item) {\n      return item.key === key;\n    });\n    config === null || config === void 0 || (_config$onClose = config.onClose) === null || _config$onClose === void 0 || _config$onClose.call(config);\n    setConfigList(function (list) {\n      return list.filter(function (item) {\n        return item.key !== key;\n      });\n    });\n  };\n\n  // ========================= Refs =========================\n  React.useImperativeHandle(ref, function () {\n    return {\n      open: function open(config) {\n        setConfigList(function (list) {\n          var clone = _toConsumableArray(list);\n\n          // Replace if exist\n          var index = clone.findIndex(function (item) {\n            return item.key === config.key;\n          });\n          var innerConfig = _objectSpread({}, config);\n          if (index >= 0) {\n            var _list$index;\n            innerConfig.times = (((_list$index = list[index]) === null || _list$index === void 0 ? void 0 : _list$index.times) || 0) + 1;\n            clone[index] = innerConfig;\n          } else {\n            innerConfig.times = 0;\n            clone.push(innerConfig);\n          }\n          if (maxCount > 0 && clone.length > maxCount) {\n            clone = clone.slice(-maxCount);\n          }\n          return clone;\n        });\n      },\n      close: function close(key) {\n        onNoticeClose(key);\n      },\n      destroy: function destroy() {\n        setConfigList([]);\n      }\n    };\n  });\n\n  // ====================== Placements ======================\n  var _React$useState3 = React.useState({}),\n    _React$useState4 = _slicedToArray(_React$useState3, 2),\n    placements = _React$useState4[0],\n    setPlacements = _React$useState4[1];\n  React.useEffect(function () {\n    var nextPlacements = {};\n    configList.forEach(function (config) {\n      var _config$placement = config.placement,\n        placement = _config$placement === void 0 ? 'topRight' : _config$placement;\n      if (placement) {\n        nextPlacements[placement] = nextPlacements[placement] || [];\n        nextPlacements[placement].push(config);\n      }\n    });\n\n    // Fill exist placements to avoid empty list causing remove without motion\n    Object.keys(placements).forEach(function (placement) {\n      nextPlacements[placement] = nextPlacements[placement] || [];\n    });\n    setPlacements(nextPlacements);\n  }, [configList]);\n\n  // Clean up container if all notices fade out\n  var onAllNoticeRemoved = function onAllNoticeRemoved(placement) {\n    setPlacements(function (originPlacements) {\n      var clone = _objectSpread({}, originPlacements);\n      var list = clone[placement] || [];\n      if (!list.length) {\n        delete clone[placement];\n      }\n      return clone;\n    });\n  };\n\n  // Effect tell that placements is empty now\n  var emptyRef = React.useRef(false);\n  React.useEffect(function () {\n    if (Object.keys(placements).length > 0) {\n      emptyRef.current = true;\n    } else if (emptyRef.current) {\n      // Trigger only when from exist to empty\n      onAllRemoved === null || onAllRemoved === void 0 || onAllRemoved();\n      emptyRef.current = false;\n    }\n  }, [placements]);\n  // ======================== Render ========================\n  if (!container) {\n    return null;\n  }\n  var placementList = Object.keys(placements);\n  return /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(React.Fragment, null, placementList.map(function (placement) {\n    var placementConfigList = placements[placement];\n    var list = /*#__PURE__*/React.createElement(NoticeList, {\n      key: placement,\n      configList: placementConfigList,\n      placement: placement,\n      prefixCls: prefixCls,\n      className: className === null || className === void 0 ? void 0 : className(placement),\n      style: style === null || style === void 0 ? void 0 : style(placement),\n      motion: motion,\n      onNoticeClose: onNoticeClose,\n      onAllNoticeRemoved: onAllNoticeRemoved,\n      stack: stack\n    });\n    return renderNotifications ? renderNotifications(list, {\n      prefixCls: prefixCls,\n      key: placement\n    }) : list;\n  })), container);\n});\nif (process.env.NODE_ENV !== 'production') {\n  Notifications.displayName = 'Notifications';\n}\nexport default Notifications;","import _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nvar _excluded = [\"getContainer\", \"motion\", \"prefixCls\", \"maxCount\", \"className\", \"style\", \"onAllRemoved\", \"stack\", \"renderNotifications\"];\nimport * as React from 'react';\nimport Notifications from \"../Notifications\";\nimport { useEvent } from 'rc-util';\nvar defaultGetContainer = function defaultGetContainer() {\n  return document.body;\n};\nvar uniqueKey = 0;\nfunction mergeConfig() {\n  var clone = {};\n  for (var _len = arguments.length, objList = new Array(_len), _key = 0; _key < _len; _key++) {\n    objList[_key] = arguments[_key];\n  }\n  objList.forEach(function (obj) {\n    if (obj) {\n      Object.keys(obj).forEach(function (key) {\n        var val = obj[key];\n        if (val !== undefined) {\n          clone[key] = val;\n        }\n      });\n    }\n  });\n  return clone;\n}\nexport default function useNotification() {\n  var rootConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  var _rootConfig$getContai = rootConfig.getContainer,\n    getContainer = _rootConfig$getContai === void 0 ? defaultGetContainer : _rootConfig$getContai,\n    motion = rootConfig.motion,\n    prefixCls = rootConfig.prefixCls,\n    maxCount = rootConfig.maxCount,\n    className = rootConfig.className,\n    style = rootConfig.style,\n    onAllRemoved = rootConfig.onAllRemoved,\n    stack = rootConfig.stack,\n    renderNotifications = rootConfig.renderNotifications,\n    shareConfig = _objectWithoutProperties(rootConfig, _excluded);\n  var _React$useState = React.useState(),\n    _React$useState2 = _slicedToArray(_React$useState, 2),\n    container = _React$useState2[0],\n    setContainer = _React$useState2[1];\n  var notificationsRef = React.useRef();\n  var contextHolder = /*#__PURE__*/React.createElement(Notifications, {\n    container: container,\n    ref: notificationsRef,\n    prefixCls: prefixCls,\n    motion: motion,\n    maxCount: maxCount,\n    className: className,\n    style: style,\n    onAllRemoved: onAllRemoved,\n    stack: stack,\n    renderNotifications: renderNotifications\n  });\n  var _React$useState3 = React.useState([]),\n    _React$useState4 = _slicedToArray(_React$useState3, 2),\n    taskQueue = _React$useState4[0],\n    setTaskQueue = _React$useState4[1];\n  var open = useEvent(function (config) {\n    var mergedConfig = mergeConfig(shareConfig, config);\n    if (mergedConfig.key === null || mergedConfig.key === undefined) {\n      mergedConfig.key = \"rc-notification-\".concat(uniqueKey);\n      uniqueKey += 1;\n    }\n    setTaskQueue(function (queue) {\n      return [].concat(_toConsumableArray(queue), [{\n        type: 'open',\n        config: mergedConfig\n      }]);\n    });\n  });\n\n  // ========================= Refs =========================\n  var api = React.useMemo(function () {\n    return {\n      open: open,\n      close: function close(key) {\n        setTaskQueue(function (queue) {\n          return [].concat(_toConsumableArray(queue), [{\n            type: 'close',\n            key: key\n          }]);\n        });\n      },\n      destroy: function destroy() {\n        setTaskQueue(function (queue) {\n          return [].concat(_toConsumableArray(queue), [{\n            type: 'destroy'\n          }]);\n        });\n      }\n    };\n  }, []);\n\n  // ======================= Container ======================\n  // React 18 should all in effect that we will check container in each render\n  // Which means getContainer should be stable.\n  React.useEffect(function () {\n    setContainer(getContainer());\n  });\n\n  // ======================== Effect ========================\n  React.useEffect(function () {\n    // Flush task when node ready\n    if (notificationsRef.current && taskQueue.length) {\n      taskQueue.forEach(function (task) {\n        switch (task.type) {\n          case 'open':\n            notificationsRef.current.open(task.config);\n            break;\n          case 'close':\n            notificationsRef.current.close(task.key);\n            break;\n          case 'destroy':\n            notificationsRef.current.destroy();\n            break;\n        }\n      });\n\n      // https://github.com/ant-design/ant-design/issues/52590\n      // React `startTransition` will run once `useEffect` but many times `setState`,\n      // So `setTaskQueue` with filtered array will cause infinite loop.\n      // We cache the first match queue instead.\n      var oriTaskQueue;\n      var tgtTaskQueue;\n\n      // React 17 will mix order of effect & setState in async\n      // - open: setState[0]\n      // - effect[0]\n      // - open: setState[1]\n      // - effect setState([]) * here will clean up [0, 1] in React 17\n      setTaskQueue(function (oriQueue) {\n        if (oriTaskQueue !== oriQueue || !tgtTaskQueue) {\n          oriTaskQueue = oriQueue;\n          tgtTaskQueue = oriQueue.filter(function (task) {\n            return !taskQueue.includes(task);\n          });\n        }\n        return tgtTaskQueue;\n      });\n    }\n  }, [taskQueue]);\n\n  // ======================== Return ========================\n  return [api, contextHolder];\n}","import { useToken } from '../../theme/internal';\n/**\n * This hook is only for cssVar to add root className for components.\n * If root ClassName is needed, this hook could be refactored with `-root`\n * @param prefixCls\n */\nconst useCSSVarCls = prefixCls => {\n  const [,,,, cssVar] = useToken();\n  return cssVar ? `${prefixCls}-css-var` : '';\n};\nexport default useCSSVarCls;","import _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nvar AbstractCalculator = /*#__PURE__*/_createClass(function AbstractCalculator() {\n  _classCallCheck(this, AbstractCalculator);\n});\nexport default AbstractCalculator;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport AbstractCalculator from \"./calculator\";\nvar CALC_UNIT = 'CALC_UNIT';\nvar regexp = new RegExp(CALC_UNIT, 'g');\nfunction unit(value) {\n  if (typeof value === 'number') {\n    return \"\".concat(value).concat(CALC_UNIT);\n  }\n  return value;\n}\nvar CSSCalculator = /*#__PURE__*/function (_AbstractCalculator) {\n  _inherits(CSSCalculator, _AbstractCalculator);\n  var _super = _createSuper(CSSCalculator);\n  function CSSCalculator(num, unitlessCssVar) {\n    var _this;\n    _classCallCheck(this, CSSCalculator);\n    _this = _super.call(this);\n    _defineProperty(_assertThisInitialized(_this), \"result\", '');\n    _defineProperty(_assertThisInitialized(_this), \"unitlessCssVar\", void 0);\n    _defineProperty(_assertThisInitialized(_this), \"lowPriority\", void 0);\n    var numType = _typeof(num);\n    _this.unitlessCssVar = unitlessCssVar;\n    if (num instanceof CSSCalculator) {\n      _this.result = \"(\".concat(num.result, \")\");\n    } else if (numType === 'number') {\n      _this.result = unit(num);\n    } else if (numType === 'string') {\n      _this.result = num;\n    }\n    return _this;\n  }\n  _createClass(CSSCalculator, [{\n    key: \"add\",\n    value: function add(num) {\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" + \").concat(num.getResult());\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" + \").concat(unit(num));\n      }\n      this.lowPriority = true;\n      return this;\n    }\n  }, {\n    key: \"sub\",\n    value: function sub(num) {\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" - \").concat(num.getResult());\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" - \").concat(unit(num));\n      }\n      this.lowPriority = true;\n      return this;\n    }\n  }, {\n    key: \"mul\",\n    value: function mul(num) {\n      if (this.lowPriority) {\n        this.result = \"(\".concat(this.result, \")\");\n      }\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" * \").concat(num.getResult(true));\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" * \").concat(num);\n      }\n      this.lowPriority = false;\n      return this;\n    }\n  }, {\n    key: \"div\",\n    value: function div(num) {\n      if (this.lowPriority) {\n        this.result = \"(\".concat(this.result, \")\");\n      }\n      if (num instanceof CSSCalculator) {\n        this.result = \"\".concat(this.result, \" / \").concat(num.getResult(true));\n      } else if (typeof num === 'number' || typeof num === 'string') {\n        this.result = \"\".concat(this.result, \" / \").concat(num);\n      }\n      this.lowPriority = false;\n      return this;\n    }\n  }, {\n    key: \"getResult\",\n    value: function getResult(force) {\n      return this.lowPriority || force ? \"(\".concat(this.result, \")\") : this.result;\n    }\n  }, {\n    key: \"equal\",\n    value: function equal(options) {\n      var _this2 = this;\n      var _ref = options || {},\n        cssUnit = _ref.unit;\n      var mergedUnit = true;\n      if (typeof cssUnit === 'boolean') {\n        mergedUnit = cssUnit;\n      } else if (Array.from(this.unitlessCssVar).some(function (cssVar) {\n        return _this2.result.includes(cssVar);\n      })) {\n        mergedUnit = false;\n      }\n      this.result = this.result.replace(regexp, mergedUnit ? 'px' : '');\n      if (typeof this.lowPriority !== 'undefined') {\n        return \"calc(\".concat(this.result, \")\");\n      }\n      return this.result;\n    }\n  }]);\n  return CSSCalculator;\n}(AbstractCalculator);\nexport { CSSCalculator as default };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport AbstractCalculator from \"./calculator\";\nvar NumCalculator = /*#__PURE__*/function (_AbstractCalculator) {\n  _inherits(NumCalculator, _AbstractCalculator);\n  var _super = _createSuper(NumCalculator);\n  function NumCalculator(num) {\n    var _this;\n    _classCallCheck(this, NumCalculator);\n    _this = _super.call(this);\n    _defineProperty(_assertThisInitialized(_this), \"result\", 0);\n    if (num instanceof NumCalculator) {\n      _this.result = num.result;\n    } else if (typeof num === 'number') {\n      _this.result = num;\n    }\n    return _this;\n  }\n  _createClass(NumCalculator, [{\n    key: \"add\",\n    value: function add(num) {\n      if (num instanceof NumCalculator) {\n        this.result += num.result;\n      } else if (typeof num === 'number') {\n        this.result += num;\n      }\n      return this;\n    }\n  }, {\n    key: \"sub\",\n    value: function sub(num) {\n      if (num instanceof NumCalculator) {\n        this.result -= num.result;\n      } else if (typeof num === 'number') {\n        this.result -= num;\n      }\n      return this;\n    }\n  }, {\n    key: \"mul\",\n    value: function mul(num) {\n      if (num instanceof NumCalculator) {\n        this.result *= num.result;\n      } else if (typeof num === 'number') {\n        this.result *= num;\n      }\n      return this;\n    }\n  }, {\n    key: \"div\",\n    value: function div(num) {\n      if (num instanceof NumCalculator) {\n        this.result /= num.result;\n      } else if (typeof num === 'number') {\n        this.result /= num;\n      }\n      return this;\n    }\n  }, {\n    key: \"equal\",\n    value: function equal() {\n      return this.result;\n    }\n  }]);\n  return NumCalculator;\n}(AbstractCalculator);\nexport default NumCalculator;","import CSSCalculator from \"./CSSCalculator\";\nimport NumCalculator from \"./NumCalculator\";\nvar genCalc = function genCalc(type, unitlessCssVar) {\n  var Calculator = type === 'css' ? CSSCalculator : NumCalculator;\n  return function (num) {\n    return new Calculator(num, unitlessCssVar);\n  };\n};\nexport default genCalc;","var getCompVarPrefix = function getCompVarPrefix(component, prefix) {\n  return \"\".concat([prefix, component.replace(/([A-Z]+)([A-Z][a-z]+)/g, '$1-$2').replace(/([a-z])([A-Z])/g, '$1-$2')].filter(Boolean).join('-'));\n};\nexport default getCompVarPrefix;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport { warning } from 'rc-util';\nfunction getComponentToken(component, token, defaultToken, options) {\n  var customToken = _objectSpread({}, token[component]);\n  if (options !== null && options !== void 0 && options.deprecatedTokens) {\n    var deprecatedTokens = options.deprecatedTokens;\n    deprecatedTokens.forEach(function (_ref) {\n      var _ref2 = _slicedToArray(_ref, 2),\n        oldTokenKey = _ref2[0],\n        newTokenKey = _ref2[1];\n      if (process.env.NODE_ENV !== 'production') {\n        warning(!(customToken !== null && customToken !== void 0 && customToken[oldTokenKey]), \"Component Token `\".concat(String(oldTokenKey), \"` of \").concat(String(component), \" is deprecated. Please use `\").concat(String(newTokenKey), \"` instead.\"));\n      }\n\n      // Should wrap with `if` clause, or there will be `undefined` in object.\n      if (customToken !== null && customToken !== void 0 && customToken[oldTokenKey] || customToken !== null && customToken !== void 0 && customToken[newTokenKey]) {\n        var _customToken$newToken;\n        (_customToken$newToken = customToken[newTokenKey]) !== null && _customToken$newToken !== void 0 ? _customToken$newToken : customToken[newTokenKey] = customToken === null || customToken === void 0 ? void 0 : customToken[oldTokenKey];\n      }\n    });\n  }\n  var mergedToken = _objectSpread(_objectSpread({}, defaultToken), customToken);\n\n  // Remove same value as global token to minimize size\n  Object.keys(mergedToken).forEach(function (key) {\n    if (mergedToken[key] === token[key]) {\n      delete mergedToken[key];\n    }\n  });\n  return mergedToken;\n}\nexport default getComponentToken;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _typeof from \"@babel/runtime/helpers/esm/typeof\";\nvar enableStatistic = process.env.NODE_ENV !== 'production' || typeof CSSINJS_STATISTIC !== 'undefined';\nvar recording = true;\n\n/**\n * This function will do as `Object.assign` in production. But will use Object.defineProperty:get to\n * pass all value access in development. To support statistic field usage with alias token.\n */\nexport function merge() {\n  for (var _len = arguments.length, objs = new Array(_len), _key = 0; _key < _len; _key++) {\n    objs[_key] = arguments[_key];\n  }\n  /* istanbul ignore next */\n  if (!enableStatistic) {\n    return Object.assign.apply(Object, [{}].concat(objs));\n  }\n  recording = false;\n  var ret = {};\n  objs.forEach(function (obj) {\n    if (_typeof(obj) !== 'object') {\n      return;\n    }\n    var keys = Object.keys(obj);\n    keys.forEach(function (key) {\n      Object.defineProperty(ret, key, {\n        configurable: true,\n        enumerable: true,\n        get: function get() {\n          return obj[key];\n        }\n      });\n    });\n  });\n  recording = true;\n  return ret;\n}\n\n/** @internal Internal Usage. Not use in your production. */\nexport var statistic = {};\n\n/** @internal Internal Usage. Not use in your production. */\nexport var _statistic_build_ = {};\n\n/* istanbul ignore next */\nfunction noop() {}\n\n/** Statistic token usage case. Should use `merge` function if you do not want spread record. */\nvar statisticToken = function statisticToken(token) {\n  var tokenKeys;\n  var proxy = token;\n  var flush = noop;\n  if (enableStatistic && typeof Proxy !== 'undefined') {\n    tokenKeys = new Set();\n    proxy = new Proxy(token, {\n      get: function get(obj, prop) {\n        if (recording) {\n          var _tokenKeys;\n          (_tokenKeys = tokenKeys) === null || _tokenKeys === void 0 || _tokenKeys.add(prop);\n        }\n        return obj[prop];\n      }\n    });\n    flush = function flush(componentName, componentToken) {\n      var _statistic$componentN;\n      statistic[componentName] = {\n        global: Array.from(tokenKeys),\n        component: _objectSpread(_objectSpread({}, (_statistic$componentN = statistic[componentName]) === null || _statistic$componentN === void 0 ? void 0 : _statistic$componentN.component), componentToken)\n      };\n    };\n  }\n  return {\n    token: proxy,\n    keys: tokenKeys,\n    flush: flush\n  };\n};\nexport default statisticToken;","import { merge as mergeToken } from \"./statistic\";\nfunction getDefaultComponentToken(component, token, getDefaultToken) {\n  if (typeof getDefaultToken === 'function') {\n    var _token$component;\n    return getDefaultToken(mergeToken(token, (_token$component = token[component]) !== null && _token$component !== void 0 ? _token$component : {}));\n  }\n  return getDefaultToken !== null && getDefaultToken !== void 0 ? getDefaultToken : {};\n}\nexport default getDefaultComponentToken;","import { unit } from '@ant-design/cssinjs';\nfunction genMaxMin(type) {\n  if (type === 'js') {\n    return {\n      max: Math.max,\n      min: Math.min\n    };\n  }\n  return {\n    max: function max() {\n      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n      return \"max(\".concat(args.map(function (value) {\n        return unit(value);\n      }).join(','), \")\");\n    },\n    min: function min() {\n      for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n      return \"min(\".concat(args.map(function (value) {\n        return unit(value);\n      }).join(','), \")\");\n    }\n  };\n}\nexport default genMaxMin;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport React from 'react';\nvar BEAT_LIMIT = 1000 * 60 * 10;\n\n/**\n * A helper class to map keys to values.\n * It supports both primitive keys and object keys.\n */\nvar ArrayKeyMap = /*#__PURE__*/function () {\n  function ArrayKeyMap() {\n    _classCallCheck(this, ArrayKeyMap);\n    _defineProperty(this, \"map\", new Map());\n    // Use WeakMap to avoid memory leak\n    _defineProperty(this, \"objectIDMap\", new WeakMap());\n    _defineProperty(this, \"nextID\", 0);\n    _defineProperty(this, \"lastAccessBeat\", new Map());\n    // We will clean up the cache when reach the limit\n    _defineProperty(this, \"accessBeat\", 0);\n  }\n  _createClass(ArrayKeyMap, [{\n    key: \"set\",\n    value: function set(keys, value) {\n      // New set will trigger clear\n      this.clear();\n\n      // Set logic\n      var compositeKey = this.getCompositeKey(keys);\n      this.map.set(compositeKey, value);\n      this.lastAccessBeat.set(compositeKey, Date.now());\n    }\n  }, {\n    key: \"get\",\n    value: function get(keys) {\n      var compositeKey = this.getCompositeKey(keys);\n      var cache = this.map.get(compositeKey);\n      this.lastAccessBeat.set(compositeKey, Date.now());\n      this.accessBeat += 1;\n      return cache;\n    }\n  }, {\n    key: \"getCompositeKey\",\n    value: function getCompositeKey(keys) {\n      var _this = this;\n      var ids = keys.map(function (key) {\n        if (key && _typeof(key) === 'object') {\n          return \"obj_\".concat(_this.getObjectID(key));\n        }\n        return \"\".concat(_typeof(key), \"_\").concat(key);\n      });\n      return ids.join('|');\n    }\n  }, {\n    key: \"getObjectID\",\n    value: function getObjectID(obj) {\n      if (this.objectIDMap.has(obj)) {\n        return this.objectIDMap.get(obj);\n      }\n      var id = this.nextID;\n      this.objectIDMap.set(obj, id);\n      this.nextID += 1;\n      return id;\n    }\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      var _this2 = this;\n      if (this.accessBeat > 10000) {\n        var now = Date.now();\n        this.lastAccessBeat.forEach(function (beat, key) {\n          if (now - beat > BEAT_LIMIT) {\n            _this2.map.delete(key);\n            _this2.lastAccessBeat.delete(key);\n          }\n        });\n        this.accessBeat = 0;\n      }\n    }\n  }]);\n  return ArrayKeyMap;\n}();\nvar uniqueMap = new ArrayKeyMap();\n\n/**\n * Like `useMemo`, but this hook result will be shared across all instances.\n */\nfunction useUniqueMemo(memoFn, deps) {\n  return React.useMemo(function () {\n    var cachedValue = uniqueMap.get(deps);\n    if (cachedValue) {\n      return cachedValue;\n    }\n    var newValue = memoFn();\n    uniqueMap.set(deps, newValue);\n    return newValue;\n  }, deps);\n}\nexport default useUniqueMemo;","/**\n * Provide a default hook since not everyone needs to config this.\n */\nvar useDefaultCSP = function useDefaultCSP() {\n  return {};\n};\nexport default useDefaultCSP;","import _typeof from \"@babel/runtime/helpers/esm/typeof\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport React from 'react';\nimport { token2CSSVar, useCSSVarRegister, useStyleRegister } from '@ant-design/cssinjs';\nimport genCalc from \"./calc\";\nimport getCompVarPrefix from \"./getCompVarPrefix\";\nimport getComponentToken from \"./getComponentToken\";\nimport getDefaultComponentToken from \"./getDefaultComponentToken\";\nimport genMaxMin from \"./maxmin\";\nimport statisticToken, { merge as mergeToken } from \"./statistic\";\nimport useUniqueMemo from \"../_util/hooks/useUniqueMemo\";\nimport useDefaultCSP from \"../hooks/useCSP\";\nfunction genStyleUtils(config) {\n  // Dependency inversion for preparing basic config.\n  var _config$useCSP = config.useCSP,\n    useCSP = _config$useCSP === void 0 ? useDefaultCSP : _config$useCSP,\n    useToken = config.useToken,\n    usePrefix = config.usePrefix,\n    getResetStyles = config.getResetStyles,\n    getCommonStyle = config.getCommonStyle,\n    getCompUnitless = config.getCompUnitless;\n  function genStyleHooks(component, styleFn, getDefaultToken, options) {\n    var componentName = Array.isArray(component) ? component[0] : component;\n    function prefixToken(key) {\n      return \"\".concat(String(componentName)).concat(key.slice(0, 1).toUpperCase()).concat(key.slice(1));\n    }\n\n    // Fill unitless\n    var originUnitless = (options === null || options === void 0 ? void 0 : options.unitless) || {};\n    var originCompUnitless = typeof getCompUnitless === 'function' ? getCompUnitless(component) : {};\n    var compUnitless = _objectSpread(_objectSpread({}, originCompUnitless), {}, _defineProperty({}, prefixToken('zIndexPopup'), true));\n    Object.keys(originUnitless).forEach(function (key) {\n      compUnitless[prefixToken(key)] = originUnitless[key];\n    });\n\n    // Options\n    var mergedOptions = _objectSpread(_objectSpread({}, options), {}, {\n      unitless: compUnitless,\n      prefixToken: prefixToken\n    });\n\n    // Hooks\n    var useStyle = genComponentStyleHook(component, styleFn, getDefaultToken, mergedOptions);\n    var useCSSVar = genCSSVarRegister(componentName, getDefaultToken, mergedOptions);\n    return function (prefixCls) {\n      var rootCls = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : prefixCls;\n      var _useStyle = useStyle(prefixCls, rootCls),\n        _useStyle2 = _slicedToArray(_useStyle, 2),\n        hashId = _useStyle2[1];\n      var _useCSSVar = useCSSVar(rootCls),\n        _useCSSVar2 = _slicedToArray(_useCSSVar, 2),\n        wrapCSSVar = _useCSSVar2[0],\n        cssVarCls = _useCSSVar2[1];\n      return [wrapCSSVar, hashId, cssVarCls];\n    };\n  }\n  function genCSSVarRegister(component, getDefaultToken, options) {\n    var compUnitless = options.unitless,\n      _options$injectStyle = options.injectStyle,\n      injectStyle = _options$injectStyle === void 0 ? true : _options$injectStyle,\n      prefixToken = options.prefixToken,\n      ignore = options.ignore;\n    var CSSVarRegister = function CSSVarRegister(_ref) {\n      var rootCls = _ref.rootCls,\n        _ref$cssVar = _ref.cssVar,\n        cssVar = _ref$cssVar === void 0 ? {} : _ref$cssVar;\n      var _useToken = useToken(),\n        realToken = _useToken.realToken;\n      useCSSVarRegister({\n        path: [component],\n        prefix: cssVar.prefix,\n        key: cssVar.key,\n        unitless: compUnitless,\n        ignore: ignore,\n        token: realToken,\n        scope: rootCls\n      }, function () {\n        var defaultToken = getDefaultComponentToken(component, realToken, getDefaultToken);\n        var componentToken = getComponentToken(component, realToken, defaultToken, {\n          deprecatedTokens: options === null || options === void 0 ? void 0 : options.deprecatedTokens\n        });\n        Object.keys(defaultToken).forEach(function (key) {\n          componentToken[prefixToken(key)] = componentToken[key];\n          delete componentToken[key];\n        });\n        return componentToken;\n      });\n      return null;\n    };\n    var useCSSVar = function useCSSVar(rootCls) {\n      var _useToken2 = useToken(),\n        cssVar = _useToken2.cssVar;\n      return [function (node) {\n        return injectStyle && cssVar ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(CSSVarRegister, {\n          rootCls: rootCls,\n          cssVar: cssVar,\n          component: component\n        }), node) : node;\n      }, cssVar === null || cssVar === void 0 ? void 0 : cssVar.key];\n    };\n    return useCSSVar;\n  }\n  function genComponentStyleHook(componentName, styleFn, getDefaultToken) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var cells = Array.isArray(componentName) ? componentName : [componentName, componentName];\n    var _cells = _slicedToArray(cells, 1),\n      component = _cells[0];\n    var concatComponent = cells.join('-');\n    var mergedLayer = config.layer || {\n      name: 'antd'\n    };\n\n    // Return new style hook\n    return function (prefixCls) {\n      var rootCls = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : prefixCls;\n      var _useToken3 = useToken(),\n        theme = _useToken3.theme,\n        realToken = _useToken3.realToken,\n        hashId = _useToken3.hashId,\n        token = _useToken3.token,\n        cssVar = _useToken3.cssVar;\n      var _usePrefix = usePrefix(),\n        rootPrefixCls = _usePrefix.rootPrefixCls,\n        iconPrefixCls = _usePrefix.iconPrefixCls;\n      var csp = useCSP();\n      var type = cssVar ? 'css' : 'js';\n\n      // Use unique memo to share the result across all instances\n      var calc = useUniqueMemo(function () {\n        var unitlessCssVar = new Set();\n        if (cssVar) {\n          Object.keys(options.unitless || {}).forEach(function (key) {\n            // Some component proxy the AliasToken (e.g. Image) and some not (e.g. Modal)\n            // We should both pass in `unitlessCssVar` to make sure the CSSVar can be unitless.\n            unitlessCssVar.add(token2CSSVar(key, cssVar.prefix));\n            unitlessCssVar.add(token2CSSVar(key, getCompVarPrefix(component, cssVar.prefix)));\n          });\n        }\n        return genCalc(type, unitlessCssVar);\n      }, [type, component, cssVar === null || cssVar === void 0 ? void 0 : cssVar.prefix]);\n      var _genMaxMin = genMaxMin(type),\n        max = _genMaxMin.max,\n        min = _genMaxMin.min;\n\n      // Shared config\n      var sharedConfig = {\n        theme: theme,\n        token: token,\n        hashId: hashId,\n        nonce: function nonce() {\n          return csp.nonce;\n        },\n        clientOnly: options.clientOnly,\n        layer: mergedLayer,\n        // antd is always at top of styles\n        order: options.order || -999\n      };\n\n      // This if statement is safe, as it will only be used if the generator has the function. It's not dynamic.\n      if (typeof getResetStyles === 'function') {\n        // Generate style for all need reset tags.\n        useStyleRegister(_objectSpread(_objectSpread({}, sharedConfig), {}, {\n          clientOnly: false,\n          path: ['Shared', rootPrefixCls]\n        }), function () {\n          return getResetStyles(token, {\n            prefix: {\n              rootPrefixCls: rootPrefixCls,\n              iconPrefixCls: iconPrefixCls\n            },\n            csp: csp\n          });\n        });\n      }\n      var wrapSSR = useStyleRegister(_objectSpread(_objectSpread({}, sharedConfig), {}, {\n        path: [concatComponent, prefixCls, iconPrefixCls]\n      }), function () {\n        if (options.injectStyle === false) {\n          return [];\n        }\n        var _statisticToken = statisticToken(token),\n          proxyToken = _statisticToken.token,\n          flush = _statisticToken.flush;\n        var defaultComponentToken = getDefaultComponentToken(component, realToken, getDefaultToken);\n        var componentCls = \".\".concat(prefixCls);\n        var componentToken = getComponentToken(component, realToken, defaultComponentToken, {\n          deprecatedTokens: options.deprecatedTokens\n        });\n        if (cssVar && defaultComponentToken && _typeof(defaultComponentToken) === 'object') {\n          Object.keys(defaultComponentToken).forEach(function (key) {\n            defaultComponentToken[key] = \"var(\".concat(token2CSSVar(key, getCompVarPrefix(component, cssVar.prefix)), \")\");\n          });\n        }\n        var mergedToken = mergeToken(proxyToken, {\n          componentCls: componentCls,\n          prefixCls: prefixCls,\n          iconCls: \".\".concat(iconPrefixCls),\n          antCls: \".\".concat(rootPrefixCls),\n          calc: calc,\n          // @ts-ignore\n          max: max,\n          // @ts-ignore\n          min: min\n        }, cssVar ? defaultComponentToken : componentToken);\n        var styleInterpolation = styleFn(mergedToken, {\n          hashId: hashId,\n          prefixCls: prefixCls,\n          rootPrefixCls: rootPrefixCls,\n          iconPrefixCls: iconPrefixCls\n        });\n        flush(component, componentToken);\n        var commonStyle = typeof getCommonStyle === 'function' ? getCommonStyle(mergedToken, prefixCls, rootCls, options.resetFont) : null;\n        return [options.resetStyle === false ? null : commonStyle, styleInterpolation];\n      });\n      return [wrapSSR, hashId];\n    };\n  }\n  function genSubStyleComponent(componentName, styleFn, getDefaultToken) {\n    var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n    var useStyle = genComponentStyleHook(componentName, styleFn, getDefaultToken, _objectSpread({\n      resetStyle: false,\n      // Sub Style should default after root one\n      order: -998\n    }, options));\n    var StyledComponent = function StyledComponent(_ref2) {\n      var prefixCls = _ref2.prefixCls,\n        _ref2$rootCls = _ref2.rootCls,\n        rootCls = _ref2$rootCls === void 0 ? prefixCls : _ref2$rootCls;\n      useStyle(prefixCls, rootCls);\n      return null;\n    };\n    if (process.env.NODE_ENV !== 'production') {\n      StyledComponent.displayName = \"SubStyle_\".concat(String(Array.isArray(componentName) ? componentName.join('.') : componentName));\n    }\n    return StyledComponent;\n  }\n  return {\n    genStyleHooks: genStyleHooks,\n    genSubStyleComponent: genSubStyleComponent,\n    genComponentStyleHook: genComponentStyleHook\n  };\n}\nexport default genStyleUtils;","import { useContext } from 'react';\nimport { genStyleUtils } from '@ant-design/cssinjs-utils';\nimport { ConfigContext, defaultIconPrefixCls } from '../../config-provider/context';\nimport { genCommonStyle, genIconStyle, genLinkStyle } from '../../style';\nimport useLocalToken, { unitless } from '../useToken';\nexport const {\n  genStyleHooks,\n  genComponentStyleHook,\n  genSubStyleComponent\n} = genStyleUtils({\n  usePrefix: () => {\n    const {\n      getPrefixCls,\n      iconPrefixCls\n    } = useContext(ConfigContext);\n    const rootPrefixCls = getPrefixCls();\n    return {\n      rootPrefixCls,\n      iconPrefixCls\n    };\n  },\n  useToken: () => {\n    const [theme, realToken, hashId, token, cssVar] = useLocalToken();\n    return {\n      theme,\n      realToken,\n      hashId,\n      token,\n      cssVar\n    };\n  },\n  useCSP: () => {\n    const {\n      csp\n    } = useContext(ConfigContext);\n    return csp !== null && csp !== void 0 ? csp : {};\n  },\n  getResetStyles: (token, config) => {\n    var _a;\n    const linkStyle = genLinkStyle(token);\n    return [linkStyle, {\n      '&': linkStyle\n    }, genIconStyle((_a = config === null || config === void 0 ? void 0 : config.prefix.iconPrefixCls) !== null && _a !== void 0 ? _a : defaultIconPrefixCls)];\n  },\n  getCommonStyle: genCommonStyle,\n  getCompUnitless: () => unitless\n});","import { Keyframes } from '@ant-design/cssinjs';\nimport { CONTAINER_MAX_OFFSET } from '../../_util/hooks/useZIndex';\nimport { resetComponent } from '../../style';\nimport { genStyleHooks, mergeToken } from '../../theme/internal';\nconst genMessageStyle = token => {\n  const {\n    componentCls,\n    iconCls,\n    boxShadow,\n    colorText,\n    colorSuccess,\n    colorError,\n    colorWarning,\n    colorInfo,\n    fontSizeLG,\n    motionEaseInOutCirc,\n    motionDurationSlow,\n    marginXS,\n    paddingXS,\n    borderRadiusLG,\n    zIndexPopup,\n    // Custom token\n    contentPadding,\n    contentBg\n  } = token;\n  const noticeCls = `${componentCls}-notice`;\n  const messageMoveIn = new Keyframes('MessageMoveIn', {\n    '0%': {\n      padding: 0,\n      transform: 'translateY(-100%)',\n      opacity: 0\n    },\n    '100%': {\n      padding: paddingXS,\n      transform: 'translateY(0)',\n      opacity: 1\n    }\n  });\n  const messageMoveOut = new Keyframes('MessageMoveOut', {\n    '0%': {\n      maxHeight: token.height,\n      padding: paddingXS,\n      opacity: 1\n    },\n    '100%': {\n      maxHeight: 0,\n      padding: 0,\n      opacity: 0\n    }\n  });\n  const noticeStyle = {\n    padding: paddingXS,\n    textAlign: 'center',\n    [`${componentCls}-custom-content`]: {\n      display: 'flex',\n      alignItems: 'center'\n    },\n    [`${componentCls}-custom-content > ${iconCls}`]: {\n      marginInlineEnd: marginXS,\n      // affected by ltr or rtl\n      fontSize: fontSizeLG\n    },\n    [`${noticeCls}-content`]: {\n      display: 'inline-block',\n      padding: contentPadding,\n      background: contentBg,\n      borderRadius: borderRadiusLG,\n      boxShadow,\n      pointerEvents: 'all'\n    },\n    [`${componentCls}-success > ${iconCls}`]: {\n      color: colorSuccess\n    },\n    [`${componentCls}-error > ${iconCls}`]: {\n      color: colorError\n    },\n    [`${componentCls}-warning > ${iconCls}`]: {\n      color: colorWarning\n    },\n    [`${componentCls}-info > ${iconCls},\n      ${componentCls}-loading > ${iconCls}`]: {\n      color: colorInfo\n    }\n  };\n  return [\n  // ============================ Holder ============================\n  {\n    [componentCls]: Object.assign(Object.assign({}, resetComponent(token)), {\n      color: colorText,\n      position: 'fixed',\n      top: marginXS,\n      width: '100%',\n      pointerEvents: 'none',\n      zIndex: zIndexPopup,\n      [`${componentCls}-move-up`]: {\n        animationFillMode: 'forwards'\n      },\n      [`\n        ${componentCls}-move-up-appear,\n        ${componentCls}-move-up-enter\n      `]: {\n        animationName: messageMoveIn,\n        animationDuration: motionDurationSlow,\n        animationPlayState: 'paused',\n        animationTimingFunction: motionEaseInOutCirc\n      },\n      [`\n        ${componentCls}-move-up-appear${componentCls}-move-up-appear-active,\n        ${componentCls}-move-up-enter${componentCls}-move-up-enter-active\n      `]: {\n        animationPlayState: 'running'\n      },\n      [`${componentCls}-move-up-leave`]: {\n        animationName: messageMoveOut,\n        animationDuration: motionDurationSlow,\n        animationPlayState: 'paused',\n        animationTimingFunction: motionEaseInOutCirc\n      },\n      [`${componentCls}-move-up-leave${componentCls}-move-up-leave-active`]: {\n        animationPlayState: 'running'\n      },\n      '&-rtl': {\n        direction: 'rtl',\n        span: {\n          direction: 'rtl'\n        }\n      }\n    })\n  },\n  // ============================ Notice ============================\n  {\n    [componentCls]: {\n      [`${noticeCls}-wrapper`]: Object.assign({}, noticeStyle)\n    }\n  },\n  // ============================= Pure =============================\n  {\n    [`${componentCls}-notice-pure-panel`]: Object.assign(Object.assign({}, noticeStyle), {\n      padding: 0,\n      textAlign: 'start'\n    })\n  }];\n};\nexport const prepareComponentToken = token => ({\n  zIndexPopup: token.zIndexPopupBase + CONTAINER_MAX_OFFSET + 10,\n  contentBg: token.colorBgElevated,\n  contentPadding: `${(token.controlHeightLG - token.fontSize * token.lineHeight) / 2}px ${token.paddingSM}px`\n});\n// ============================== Export ==============================\nexport default genStyleHooks('Message', token => {\n  // Gen-style functions here\n  const combinedToken = mergeToken(token, {\n    height: 150\n  });\n  return [genMessageStyle(combinedToken)];\n}, prepareComponentToken);","import React from 'react';\nimport useToken from '../../theme/useToken';\nimport { devUseWarning } from '../warning';\nimport zIndexContext from '../zindexContext';\n// Z-Index control range\n// Container: 1000 + offset 100 (max base + 10 * offset = 2000)\n// Popover: offset 50\n// Notification: Container Max zIndex + componentOffset\nconst CONTAINER_OFFSET = 100;\nconst CONTAINER_OFFSET_MAX_COUNT = 10;\nexport const CONTAINER_MAX_OFFSET = CONTAINER_OFFSET * CONTAINER_OFFSET_MAX_COUNT;\n/**\n * Static function will default be the `CONTAINER_MAX_OFFSET`.\n * But it still may have children component like Select, Dropdown.\n * So the warning zIndex should exceed the `CONTAINER_MAX_OFFSET`.\n */\nconst CONTAINER_MAX_OFFSET_WITH_CHILDREN = CONTAINER_MAX_OFFSET + CONTAINER_OFFSET;\nexport const containerBaseZIndexOffset = {\n  Modal: CONTAINER_OFFSET,\n  Drawer: CONTAINER_OFFSET,\n  Popover: CONTAINER_OFFSET,\n  Popconfirm: CONTAINER_OFFSET,\n  Tooltip: CONTAINER_OFFSET,\n  Tour: CONTAINER_OFFSET,\n  FloatButton: CONTAINER_OFFSET\n};\nexport const consumerBaseZIndexOffset = {\n  SelectLike: 50,\n  Dropdown: 50,\n  DatePicker: 50,\n  Menu: 50,\n  ImagePreview: 1\n};\nfunction isContainerType(type) {\n  return type in containerBaseZIndexOffset;\n}\nexport const useZIndex = (componentType, customZIndex) => {\n  const [, token] = useToken();\n  const parentZIndex = React.useContext(zIndexContext);\n  const isContainer = isContainerType(componentType);\n  let result;\n  if (customZIndex !== undefined) {\n    result = [customZIndex, customZIndex];\n  } else {\n    let zIndex = parentZIndex !== null && parentZIndex !== void 0 ? parentZIndex : 0;\n    if (isContainer) {\n      zIndex +=\n      // Use preset token zIndex by default but not stack when has parent container\n      (parentZIndex ? 0 : token.zIndexPopupBase) +\n      // Container offset\n      containerBaseZIndexOffset[componentType];\n    } else {\n      zIndex += consumerBaseZIndexOffset[componentType];\n    }\n    result = [parentZIndex === undefined ? customZIndex : zIndex, zIndex];\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    const warning = devUseWarning(componentType);\n    const maxZIndex = token.zIndexPopupBase + CONTAINER_MAX_OFFSET_WITH_CHILDREN;\n    const currentZIndex = result[0] || 0;\n    process.env.NODE_ENV !== \"production\" ? warning(customZIndex !== undefined || currentZIndex <= maxZIndex, 'usage', '`zIndex` is over design token `zIndexPopupBase` too much. It may cause unexpected override.') : void 0;\n  }\n  return result;\n};","\"use client\";\n\nvar __rest = this && this.__rest || function (s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n};\nimport * as React from 'react';\nimport CheckCircleFilled from \"@ant-design/icons/es/icons/CheckCircleFilled\";\nimport CloseCircleFilled from \"@ant-design/icons/es/icons/CloseCircleFilled\";\nimport ExclamationCircleFilled from \"@ant-design/icons/es/icons/ExclamationCircleFilled\";\nimport InfoCircleFilled from \"@ant-design/icons/es/icons/InfoCircleFilled\";\nimport LoadingOutlined from \"@ant-design/icons/es/icons/LoadingOutlined\";\nimport classNames from 'classnames';\nimport { Notice } from 'rc-notification';\nimport { ConfigContext } from '../config-provider';\nimport useCSSVarCls from '../config-provider/hooks/useCSSVarCls';\nimport useStyle from './style';\nexport const TypeIcon = {\n  info: /*#__PURE__*/React.createElement(InfoCircleFilled, null),\n  success: /*#__PURE__*/React.createElement(CheckCircleFilled, null),\n  error: /*#__PURE__*/React.createElement(CloseCircleFilled, null),\n  warning: /*#__PURE__*/React.createElement(ExclamationCircleFilled, null),\n  loading: /*#__PURE__*/React.createElement(LoadingOutlined, null)\n};\nexport const PureContent = ({\n  prefixCls,\n  type,\n  icon,\n  children\n}) => (/*#__PURE__*/React.createElement(\"div\", {\n  className: classNames(`${prefixCls}-custom-content`, `${prefixCls}-${type}`)\n}, icon || TypeIcon[type], /*#__PURE__*/React.createElement(\"span\", null, children)));\n/** @private Internal Component. Do not use in your production. */\nconst PurePanel = props => {\n  const {\n      prefixCls: staticPrefixCls,\n      className,\n      type,\n      icon,\n      content\n    } = props,\n    restProps = __rest(props, [\"prefixCls\", \"className\", \"type\", \"icon\", \"content\"]);\n  const {\n    getPrefixCls\n  } = React.useContext(ConfigContext);\n  const prefixCls = staticPrefixCls || getPrefixCls('message');\n  const rootCls = useCSSVarCls(prefixCls);\n  const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls, rootCls);\n  return wrapCSSVar(/*#__PURE__*/React.createElement(Notice, Object.assign({}, restProps, {\n    prefixCls: prefixCls,\n    className: classNames(className, hashId, `${prefixCls}-notice-pure-panel`, cssVarCls, rootCls),\n    eventKey: \"pure\",\n    duration: null,\n    content: /*#__PURE__*/React.createElement(PureContent, {\n      prefixCls: prefixCls,\n      type: type,\n      icon: icon\n    }, content)\n  })));\n};\nexport default PurePanel;","// This icon file is generated automatically.\nvar CloseOutlined = { \"icon\": { \"tag\": \"svg\", \"attrs\": { \"fill-rule\": \"evenodd\", \"viewBox\": \"64 64 896 896\", \"focusable\": \"false\" }, \"children\": [{ \"tag\": \"path\", \"attrs\": { \"d\": \"M799.86 166.31c.02 0 .04.02.08.06l57.69 57.7c.04.03.05.05.06.08a.12.12 0 010 .06c0 .03-.02.05-.06.09L569.93 512l287.7 287.7c.04.04.05.06.06.09a.12.12 0 010 .07c0 .02-.02.04-.06.08l-57.7 57.69c-.03.04-.05.05-.07.06a.12.12 0 01-.07 0c-.03 0-.05-.02-.09-.06L512 569.93l-287.7 287.7c-.04.04-.06.05-.09.06a.12.12 0 01-.07 0c-.02 0-.04-.02-.08-.06l-57.69-57.7c-.04-.03-.05-.05-.06-.07a.12.12 0 010-.07c0-.03.02-.05.06-.09L454.07 512l-287.7-287.7c-.04-.04-.05-.06-.06-.09a.12.12 0 010-.07c0-.02.02-.04.06-.08l57.7-57.69c.03-.04.05-.05.07-.06a.12.12 0 01.07 0c.03 0 .05.02.09.06L512 454.07l287.7-287.7c.04-.04.06-.05.09-.06a.12.12 0 01.07 0z\" } }] }, \"name\": \"close\", \"theme\": \"outlined\" };\nexport default CloseOutlined;\n","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// GENERATE BY ./scripts/generate.ts\n// DON NOT EDIT IT MANUALLY\n\nimport * as React from 'react';\nimport CloseOutlinedSvg from \"@ant-design/icons-svg/es/asn/CloseOutlined\";\nimport AntdIcon from \"../components/AntdIcon\";\nvar CloseOutlined = function CloseOutlined(props, ref) {\n  return /*#__PURE__*/React.createElement(AntdIcon, _extends({}, props, {\n    ref: ref,\n    icon: CloseOutlinedSvg\n  }));\n};\n\n/**![close](data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiNjYWNhY2EiIGZpbGwtcnVsZT0iZXZlbm9kZCIgdmlld0JveD0iNjQgNjQgODk2IDg5NiIgZm9jdXNhYmxlPSJmYWxzZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNzk5Ljg2IDE2Ni4zMWMuMDIgMCAuMDQuMDIuMDguMDZsNTcuNjkgNTcuN2MuMDQuMDMuMDUuMDUuMDYuMDhhLjEyLjEyIDAgMDEwIC4wNmMwIC4wMy0uMDIuMDUtLjA2LjA5TDU2OS45MyA1MTJsMjg3LjcgMjg3LjdjLjA0LjA0LjA1LjA2LjA2LjA5YS4xMi4xMiAwIDAxMCAuMDdjMCAuMDItLjAyLjA0LS4wNi4wOGwtNTcuNyA1Ny42OWMtLjAzLjA0LS4wNS4wNS0uMDcuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMyAwLS4wNS0uMDItLjA5LS4wNkw1MTIgNTY5LjkzbC0yODcuNyAyODcuN2MtLjA0LjA0LS4wNi4wNS0uMDkuMDZhLjEyLjEyIDAgMDEtLjA3IDBjLS4wMiAwLS4wNC0uMDItLjA4LS4wNmwtNTcuNjktNTcuN2MtLjA0LS4wMy0uMDUtLjA1LS4wNi0uMDdhLjEyLjEyIDAgMDEwLS4wN2MwLS4wMy4wMi0uMDUuMDYtLjA5TDQ1NC4wNyA1MTJsLTI4Ny43LTI4Ny43Yy0uMDQtLjA0LS4wNS0uMDYtLjA2LS4wOWEuMTIuMTIgMCAwMTAtLjA3YzAtLjAyLjAyLS4wNC4wNi0uMDhsNTcuNy01Ny42OWMuMDMtLjA0LjA1LS4wNS4wNy0uMDZhLjEyLjEyIDAgMDEuMDcgMGMuMDMgMCAuMDUuMDIuMDkuMDZMNTEyIDQ1NC4wN2wyODcuNy0yODcuN2MuMDQtLjA0LjA2LS4wNS4wOS0uMDZhLjEyLjEyIDAgMDEuMDcgMHoiIC8+PC9zdmc+) */\nvar RefIcon = /*#__PURE__*/React.forwardRef(CloseOutlined);\nif (process.env.NODE_ENV !== 'production') {\n  RefIcon.displayName = 'CloseOutlined';\n}\nexport default RefIcon;","export function getMotion(prefixCls, transitionName) {\n  return {\n    motionName: transitionName !== null && transitionName !== void 0 ? transitionName : `${prefixCls}-move-up`\n  };\n}\n/** Wrap message open with promise like function */\nexport function wrapPromiseFn(openFn) {\n  let closeFn;\n  const closePromise = new Promise(resolve => {\n    closeFn = openFn(() => {\n      resolve(true);\n    });\n  });\n  const result = () => {\n    closeFn === null || closeFn === void 0 ? void 0 : closeFn();\n  };\n  result.then = (filled, rejected) => closePromise.then(filled, rejected);\n  result.promise = closePromise;\n  return result;\n}","\"use client\";\n\nvar __rest = this && this.__rest || function (s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n};\nimport * as React from 'react';\nimport CloseOutlined from \"@ant-design/icons/es/icons/CloseOutlined\";\nimport classNames from 'classnames';\nimport { NotificationProvider, useNotification as useRcNotification } from 'rc-notification';\nimport { devUseWarning } from '../_util/warning';\nimport { ConfigContext } from '../config-provider';\nimport useCSSVarCls from '../config-provider/hooks/useCSSVarCls';\nimport { PureContent } from './PurePanel';\nimport useStyle from './style';\nimport { getMotion, wrapPromiseFn } from './util';\nconst DEFAULT_OFFSET = 8;\nconst DEFAULT_DURATION = 3;\nconst Wrapper = ({\n  children,\n  prefixCls\n}) => {\n  const rootCls = useCSSVarCls(prefixCls);\n  const [wrapCSSVar, hashId, cssVarCls] = useStyle(prefixCls, rootCls);\n  return wrapCSSVar(/*#__PURE__*/React.createElement(NotificationProvider, {\n    classNames: {\n      list: classNames(hashId, cssVarCls, rootCls)\n    }\n  }, children));\n};\nconst renderNotifications = (node, {\n  prefixCls,\n  key\n}) => (/*#__PURE__*/React.createElement(Wrapper, {\n  prefixCls: prefixCls,\n  key: key\n}, node));\nconst Holder = /*#__PURE__*/React.forwardRef((props, ref) => {\n  const {\n    top,\n    prefixCls: staticPrefixCls,\n    getContainer: staticGetContainer,\n    maxCount,\n    duration = DEFAULT_DURATION,\n    rtl,\n    transitionName,\n    onAllRemoved\n  } = props;\n  const {\n    getPrefixCls,\n    getPopupContainer,\n    message,\n    direction\n  } = React.useContext(ConfigContext);\n  const prefixCls = staticPrefixCls || getPrefixCls('message');\n  // =============================== Style ===============================\n  const getStyle = () => ({\n    left: '50%',\n    transform: 'translateX(-50%)',\n    top: top !== null && top !== void 0 ? top : DEFAULT_OFFSET\n  });\n  const getClassName = () => classNames({\n    [`${prefixCls}-rtl`]: rtl !== null && rtl !== void 0 ? rtl : direction === 'rtl'\n  });\n  // ============================== Motion ===============================\n  const getNotificationMotion = () => getMotion(prefixCls, transitionName);\n  // ============================ Close Icon =============================\n  const mergedCloseIcon = /*#__PURE__*/React.createElement(\"span\", {\n    className: `${prefixCls}-close-x`\n  }, /*#__PURE__*/React.createElement(CloseOutlined, {\n    className: `${prefixCls}-close-icon`\n  }));\n  // ============================== Origin ===============================\n  const [api, holder] = useRcNotification({\n    prefixCls,\n    style: getStyle,\n    className: getClassName,\n    motion: getNotificationMotion,\n    closable: false,\n    closeIcon: mergedCloseIcon,\n    duration,\n    getContainer: () => (staticGetContainer === null || staticGetContainer === void 0 ? void 0 : staticGetContainer()) || (getPopupContainer === null || getPopupContainer === void 0 ? void 0 : getPopupContainer()) || document.body,\n    maxCount,\n    onAllRemoved,\n    renderNotifications\n  });\n  // ================================ Ref ================================\n  React.useImperativeHandle(ref, () => Object.assign(Object.assign({}, api), {\n    prefixCls,\n    message\n  }));\n  return holder;\n});\n// ==============================================================================\n// ==                                   Hook                                   ==\n// ==============================================================================\nlet keyIndex = 0;\nexport function useInternalMessage(messageConfig) {\n  const holderRef = React.useRef(null);\n  const warning = devUseWarning('Message');\n  // ================================ API ================================\n  const wrapAPI = React.useMemo(() => {\n    // Wrap with notification content\n    // >>> close\n    const close = key => {\n      var _a;\n      (_a = holderRef.current) === null || _a === void 0 ? void 0 : _a.close(key);\n    };\n    // >>> Open\n    const open = config => {\n      if (!holderRef.current) {\n        process.env.NODE_ENV !== \"production\" ? warning(false, 'usage', 'You are calling notice in render which will break in React 18 concurrent mode. Please trigger in effect instead.') : void 0;\n        const fakeResult = () => {};\n        fakeResult.then = () => {};\n        return fakeResult;\n      }\n      const {\n        open: originOpen,\n        prefixCls,\n        message\n      } = holderRef.current;\n      const noticePrefixCls = `${prefixCls}-notice`;\n      const {\n          content,\n          icon,\n          type,\n          key,\n          className,\n          style,\n          onClose\n        } = config,\n        restConfig = __rest(config, [\"content\", \"icon\", \"type\", \"key\", \"className\", \"style\", \"onClose\"]);\n      let mergedKey = key;\n      if (mergedKey === undefined || mergedKey === null) {\n        keyIndex += 1;\n        mergedKey = `antd-message-${keyIndex}`;\n      }\n      return wrapPromiseFn(resolve => {\n        originOpen(Object.assign(Object.assign({}, restConfig), {\n          key: mergedKey,\n          content: (/*#__PURE__*/React.createElement(PureContent, {\n            prefixCls: prefixCls,\n            type: type,\n            icon: icon\n          }, content)),\n          placement: 'top',\n          className: classNames(type && `${noticePrefixCls}-${type}`, className, message === null || message === void 0 ? void 0 : message.className),\n          style: Object.assign(Object.assign({}, message === null || message === void 0 ? void 0 : message.style), style),\n          onClose: () => {\n            onClose === null || onClose === void 0 ? void 0 : onClose();\n            resolve();\n          }\n        }));\n        // Return close function\n        return () => {\n          close(mergedKey);\n        };\n      });\n    };\n    // >>> destroy\n    const destroy = key => {\n      var _a;\n      if (key !== undefined) {\n        close(key);\n      } else {\n        (_a = holderRef.current) === null || _a === void 0 ? void 0 : _a.destroy();\n      }\n    };\n    const clone = {\n      open,\n      destroy\n    };\n    const keys = ['info', 'success', 'warning', 'error', 'loading'];\n    keys.forEach(type => {\n      const typeOpen = (jointContent, duration, onClose) => {\n        let config;\n        if (jointContent && typeof jointContent === 'object' && 'content' in jointContent) {\n          config = jointContent;\n        } else {\n          config = {\n            content: jointContent\n          };\n        }\n        // Params\n        let mergedDuration;\n        let mergedOnClose;\n        if (typeof duration === 'function') {\n          mergedOnClose = duration;\n        } else {\n          mergedDuration = duration;\n          mergedOnClose = onClose;\n        }\n        const mergedConfig = Object.assign(Object.assign({\n          onClose: mergedOnClose,\n          duration: mergedDuration\n        }, config), {\n          type\n        });\n        return open(mergedConfig);\n      };\n      clone[type] = typeOpen;\n    });\n    return clone;\n  }, []);\n  // ============================== Return ===============================\n  return [wrapAPI, /*#__PURE__*/React.createElement(Holder, Object.assign({\n    key: \"message-holder\"\n  }, messageConfig, {\n    ref: holderRef\n  }))];\n}\nexport default function useMessage(messageConfig) {\n  return useInternalMessage(messageConfig);\n}","\"use client\";\n\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport React, { useContext } from 'react';\nimport { AppConfigContext } from '../app/context';\nimport ConfigProvider, { ConfigContext, globalConfig, warnContext } from '../config-provider';\nimport { unstableSetRender } from '../config-provider/UnstableContext';\nimport PurePanel from './PurePanel';\nimport useMessage, { useInternalMessage } from './useMessage';\nimport { wrapPromiseFn } from './util';\nlet message = null;\nlet act = callback => callback();\nlet taskQueue = [];\nlet defaultGlobalConfig = {};\nfunction getGlobalContext() {\n  const {\n    getContainer,\n    duration,\n    rtl,\n    maxCount,\n    top\n  } = defaultGlobalConfig;\n  const mergedContainer = (getContainer === null || getContainer === void 0 ? void 0 : getContainer()) || document.body;\n  return {\n    getContainer: () => mergedContainer,\n    duration,\n    rtl,\n    maxCount,\n    top\n  };\n}\nconst GlobalHolder = /*#__PURE__*/React.forwardRef((props, ref) => {\n  const {\n    messageConfig,\n    sync\n  } = props;\n  const {\n    getPrefixCls\n  } = useContext(ConfigContext);\n  const prefixCls = defaultGlobalConfig.prefixCls || getPrefixCls('message');\n  const appConfig = useContext(AppConfigContext);\n  const [api, holder] = useInternalMessage(Object.assign(Object.assign(Object.assign({}, messageConfig), {\n    prefixCls\n  }), appConfig.message));\n  React.useImperativeHandle(ref, () => {\n    const instance = Object.assign({}, api);\n    Object.keys(instance).forEach(method => {\n      instance[method] = (...args) => {\n        sync();\n        return api[method].apply(api, args);\n      };\n    });\n    return {\n      instance,\n      sync\n    };\n  });\n  return holder;\n});\nconst GlobalHolderWrapper = /*#__PURE__*/React.forwardRef((_, ref) => {\n  const [messageConfig, setMessageConfig] = React.useState(getGlobalContext);\n  const sync = () => {\n    setMessageConfig(getGlobalContext);\n  };\n  React.useEffect(sync, []);\n  const global = globalConfig();\n  const rootPrefixCls = global.getRootPrefixCls();\n  const rootIconPrefixCls = global.getIconPrefixCls();\n  const theme = global.getTheme();\n  const dom = /*#__PURE__*/React.createElement(GlobalHolder, {\n    ref: ref,\n    sync: sync,\n    messageConfig: messageConfig\n  });\n  return /*#__PURE__*/React.createElement(ConfigProvider, {\n    prefixCls: rootPrefixCls,\n    iconPrefixCls: rootIconPrefixCls,\n    theme: theme\n  }, global.holderRender ? global.holderRender(dom) : dom);\n});\nfunction flushNotice() {\n  if (!message) {\n    const holderFragment = document.createDocumentFragment();\n    const newMessage = {\n      fragment: holderFragment\n    };\n    message = newMessage;\n    // Delay render to avoid sync issue\n    act(() => {\n      const reactRender = unstableSetRender();\n      reactRender(/*#__PURE__*/React.createElement(GlobalHolderWrapper, {\n        ref: node => {\n          const {\n            instance,\n            sync\n          } = node || {};\n          // React 18 test env will throw if call immediately in ref\n          Promise.resolve().then(() => {\n            if (!newMessage.instance && instance) {\n              newMessage.instance = instance;\n              newMessage.sync = sync;\n              flushNotice();\n            }\n          });\n        }\n      }), holderFragment);\n    });\n    return;\n  }\n  // Notification not ready\n  if (!message.instance) {\n    return;\n  }\n  // >>> Execute task\n  taskQueue.forEach(task => {\n    const {\n      type,\n      skipped\n    } = task;\n    // Only `skipped` when user call notice but cancel it immediately\n    // and instance not ready\n    if (!skipped) {\n      switch (type) {\n        case 'open':\n          {\n            act(() => {\n              const closeFn = message.instance.open(Object.assign(Object.assign({}, defaultGlobalConfig), task.config));\n              closeFn === null || closeFn === void 0 ? void 0 : closeFn.then(task.resolve);\n              task.setCloseFn(closeFn);\n            });\n            break;\n          }\n        case 'destroy':\n          act(() => {\n            message === null || message === void 0 ? void 0 : message.instance.destroy(task.key);\n          });\n          break;\n        // Other type open\n        default:\n          {\n            act(() => {\n              var _message$instance;\n              const closeFn = (_message$instance = message.instance)[type].apply(_message$instance, _toConsumableArray(task.args));\n              closeFn === null || closeFn === void 0 ? void 0 : closeFn.then(task.resolve);\n              task.setCloseFn(closeFn);\n            });\n          }\n      }\n    }\n  });\n  // Clean up\n  taskQueue = [];\n}\n// ==============================================================================\n// ==                                  Export                                  ==\n// ==============================================================================\nfunction setMessageGlobalConfig(config) {\n  defaultGlobalConfig = Object.assign(Object.assign({}, defaultGlobalConfig), config);\n  // Trigger sync for it\n  act(() => {\n    var _a;\n    (_a = message === null || message === void 0 ? void 0 : message.sync) === null || _a === void 0 ? void 0 : _a.call(message);\n  });\n}\nfunction open(config) {\n  const result = wrapPromiseFn(resolve => {\n    let closeFn;\n    const task = {\n      type: 'open',\n      config,\n      resolve,\n      setCloseFn: fn => {\n        closeFn = fn;\n      }\n    };\n    taskQueue.push(task);\n    return () => {\n      if (closeFn) {\n        act(() => {\n          closeFn();\n        });\n      } else {\n        task.skipped = true;\n      }\n    };\n  });\n  flushNotice();\n  return result;\n}\nfunction typeOpen(type, args) {\n  const global = globalConfig();\n  if (process.env.NODE_ENV !== 'production' && !global.holderRender) {\n    warnContext('message');\n  }\n  const result = wrapPromiseFn(resolve => {\n    let closeFn;\n    const task = {\n      type,\n      args,\n      resolve,\n      setCloseFn: fn => {\n        closeFn = fn;\n      }\n    };\n    taskQueue.push(task);\n    return () => {\n      if (closeFn) {\n        act(() => {\n          closeFn();\n        });\n      } else {\n        task.skipped = true;\n      }\n    };\n  });\n  flushNotice();\n  return result;\n}\nconst destroy = key => {\n  taskQueue.push({\n    type: 'destroy',\n    key\n  });\n  flushNotice();\n};\nconst methods = ['success', 'info', 'warning', 'error', 'loading'];\nconst baseStaticMethods = {\n  open,\n  destroy,\n  config: setMessageGlobalConfig,\n  useMessage,\n  _InternalPanelDoNotUseOrYouWillBeFired: PurePanel\n};\nconst staticMethods = baseStaticMethods;\nmethods.forEach(type => {\n  staticMethods[type] = (...args) => typeOpen(type, args);\n});\n// ==============================================================================\n// ==                                   Test                                   ==\n// ==============================================================================\nconst noop = () => {};\n/** @internal Only Work in test env */\n// eslint-disable-next-line import/no-mutable-exports\nexport let actWrapper = noop;\nif (process.env.NODE_ENV === 'test') {\n  actWrapper = wrapper => {\n    act = wrapper;\n  };\n}\n/** @internal Only Work in test env */\n// eslint-disable-next-line import/no-mutable-exports\nexport let actDestroy = noop;\nif (process.env.NODE_ENV === 'test') {\n  actDestroy = () => {\n    message = null;\n  };\n}\nexport default staticMethods;","import axios from 'axios';\r\n\r\nconst API_BASE_URL = 'http://localhost:8088'; // 替换为你的后端API基础URL\r\n\r\nexport const getAllUsers = async () => {\r\n  try {\r\n    const response = await axios.get(`${API_BASE_URL}/user/allUser`, {\r\n      headers: {\r\n        Authorization: localStorage.getItem('token')\r\n      }\r\n    });\r\n    \r\n    console.log(\"API Response:\", response.data); // 打印完整响应\r\n    \r\n    if (response.data && response.data.code === 200) {\r\n      // 修正这里：response.data.data.data 才是用户数组\r\n      const data = response.data.data.data;\r\n      return Array.isArray(data) ? data : [data];\r\n    } else {\r\n      throw new Error(response.data?.message || \"未知错误\");\r\n    }\r\n  } catch (error) {\r\n    console.error('获取用户列表失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const searchUsers = async (key) => {\r\n  try {\r\n    const response = await axios.get(`${API_BASE_URL}/user/searchUser`, {\r\n      params: { key },\r\n      headers: {\r\n        Authorization: localStorage.getItem('token')\r\n      }\r\n    });\r\n\r\n    if (response.data?.code === 200) {\r\n      // 提取正确的用户数组：response.data.data.data\r\n      const users = response.data.data.data;\r\n      return Array.isArray(users) ? users : [users];\r\n    } else {\r\n      throw new Error(response.data?.message || \"搜索失败\");\r\n    }\r\n  } catch (error) {\r\n    console.error('搜索用户失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n// 修改用户权限\r\nexport const updateUserAuthority = async (username, authority) => {\r\n  try {\r\n    const response = await axios.put(`${API_BASE_URL}/user/changeAuthority`, \r\n      { \r\n        changeUsername: username, \r\n        authority: authority \r\n      },\r\n      {\r\n        headers: {\r\n          Authorization: localStorage.getItem('token')\r\n        }\r\n      }\r\n    );\r\n    return response.data;\r\n  } catch (error) {\r\n    console.error('修改用户权限失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n\r\n// // 获取所有折扣\r\n// export const getAllDiscounts = async () => {\r\n//   try {\r\n//     const response = await axios.get(`${API_BASE_URL}/discount/all`, {\r\n//       headers: {\r\n//         Authorization: localStorage.getItem('token')\r\n//       }\r\n//     });\r\n    \r\n//     if (response.data && response.data.code === 200) {\r\n//       // 确保返回的是数组格式\r\n//       const data = response.data.data.data || response.data.data;\r\n//       return Array.isArray(data) ? data : [data];\r\n//     } else {\r\n//       throw new Error(response.data?.message || \"获取折扣信息失败\");\r\n//     }\r\n//   } catch (error) {\r\n//     console.error('获取折扣列表失败:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n\r\n// // 获取当前折扣\r\n// export const getCurrentDiscount = async () => {\r\n//   try {\r\n//     const response = await axios.get(`${API_BASE_URL}/discount/current`, {\r\n//       headers: {\r\n//         Authorization: localStorage.getItem('token')\r\n//       }\r\n//     });\r\n    \r\n//     if (response.data && response.data.code === 200) {\r\n//       return response.data.data.data || response.data.data;\r\n//     } else {\r\n//       throw new Error(response.data?.message || \"获取当前折扣失败\");\r\n//     }\r\n//   } catch (error) {\r\n//     console.error('获取当前折扣失败:', error);\r\n//     throw error;\r\n//   }\r\n// };\r\n// 修改 getAllDiscounts 和 getCurrentDiscount 方法\r\nexport const getAllDiscounts = async () => {\r\n  try {\r\n    const response = await axios.get(`${API_BASE_URL}/discount/all`, {\r\n      headers: {\r\n        Authorization: localStorage.getItem('token')\r\n      }\r\n    });\r\n    \r\n    if (response.data && response.data.code === 200) {\r\n      // 更健壮的数据提取方式\r\n      return response.data.data?.data || response.data.data || [];\r\n    } else {\r\n      throw new Error(response.data?.message || \"获取折扣信息失败\");\r\n    }\r\n  } catch (error) {\r\n    console.error('获取折扣列表失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const getCurrentDiscount = async () => {\r\n  try {\r\n    const response = await axios.get(`${API_BASE_URL}/discount/current`, {\r\n      headers: {\r\n        Authorization: localStorage.getItem('token')\r\n      }\r\n    });\r\n    \r\n    if (response.data && response.data.code === 200) {\r\n      // 更健壮的数据提取方式\r\n      return response.data.data?.data || response.data.data || null;\r\n    } else if (response.data?.message === \"目前没有进行中的折扣\") {\r\n      return null;\r\n    } else {\r\n      throw new Error(response.data?.message || \"获取当前折扣失败\");\r\n    }\r\n  } catch (error) {\r\n    console.error('获取当前折扣失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n// 添加折扣\r\nexport const addDiscount = async (discountData) => {\r\n  try {\r\n    const response = await axios.post(`${API_BASE_URL}/discount/add`, discountData, {\r\n      headers: {\r\n        Authorization: localStorage.getItem('token')\r\n      }\r\n    });\r\n    \r\n    if (response.data && response.data.code === 200) {\r\n      return response.data.data.data || response.data.data;\r\n    } else {\r\n      throw new Error(response.data?.message || \"添加折扣失败\");\r\n    }\r\n  } catch (error) {\r\n    console.error('添加折扣失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\n// 删除折扣\r\nexport const deleteDiscount = async (id) => {\r\n  try {\r\n    const response = await axios.delete(`${API_BASE_URL}/discount/delete/${id}`, {\r\n      headers: {\r\n        Authorization: localStorage.getItem('token')\r\n      }\r\n    });\r\n    \r\n    if (response.data && response.data.code === 200) {\r\n      return true;\r\n    } else {\r\n      throw new Error(response.data?.message || \"删除折扣失败\");\r\n    }\r\n  } catch (error) {\r\n    console.error('删除折扣失败:', error);\r\n    throw error;\r\n  }\r\n};","import React, {useEffect, useState} from 'react';\r\nimport {useNavigate, useLocation, useParams} from 'react-router-dom';  \r\nimport {createTorrent, getTorrents, downloadTorrent, getDownloadProgress, deleteTorrent, searchTorrents} from '../api/torrent';\r\nimport './Dashboard.css';\r\nimport {createHelpPost, getHelpPosts, getHelpPostDetail, searchHelpPosts} from '../api/helpPost';\r\nimport {createRequestPost, getRequestPosts, getRequestPostDetail, searchRequestPosts} from '../api/requestPost';\r\nimport { message } from 'antd'; // 用于显示提示消息\r\nimport { getAnnouncements,getLatestAnnouncements,getAnnouncementDetail } from '../api/announcement'; \r\nimport { getAllDiscounts } from '../api/administer'; \r\n   import { getUserInfo, isAdmin } from '../api/auth';\r\nimport { api } from '../api/auth'; \r\n\r\n\r\nconst Dashboard = ({onLogout}) => {\r\n    const location = useLocation();\r\n    const [userInfo, setUserInfo] = useState(null);\r\n    const [loading, setLoading] = useState(false);\r\n    const [error, setError] = useState('');\r\n    const [currentSlide, setCurrentSlide] = useState(0);\r\n    const navigate = useNavigate();\r\n    const {tab} = useParams();\r\n    const [showUploadModal, setShowUploadModal] = useState(false);\r\n    const [isUploading, setIsUploading] = useState(false);\r\n    const [uploadData, setUploadData] = useState({\r\n        name: '',\r\n        type: '',\r\n        region: '',\r\n        subtitle: '',\r\n        resolution: '', // 新增分辨率字段\r\n        file: null,\r\n        description: ''\r\n    });\r\n    const [showPostModal, setShowPostModal] = useState(false);\r\n    const [postTitle, setPostTitle] = useState('');\r\n    const [postContent, setPostContent] = useState('');\r\n    const [selectedImage, setSelectedImage] = useState(null);\r\n    const [helpPosts, setHelpPosts] = useState([]);\r\n    const [helpLoading, setHelpLoading] = useState(false);\r\n    const [helpError, setHelpError] = useState(null);\r\n    const [currentPage, setCurrentPage] = useState(1);\r\n    const [totalPages, setTotalPages] = useState(1);\r\n    const [likedPosts,setLikedPosts] = useState({});\r\n    const [announcements, setAnnouncements] = useState([]);\r\n    const [carouselDiscounts, setCarouselDiscounts] = useState([]);\r\n    const [requestLoading, setRequestLoading] = useState(false);\r\n    const [requestError, setRequestError] = useState(null);\r\n    const [requestPosts, setRequestPosts] = useState([]);\r\n\r\n\r\n    // 添加状态\r\n    const [torrentPosts, setTorrentPosts] = useState([]);\r\n    const [torrentLoading, setTorrentLoading] = useState(false);\r\n    const [torrentError, setTorrentError] = useState(null);\r\n\r\n    const [filteredResources, setFilteredResources] = useState(torrentPosts);\r\n    const [isAdmin, setIsAdmin] = useState(false);\r\n\r\n    // 在组件状态中添加\r\n    const [showDownloadModal, setShowDownloadModal] = useState(false);\r\n    const [selectedTorrent, setSelectedTorrent] = useState(null);\r\n    const [downloadProgress, setDownloadProgress] = useState(0);\r\n    const [isDownloading, setIsDownloading] = useState(false);\r\n    const [downloadPath, setDownloadPath] = useState('D:/studies/ptPlatform/torrent');\r\n\r\n    // 新增搜索状态\r\n    const [announcementSearch, setAnnouncementSearch] = useState('');\r\n    const [shareSearch, setShareSearch] = useState('');\r\n    const [requestSearch, setRequestSearch] = useState('');\r\n    const [helpSearch, setHelpSearch] = useState('');\r\n\r\n\r\n    const activeTab = tab || 'announcement'; // 如果没有tab参数，则默认为announcement\r\n    // 从location.state中初始化状态\r\n\r\n\r\n    const handleTabChange = (tabName) => {\r\n        navigate(`/dashboard/${tabName}`, {\r\n            state: {\r\n                savedFilters: selectedFilters, // 使用新的筛选状态 // 保留现有状态\r\n                activeTab: tabName // 可选，如果其他组件依赖这个 state\r\n            }\r\n        });\r\n    };\r\n\r\n    \r\n\r\n    //公告区\r\n    // 添加获取公告的方法\r\n    const fetchAnnouncements = async () => {\r\n    try {\r\n        const response = await getLatestAnnouncements();\r\n        setAnnouncements(response.data.data.announcements || []);\r\n    } catch (error) {\r\n        console.error('获取公告失败:', error);\r\n    }\r\n    };\r\n\r\n    useEffect(() => {\r\n        if (activeTab === 'announcement') {\r\n            fetchAnnouncements();\r\n            fetchDiscountsForCarousel();\r\n        }\r\n    }, [activeTab]);\r\n\r\n    const fetchDiscountsForCarousel = async () => {\r\n        try {\r\n            const all = await getAllDiscounts();\r\n            console.log(\"返回的折扣数据：\", all);\r\n            const now = new Date();\r\n\r\n            // ⚠️ 使用 Date.parse 确保兼容 ISO 格式\r\n            const ongoing = all.filter(d =>\r\n            Date.parse(d.startTime) <= now.getTime() && Date.parse(d.endTime) >= now.getTime()\r\n            );\r\n\r\n            const upcoming = all\r\n            .filter(d => Date.parse(d.startTime) > now.getTime())\r\n            .sort((a, b) => Date.parse(a.startTime) - Date.parse(b.startTime));\r\n\r\n            const selected = [...ongoing.slice(0, 3)];\r\n\r\n            while (selected.length < 3 && upcoming.length > 0) {\r\n            selected.push(upcoming.shift());\r\n            }\r\n\r\n            setCarouselDiscounts(selected);\r\n        } catch (e) {\r\n            console.error(\"获取折扣失败:\", e);\r\n        }\r\n    };\r\n\r\n    // 修改handleAnnouncementClick函数中的state传递，移除不必要的字段\r\n    const handleAnnouncementClick = (announcement, e) => {\r\n        if (!e.target.closest('.exclude-click')) {\r\n            navigate(`/announcement/${announcement.id}`, {\r\n                state: {\r\n                    announcement,\r\n                    returnPath: `/dashboard/${activeTab}`,\r\n                    scrollPosition: window.scrollY,\r\n                    activeTab\r\n                }\r\n            });\r\n        }\r\n    };\r\n\r\n    \r\n   // 公告区搜索处理\r\n    const handleSearchAnnouncement = (e) => {\r\n        setAnnouncementSearch(e.target.value);\r\n    };\r\n\r\n    // 修改后的搜索函数\r\n    const handleSearchShare = async () => {\r\n        try {\r\n            setTorrentLoading(true);\r\n            const response = await searchTorrents(shareSearch, 1);\r\n            if (response.data.code === 200) {\r\n                setTorrentPosts(response.data.data.records);\r\n                const total = response.data.data.total;\r\n                setTotalPages(Math.ceil(total / 5));\r\n                setCurrentPage(1);\r\n            } else {\r\n                setTorrentError(response.data.message || '搜索失败');\r\n            }\r\n        } catch (err) {\r\n            setTorrentError(err.message || '搜索失败');\r\n        } finally {\r\n            setTorrentLoading(false);\r\n        }\r\n    };\r\n\r\n    const handleResetShareSearch = async () => {\r\n        setShareSearch('');\r\n        setSelectedFilters(\r\n            Object.keys(filterCategories).reduce((acc, category) => {\r\n                acc[category] = 'all';\r\n                return acc;\r\n            }, {})\r\n        );\r\n        await fetchTorrentPosts(1, true);\r\n    };\r\n\r\n    // 添加搜索函数\r\n    const handleSearchRequest = async () => {\r\n        try {\r\n        setRequestLoading(true);\r\n        const response = await searchRequestPosts(requestSearch, currentPage);\r\n        if (response.data.code === 200) {\r\n            const postsWithCounts = await Promise.all(\r\n            response.data.data.records.map(async (post) => {\r\n                try {\r\n                const detailResponse = await getRequestPostDetail(post.id);\r\n                if (detailResponse.data.code === 200) {\r\n                    return {\r\n                    ...post,\r\n                    replyCount: detailResponse.data.data.post.replyCount || 0,\r\n                    isLiked: false\r\n                    };\r\n                }\r\n                return post;\r\n                } catch (err) {\r\n                console.error(`获取帖子${post.id}详情失败:`, err);\r\n                return post;\r\n                }\r\n            })\r\n            );\r\n            setRequestPosts(postsWithCounts);\r\n            setTotalPages(Math.ceil(response.data.data.total / 5));\r\n        } else {\r\n            setRequestError(response.data.message || '搜索失败');\r\n        }\r\n        } catch (err) {\r\n        setRequestError(err.message || '搜索失败');\r\n        } finally {\r\n        setRequestLoading(false);\r\n        }\r\n    };\r\n    \r\n    // 添加重置搜索函数\r\n    const handleResetRequestSearch = async () => {\r\n        setRequestSearch('');\r\n        await fetchRequestPosts(1); // 重置到第一页\r\n };\r\n\r\n   // 添加搜索函数\r\n    const handleSearchHelp = async () => {\r\n        try {\r\n        setHelpLoading(true);\r\n        const response = await searchHelpPosts(helpSearch, currentPage);\r\n        if (response.data.code === 200) {\r\n            const postsWithCounts = await Promise.all(\r\n            response.data.data.records.map(async (post) => {\r\n                try {\r\n                const detailResponse = await getHelpPostDetail(post.id);\r\n                if (detailResponse.data.code === 200) {\r\n                    return {\r\n                    ...post,\r\n                    replyCount: detailResponse.data.data.post.replyCount || 0,\r\n                    isLiked: false\r\n                    };\r\n                }\r\n                return post;\r\n                } catch (err) {\r\n                console.error(`获取帖子${post.id}详情失败:`, err);\r\n                return post;\r\n                }\r\n            })\r\n            );\r\n            setHelpPosts(postsWithCounts);\r\n            setTotalPages(Math.ceil(response.data.data.total / 5));\r\n        } else {\r\n            setHelpError(response.data.message || '搜索失败');\r\n        }\r\n        } catch (err) {\r\n        setHelpError(err.message || '搜索失败');\r\n        } finally {\r\n        setHelpLoading(false);\r\n        }\r\n    };\r\n    \r\n    // 添加重置搜索函数\r\n    const handleResetHelpSearch = async () => {\r\n        setHelpSearch('');\r\n        await fetchHelpPosts(1); // 重置到第一页\r\n };\r\n\r\n\r\n\r\n\r\n    //资源区\r\n    const handleFileChange = (e) => {\r\n        setUploadData({...uploadData, file: e.target.files[0]});\r\n    };\r\n\r\n    const handleUploadSubmit = async (e) => {\r\n        e.preventDefault();\r\n        try {\r\n            setIsUploading(true);\r\n\r\n            const torrentData = {\r\n                torrentName: uploadData.name,\r\n                description: uploadData.description,\r\n                category: uploadData.type,\r\n                region: uploadData.region,\r\n                resolution: uploadData.resolution,\r\n                subtitle: uploadData.subtitle\r\n            };\r\n\r\n            await createTorrent(uploadData.file, torrentData, (progress) => {\r\n                console.log(`上传进度: ${progress}%`);\r\n                // 这里可以添加进度条更新逻辑\r\n                });\r\n\r\n            // 上传成功处理\r\n            setShowUploadModal(false);\r\n            setUploadData({\r\n                name: '',\r\n                type: '',\r\n                region: '',\r\n                subtitle: '',\r\n                resolution: '',\r\n                file: null,\r\n                description: ''\r\n            });\r\n            alert('种子创建成功！');\r\n\r\n            // 刷新列表\r\n            await fetchTorrentPosts(currentPage);\r\n\r\n        } catch (error) {\r\n            console.error('创建失败:', error);\r\n            alert('创建失败: ' + (error.response?.data?.message || error.message));\r\n        } finally {\r\n            setIsUploading(false);\r\n        }\r\n    };\r\n\r\n    // 处理下载按钮点击\r\n    const handleDownloadClick = (torrent, e) => {\r\n        e.stopPropagation();\r\n        setSelectedTorrent(torrent);\r\n        setShowDownloadModal(true);\r\n    };\r\n\r\n    // 执行下载\r\n    const handleDownload = async () => {\r\n    if (!selectedTorrent || !downloadPath) return;\r\n\r\n    setIsDownloading(true);\r\n    setDownloadProgress(0);\r\n\r\n    try {\r\n        // 标准化路径\r\n        const cleanPath = downloadPath\r\n        .replace(/\\\\/g, '/')  // 统一使用正斜杠\r\n        .replace(/\\/+/g, '/') // 去除多余斜杠\r\n        .trim();\r\n\r\n        // 确保路径以斜杠结尾\r\n        const finalPath = cleanPath.endsWith('/') ? cleanPath : cleanPath + '/';\r\n\r\n        // 发起下载请求\r\n        await downloadTorrent(selectedTorrent.id, finalPath);\r\n        \r\n        // 开始轮询进度\r\n        const interval = setInterval(async () => {\r\n            try {\r\n                const res = await getDownloadProgress();\r\n                const progresses = res.data.progresses;\r\n                \r\n                if (progresses) {\r\n                    // 使用完整的 torrent 文件路径作为键\r\n                    const torrentPath = selectedTorrent.filePath.replace(/\\\\/g, '/');\r\n                    const torrentHash = selectedTorrent.hash;\r\n                    // 查找匹配的进度\r\n                    let foundProgress = null;\r\n                    for (const [key, value] of Object.entries(progresses)) {\r\n                        const normalizedKey = key.replace(/\\\\/g, '/');\r\n                        if (normalizedKey.includes(selectedTorrent.hash) || \r\n                            normalizedKey.includes(selectedTorrent.torrentName)) {\r\n                            foundProgress = value;\r\n                            break;\r\n                        }\r\n                    }\r\n                    if (foundProgress !== null) {\r\n                        const newProgress = Math.round(foundProgress * 100);\r\n                        setDownloadProgress(newProgress);\r\n                        \r\n                        // 检查是否下载完成\r\n                        if (newProgress >= 100) {\r\n                        clearInterval(interval);\r\n                        setIsDownloading(false);\r\n                        message.success('下载完成！');\r\n                        setTimeout(() => setShowDownloadModal(false), 2000);\r\n                        }\r\n                    } else {\r\n                        console.log('当前下载进度:', progresses); // 添加日志\r\n                    }\r\n                    }\r\n                } catch (error) {\r\n                    console.error('获取进度失败:', error);\r\n                    // 如果获取进度失败但文件已存在，也视为完成\r\n                    const filePath = `${finalPath}${selectedTorrent.torrentName || 'downloaded_file'}`;\r\n                    try {\r\n                    const exists = await checkFileExists(filePath);\r\n                    if (exists) {\r\n                        clearInterval(interval);\r\n                        setDownloadProgress(100);\r\n                        setIsDownloading(false);\r\n                        message.success('下载完成！');\r\n                        setTimeout(() => setShowDownloadModal(false), 2000);\r\n                    }\r\n                    } catch (e) {\r\n                    console.error('文件检查失败:', e);\r\n                    }\r\n                }\r\n                }, 2000);\r\n\r\n        return () => clearInterval(interval);\r\n    } catch (error) {\r\n        setIsDownloading(false);\r\n        if (error.response && error.response.status === 409) {\r\n        message.error('分享率不足，无法下载此资源');\r\n        } else {\r\n        message.error('下载失败: ' + (error.message || '未知错误'));\r\n        }\r\n    }\r\n    };\r\n\r\n    const checkFileExists = async (filePath) => {\r\n        try {\r\n            // 这里需要根据您的实际环境实现文件存在性检查\r\n            // 如果是Electron应用，可以使用Node.js的fs模块\r\n            // 如果是纯前端，可能需要通过API请求后端检查\r\n            return true; // 暂时返回true，实际实现需要修改\r\n        } catch (e) {\r\n            console.error('检查文件存在性失败:', e);\r\n            return false;\r\n        }\r\n    };\r\n\r\n    const handleDeleteTorrent = async (torrentId, e) => {\r\n        e.stopPropagation(); // 阻止事件冒泡，避免触发资源项的点击事件\r\n        \r\n        try {\r\n            // 确认删除\r\n            if (!window.confirm('确定要删除这个种子吗？此操作不可撤销！')) {\r\n            return;\r\n            }\r\n            \r\n            // 调用删除API\r\n            await deleteTorrent(torrentId);\r\n            \r\n            // 删除成功后刷新列表\r\n            message.success('种子删除成功');\r\n            await fetchTorrentPosts(currentPage);\r\n        } catch (error) {\r\n            console.error('删除种子失败:', error);\r\n            message.error('删除种子失败: ' + (error.response?.data?.message || error.message));\r\n        }\r\n        };\r\n\r\n        const handleRequestPostSubmit = async (e) => {\r\n        e.preventDefault();\r\n        try {\r\n          const username = localStorage.getItem('username');\r\n          const response = await createRequestPost(\r\n            postTitle,\r\n            postContent,\r\n            username,\r\n            selectedImage\r\n          );\r\n          \r\n          if (response.data.code === 200) {\r\n            // 刷新帖子列表\r\n           \r\n            await fetchRequestPosts(currentPage);\r\n            // 重置表单\r\n            setShowPostModal(false);\r\n            setPostTitle('');\r\n            setPostContent('');\r\n            setSelectedImage(null);\r\n          } else {\r\n            setHelpError(response.data.message || '发帖失败');\r\n          }\r\n        } catch (err) {\r\n          setHelpError(err.message || '发帖失败');\r\n        }\r\n      };\r\n\r\n    const handleHelpPostSubmit = async (e) => {\r\n        e.preventDefault();\r\n        try {\r\n          const username = localStorage.getItem('username');\r\n          const response = await createHelpPost(\r\n            postTitle,\r\n            postContent,\r\n            username,\r\n            selectedImage\r\n          );\r\n          \r\n          if (response.data.code === 200) {\r\n            // 刷新帖子列表\r\n            await fetchHelpPosts(currentPage);\r\n            \r\n            // 重置表单\r\n            setShowPostModal(false);\r\n            setPostTitle('');\r\n            setPostContent('');\r\n            setSelectedImage(null);\r\n          } else {\r\n            setHelpError(response.data.message || '发帖失败');\r\n          }\r\n        } catch (err) {\r\n          setHelpError(err.message || '发帖失败');\r\n        }\r\n      };\r\n\r\n\r\nconst fetchTorrentPosts = async (page = 1, isReset = false) => {\r\n    setTorrentLoading(true);\r\n    try {\r\n        const params = {\r\n            page,\r\n            size: 5\r\n        };\r\n        \r\n        // 如果有筛选条件且不是重置操作\r\n        if (!isReset && Object.values(selectedFilters).some(v => v !== 'all')) {\r\n            if (selectedFilters.type !== 'all') params.category = selectedFilters.type;\r\n            if (selectedFilters.subtitle !== 'all') params.subtitle = selectedFilters.subtitle;\r\n            if (selectedFilters.region !== 'all') params.region = selectedFilters.region;\r\n            if (selectedFilters.resolution !== 'all') params.resolution = selectedFilters.resolution;\r\n        }\r\n        \r\n        const response = (shareSearch && !isReset) \r\n            ? await searchTorrents(shareSearch, page)\r\n            : await api.get('http://localhost:8088/torrent', { params });\r\n            \r\n        if (response.data.code === 200) {\r\n            setTorrentPosts(response.data.data.records);\r\n            const total = response.data.data.total;\r\n            setTotalPages(Math.ceil(total / 5));\r\n            setCurrentPage(page);\r\n        } else {\r\n            setTorrentError(response.data.message);\r\n        }\r\n    } catch (err) {\r\n        setTorrentError(err.message);\r\n    } finally {\r\n        setTorrentLoading(false);\r\n    }\r\n};\r\n\r\n    // 在useEffect中调用\r\n    useEffect(() => {\r\n        if (activeTab === 'share') {\r\n            fetchTorrentPosts();\r\n        }\r\n    }, [activeTab]);\r\n\r\nconst fetchRequestPosts = async (page = 1) => {\r\n        setRequestLoading(true);\r\n        try {\r\n          const response = await getRequestPosts(page);\r\n          if (response.data.code === 200) {\r\n            const postsWithCounts = await Promise.all(\r\n              response.data.data.records.map(async (post) => {\r\n                try {\r\n                  const detailResponse = await getRequestPostDetail(post.id);\r\n                  if (detailResponse.data.code === 200) {\r\n                    return {\r\n                      ...post,\r\n                      replyCount: detailResponse.data.data.post.replyCount || 0,\r\n                      isLiked: false // 根据需要添加其他字段\r\n                    };\r\n                  }\r\n                  return post; // 如果获取详情失败，返回原始帖子数据\r\n                } catch (err) {\r\n                  console.error(`获取帖子${post.id}详情失败:`, err);\r\n                  return post;\r\n                }\r\n              })\r\n            );\r\n            setRequestPosts(postsWithCounts);\r\n            setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条\r\n            setCurrentPage(page);\r\n          } else {\r\n            setRequestError(response.data.message || '获取求助帖失败');\r\n          }\r\n        } catch (err) {\r\n          setRequestError(err.message || '获取求助帖失败');\r\n        } finally {\r\n          setRequestLoading(false);\r\n        }\r\n      };\r\n\r\n    const handleImageUpload = (e) => {\r\n        setSelectedImage(e.target.files[0]);\r\n    };\r\n\r\n\r\n    const fetchHelpPosts = async (page = 1) => {\r\n        setHelpLoading(true);\r\n        try {\r\n          const response = await getHelpPosts(page);\r\n          if (response.data.code === 200) {\r\n            const postsWithCounts = await Promise.all(\r\n              response.data.data.records.map(async (post) => {\r\n                try {\r\n                  const detailResponse = await getHelpPostDetail(post.id);\r\n                  if (detailResponse.data.code === 200) {\r\n                    return {\r\n                      ...post,\r\n                      replyCount: detailResponse.data.data.post.replyCount || 0,\r\n                      isLiked: false // 根据需要添加其他字段\r\n                    };\r\n                  }\r\n                  return post; // 如果获取详情失败，返回原始帖子数据\r\n                } catch (err) {\r\n                  console.error(`获取帖子${post.id}详情失败:`, err);\r\n                  return post;\r\n                }\r\n              })\r\n            );\r\n            setHelpPosts(postsWithCounts);\r\n            setTotalPages(Math.ceil(response.data.data.total / 5)); // 假设每页5条\r\n            setCurrentPage(page);\r\n          } else {\r\n            setHelpError(response.data.message || '获取求助帖失败');\r\n          }\r\n        } catch (err) {\r\n          setHelpError(err.message || '获取求助帖失败');\r\n        } finally {\r\n          setHelpLoading(false);\r\n        }\r\n      };\r\n\r\n\r\n    useEffect(() => {\r\n        if (activeTab === 'request') {\r\n            fetchRequestPosts(currentPage);\r\n        }\r\n    }, [activeTab, currentPage]); // 添加 currentPage 作为依赖\r\n\r\n\r\n        // 分类维度配置\r\n    const filterCategories = {\r\n        type: {\r\n            label: '类型',\r\n            options: {\r\n                'all': '全部',\r\n                '电影': '电影',\r\n                '电视剧': '电视剧',\r\n                '动漫': '动漫',\r\n                '综艺': '综艺',\r\n                '音乐': '音乐',\r\n                '其他': '其他'\r\n            }\r\n        },\r\n        subtitle: {\r\n            label: '字幕',\r\n            options: {\r\n                'all': '全部',\r\n                '无需字幕': '无需字幕',\r\n                '暂无字幕': '暂无字幕',\r\n                '自带中文字幕': '自带中文字幕',\r\n                '自带双语字幕(含中文)': '自带双语字幕(含中文)',\r\n                '附件中文字幕': '附件中文字幕',\r\n                '附件双语字幕': '附件双语字幕'\r\n            }\r\n        },\r\n        region: {\r\n            label: '地区',\r\n            options: {\r\n                'all': '全部',\r\n                '中国': '中国',\r\n                '英国': '英国',\r\n                '美国': '美国',\r\n                '日本': '日本',\r\n                '韩国': '韩国',\r\n                '其他': '其他'\r\n            }\r\n        },\r\n        resolution: {\r\n            label: '分辨率',\r\n            options: {\r\n                'all': '全部',\r\n                '4K': '4K',\r\n                '2K': '2K',\r\n                '1080P': '1080P',\r\n                '720P': '720P',\r\n                'SD': 'SD',\r\n                '无损音源': '无损音源',\r\n                '杜比全景声': '杜比全景声',\r\n                '其他': '其他'\r\n            }\r\n        }\r\n    };\r\n    const [selectedFilters, setSelectedFilters] = useState(\r\n        location.state?.savedFilters ||\r\n        Object.keys(filterCategories).reduce((acc, category) => {\r\n            acc[category] = 'all';\r\n            return acc;\r\n        }, {})\r\n    );\r\n\r\n    // 处理筛选条件变更\r\n    const handleFilterSelect = (category, value) => {\r\n        setSelectedFilters(prev => ({\r\n            ...prev,\r\n            [category]: prev[category] === value ? 'all' : value\r\n        }));\r\n    };\r\n\r\n    // 应用筛选条件\r\n    const applyFilters = async () => {\r\n        try {\r\n            setTorrentLoading(true);\r\n            \r\n            // 构建查询参数\r\n            const params = {\r\n                page: 1, // 从第一页开始\r\n                size: 5 \r\n            };\r\n            \r\n            // 添加筛选条件\r\n            if (selectedFilters.type !== 'all') {\r\n                params.category = selectedFilters.type;\r\n            }\r\n            if (selectedFilters.subtitle !== 'all') {\r\n                params.subtitle = selectedFilters.subtitle;\r\n            }\r\n            if (selectedFilters.region !== 'all') {\r\n                params.region = selectedFilters.region;\r\n            }\r\n            if (selectedFilters.resolution !== 'all') {\r\n                params.resolution = selectedFilters.resolution;\r\n            }\r\n            \r\n            // 调用API获取筛选结果\r\n            const response = await api.get('http://localhost:8088/torrent', { params });\r\n            \r\n            if (response.data.code === 200) {\r\n                setTorrentPosts(response.data.data.records);\r\n                setTotalPages(Math.ceil(response.data.data.total / 5));\r\n                setCurrentPage(1);\r\n            } else {\r\n                setTorrentError(response.data.message || '筛选失败');\r\n            }\r\n        } catch (err) {\r\n            setTorrentError(err.message || '筛选失败');\r\n        } finally {\r\n            setTorrentLoading(false);\r\n        }\r\n    };\r\n\r\n\r\n    // 恢复滚动位置\r\n    useEffect(() => {\r\n        if (location.state?.scrollPosition) {\r\n            window.scrollTo(0, location.state.scrollPosition);\r\n        }\r\n    }, [location.state]);\r\n\r\n    // 在Dashboard.jsx中修改useEffect\r\nuseEffect(() => {\r\n    const token = localStorage.getItem('token');\r\n    if (!token) {\r\n        navigate('/login');\r\n        return;\r\n    }\r\n    \r\n    const fetchUserInfo = async () => {\r\n        try {\r\n          setLoading(true);\r\n          const backendData = await getUserInfo(); // 调用修改后的方法\r\n          console.log('后端返回的用户数据:', backendData); // 调试用\r\n          \r\n          setUserInfo({\r\n            name: backendData.username || '演示用户',\r\n            avatar: 'https://via.placeholder.com/40',\r\n            isAdmin: backendData.authority === 'ADMIN' // 检查 authority 是否为 \"ADMIN\"\r\n          });\r\n        } catch (error) {\r\n          console.error('获取用户信息失败:', error);\r\n          setError('获取用户信息失败');\r\n        } finally {\r\n          setLoading(false);\r\n        }\r\n      };\r\n    \r\n    fetchUserInfo();\r\n}, [navigate]);\r\n\r\n\r\n    useEffect(() => {\r\n        if (activeTab === 'announcement') {\r\n            const timer = setInterval(() => {\r\n                setCurrentSlide(prev => {\r\n                    const count = carouselDiscounts.length || 1;\r\n                    return (prev + 1) % count;\r\n                });\r\n            }, 3000);\r\n            return () => clearInterval(timer);\r\n        }\r\n    }, [activeTab]);\r\n\r\n    useEffect(() => {\r\n        if (activeTab === 'help') {\r\n            fetchHelpPosts();\r\n        }\r\n    }, [activeTab, currentPage]); // 添加 currentPage 作为依赖\r\n\r\n    \r\n\r\n    const renderContent = () => {\r\n        switch (activeTab) {\r\n            case 'announcement':\r\n                return (\r\n                    <div className=\"content-area\" data-testid=\"announcement-section\">\r\n                        <div className=\"section-search-container\">\r\n                            <input\r\n                                type=\"text\"\r\n                                placeholder=\"搜索公告...\"\r\n                                value={announcementSearch}\r\n                                onChange={(e) => setAnnouncementSearch(e.target.value)}\r\n                                className=\"section-search-input\"\r\n                                onKeyPress={(e) => e.key === 'Enter' && handleSearchAnnouncement()}\r\n                            />\r\n                            <button \r\n                                className=\"search-button\"\r\n                                onClick={handleSearchAnnouncement}\r\n                            >\r\n                                搜索\r\n                            </button>\r\n                        </div>\r\n                        {/* 轮播图区域 */}\r\n                       <div className=\"carousel-container\">\r\n                        {carouselDiscounts.length === 0 ? (\r\n                            <div className=\"carousel-slide active\">\r\n                            <div className=\"carousel-image gray-bg\">暂无折扣活动</div>\r\n                            </div>\r\n                        ) : (\r\n                            carouselDiscounts.map((discount, index) => (\r\n                            <div key={index} className={`carousel-slide ${currentSlide === index ? 'active' : ''}`}>\r\n                                <div className=\"carousel-image gray-bg\">\r\n                                <h3>{discount.type}</h3>\r\n                                <p>{discount.name}</p>\r\n                                <p>{new Date(discount.startTime).toLocaleDateString()} ~ {new Date(discount.endTime).toLocaleDateString()}</p>\r\n                                </div>\r\n                            </div>\r\n                            ))\r\n                        )}\r\n                        <div className=\"carousel-dots\">\r\n                            {carouselDiscounts.map((_, index) => (\r\n                            <span key={index} className={`dot ${currentSlide === index ? 'active' : ''}`}></span>\r\n                            ))}\r\n                        </div>\r\n                        </div>\r\n\r\n\r\n\r\n                        {/* 公告区块区域 */}\r\n                        <div className=\"announcement-grid\">\r\n                            {announcements.map(announcement => (\r\n                                <div\r\n                                    key={announcement.id}\r\n                                    className=\"announcement-card\"\r\n                                    onClick={(e) => handleAnnouncementClick(announcement, e)}\r\n                                >\r\n                                    <h3>{announcement.title}</h3>\r\n                                    <p>{announcement.content.substring(0, 100)}...</p>\r\n                                    <div className=\"announcement-footer exclude-click\">\r\n                                        <span>{announcement.date}</span>\r\n                                    </div>\r\n                                </div>\r\n                            ))}\r\n                        </div>\r\n                    </div>\r\n                );\r\n            case 'share':\r\n                return (\r\n                    <div className=\"content-area\" data-testid=\"share-section\">\r\n                        {/* 分享区搜索框 */}\r\n                        <div className=\"section-search-container\">\r\n                            <input\r\n                                type=\"text\"\r\n                                placeholder=\"搜索资源...\"\r\n                                value={shareSearch}\r\n                                onChange={(e) => setShareSearch(e.target.value)}\r\n                                className=\"section-search-input\"\r\n                                onKeyPress={(e) => e.key === 'Enter' && handleSearchShare()}\r\n                            />\r\n                            <button \r\n                                className=\"search-button\"\r\n                                onClick={handleSearchShare}\r\n                            >\r\n                                搜索\r\n                            </button>\r\n                            <button \r\n                                className=\"reset-button\"\r\n                                onClick={handleResetShareSearch}  // 使用新的重置函数\r\n                                style={{marginLeft: '10px'}}\r\n                            >\r\n                                重置\r\n                            </button>\r\n                        </div>\r\n\r\n                        {/* 上传按钮 - 添加在筛选区上方 */}\r\n                        <div className=\"upload-header\">\r\n                            <button\r\n                                className=\"upload-btn\"\r\n                                onClick={() => setShowUploadModal(true)}\r\n                            >\r\n                                ＋ 上传种子\r\n                            </button>\r\n                        </div>\r\n                        {/* 分类筛选区 */}\r\n                        <div className=\"filter-section\">\r\n                            {Object.entries(filterCategories).map(([category, config]) => (\r\n                                <div key={category} className=\"filter-group\">\r\n                                    <h4>{config.label}：</h4>\r\n                                    <div className=\"filter-options\">\r\n                                        {Object.entries(config.options).map(([value, label]) => (\r\n                                            <button\r\n                                                key={value}\r\n                                                className={`filter-btn ${\r\n                                                    selectedFilters[category] === value ? 'active' : ''\r\n                                                }`}\r\n                                                onClick={() => handleFilterSelect(category, value)}\r\n                                            >\r\n                                                {label}\r\n                                            </button>\r\n                                        ))}\r\n                                    </div>\r\n                                </div>\r\n                            ))}\r\n\r\n                            <button\r\n                                className=\"confirm-btn\"\r\n                                onClick={applyFilters}\r\n                            >\r\n                                确认筛选\r\n                            </button>\r\n                        </div>\r\n\r\n                        {/* 上传弹窗 */}\r\n                        {showUploadModal && (\r\n                            <div className=\"modal-overlay\">\r\n                                <div className=\"upload-modal\">\r\n                                    <h3>上传新种子</h3>\r\n                                    <button\r\n                                        className=\"close-btn\"\r\n                                        onClick={() => setShowUploadModal(false)}\r\n                                    >\r\n                                        ×\r\n                                    </button>\r\n\r\n                                    <form onSubmit={handleUploadSubmit}>\r\n                                        <div className=\"form-group\">\r\n                                            <label>种子名称</label>\r\n                                            <input\r\n                                                type=\"text\"\r\n                                                value={uploadData.name}\r\n                                                onChange={(e) => setUploadData({...uploadData, name: e.target.value})}\r\n                                                required\r\n                                            />\r\n                                        </div>\r\n\r\n                                        <div className=\"form-group\">\r\n                                            <label>资源类型</label>\r\n                                            <select\r\n                                                value={uploadData.type}\r\n                                                onChange={(e) => setUploadData({...uploadData, type: e.target.value})}\r\n                                                required\r\n                                            >\r\n                                                <option value=\"\">请选择</option>\r\n                                                <option value=\"电影\">电影</option>\r\n                                                <option value=\"电视剧\">电视剧</option>\r\n                                                <option value=\"动漫\">动漫</option>\r\n                                                <option value=\"综艺\">综艺</option>\r\n                                                <option value=\"音乐\">音乐</option>\r\n                                                <option value=\"其他\">其他</option>\r\n                                            </select>\r\n                                        </div>\r\n\r\n                                        {/* 修改后的地区下拉框 */}\r\n                                        <div className=\"form-group\">\r\n                                            <label>地区</label>\r\n                                            <select\r\n                                                value={uploadData.region || ''}\r\n                                                onChange={(e) => setUploadData({...uploadData, region: e.target.value})}\r\n                                                required\r\n                                            >\r\n                                                <option value=\"\">请选择</option>\r\n                                                <option value=\"中国\">中国</option>\r\n                                                <option value=\"英国\">英国</option>\r\n                                                <option value=\"美国\">美国</option>\r\n                                                <option value=\"日本\">日本</option>\r\n                                                <option value=\"韩国\">韩国</option>\r\n                                                <option value=\"其他\">其他</option>\r\n                                            </select>\r\n                                        </div>\r\n\r\n                                        {/* 添加分辨率下拉框 */}\r\n                                        <div className=\"form-group\">\r\n                                            <label>分辨率</label>\r\n                                            <select\r\n                                                value={uploadData.resolution || ''}\r\n                                                onChange={(e) => setUploadData({\r\n                                                    ...uploadData,\r\n                                                    resolution: e.target.value\r\n                                                })}\r\n                                                required\r\n                                            >\r\n                                                <option value=\"\">请选择</option>\r\n                                                <option value=\"4K\">4K</option>\r\n                                                <option value=\"2K\">2K</option>\r\n                                                <option value=\"1080P\">1080P</option>\r\n                                                <option value=\"720P\">720P</option>\r\n                                                <option value=\"SD\">SD</option>\r\n                                                <option value=\"无损音源\">无损音源</option>\r\n                                                <option value=\"杜比全景声\">杜比全景声</option>\r\n                                                <option value=\"其他\">其他</option>\r\n                                            </select>\r\n                                        </div>\r\n\r\n\r\n                                        {/* 新增字幕语言下拉框 */}\r\n                                        <div className=\"form-group\">\r\n                                            <label>字幕语言</label>\r\n                                            <select\r\n                                                value={uploadData.subtitle || ''}\r\n                                                onChange={(e) => setUploadData({\r\n                                                    ...uploadData,\r\n                                                    subtitle: e.target.value\r\n                                                })}\r\n                                                required\r\n                                            >\r\n                                                <option value=\"\">请选择</option>\r\n                                                <option value=\"无需字幕\">无需字幕</option>\r\n                                                <option value=\"暂无字幕\">暂无字幕</option>\r\n                                                <option value=\"自带中文字幕\">自带中文字幕</option>\r\n                                                <option value=\"自带双语字幕(含中文)\">自带双语字幕(含中文)</option>\r\n                                                <option value=\"附件中文字幕\">附件中文字幕</option>\r\n                                                <option value=\"附件双语字幕\">附件双语字幕</option>\r\n                                            </select>\r\n                                        </div>\r\n\r\n                                        <div className=\"form-group\">\r\n                                            <label>种子文件</label>\r\n                                            <input\r\n                                                type=\"file\"\r\n                                                accept=\".torrent\"\r\n                                                onChange={handleFileChange}\r\n\r\n                                            />\r\n                                        </div>\r\n\r\n                                        <div className=\"form-group\">\r\n                                            <label>简介</label>\r\n                                            <textarea\r\n                                                value={uploadData.description}\r\n                                                onChange={(e) => setUploadData({\r\n                                                    ...uploadData,\r\n                                                    description: e.target.value\r\n                                                })}\r\n                                            />\r\n                                        </div>\r\n\r\n                                        <div className=\"form-actions\">\r\n                                            <button\r\n                                                type=\"button\"\r\n                                                className=\"cancel-btn\"\r\n                                                onClick={() => setShowUploadModal(false)}\r\n                                            >\r\n                                                取消\r\n                                            </button>\r\n                                            <button\r\n                                                type=\"submit\"\r\n                                                className=\"confirm-btn\"\r\n                                                disabled={isUploading}\r\n                                            >\r\n                                                {isUploading ? '上传中...' : '确认上传'}\r\n                                            </button>\r\n                                        </div>\r\n                                    </form>\r\n                                </div>\r\n                            </div>\r\n                        )}\r\n\r\n                        <div className=\"resource-list\">\r\n                            {torrentPosts.map(torrent => (\r\n                                <div\r\n                                    key={torrent.id}\r\n                                    className=\"resource-item\"\r\n                                    onClick={() => navigate(`/torrent/${torrent.id}`)}\r\n                                >\r\n                                    <div className=\"resource-poster\">\r\n                                        <div className=\"poster-image gray-bg\">{torrent.torrentName.charAt(0)}</div>\r\n                                    </div>\r\n                                    <div className=\"resource-info\">\r\n                                        <h3 className=\"resource-title\">{torrent.torrentName}</h3>\r\n                                        <p className=\"resource-meta\">\r\n                                            {torrent.resolution} | {torrent.region} | {torrent.category}\r\n                                        </p>\r\n                                        <p className=\"resource-subtitle\">字幕: {torrent.subtitle}</p>\r\n                                    </div>\r\n                                    <div className=\"resource-stats\">\r\n                                    <span className=\"stat\">{torrent.size}</span>\r\n                                        <span className=\"stat\">发布者: {torrent.username}</span>\r\n                                    </div>\r\n                                    <button\r\n                                        className=\"download-btn\"\r\n                                        onClick={(e) => handleDownloadClick(torrent, e)}\r\n                                    >\r\n                                        立即下载\r\n                                    </button>\r\n                                    {/* 添加删除按钮 - 只有管理员或发布者可见 */}\r\n                                    {(userInfo?.isAdmin || userInfo?.name === torrent.username) && (\r\n                                        <button\r\n                                        className=\"delete-btn\"\r\n                                        onClick={(e) => handleDeleteTorrent(torrent.id, e)}\r\n                                        >\r\n                                        删除\r\n                                        </button>\r\n                                    )}\r\n                                </div>\r\n                            ))}\r\n                        </div>\r\n\r\n                    {totalPages > 1 && (\r\n                        <div className=\"pagination\">\r\n                            <button\r\n                                onClick={() => fetchTorrentPosts(currentPage - 1)}\r\n                                disabled={currentPage === 1}\r\n                            >\r\n                                上一页\r\n                            </button>\r\n\r\n                            {Array.from({length: totalPages}, (_, i) => i + 1).map(page => (\r\n                                <button\r\n                                    key={page}\r\n                                    onClick={() => fetchTorrentPosts(page)}\r\n                                    className={currentPage === page ? 'active' : ''}\r\n                                >\r\n                                    {page}\r\n                                </button>\r\n                            ))}\r\n\r\n                            <button\r\n                                onClick={() => fetchTorrentPosts(currentPage + 1)}\r\n                                disabled={currentPage === totalPages}\r\n                            >\r\n                                下一页\r\n                            </button>\r\n                        </div>\r\n                        )}\r\n                    </div>\r\n                );\r\n            // 在Dashboard.jsx的renderContent函数中修改case 'request'部分\r\n            case 'request':\r\n                return (\r\n                    <div className=\"content-area\" data-testid=\"request-section\">\r\n                        {/* 求助区搜索框 */}\r\n                        <div className=\"section-search-container\">\r\n                            <input\r\n                                type=\"text\"\r\n                                placeholder=\"搜索求助...\"\r\n                                value={requestSearch}\r\n                                onChange={(e) => setRequestSearch(e.target.value)}\r\n                                className=\"section-search-input\"\r\n                                onKeyPress={(e) => e.key === 'Enter' && handleSearchRequest()}\r\n                            />\r\n                            <button \r\n                                className=\"search-button\"\r\n                                onClick={handleSearchRequest}\r\n                            >\r\n                                搜索\r\n                            </button>\r\n                            <button \r\n                                className=\"reset-button\"\r\n                                onClick={handleResetRequestSearch}\r\n                                style={{marginLeft: '10px'}}\r\n                            >\r\n                                重置\r\n                            </button>\r\n                        </div>\r\n\r\n                         {/* 新增发帖按钮 */}\r\n                        <div className=\"post-header\">\r\n                            <button\r\n                                className=\"create-post-btn\"\r\n                                onClick={() => setShowPostModal(true)}\r\n                            >\r\n                                ＋ 发帖求助\r\n                            </button>\r\n                        </div>\r\n\r\n                        {/* 加载状态和错误提示 */}\r\n                        {requestLoading && <div className=\"loading\">加载中...</div>}\r\n                        {requestError && <div className=\"error\">{helpError}</div>}\r\n                        {/* 求种区帖子列表 */}\r\n                        <div className=\"request-list\">\r\n                            {requestPosts.map(post => (\r\n                                <div\r\n                                    key={post.id}\r\n                                    className={`request-post ${post.isSolved ? 'solved' : ''}`}\r\n                                    onClick={() => navigate(`/request/${post.id}`)}\r\n                                >\r\n                                    <div className=\"post-header\">\r\n                                        <img\r\n                                            src={post.authorAvatar || 'https://via.placeholder.com/40'}\r\n                                            alt={post.authorId}\r\n                                            className=\"post-avatar\"\r\n                                        />\r\n                                        <div className=\"post-author\">{post.authorId}</div>\r\n                                        <div className=\"post-date\">\r\n                                            {new Date(post.createTime).toLocaleDateString()}\r\n                                        </div>\r\n                                        {post.isSolved && <span className=\"solved-badge\">已解决</span>}\r\n                                    </div>\r\n                                    <h3 className=\"post-title\">{post.title}</h3>\r\n                                    <p className=\"post-content\">{post.content}</p>\r\n                                    <div className=\"post-stats\">\r\n                                        <span className=\"post-likes\">👍 {post.likeCount || 0}</span>\r\n                                        <span className=\"post-comments\">💬 {post.replyCount || 0}</span>\r\n                                    </div>\r\n                                </div>\r\n                            ))}\r\n                        </div>\r\n                        {/* 在帖子列表后添加分页控件 */}\r\n                        <div className=\"pagination\">\r\n                            <button\r\n                                onClick={() => fetchRequestPosts(currentPage - 1)}\r\n                                disabled={currentPage === 1}\r\n                            >\r\n                                上一页\r\n                            </button>\r\n\r\n                            {Array.from({length: totalPages}, (_, i) => i + 1).map(page => (\r\n                                <button\r\n                                    key={page}\r\n                                    onClick={() => fetchRequestPosts(page)}\r\n                                    className={currentPage === page ? 'active' : ''}\r\n                                >\r\n                                    {page}\r\n                                </button>\r\n                            ))}\r\n\r\n                            <button\r\n                                onClick={() => fetchRequestPosts(currentPage + 1)}\r\n                                disabled={currentPage === totalPages}\r\n                            >\r\n                                下一页\r\n                            </button>\r\n                        </div>\r\n                        {/* 新增发帖弹窗 */}\r\n                        {showPostModal && (\r\n                            <div className=\"post-modal-overlay\">\r\n                                <div className=\"post-modal\">\r\n                                    <h3>发布求种帖</h3>\r\n                                    <button\r\n                                        className=\"modal-close-btn\"\r\n                                        onClick={() => setShowPostModal(false)}\r\n                                    >\r\n                                        ×\r\n                                    </button>\r\n\r\n                                    <form onSubmit={handleRequestPostSubmit}>\r\n                                        <div className=\"form-group\">\r\n                                            <label>帖子标题</label>\r\n                                            <input\r\n                                                type=\"text\"\r\n                                                value={postTitle}\r\n                                                onChange={(e) => setPostTitle(e.target.value)}\r\n                                                placeholder=\"请输入标题\"\r\n                                                required\r\n                                            />\r\n                                        </div>\r\n\r\n                                        <div className=\"form-group\">\r\n                                            <label>帖子内容</label>\r\n                                            <textarea\r\n                                                value={postContent}\r\n                                                onChange={(e) => setPostContent(e.target.value)}\r\n                                                placeholder=\"详细描述你的问题\"\r\n                                                required\r\n                                            />\r\n                                        </div>\r\n\r\n                                        <div className=\"form-group\">\r\n                                            <label>上传图片</label>\r\n                                            <div className=\"upload-image-btn\">\r\n                                                <input\r\n                                                    type=\"file\"\r\n                                                    id=\"image-upload\"\r\n                                                    accept=\"image/*\"\r\n                                                    onChange={handleImageUpload}\r\n                                                    style={{display: 'none'}}\r\n                                                />\r\n                                                <label htmlFor=\"image-upload\">\r\n                                                    {selectedImage ? '已选择图片' : '选择图片'}\r\n                                                </label>\r\n                                                {selectedImage && (\r\n                                                    <span className=\"image-name\">{selectedImage.name}</span>\r\n                                                )}\r\n                                            </div>\r\n                                        </div>\r\n\r\n                                        <div className=\"form-actions\">\r\n                                            <button\r\n                                                type=\"button\"\r\n                                                className=\"cancel-btn\"\r\n                                                onClick={() => setShowPostModal(false)}\r\n                                            >\r\n                                                取消\r\n                                            </button>\r\n                                            <button\r\n                                                type=\"submit\"\r\n                                                className=\"submit-btn\"\r\n                                            >\r\n                                                确认发帖\r\n                                            </button>\r\n                                        </div>\r\n                                    </form>\r\n                                </div>\r\n                            </div>\r\n                        )}\r\n                    </div>\r\n                    \r\n                \r\n\r\n                    \r\n                );\r\n            // 在Dashboard.jsx的renderContent函数中修改case 'help'部分\r\n            case 'help':\r\n                return (\r\n                    <div className=\"content-area\" data-testid=\"help-section\">\r\n                        {/* 求助区搜索框 */}\r\n                        <div className=\"section-search-container\">\r\n                            <input\r\n                                type=\"text\"\r\n                                placeholder=\"搜索求助...\"\r\n                                value={helpSearch}\r\n                                onChange={(e) => setHelpSearch(e.target.value)}\r\n                                className=\"section-search-input\"\r\n                                onKeyPress={(e) => e.key === 'Enter' && handleSearchHelp()}\r\n                            />\r\n                            <button \r\n                                className=\"search-button\"\r\n                                onClick={handleSearchHelp}\r\n                            >\r\n                                搜索\r\n                            </button>\r\n                            <button \r\n                                className=\"reset-button\"\r\n                                onClick={handleResetHelpSearch}\r\n                                style={{marginLeft: '10px'}}\r\n                            >\r\n                                重置\r\n                            </button>\r\n                        </div>\r\n\r\n                        {/* 新增发帖按钮 */}\r\n                        <div className=\"post-header\">\r\n                            <button\r\n                                className=\"create-post-btn\"\r\n                                onClick={() => setShowPostModal(true)}\r\n                            >\r\n                                ＋ 发帖求助\r\n                            </button>\r\n                        </div>\r\n\r\n                        {/* 加载状态和错误提示 */}\r\n                        {helpLoading && <div className=\"loading\">加载中...</div>}\r\n                        {helpError && <div className=\"error\">{helpError}</div>}\r\n\r\n                        {/* 求助区帖子列表 */}\r\n                        <div className=\"help-list\">\r\n                            {helpPosts.map(post => (\r\n                                <div\r\n                                    key={post.id}\r\n                                    className={`help-post ${post.isSolved ? 'solved' : ''}`}\r\n                                    onClick={() => navigate(`/help/${post.id}`)}\r\n                                >\r\n                                    <div className=\"post-header\">\r\n                                        <img\r\n                                            src={post.authorAvatar || 'https://via.placeholder.com/40'}\r\n                                            alt={post.authorId}\r\n                                            className=\"post-avatar\"\r\n                                        />\r\n                                        <div className=\"post-author\">{post.authorId}</div>\r\n                                        <div className=\"post-date\">\r\n                                            {new Date(post.createTime).toLocaleDateString()}\r\n                                        </div>\r\n                                        {post.isSolved && <span className=\"solved-badge\">已解决</span>}\r\n                                    </div>\r\n                                    <h3 className=\"post-title\">{post.title}</h3>\r\n                                    <p className=\"post-content\">{post.content}</p>\r\n                                    <div className=\"post-stats\">\r\n                                        <span className=\"post-likes\">👍 {post.likeCount || 0}</span>\r\n                                        <span className=\"post-comments\">💬 {post.replyCount || 0}</span>\r\n                                    </div>\r\n                                </div>\r\n                            ))}\r\n                        </div>\r\n\r\n                        {/* 在帖子列表后添加分页控件 */}\r\n                        <div className=\"pagination\">\r\n                            <button\r\n                                onClick={() => fetchHelpPosts(currentPage - 1)}\r\n                                disabled={currentPage === 1}\r\n                            >\r\n                                上一页\r\n                            </button>\r\n\r\n                            {Array.from({length: totalPages}, (_, i) => i + 1).map(page => (\r\n                                <button\r\n                                    key={page}\r\n                                    onClick={() => fetchHelpPosts(page)}\r\n                                    className={currentPage === page ? 'active' : ''}\r\n                                >\r\n                                    {page}\r\n                                </button>\r\n                            ))}\r\n\r\n                            <button\r\n                                onClick={() => fetchHelpPosts(currentPage + 1)}\r\n                                disabled={currentPage === totalPages}\r\n                            >\r\n                                下一页\r\n                            </button>\r\n                        </div>\r\n\r\n                        {/* 新增发帖弹窗 */}\r\n                        {showPostModal && (\r\n                            <div className=\"post-modal-overlay\">\r\n                                <div className=\"post-modal\">\r\n                                    <h3>发布求助帖</h3>\r\n                                    <button\r\n                                        className=\"modal-close-btn\"\r\n                                        onClick={() => setShowPostModal(false)}\r\n                                    >\r\n                                        ×\r\n                                    </button>\r\n\r\n                                    <form onSubmit={handleHelpPostSubmit}>\r\n                                        <div className=\"form-group\">\r\n                                            <label>帖子标题</label>\r\n                                            <input\r\n                                                type=\"text\"\r\n                                                value={postTitle}\r\n                                                onChange={(e) => setPostTitle(e.target.value)}\r\n                                                placeholder=\"请输入标题\"\r\n                                                required\r\n                                            />\r\n                                        </div>\r\n\r\n                                        <div className=\"form-group\">\r\n                                            <label>帖子内容</label>\r\n                                            <textarea\r\n                                                value={postContent}\r\n                                                onChange={(e) => setPostContent(e.target.value)}\r\n                                                placeholder=\"详细描述你的问题\"\r\n                                                required\r\n                                            />\r\n                                        </div>\r\n\r\n                                        <div className=\"form-group\">\r\n                                            <label>上传图片</label>\r\n                                            <div className=\"upload-image-btn\">\r\n                                                <input\r\n                                                    type=\"file\"\r\n                                                    id=\"image-upload\"\r\n                                                    accept=\"image/*\"\r\n                                                    onChange={handleImageUpload}\r\n                                                    style={{display: 'none'}}\r\n                                                />\r\n                                                <label htmlFor=\"image-upload\">\r\n                                                    {selectedImage ? '已选择图片' : '选择图片'}\r\n                                                </label>\r\n                                                {selectedImage && (\r\n                                                    <span className=\"image-name\">{selectedImage.name}</span>\r\n                                                )}\r\n                                            </div>\r\n                                        </div>\r\n\r\n                                        <div className=\"form-actions\">\r\n                                            <button\r\n                                                type=\"button\"\r\n                                                className=\"cancel-btn\"\r\n                                                onClick={() => setShowPostModal(false)}\r\n                                            >\r\n                                                取消\r\n                                            </button>\r\n                                            <button\r\n                                                type=\"submit\"\r\n                                                className=\"submit-btn\"\r\n                                            >\r\n                                                确认发帖\r\n                                            </button>\r\n                                        </div>\r\n                                    </form>\r\n                                </div>\r\n                            </div>\r\n                        )}\r\n                    </div>\r\n                );\r\n            default:\r\n                return <div className=\"content-area\" data-testid=\"default-section\">公告区内容</div>;\r\n        }\r\n        \r\n    };\r\n\r\n    if (loading) return <div className=\"loading\">加载中...</div>;\r\n    if (error) return <div className=\"error\">{error}</div>;\r\n\r\n    return (\r\n        <div className=\"dashboard-container\" data-testid=\"dashboard-container\">\r\n            {/* 顶部栏 */}\r\n            <div className=\"top-bar\" data-testid=\"top-bar\">\r\n                {/* 平台名称替换搜索框 */}\r\n                <div className=\"platform-name\">\r\n                    <h2>PT资源站</h2>\r\n                </div>\r\n\r\n                <div className=\"user-actions\">\r\n                    {/* 新增管理员按钮 - 只有管理员可见 */}\r\n                    {userInfo?.isAdmin && (\r\n                        <button\r\n                            className=\"admin-center-button\"\r\n                            onClick={() => navigate('/administer')}\r\n                        >\r\n                            管理员中心\r\n                        </button>\r\n                    )}\r\n\r\n                    <div className=\"user-info\" data-testid=\"user-info\">\r\n                        <img\r\n                            src={userInfo?.avatar || 'https://via.placeholder.com/40'}\r\n                            alt=\"用户头像\"\r\n                            className=\"user-avatar\"\r\n                            onClick={() => navigate('/personal')}\r\n                            style={{cursor: 'pointer'}}\r\n                        />\r\n                        <span className=\"username\">{userInfo?.name || '用户'}</span>\r\n                        <button onClick={onLogout} className=\"logout-button\">退出</button>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n\r\n            {/* 导航栏 */}\r\n            {/* handleTabchange函数替换了原本的setactivetab函数 */}\r\n            <div className=\"nav-tabs\">\r\n                <button\r\n                    className={`tab-button ${activeTab === 'announcement' ? 'active' : ''}`}\r\n                    onClick={() => handleTabChange('announcement')}\r\n                >\r\n                    公告区\r\n                </button>\r\n                <button\r\n                    className={`tab-button ${activeTab === 'share' ? 'active' : ''}`}\r\n                    onClick={() => handleTabChange('share')}\r\n                >\r\n                    分享区\r\n                </button>\r\n                <button\r\n                    className={`tab-button ${activeTab === 'request' ? 'active' : ''}`}\r\n                    onClick={() => handleTabChange('request')}\r\n                >\r\n                    求种区\r\n                </button>\r\n                <button\r\n                    className={`tab-button ${activeTab === 'help' ? 'active' : ''}`}\r\n                    onClick={() => handleTabChange('help')}\r\n                >\r\n                    求助区\r\n                </button>\r\n            </div>\r\n\r\n            {/* 内容区 */}\r\n            {renderContent()}\r\n            {/* 下载模态框 - 添加在这里 */}\r\n            {showDownloadModal && selectedTorrent && (\r\n                <div className=\"modal-overlay\">\r\n                    <div className=\"download-modal\">\r\n                        <h3>下载 {selectedTorrent.torrentName}</h3>\r\n                        <button \r\n                            className=\"close-btn\"\r\n                            onClick={() => !isDownloading && setShowDownloadModal(false)}\r\n                            disabled={isDownloading}\r\n                        >\r\n                            ×\r\n                        </button>\r\n                        \r\n                        <div className=\"form-group\">\r\n                            <label>下载路径:</label>\r\n                            <input\r\n                                type=\"text\"\r\n                                value={downloadPath}\r\n                                onChange={(e) => {\r\n                                    // 实时格式化显示\r\n                                    let path = e.target.value\r\n                                        .replace(/\\t/g, '')\r\n                                        .replace(/\\\\/g, '/')\r\n                                        .replace(/\\s+/g, ' ');\r\n                                    setDownloadPath(path);\r\n                                }}\r\n                                disabled={isDownloading}\r\n                                placeholder=\"例如: D:/downloads/\"\r\n                            />\r\n                        </div>\r\n                        \r\n                        {isDownloading && (\r\n                            <div className=\"progress-container\">\r\n                                <div className=\"progress-bar\" style={{ width: `${downloadProgress}%` }}>\r\n                                    {downloadProgress}%\r\n                                </div>\r\n                            </div>\r\n                        )}\r\n                        \r\n                        <div className=\"modal-actions\">\r\n                            <button\r\n                                onClick={() => !isDownloading && setShowDownloadModal(false)}\r\n                                disabled={isDownloading}\r\n                            >\r\n                                取消\r\n                            </button>\r\n                            <button\r\n                                onClick={handleDownload}\r\n                                disabled={isDownloading || !downloadPath}\r\n                            >\r\n                                {isDownloading ? '下载中...' : '开始下载'}\r\n                            </button>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            )}\r\n        </div>\r\n    );\r\n};\r\n\r\nexport default Dashboard;","import { api } from './auth';\r\n\r\n// 获取所有公告\r\nexport const getAnnouncements = () => {\r\n  return api.get('/announcement/list');\r\n};\r\n\r\n\r\nexport const postAnnouncement = (data) => {\r\n  // 创建 FormData 对象\r\n  const formData = new FormData();\r\n  formData.append('title', data.title);\r\n  formData.append('content', data.content);\r\n\r\n  return api.post('/announcement/create', formData);\r\n}\r\n\r\n\r\n// 获取最新公告\r\nexport const getLatestAnnouncements = () => {\r\n  return api.get('/announcement/latest');\r\n};\r\n\r\n// 获取公告详情\r\nexport const getAnnouncementDetail = (id) => {\r\n  return api.get(`/announcement/${id}`);\r\n};\r\n\r\n","// src/api/personal.js\r\nimport { api } from './auth';\r\n\r\n/**\r\n * 获取用户信息\r\n * @returns {Promise<Object>} 用户信息对象\r\n */\r\nexport const getUserInfo = async () => {\r\n  try {\r\n    const response = await api.get('/user/userInfo');\r\n    if (response.data.code === 200) {\r\n        const userData = response.data.data;\r\n        return {\r\n            username: userData.username,\r\n            level: userData.level,\r\n            registTime: formatDate(userData.registTime),\r\n            magicPoints: userData.magicPoints,\r\n            upload: userData.upload, \r\n            download: userData.download, \r\n            shareRate: userData.shareRate.toFixed(2)\r\n        };\r\n    }\r\n    throw new Error(response.data.message || '获取用户信息失败');\r\n  } catch (error) {\r\n    console.error('获取用户信息失败:', error);\r\n    throw error;\r\n  }\r\n};\r\n\r\nexport const formatFileSize = (bytes) => {\r\n    if (bytes < 1024) {\r\n      return bytes + ' B';\r\n    }\r\n    const kb = bytes / 1024;\r\n    if (kb < 1024) {\r\n      return kb.toFixed(2) + ' KB';\r\n    }\r\n    const mb = kb / 1024;\r\n    if (mb < 1024) {\r\n      return mb.toFixed(2) + ' MB';\r\n    }\r\n    const gb = mb / 1024;\r\n    return gb.toFixed(2) + ' GB';\r\n  };\r\n  \r\n  \r\n  export const getDownloadQuota = async () => {\r\n    try {\r\n      const response = await api.get('/user/allowDownload');\r\n      if (response.data.code === 200) {\r\n        const data = response.data.data;\r\n        return {\r\n          total: data.total,  // 已经是字节\r\n          used: data.used,\r\n          remaining: data.remaining\r\n        };\r\n      }\r\n      throw new Error(response.data.message || '获取下载额度失败');\r\n    } catch (error) {\r\n      console.error('获取下载额度失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n\r\n// 修正后的时间格式化（正确处理时区）\r\nconst formatDate = (dateString) => {\r\n    const date = new Date(dateString);\r\n    const year = date.getFullYear();\r\n    const month = String(date.getMonth() + 1).padStart(2, '0');\r\n    const day = String(date.getDate()).padStart(2, '0');\r\n    return `${year}-${month}-${day}`;\r\n  };\r\n\r\n\r\n  export const getDownloadProgress = async () => {\r\n    try {\r\n      const response = await api.get('/torrent/getProgress');\r\n      if (response.data.code === 200) {\r\n        return response.data.data.progresses;\r\n      }\r\n      throw new Error(response.data.message || '获取下载进度失败');\r\n    } catch (error) {\r\n      console.error('获取下载进度失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n\r\n  export const getUserTorrents = async (page = 1, size = 5) => {\r\n    try {\r\n      const response = await api.get('/torrent/get/torrentMyself', {\r\n        params: { page, size }\r\n      });\r\n      if (response.data.code === 200) {\r\n        const records = response.data.data.records.map(item => ({\r\n          ...item.torrent,\r\n          downloadCount: item.downloadCount,\r\n          formattedSize: item.formattedSize\r\n        }));\r\n        return {\r\n          records: records,\r\n          total: response.data.data.total\r\n        };\r\n      }\r\n      throw new Error(response.data.message || '获取上传记录失败');\r\n    } catch (error) {\r\n      console.error('获取上传记录失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n  \r\n\r\n  export const deleteTorrent = async (id) => {\r\n    try {\r\n      const response = await api.delete(`/torrent/deleteTorrent/${id}`);\r\n      if (response.data.code === 200) {\r\n        return response.data;\r\n      }\r\n      throw new Error(response.data.message || '删除种子失败');\r\n    } catch (error) {\r\n      console.error('删除种子失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n\r\n\r\n  export const generateInviteCode = async () => {\r\n    try {\r\n      const response = await api.post('/invitecode/generate');\r\n      if (response.data.code === 200) {\r\n        return response.data.data.inviteCode;\r\n      }\r\n      throw new Error(response.data.message || '生成邀请码失败');\r\n    } catch (error) {\r\n      console.error('生成邀请码失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n\r\n  export const getUserInviteCodes = async () => {\r\n    try {\r\n      const response = await api.get('/invitecode/userInviteCode');\r\n      if (response.data.code === 200) {\r\n        return response.data.data.inviteCode;\r\n      }\r\n      throw new Error(response.data.message || '获取邀请码列表失败');\r\n    } catch (error) {\r\n      console.error('获取邀请码列表失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n\r\n  export const exchangeUpload = async (magicPoints) => {\r\n    try {\r\n      const response = await api.post('/user/exchangeUpload', {\r\n        magicPoint: magicPoints\r\n      });\r\n      if (response.data.code === 200) {\r\n        return response.data;\r\n      }\r\n      throw new Error(response.data.message || '兑换上传量失败');\r\n    } catch (error) {\r\n      console.error('兑换上传量失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n\r\n  export const updatePassword = async (oldPassword, newPassword) => {\r\n    try {\r\n      const response = await api.put('/user/password', {\r\n        oldPassword,\r\n        newPassword\r\n      });\r\n      if (response.data.code === 200) {\r\n        return response.data;\r\n      }\r\n      throw new Error(response.data.message || '修改密码失败');\r\n    } catch (error) {\r\n      console.error('修改密码失败:', error);\r\n      throw error;\r\n    }\r\n  };\r\n","// Personal.jsx\r\nimport React, { useState, useEffect } from 'react';\r\nimport { useNavigate, useLocation, Outlet } from 'react-router-dom';\r\nimport { getUserInfo, getDownloadQuota, getDownloadProgress } from '../../api/personal';\r\nimport './Personal.css';\r\nimport ActionCard from './ActionCard';\r\n\r\nconst Personal = () => {\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  const [userData, setUserData] = useState(null);\r\n  const [loading, setLoading] = useState(true);\r\n  const [error, setError] = useState(null);\r\n  const [downloadProgress, setDownloadProgress] = useState({});\r\n\r\n  useEffect(() => {\r\n    const fetchData = async () => {\r\n      try {\r\n        // 并行获取用户信息和下载额度\r\n        const [userInfo, downloadQuota] = await Promise.all([\r\n          getUserInfo(),\r\n          getDownloadQuota()\r\n        ]);\r\n        \r\n        setUserData({\r\n          username: userInfo.username,\r\n          avatar: 'https://via.placeholder.com/150',\r\n          joinDate: userInfo.registTime,\r\n          level: userInfo.level, // 可以根据userInfo.level设置不同等级\r\n          points: userInfo.magicPoints,\r\n          upload: userInfo.upload,\r\n          download: userInfo.download,\r\n          ratio: userInfo.shareRate,\r\n          downloadQuota: {\r\n            total: downloadQuota.total,\r\n            used: downloadQuota.used,\r\n            remaining: downloadQuota.remaining\r\n          }\r\n        });\r\n      } catch (err) {\r\n        setError(err.message);\r\n      } finally {\r\n        setLoading(false);\r\n      }\r\n    };\r\n\r\n    fetchData();\r\n  }, []);\r\n\r\n  // 获取下载进度数据\r\n  const fetchDownloadProgress = async () => {\r\n    try {\r\n      const progressData = await getDownloadProgress();\r\n      setDownloadProgress(progressData);\r\n    } catch (err) {\r\n      console.error('获取下载进度失败:', err);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    // 初始获取下载进度\r\n    fetchDownloadProgress();\r\n    \r\n    // 设置定时器，每10秒获取一次下载进度\r\n    const intervalId = setInterval(fetchDownloadProgress, 10000);\r\n    \r\n    // 组件卸载时清除定时器\r\n    return () => clearInterval(intervalId);\r\n  }, []);\r\n\r\n\r\n  if (loading) {\r\n    return <div className=\"loading\">加载中...</div>;\r\n  }\r\n\r\n  if (error) {\r\n    return <div className=\"error\">错误: {error}</div>;\r\n  }\r\n\r\n  if (!userData) {\r\n    return <div className=\"error\">未获取到用户数据</div>;\r\n  }\r\n\r\n  const features = [\r\n    { \r\n      title: '兑换区', \r\n      description: '下载量/邀请码',\r\n      path: '/personal/Exchange' // 相对路径\r\n    },\r\n    { \r\n      title: '上传记录', \r\n      description: '管理上传的资源',\r\n      path: '/personal/Upload' \r\n    },\r\n    { \r\n      title: '消息通知', \r\n      description: '查看系统消息',\r\n      path: '/personal/Notice' \r\n    },\r\n    { \r\n      title: '设置', \r\n      description: '修改个人资料',\r\n      path: '/personal/Setting' \r\n    }\r\n  ];\r\n\r\n  const handleCardClick = (path) => {\r\n    navigate(path); // 相对导航\r\n  };\r\n\r\n  const handleBack = () => {\r\n    if (location.state?.fromSubpage) {\r\n      // 如果是从子页面返回，则继续返回到Dashboard\r\n      navigate(`/dashboard/${location.state.dashboardTab || ''}`, {\r\n        replace: true\r\n      });\r\n    } else {\r\n      // 普通返回逻辑\r\n      navigate(-1);\r\n    }\r\n  };\r\n\r\n  const formatSize = (bytes) => {\r\n    if (bytes < 1024) return `${bytes} B`;\r\n    const kb = bytes / 1024;\r\n    if (kb < 1024) return `${kb.toFixed(2)} KB`;\r\n    const mb = kb / 1024;\r\n    if (mb < 1024) return `${mb.toFixed(2)} MB`;\r\n    const gb = mb / 1024;\r\n    return `${gb.toFixed(2)} GB`;\r\n  };\r\n\r\n  // 添加进度条颜色函数\r\n  const getProgressColor = (percentage) => {\r\n    if (percentage < 0.3) return '#4CAF50'; // 绿色\r\n    if (percentage < 0.7) return '#FFC107'; // 黄色\r\n    return '#F44336'; // 红色\r\n  };\r\n\r\n  return (\r\n    <div className=\"personal-container\">\r\n      {/* 返回按钮 */}\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        &larr; 返回\r\n      </button>\r\n      \r\n      {/* 用户基本信息卡片 */}\r\n      <div className=\"profile-card\">\r\n        <div className=\"profile-header\">\r\n          <img \r\n            src={userData.avatar} \r\n            alt={userData.username} \r\n            className=\"profile-avatar\"\r\n          />\r\n          <div className=\"profile-info\">\r\n            <h2 className=\"username\">{userData.username}</h2>\r\n            <div className=\"user-meta\">\r\n              <span>加入时间: {userData.joinDate}</span>\r\n              <span>会员等级: Lv.{userData.level}</span> \r\n            </div>\r\n          </div>\r\n        </div>\r\n        \r\n        {/* 用户数据统计 */}\r\n        <div className=\"stats-grid\">\r\n          <div className=\"stat-item\">\r\n            <div className=\"stat-label\">保种积分</div>\r\n            <div className=\"stat-value\">{userData.points}</div>\r\n          </div>\r\n          <div className=\"stat-item\">\r\n            <div className=\"stat-label\">上传量</div>\r\n            <div className=\"stat-value\">{formatSize(userData.upload)}</div>\r\n          </div>\r\n          <div className=\"stat-item\">\r\n            <div className=\"stat-label\">下载量</div>\r\n            <div className=\"stat-value\">{formatSize(userData.download)}</div>\r\n          </div>\r\n          <div className=\"stat-item\">\r\n            <div className=\"stat-label\">分享率</div>\r\n            <div className=\"stat-value\">{userData.ratio}</div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      \r\n      {/* 下载额度卡片 */}\r\n      <div className=\"quota-card\">\r\n        <h3>下载额度</h3>\r\n        <div className=\"quota-info\">\r\n          <span className=\"quota-used\">\r\n            {formatSize(userData.downloadQuota.used)} 已使用\r\n          </span>\r\n          <span className=\"quota-remaining\">\r\n            {formatSize(userData.downloadQuota.remaining)} 剩余\r\n          </span>\r\n        </div>\r\n        <div className=\"progress-bar\">\r\n          <div \r\n            className=\"progress-fill\"\r\n            style={{ \r\n              width: `${(userData.downloadQuota.used / userData.downloadQuota.total) * 100}%`,\r\n              backgroundColor: getProgressColor(userData.downloadQuota.used / userData.downloadQuota.total)\r\n            }}\r\n          ></div>\r\n        </div>\r\n        <div className=\"quota-total\">\r\n          总额度: {formatSize(userData.downloadQuota.total)}\r\n        </div>\r\n      </div>\r\n\r\n      {Object.keys(downloadProgress).length > 0 && (\r\n        <div className=\"progress-card\">\r\n          <h3>当前下载进度</h3>\r\n          {Object.entries(downloadProgress).map(([taskId, progress]) => (\r\n            <div key={taskId} className=\"download-task\">\r\n              <div className=\"task-info\">\r\n                <span className=\"task-id\">任务: {taskId.substring(0, 8)}...</span>\r\n                <span className=\"task-progress\">{Math.round(progress * 100)}%</span>\r\n              </div>\r\n              <div className=\"progress-bar\">\r\n                <div \r\n                  className=\"progress-fill\"\r\n                  style={{ width: `${progress * 100}%` }}\r\n                ></div>\r\n              </div>\r\n            </div>\r\n          ))}\r\n        </div>\r\n      )}\r\n      \r\n      {/* 功能卡片区 */}\r\n      <div className=\"action-cards\">\r\n        {features.map((feature) => (\r\n          <div \r\n            key={feature.path}\r\n            className=\"action-card\"\r\n            onClick={() => handleCardClick(feature.path)}\r\n          >\r\n            <h3>{feature.title}</h3>\r\n            <p>{feature.description}</p>\r\n          </div>\r\n        ))}\r\n      </div>\r\n\r\n      {/* 子路由出口 */}\r\n      <div className=\"subpage-container\">\r\n        <Outlet />\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default Personal;","// src/components/AuthForm.jsx\r\nimport React, { useState } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { login, register } from '../api/auth';\r\nimport './AuthForm.css';\r\n\r\nconst AuthForm = ({ onLoginSuccess }) => {\r\n  const [isLogin, setIsLogin] = useState(true);\r\n  const [formData, setFormData] = useState({\r\n    username: '',\r\n    password: '',\r\n    code: ''\r\n  });\r\n  const [error, setError] = useState('');\r\n  const [isLoading, setIsLoading] = useState(false);\r\n  const navigate = useNavigate();\r\n\r\n  const handleChange = (e) => {\r\n    const { name, value } = e.target;\r\n    setFormData(prev => ({ ...prev, [name]: value }));\r\n  };\r\n\r\n  const handleSubmit = async (e) => {\r\n    e.preventDefault();\r\n    \r\n    try {\r\n      if (isLogin) {\r\n            const response = await login(formData.username, formData.password);\r\n            if (response.data.code === 200) {\r\n              localStorage.setItem('token', response.data.data.token);\r\n              localStorage.setItem('username', formData.username);\r\n              onLoginSuccess?.();\r\n              navigate('/dashboard');\r\n            } else {\r\n              setError(response.data.message || '登录失败');\r\n            }\r\n          } else {\r\n            const response = await register(\r\n              formData.username,\r\n              formData.password,\r\n              formData.code\r\n            );\r\n            if (response.data.code === 200) {\r\n              setError('');\r\n              setIsLogin(true);\r\n              setFormData({ username: '', password: '', code: '' });\r\n            } else {\r\n              setError(response.data.message || '注册失败');\r\n            }\r\n          }\r\n        } catch (err) {\r\n          setError(err.message || (isLogin ? '登录失败' : '注册失败'));\r\n        } finally {\r\n          setIsLoading(false);\r\n        }\r\n      \r\n\r\n      \r\n  };\r\n\r\n  return (\r\n    <div className=\"auth-container\">\r\n      <h1 className=\"auth-title\">PT影视资源站</h1>\r\n      \r\n      <div className=\"auth-form-wrapper\">\r\n        {isLogin ? (\r\n          <form className=\"auth-form\" onSubmit={handleSubmit}>\r\n            <h2>用户登录</h2>\r\n            {error && <div className=\"error-message\">{error}</div>}\r\n            \r\n            <div className=\"form-group\">\r\n              <input\r\n                type=\"text\"\r\n                name=\"username\"\r\n                placeholder=\"账号\"\r\n                value={formData.username}\r\n                onChange={handleChange}\r\n                required\r\n              />\r\n            </div>\r\n            \r\n            <div className=\"form-group\">\r\n              <input\r\n                type=\"password\"\r\n                name=\"password\"\r\n                placeholder=\"密码\"\r\n                value={formData.password}\r\n                onChange={handleChange}\r\n                required\r\n              />\r\n            </div>\r\n            \r\n            <button type=\"submit\" className=\"auth-button\" disabled={isLoading}>\r\n              {isLoading ? '登录中...' : '登录'}\r\n            </button>\r\n            \r\n            <div className=\"auth-switch\">\r\n              <span>未有账户？</span>\r\n              <button type=\"button\" onClick={() => setIsLogin(false)} className=\"switch-button\">\r\n                去注册\r\n              </button>\r\n            </div>\r\n          </form>\r\n        ) : (\r\n          <form className=\"auth-form\" onSubmit={handleSubmit}>\r\n            <h2>用户注册</h2>\r\n            {error && <div className=\"error-message\">{error}</div>}\r\n            \r\n            <div className=\"form-group\">\r\n              <input\r\n                type=\"text\"\r\n                name=\"username\"\r\n                placeholder=\"账号\"\r\n                value={formData.username}\r\n                onChange={handleChange}\r\n                required\r\n              />\r\n            </div>\r\n            \r\n            <div className=\"form-group\">\r\n              <input\r\n                type=\"password\"\r\n                name=\"password\"\r\n                placeholder=\"密码\"\r\n                value={formData.password}\r\n                onChange={handleChange}\r\n                required\r\n              />\r\n            </div>\r\n            \r\n            <div className=\"form-group\">\r\n              <input\r\n                type=\"text\"\r\n                name=\"code\"\r\n                placeholder=\"邀请码\"\r\n                value={formData.code}\r\n                onChange={handleChange}\r\n                required\r\n              />\r\n            </div>\r\n            \r\n            <button type=\"submit\" className=\"auth-button\" disabled={isLoading}>\r\n              {isLoading ? '注册中...' : '注册'}\r\n            </button>\r\n            \r\n            <div className=\"auth-switch\">\r\n              <span>已有账户？</span>\r\n              <button type=\"button\" onClick={() => setIsLogin(true)} className=\"switch-button\">\r\n                去登录\r\n              </button>\r\n            </div>\r\n          </form>\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default AuthForm;","import React, { useEffect, useState } from 'react';\r\nimport { useNavigate, useLocation, useParams } from 'react-router-dom';\r\nimport { getAnnouncementDetail } from '../api/announcement';\r\nimport { message } from 'antd';\r\nimport './AnnouncementDetail.css';\r\n\r\nconst AnnouncementDetail = () => {\r\n  const navigate = useNavigate();\r\n  const { id } = useParams();\r\n  const [announcement, setAnnouncement] = useState(null);\r\n  const [loading, setLoading] = useState(true);\r\n  const [error, setError] = useState('');\r\n  const location = useLocation();\r\n  const { state } = useLocation();\r\n  \r\n  \r\n  const handleBack = () => {\r\n    const fromTab = location.state?.fromTab; // 从跳转时传递的 state 中获取\r\n    if (fromTab) {\r\n    navigate(`/dashboard/${fromTab}`); // 明确返回对应标签页\r\n    } else {\r\n        navigate(-1); // 保底策略\r\n    }\r\n}\r\n  useEffect(() => {\r\n    const fetchAnnouncement = async () => {\r\n      try {\r\n        setLoading(true);\r\n        const response = await getAnnouncementDetail(id);\r\n        if (response.data.code === 200) {\r\n          setAnnouncement(response.data.data.announcement);\r\n        } else {\r\n          setError(response.data.message || '获取公告详情失败');\r\n        }\r\n      } catch (err) {\r\n        setError('获取公告详情失败');\r\n        message.error('获取公告详情失败');\r\n      } finally {\r\n        setLoading(false);\r\n      }\r\n    };\r\n\r\n    fetchAnnouncement();\r\n  }, [id]);\r\n  \r\n    \r\n\r\n  if (error || !announcement) {\r\n    return (\r\n      <div className=\"announcement-container\">\r\n        <button className=\"back-button\" onClick={handleBack}>\r\n          &larr; 返回\r\n        </button>\r\n        <div className=\"error-message\">{error || '公告不存在'}</div>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div className=\"announcement-container\">\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        &larr; 返回\r\n      </button>\r\n\r\n      <div className=\"announcement-detail\">\r\n        <div className=\"announcement-header\">\r\n          <h1>{announcement.title}</h1>\r\n          <div className=\"announcement-meta\">\r\n            <span>发布日期：{announcement.createTime}</span>\r\n          </div>\r\n        </div>\r\n\r\n        <div className=\"announcement-content\">\r\n          {announcement.content.split('\\n').map((paragraph, i) => (\r\n            <p key={i}>{paragraph}</p>\r\n          ))}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default AnnouncementDetail;\r\n\r\n\r\n    ","import React, { useState, useEffect } from 'react';\r\nimport { useParams, useNavigate, useLocation } from 'react-router-dom';\r\nimport { \r\n  getTorrentDetail, \r\n  likeTorrent, \r\n  addTorrentComment \r\n} from '../api/torrent';\r\nimport { \r\n  likeTorrentComment, \r\n  addCommentReply \r\n} from '../api/torrentComment';\r\nimport './TorrentDetail.css';\r\n\r\n\r\nconst TorrentDetail = ({ onLogout }) => {\r\n  const { id } = useParams();\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  const [torrent, setTorrent] = useState(null);\r\n  const [comments, setComments] = useState([]);\r\n  const [newComment, setNewComment] = useState('');\r\n  const [setReplyingTo] = useState(null);\r\n  const [replyContent, setReplyContent] = useState('');\r\n  const [loading, setLoading] = useState(true);\r\n  const [error, setError] = useState('');\r\n  const [activeReplyId, setActiveReplyId] = useState(null);\r\n  const [replyModal, setReplyModal] = useState({\r\n    visible: false,\r\n    replyingTo: null,\r\n    replyingToUsername: '',\r\n    isReply: false\r\n  });\r\n\r\n  // 确保openReplyModal接收username参数\r\nconst openReplyModal = (commentId, username) => {\r\n  setReplyModal({\r\n    visible: true,\r\n    replyingTo: commentId,\r\n    replyingToUsername: username,  // 确保这里接收username\r\n    isReply: false\r\n  });\r\n};\r\n\r\n  // 关闭回复弹窗\r\n  const closeReplyModal = () => {\r\n    setReplyModal({\r\n      visible: false,\r\n      replyingTo: null,\r\n      replyingToUsername: '',\r\n      isReply: false\r\n    });\r\n    setReplyContent('');\r\n  };\r\n\r\n  const Comment = ({ comment, onLike, onReply, isReply = false }) => {\r\n    return (\r\n      <div className={`comment-container ${isReply ? \"is-reply\" : \"\"}`}>\r\n        <div className=\"comment-item\">\r\n          <div className=\"comment-avatar\">\r\n            {(comment.authorId || \"?\").charAt(0)} {/* 修复点 */}\r\n          </div>\r\n          <div className=\"comment-content\">\r\n            <div className=\"comment-header\">\r\n              <span className=\"comment-user\">{comment.authorId || \"匿名用户\"}</span>\r\n              {comment.replyTo && (\r\n                <span className=\"reply-to\">回复 @{comment.replyTo}</span>\r\n              )}\r\n              <span className=\"comment-time\">\r\n                {new Date(comment.createTime).toLocaleString()}\r\n              </span>\r\n            </div>\r\n            <p className=\"comment-text\">{comment.content}</p>\r\n            <div className=\"comment-actions\">\r\n              <button onClick={() => onLike(comment.id)}>\r\n                👍 ({comment.likeCount || 0})\r\n              </button>\r\n              <button onClick={() => onReply(comment.id, comment.authorId)}>\r\n                回复\r\n              </button>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    );\r\n  };\r\n\r\n    // 递归渲染评论组件\r\n  const renderComment = (comment, depth = 0) => {\r\n    return (\r\n      <div key={comment.id} style={{ marginLeft: `${depth * 30}px` }}>\r\n        <Comment\r\n          comment={comment}\r\n          onLike={handleLikeComment}\r\n          onReply={openReplyModal}\r\n          isReply={depth > 0}\r\n        />\r\n        \r\n        {/* 递归渲染所有回复 */}\r\n        {comment.replies && comment.replies.map(reply => \r\n          renderComment(reply, depth + 1)\r\n        )}\r\n      </div>\r\n    );\r\n  };\r\n    \r\n\r\n\r\n  const fetchTorrentDetail = async () => {\r\n    try {\r\n      setLoading(true);\r\n      const response = await getTorrentDetail(id);\r\n      console.log('API Response:', JSON.parse(JSON.stringify(response.data.data.comments))); // 深度拷贝避免Proxy影响\r\n      setTorrent(response.data.data.torrent);\r\n      setComments(response.data.data.comments);\r\n    } catch (err) {\r\n      setError(err.response?.data?.message || '获取种子详情失败');\r\n    } finally {\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchTorrentDetail();\r\n  }, [id]);\r\n\r\n  // 点赞种子\r\n  const handleLikeTorrent = async () => {\r\n    try {\r\n      await likeTorrent(id);\r\n      setTorrent(prev => ({\r\n        ...prev,\r\n        likeCount: prev.likeCount + 1\r\n      }));\r\n    } catch (err) {\r\n      setError('点赞失败: ' + (err.response?.data?.message || err.message));\r\n    }\r\n  };\r\n\r\n  const handleCommentSubmit = async (e) => {\r\n    e.preventDefault();\r\n    if (!newComment.trim()) return;\r\n    \r\n    try {\r\n      const username = localStorage.getItem('username');\r\n      const response = await addTorrentComment(id, {\r\n        content: newComment,\r\n        authorId: username\r\n      });\r\n  \r\n      // 修改这里的响应处理逻辑\r\n      if (response.data && response.data.code === 200) {\r\n        await fetchTorrentDetail();\r\n        \r\n        setNewComment('');\r\n      } else {\r\n        setError(response.data.message || '评论失败');\r\n      }\r\n    } catch (err) {\r\n      setError('评论失败: ' + (err.response?.data?.message || err.message));\r\n    }\r\n  };\r\n  \r\n  \r\n  const handleLikeComment = async (commentId) => {\r\n    try {\r\n      await likeTorrentComment(commentId);\r\n      \r\n      // 递归更新评论点赞数\r\n      const updateComments = (comments) => {\r\n        return comments.map(comment => {\r\n          // 当前评论匹配\r\n          if (comment.id === commentId) {\r\n            return { ...comment, likeCount: comment.likeCount + 1 };\r\n          }\r\n          \r\n          // 递归处理回复\r\n          if (comment.replies && comment.replies.length > 0) {\r\n            return {\r\n              ...comment,\r\n              replies: updateComments(comment.replies)\r\n            };\r\n          }\r\n          \r\n          return comment;\r\n        });\r\n      };\r\n  \r\n      setComments(prev => updateComments(prev));\r\n    } catch (err) {\r\n      setError('点赞失败: ' + (err.response?.data?.message || err.message));\r\n    }\r\n  };\r\n  // 修改startReply函数\r\n  const startReply = (commentId) => {\r\n    if (activeReplyId === commentId) {\r\n      // 如果点击的是已经激活的回复按钮，则关闭\r\n      setActiveReplyId(null);\r\n      setReplyingTo(null);\r\n    } else {\r\n      // 否则打开新的回复框\r\n      setActiveReplyId(commentId);\r\n      setReplyingTo(commentId);\r\n    }\r\n  };\r\n\r\n  const handleReplySubmit = async (e) => {\r\n    e.preventDefault();\r\n    if (!replyContent.trim()) return;\r\n  \r\n    try {\r\n      const username = localStorage.getItem('username');\r\n      const response = await addCommentReply(replyModal.replyingTo, {\r\n        content: replyContent,\r\n        authorId: username\r\n      });\r\n  \r\n      console.log('回复响应:', response.data); // 调试\r\n      \r\n      if (response.data && response.data.code === 200) {\r\n        await fetchTorrentDetail();\r\n  \r\n        closeReplyModal();\r\n      }\r\n    } catch (err) {\r\n      console.error('回复错误:', err);\r\n      setError('回复失败: ' + (err.response?.data?.message || err.message));\r\n    }\r\n  };\r\n\r\n\r\n  // 返回按钮\r\n  const handleBack = () => {\r\n    const fromTab = location.state?.fromTab || 'share';\r\n    navigate(`/dashboard/${fromTab}`);\r\n  };\r\n\r\n  if (loading) return <div className=\"loading\">加载中...</div>;\r\n  if (error) return <div className=\"error\">{error}</div>;\r\n  if (!torrent) return <div className=\"error\">种子不存在</div>;\r\n\r\n  return (\r\n    <div className=\"torrent-detail-container\">\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        &larr; 返回资源区\r\n      </button>\r\n      \r\n      <div className=\"torrent-main\">\r\n        <div className=\"torrent-cover\">\r\n          <div className=\"cover-placeholder\">\r\n            {torrent.torrentName.charAt(0)}\r\n          </div>\r\n        </div>\r\n        \r\n        <div className=\"torrent-info\">\r\n          <h1 className=\"torrent-title\">{torrent.torrentName}</h1>\r\n          \r\n          <div className=\"uploader-info\">\r\n            <div className=\"uploader-avatar\">\r\n              {torrent.username.charAt(0)}\r\n            </div>\r\n            <div className=\"uploader-details\">\r\n              <span className=\"uploader-name\">{torrent.username}</span>\r\n              <span className=\"upload-time\">\r\n                {new Date(torrent.createTime).toLocaleString()}\r\n              </span>\r\n            </div>\r\n          </div>\r\n          \r\n          <div className=\"torrent-meta\">\r\n            <p><strong>类型:</strong> {torrent.category}</p>\r\n            <p><strong>地区:</strong> {torrent.region}</p>\r\n            <p><strong>分辨率:</strong> {torrent.resolution}</p>\r\n            <p><strong>字幕:</strong> {torrent.subtitle}</p>\r\n            {torrent.size && <p><strong>大小:</strong> {torrent.size}</p>}\r\n          </div>\r\n          \r\n          <div className=\"torrent-description\">\r\n            <h3>资源描述</h3>\r\n            <p>{torrent.description}</p>\r\n          </div>\r\n          \r\n          <div className=\"interaction-buttons\">\r\n            <button \r\n              className=\"like-button\"\r\n              onClick={handleLikeTorrent}\r\n            >\r\n              <span>👍 点赞 ({torrent.likeCount})</span>\r\n            </button>\r\n            <button className=\"download-button\">\r\n              <span>⬇️ 立即下载</span>\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n      \r\n      <div className=\"comments-section\">\r\n        <h2>评论 ({torrent.replyCount})</h2>\r\n        \r\n        <form onSubmit={handleCommentSubmit} className=\"comment-form\">\r\n          <textarea\r\n            value={newComment}\r\n            onChange={(e) => setNewComment(e.target.value)}\r\n            placeholder=\"写下你的评论...\"\r\n            rows=\"3\"\r\n            required\r\n          />\r\n          <button type=\"submit\">发表评论</button>\r\n        </form>\r\n        \r\n        <div className=\"comment-list\">\r\n          {comments.map(comment => renderComment(comment))}\r\n        </div>\r\n\r\n        {replyModal.visible && (\r\n          <div className=\"reply-modal-overlay\">\r\n            <div className=\"reply-modal\">\r\n              <div className=\"modal-header\">\r\n                <h3>回复 @{replyModal.replyingToUsername}</h3>\r\n                <button onClick={closeReplyModal} className=\"close-modal\">&times;</button>\r\n              </div>\r\n              <form onSubmit={handleReplySubmit}>\r\n                <textarea\r\n                  value={replyContent}\r\n                  onChange={(e) => setReplyContent(e.target.value)}\r\n                  placeholder={`回复 @${replyModal.replyingToUsername}...`}\r\n                  rows=\"5\"\r\n                  autoFocus\r\n                  required\r\n                />\r\n                <div className=\"modal-actions\">\r\n                  <button type=\"button\" onClick={closeReplyModal} className=\"cancel-btn\">\r\n                    取消\r\n                  </button>\r\n                  <button type=\"submit\" className=\"submit-btn\">\r\n                    发送回复\r\n                  </button>\r\n                </div>\r\n              </form>\r\n            </div>\r\n          </div>\r\n        )}\r\n\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default TorrentDetail;","import { api } from './auth';\r\n\r\nexport const likeTorrentComment = (commentId) => {\r\n  return api.post(`/torrent/comments/${commentId}/like`);\r\n};\r\n\r\nexport const getCommentReplies = (commentId) => {\r\n  return api.get(`/torrent/comments/${commentId}/replies`);\r\n};\r\n\r\nexport const addCommentReply = (commentId, replyData) => {\r\n  return api.post(`/torrent/comments/${commentId}/replies`, replyData);\r\n};","import React, { useState, useEffect, useRef } from 'react';\r\nimport { useParams, useNavigate, useLocation } from 'react-router-dom';\r\nimport { \r\n  getRequestPostDetail,\r\n  addRequestPostComment,\r\n  likeRequestPost,\r\n  deleteRequestPost\r\n} from '../api/requestPost';\r\nimport {\r\n  likeRequestPostComment,\r\n  getCommentReplies,\r\n  addRequestCommentReply,\r\n  deleteRequestComment\r\n} from '../api/requestComment';\r\nimport './RequestDetail.css';\r\n\r\nconst RequestDetail = () => {\r\n  const { id } = useParams();\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  const fileInputRef = useRef(null);\r\n  const [post, setPost] = useState(null);\r\n  const [comments, setComments] = useState([]);\r\n  const [loading, setLoading] = useState(true);\r\n  const [error, setError] = useState(null);\r\n  const [newComment, setNewComment] = useState('');\r\n  const [replyContent, setReplyContent] = useState('');\r\n  const [replyImage, setReplyImage] = useState([]);\r\n  const [commentImage, setCommentImage] = useState([]);\r\n  const [expandedReplies, setExpandedReplies] = useState({}); // 记录哪些评论的回复是展开的\r\n  const [loadingReplies, setLoadingReplies] = useState({});\r\n  const [setReplyingTo] = useState(null);\r\n  \r\n\r\n  const [activeReplyId, setActiveReplyId] = useState(null);\r\n    const [replyModal, setReplyModal] = useState({\r\n      visible: false,\r\n      replyingTo: null,\r\n      replyingToUsername: '',\r\n      isReply: false\r\n    });\r\n  \r\n    // 确保openReplyModal接收username参数\r\n  const openReplyModal = (commentId, username) => {\r\n    setReplyModal({\r\n      visible: true,\r\n      replyingTo: commentId,\r\n      replyingToUsername: username,  // 确保这里接收username\r\n      isReply: false\r\n    });\r\n  };\r\n  \r\n    // 关闭回复弹窗\r\n    const closeReplyModal = () => {\r\n      setReplyModal({\r\n        visible: false,\r\n        replyingTo: null,\r\n        replyingToUsername: '',\r\n        isReply: false\r\n      });\r\n      setReplyContent('');\r\n    };\r\n\r\n    const Comment = ({ comment, onLike, onReply, onDelete, isReply = false }) => {\r\n      return (\r\n        <div className={`comment-container ${isReply ? \"is-reply\" : \"\"}`}>\r\n          <div className=\"comment-item\">\r\n            <div className=\"comment-avatar\">\r\n              {(comment.authorId || \"?\").charAt(0)} {/* 修复点 */}\r\n            </div>\r\n            <div className=\"comment-content\">\r\n              <div className=\"comment-header\">\r\n                <span className=\"comment-user\">{comment.authorId || \"匿名用户\"}</span>\r\n                {comment.replyTo && (\r\n                  <span className=\"reply-to\">回复 @{comment.replyTo}</span>\r\n                )}\r\n                <span className=\"comment-time\">\r\n                  {new Date(comment.createTime).toLocaleString()}\r\n                </span>\r\n              </div>\r\n              <p className=\"comment-text\">{comment.content}</p>\r\n              {/* 添加评论图片展示 */}\r\n              {comment.imageUrl && (\r\n                <div className=\"comment-image-container\">\r\n                  <img \r\n                    src={`http://localhost:8088${comment.imageUrl}`} \r\n                    alt=\"评论图片\" \r\n                    className=\"comment-image\"\r\n                    onClick={() => window.open(comment.imageUrl, '_blank')}\r\n                  />\r\n                </div>\r\n              )}\r\n              <div className=\"comment-actions\">\r\n                <button onClick={() => onLike(comment.id)}>\r\n                  👍 ({comment.likeCount || 0})\r\n                </button>\r\n                <button onClick={() => onReply(comment.id, comment.authorId)}>\r\n                  回复\r\n                </button>\r\n                {comment.authorId === localStorage.getItem('username') && (\r\n                  <button \r\n                    className=\"delete-comment-btn\"\r\n                    onClick={() => onDelete(comment.id)}\r\n                  >\r\n                    删除\r\n                  </button>\r\n                )}\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      );\r\n    };\r\n\r\n      // 递归渲染评论组件\r\n  const renderComment = (comment, depth = 0) => {\r\n    return (\r\n      <div key={comment.id} style={{ marginLeft: `${depth * 30}px` }}>\r\n        <Comment\r\n          comment={comment}\r\n          onLike={handleLikeComment}\r\n          onReply={openReplyModal}\r\n          isReply={depth > 0}\r\n          onDelete={handleDeleteComment}\r\n        />\r\n        \r\n        {/* 递归渲染所有回复 */}\r\n        {comment.replies && comment.replies.map(reply => \r\n          renderComment(reply, depth + 1)\r\n        )}\r\n      </div>\r\n    );\r\n  };\r\n\r\n\r\n   const fetchPostDetail = async () => {\r\n      try {\r\n        setLoading(true);\r\n        const response = await getRequestPostDetail(id);\r\n        console.log('API Response:', JSON.parse(JSON.stringify(response.data.data.comments))); // 深度拷贝避免Proxy影响\r\n        setPost(response.data.data.post);\r\n        setComments(response.data.data.comments);\r\n      } catch (err) {\r\n        setError(err.response?.data?.message || '获取帖子详情失败');\r\n      } finally {\r\n        setLoading(false);\r\n      }\r\n    };\r\n  \r\n    useEffect(() => {\r\n      fetchPostDetail();\r\n    }, [id]);\r\n  \r\n    // 点赞帖子\r\n    const handleLikePost = async () => {\r\n      try {\r\n        await likeRequestPost(id);\r\n        setPost(prev => ({\r\n          ...prev,\r\n          likeCount: prev.likeCount + 1\r\n        }));\r\n      } catch (err) {\r\n        setError('点赞失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n\r\n     // 添加删除处理函数\r\n     const handleDeletePost = async (postId) => {\r\n      if (window.confirm('确定要删除这个帖子吗？所有评论也将被删除！')) {\r\n        try {\r\n          const username = localStorage.getItem('username');\r\n          await deleteRequestPost(postId, username);\r\n          navigate('/dashboard/request'); // 删除成功后返回求助区\r\n        } catch (err) {\r\n          setError('删除失败: ' + (err.response?.data?.message || err.message));\r\n        }\r\n      }\r\n    };\r\n  \r\n    const handleCommentSubmit = async (e) => {\r\n      e.preventDefault();\r\n      if (!newComment.trim()) return;\r\n      \r\n      try {\r\n        const username = localStorage.getItem('username');\r\n        const formData = new FormData();\r\n        formData.append('content', newComment);\r\n        formData.append('authorId', username);\r\n        if (commentImage) {\r\n          formData.append('image', commentImage);\r\n        }\r\n\r\n        const response = await addRequestPostComment(id, formData);\r\n    \r\n        // 修改这里的响应处理逻辑\r\n        if (response.data && response.data.code === 200) {\r\n          await fetchPostDetail();\r\n          \r\n          setNewComment('');\r\n          setCommentImage(null); // 清空评论图片\r\n        } else {\r\n          setError(response.data.message || '评论失败');\r\n        }\r\n      } catch (err) {\r\n        setError('评论失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n    \r\n    \r\n    const handleLikeComment = async (commentId) => {\r\n      try {\r\n        await likeRequestPostComment(commentId);\r\n        \r\n        // 递归更新评论点赞数\r\n        const updateComments = (comments) => {\r\n          return comments.map(comment => {\r\n            // 当前评论匹配\r\n            if (comment.id === commentId) {\r\n              return { ...comment, likeCount: comment.likeCount + 1 };\r\n            }\r\n            \r\n            // 递归处理回复\r\n            if (comment.replies && comment.replies.length > 0) {\r\n              return {\r\n                ...comment,\r\n                replies: updateComments(comment.replies)\r\n              };\r\n            }\r\n            \r\n            return comment;\r\n          });\r\n        };\r\n    \r\n        setComments(prev => updateComments(prev));\r\n      } catch (err) {\r\n        setError('点赞失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n\r\n    const handleDeleteComment = async (commentId) => {\r\n      if (window.confirm('确定要删除这条评论吗？')) {\r\n        try {\r\n          const username = localStorage.getItem('username');\r\n          await deleteRequestComment(commentId, username);\r\n          await fetchPostDetail(); // 刷新评论列表\r\n        } catch (err) {\r\n          setError('删除失败: ' + (err.response?.data?.message || err.message));\r\n        }\r\n      }\r\n    };\r\n\r\n\r\n    // 修改startReply函数\r\n    const startReply = (commentId) => {\r\n      if (activeReplyId === commentId) {\r\n        // 如果点击的是已经激活的回复按钮，则关闭\r\n        setActiveReplyId(null);\r\n        setReplyingTo(null);\r\n      } else {\r\n        // 否则打开新的回复框\r\n        setActiveReplyId(commentId);\r\n        setReplyingTo(commentId);\r\n      }\r\n    };\r\n  \r\n    const handleReplySubmit = async (e) => {\r\n      e.preventDefault();\r\n      if (!replyContent.trim()) return;\r\n    \r\n      try {\r\n        const username = localStorage.getItem('username');\r\n        const response = await addRequestCommentReply(replyModal.replyingTo, {\r\n          authorId: username,\r\n          content: replyContent,\r\n          image: replyImage\r\n        });\r\n    \r\n        console.log('回复响应:', response.data); // 调试\r\n        \r\n        if (response.data && response.data.code === 200) {\r\n          await fetchPostDetail();\r\n          setReplyContent('');\r\n          closeReplyModal();\r\n        }\r\n      } catch (err) {\r\n        console.error('回复错误:', err);\r\n        setError('回复失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n  \r\n  \r\n    // 返回按钮\r\n    const handleBack = () => {\r\n      const fromTab = location.state?.fromTab || 'share';\r\n      navigate(`/dashboard/request`);\r\n    };\r\n  \r\n    \r\n\r\n  const handleMarkSolved = () => {\r\n    // TODO: 实现标记为已解决的功能\r\n    setPost(prev => ({\r\n      ...prev,\r\n      isSolved: !prev.isSolved\r\n    }));\r\n  };\r\n\r\n  // const handleImageUpload = (e) => {\r\n  //   const files = Array.from(e.target.files);\r\n  //   const newImages = files.map(file => URL.createObjectURL(file));\r\n  //   setImages(prev => [...prev, ...newImages]);\r\n  // };\r\n\r\n  // const handleRemoveImage = (index) => {\r\n  //   setImages(prev => prev.filter((_, i) => i !== index));\r\n  // };\r\n\r\n  \r\n\r\n  if (loading) return <div className=\"loading\">加载中...</div>;\r\n  if (error) return <div className=\"error\">{error}</div>;\r\n  if (!post) return <div className=\"error\">帖子不存在</div>;\r\n\r\n  return (\r\n    <div className=\"request-detail-container\">\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        &larr; 返回求助区\r\n      </button>\r\n      \r\n      <div className={`request-post ${post.isSolved ? 'solved' : ''}`}>\r\n        <div className=\"post-header\">\r\n          <img \r\n            src={post.authorAvatar || 'https://via.placeholder.com/40'} \r\n            alt={post.authorId} \r\n            className=\"post-avatar\" \r\n          />\r\n          <div className=\"post-meta\">\r\n            <div className=\"post-author\">{post.authorId}</div>\r\n            <div className=\"post-date\">\r\n              {new Date(post.createTime).toLocaleString()}\r\n              </div>\r\n          </div>\r\n          {post.isSolved && <span ClassName=\"solved-badge\">已解决</span>}\r\n          <div classname=\"delete-post\">\r\n            {post.authorId === localStorage.getItem('username') && (\r\n              <button \r\n                className=\"delete-button\"\r\n                onClick={() => handleDeletePost(post.id)}\r\n              >\r\n                删除帖子\r\n              </button>\r\n            )}\r\n          </div>\r\n        </div>\r\n        \r\n        <h1 className=\"post-title\">{post.title}</h1>\r\n        \r\n        <div className=\"post-content\">\r\n          {post.content.split('\\n').map((para, i) => (\r\n            <p key={i}>{para}</p>\r\n          ))}\r\n          {/* 添加帖子图片展示 */}\r\n          {post.imageUrl && (\r\n            <div className=\"post-image-container\">\r\n              <img \r\n                src={`http://localhost:8088${post.imageUrl}`} \r\n                alt=\"帖子图片\" \r\n                className=\"post-image\"\r\n                // onError={(e) => {\r\n                //   e.target.onerror = null; \r\n                //   e.target.src = 'https://via.placeholder.com/400x300?text=图片加载失败';\r\n                //   console.error('图片加载失败:', post.imageUrl);\r\n                // }}\r\n              />\r\n            </div>\r\n          )}\r\n        </div>\r\n        \r\n        <div className=\"post-actions\">\r\n          <button \r\n            className={`like-button ${post.isLiked ? 'liked' : ''}`}\r\n            onClick={handleLikePost}\r\n          >\r\n            👍 点赞 ({post.likeCount})\r\n          </button>\r\n          <button \r\n            className={`solve-button ${post.isSolved ? 'solved' : ''}`}\r\n            onClick={handleMarkSolved}\r\n          >\r\n            {post.isSolved ? '✓ 已解决' : '标记为已解决'}\r\n          </button>\r\n        </div>\r\n      </div>\r\n      \r\n       <div className=\"comments-section\">\r\n        <h2>评论 ({post.replyCount})</h2>\r\n        \r\n        <form onSubmit={handleCommentSubmit} className=\"comment-form\">\r\n          <textarea\r\n            value={newComment}\r\n            onChange={(e) => setNewComment(e.target.value)}\r\n            placeholder=\"写下你的评论...\"\r\n            rows=\"3\"\r\n            required\r\n          />\r\n          <button type=\"submit\">发表评论</button>\r\n\r\n          {/* 图片上传部分 */}\r\n          <div className=\"form-group\">\r\n            <div className=\"upload-image-btn\">\r\n              <input \r\n                type=\"file\" \r\n                accept=\"image/*\" \r\n                onChange={(e) => setCommentImage(e.target.files[0])} \r\n                data-testid=\"comment-image-input\"  \r\n              />\r\n            </div>\r\n          </div>\r\n        </form>\r\n        \r\n        \r\n        <div className=\"comment-list\">\r\n          {comments.map(comment => renderComment(comment))}\r\n        </div>\r\n\r\n        {replyModal.visible && (\r\n          <div className=\"reply-modal-overlay\">\r\n            <div className=\"reply-modal\">\r\n              <div className=\"modal-header\">\r\n                <h3>回复 @{replyModal.replyingToUsername}</h3>\r\n                <button onClick={closeReplyModal} className=\"close-modal\">&times;</button>\r\n              </div>\r\n              <form onSubmit={handleReplySubmit}>\r\n                <textarea\r\n                  value={replyContent}\r\n                  onChange={(e) => setReplyContent(e.target.value)}\r\n                  placeholder={`回复 @${replyModal.replyingToUsername}...`}\r\n                  rows=\"5\"\r\n                  autoFocus\r\n                  required\r\n                />\r\n\r\n                {/* 图片上传部分 */}\r\n                <div className=\"form-group\">\r\n                  <div className=\"upload-image-btn\">\r\n                    <input \r\n                      type=\"file\" \r\n                      accept=\"image/*\" \r\n                      onChange={(e) => setReplyImage(e.target.files[0])} \r\n                    />\r\n                  </div>\r\n                </div>\r\n\r\n                <div className=\"modal-actions\">\r\n                  <button type=\"button\" onClick={closeReplyModal} className=\"cancel-btn\">\r\n                    取消\r\n                  </button>\r\n                  <button type=\"submit\" className=\"submit-btn\">\r\n                    发送回复\r\n                  </button>\r\n                </div>\r\n              </form>\r\n            </div>\r\n          </div>\r\n        )}\r\n\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default RequestDetail;","import { api } from './auth';\r\n\r\nexport const likeRequestPostComment = (commentId) => {\r\n  return api.post(`/request/comments/${commentId}/like`);\r\n};\r\n\r\nexport const getRequestCommentReplies = (commentId) => {\r\n  return api.get(`/request/comments/${commentId}/replies`);\r\n};\r\n\r\nexport const addRequestCommentReply = (commentId, replyData) => {\r\n  const formData = new FormData();\r\n  formData.append('authorId', replyData.authorId);\r\n  formData.append('content', replyData.content);\r\n\r\n  // 如果有图片，添加到formData\r\n  if (replyData.image) {\r\n    formData.append('image', replyData.image);\r\n  }\r\n\r\n  return api.post(`/request/comments/${commentId}/replies`, formData);\r\n};\r\n\r\nexport const deleteRequestComment = (commentId, authorId) => {\r\n  return api.delete(`/request/comments/${commentId}`, {\r\n    params: { authorId }\r\n  });\r\n};","import React, { useState, useEffect, useRef } from 'react';\r\nimport { useParams, useNavigate, useLocation } from 'react-router-dom';\r\nimport { \r\n  getHelpPostDetail,\r\n  addHelpPostComment,\r\n  likeHelpPost,\r\n  deleteHelpPost\r\n} from '../api/helpPost';\r\nimport {\r\n  likeHelpPostComment,\r\n  getCommentReplies,\r\n  addHelpCommentReply,\r\n  deleteHelpComment\r\n} from '../api/helpComment';\r\nimport './HelpDetail.css';\r\n\r\nconst HelpDetail = () => {\r\n  const { id } = useParams();\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  const fileInputRef = useRef(null);\r\n  const [post, setPost] = useState(null);\r\n  const [comments, setComments] = useState([]);\r\n  const [loading, setLoading] = useState(true);\r\n  const [error, setError] = useState(null);\r\n  const [newComment, setNewComment] = useState('');\r\n  const [replyContent, setReplyContent] = useState('');\r\n  const [replyImage, setReplyImage] = useState([]);\r\n  const [commentImage, setCommentImage] = useState([]);\r\n  const [expandedReplies, setExpandedReplies] = useState({}); // 记录哪些评论的回复是展开的\r\n  const [loadingReplies, setLoadingReplies] = useState({});\r\n  const [setReplyingTo] = useState(null);\r\n  \r\n\r\n  const [activeReplyId, setActiveReplyId] = useState(null);\r\n    const [replyModal, setReplyModal] = useState({\r\n      visible: false,\r\n      replyingTo: null,\r\n      replyingToUsername: '',\r\n      isReply: false\r\n    });\r\n  \r\n    // 确保openReplyModal接收username参数\r\n  const openReplyModal = (commentId, username) => {\r\n    setReplyModal({\r\n      visible: true,\r\n      replyingTo: commentId,\r\n      replyingToUsername: username,  // 确保这里接收username\r\n      isReply: false\r\n    });\r\n  };\r\n  \r\n    // 关闭回复弹窗\r\n    const closeReplyModal = () => {\r\n      setReplyModal({\r\n        visible: false,\r\n        replyingTo: null,\r\n        replyingToUsername: '',\r\n        isReply: false\r\n      });\r\n      setReplyContent('');\r\n    };\r\n\r\n    const Comment = ({ comment, onLike, onReply, onDelete, isReply = false }) => {\r\n      return (\r\n        <div className={`comment-container ${isReply ? \"is-reply\" : \"\"}`}>\r\n          <div className=\"comment-item\">\r\n            <div className=\"comment-avatar\">\r\n              {(comment.authorId || \"?\").charAt(0)} {/* 修复点 */}\r\n            </div>\r\n            <div className=\"comment-content\">\r\n              <div className=\"comment-header\">\r\n                <span className=\"comment-user\">{comment.authorId || \"匿名用户\"}</span>\r\n                {comment.replyTo && (\r\n                  <span className=\"reply-to\">回复 @{comment.replyTo}</span>\r\n                )}\r\n                <span className=\"comment-time\">\r\n                  {new Date(comment.createTime).toLocaleString()}\r\n                </span>\r\n              </div>\r\n              <p className=\"comment-text\">{comment.content}</p>\r\n              {/* 添加评论图片展示 */}\r\n              {comment.imageUrl && (\r\n                <div className=\"comment-image-container\">\r\n                  <img \r\n                    src={`http://localhost:8088${comment.imageUrl}`} \r\n                    alt=\"评论图片\" \r\n                    className=\"comment-image\"\r\n                    onClick={() => window.open(comment.imageUrl, '_blank')}\r\n                  />\r\n                </div>\r\n              )}\r\n              <div className=\"comment-actions\">\r\n                <button onClick={() => onLike(comment.id)}>\r\n                  👍 ({comment.likeCount || 0})\r\n                </button>\r\n                <button onClick={() => onReply(comment.id, comment.authorId)}>\r\n                  回复\r\n                </button>\r\n                {comment.authorId === localStorage.getItem('username') && (\r\n                  <button \r\n                    className=\"delete-comment-btn\"\r\n                    onClick={() => onDelete(comment.id)}\r\n                  >\r\n                    删除\r\n                  </button>\r\n                )}\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      );\r\n    };\r\n\r\n      // 递归渲染评论组件\r\n  const renderComment = (comment, depth = 0) => {\r\n    return (\r\n      <div key={comment.id} style={{ marginLeft: `${depth * 30}px` }}>\r\n        <Comment\r\n          comment={comment}\r\n          onLike={handleLikeComment}\r\n          onReply={openReplyModal}\r\n          isReply={depth > 0}\r\n          onDelete={handleDeleteComment}\r\n        />\r\n        \r\n        {/* 递归渲染所有回复 */}\r\n        {comment.replies && comment.replies.map(reply => \r\n          renderComment(reply, depth + 1)\r\n        )}\r\n      </div>\r\n    );\r\n  };\r\n\r\n\r\n   const fetchPostDetail = async () => {\r\n      try {\r\n        setLoading(true);\r\n        const response = await getHelpPostDetail(id);\r\n        console.log('API Response:', JSON.parse(JSON.stringify(response.data.data.comments))); // 深度拷贝避免Proxy影响\r\n        setPost(response.data.data.post);\r\n        setComments(response.data.data.comments);\r\n      } catch (err) {\r\n        setError(err.response?.data?.message || '获取帖子详情失败');\r\n      } finally {\r\n        setLoading(false);\r\n      }\r\n    };\r\n  \r\n    useEffect(() => {\r\n      fetchPostDetail();\r\n    }, [id]);\r\n  \r\n    // 点赞帖子\r\n    const handleLikePost = async () => {\r\n      try {\r\n        await likeHelpPost(id);\r\n        setPost(prev => ({\r\n          ...prev,\r\n          likeCount: prev.likeCount + 1\r\n        }));\r\n      } catch (err) {\r\n        setError('点赞失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n\r\n     // 添加删除处理函数\r\n     const handleDeletePost = async (postId) => {\r\n      if (window.confirm('确定要删除这个帖子吗？所有评论也将被删除！')) {\r\n        try {\r\n          const username = localStorage.getItem('username');\r\n          await deleteHelpPost(postId, username);\r\n          navigate('/dashboard/help'); // 删除成功后返回求助区\r\n        } catch (err) {\r\n          setError('删除失败: ' + (err.response?.data?.message || err.message));\r\n        }\r\n      }\r\n    };\r\n  \r\n    const handleCommentSubmit = async (e) => {\r\n      e.preventDefault();\r\n      if (!newComment.trim()) return;\r\n      \r\n      try {\r\n        const username = localStorage.getItem('username');\r\n        const formData = new FormData();\r\n        formData.append('content', newComment);\r\n        formData.append('authorId', username);\r\n        if (commentImage) {\r\n          formData.append('image', commentImage);\r\n        }\r\n\r\n        const response = await addHelpPostComment(id, formData);\r\n    \r\n        // 修改这里的响应处理逻辑\r\n        if (response.data && response.data.code === 200) {\r\n          await fetchPostDetail();\r\n          \r\n          setNewComment('');\r\n          setCommentImage(null); // 清空评论图片\r\n        } else {\r\n          setError(response.data.message || '评论失败');\r\n        }\r\n      } catch (err) {\r\n        setError('评论失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n    \r\n    \r\n    const handleLikeComment = async (commentId) => {\r\n      try {\r\n        await likeHelpPostComment(commentId);\r\n        \r\n        // 递归更新评论点赞数\r\n        const updateComments = (comments) => {\r\n          return comments.map(comment => {\r\n            // 当前评论匹配\r\n            if (comment.id === commentId) {\r\n              return { ...comment, likeCount: comment.likeCount + 1 };\r\n            }\r\n            \r\n            // 递归处理回复\r\n            if (comment.replies && comment.replies.length > 0) {\r\n              return {\r\n                ...comment,\r\n                replies: updateComments(comment.replies)\r\n              };\r\n            }\r\n            \r\n            return comment;\r\n          });\r\n        };\r\n    \r\n        setComments(prev => updateComments(prev));\r\n      } catch (err) {\r\n        setError('点赞失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n\r\n    const handleDeleteComment = async (commentId) => {\r\n      if (window.confirm('确定要删除这条评论吗？')) {\r\n        try {\r\n          const username = localStorage.getItem('username');\r\n          await deleteHelpComment(commentId, username);\r\n          await fetchPostDetail(); // 刷新评论列表\r\n        } catch (err) {\r\n          setError('删除失败: ' + (err.response?.data?.message || err.message));\r\n        }\r\n      }\r\n    };\r\n\r\n\r\n    // 修改startReply函数\r\n    const startReply = (commentId) => {\r\n      if (activeReplyId === commentId) {\r\n        // 如果点击的是已经激活的回复按钮，则关闭\r\n        setActiveReplyId(null);\r\n        setReplyingTo(null);\r\n      } else {\r\n        // 否则打开新的回复框\r\n        setActiveReplyId(commentId);\r\n        setReplyingTo(commentId);\r\n      }\r\n    };\r\n  \r\n    const handleReplySubmit = async (e) => {\r\n      e.preventDefault();\r\n      if (!replyContent.trim()) return;\r\n    \r\n      try {\r\n        const username = localStorage.getItem('username');\r\n        const response = await addHelpCommentReply(replyModal.replyingTo, {\r\n          authorId: username,\r\n          content: replyContent,\r\n          image: replyImage\r\n        });\r\n    \r\n        console.log('回复响应:', response.data); // 调试\r\n        \r\n        if (response.data && response.data.code === 200) {\r\n          await fetchPostDetail();\r\n          setReplyContent('');\r\n          closeReplyModal();\r\n        }\r\n      } catch (err) {\r\n        console.error('回复错误:', err);\r\n        setError('回复失败: ' + (err.response?.data?.message || err.message));\r\n      }\r\n    };\r\n  \r\n  \r\n    // 返回按钮\r\n    const handleBack = () => {\r\n      const fromTab = location.state?.fromTab || 'share';\r\n      navigate(`/dashboard/help`);\r\n    };\r\n  \r\n    \r\n\r\n  const handleMarkSolved = () => {\r\n    // TODO: 实现标记为已解决的功能\r\n    setPost(prev => ({\r\n      ...prev,\r\n      isSolved: !prev.isSolved\r\n    }));\r\n  };\r\n\r\n  // const handleImageUpload = (e) => {\r\n  //   const files = Array.from(e.target.files);\r\n  //   const newImages = files.map(file => URL.createObjectURL(file));\r\n  //   setImages(prev => [...prev, ...newImages]);\r\n  // };\r\n\r\n  // const handleRemoveImage = (index) => {\r\n  //   setImages(prev => prev.filter((_, i) => i !== index));\r\n  // };\r\n\r\n  \r\n\r\n  if (loading) return <div className=\"loading\">加载中...</div>;\r\n  if (error) return <div className=\"error\">{error}</div>;\r\n  if (!post) return <div className=\"error\">帖子不存在</div>;\r\n\r\n  return (\r\n    <div className=\"help-detail-container\">\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        &larr; 返回求助区\r\n      </button>\r\n      \r\n      <div className={`help-post ${post.isSolved ? 'solved' : ''}`}>\r\n        <div className=\"post-header\">\r\n          <img \r\n            src={post.authorAvatar || 'https://via.placeholder.com/40'} \r\n            alt={post.authorId} \r\n            className=\"post-avatar\" \r\n          />\r\n          <div className=\"post-meta\">\r\n            <div className=\"post-author\">{post.authorId}</div>\r\n            <div className=\"post-date\">\r\n              {new Date(post.createTime).toLocaleString()}\r\n              </div>\r\n          </div>\r\n          {post.isSolved && <span ClassName=\"solved-badge\">已解决</span>}\r\n          <div classname=\"delete-post\">\r\n            {post.authorId === localStorage.getItem('username') && (\r\n              <button \r\n                className=\"delete-button\"\r\n                onClick={() => handleDeletePost(post.id)}\r\n              >\r\n                删除帖子\r\n              </button>\r\n            )}\r\n          </div>\r\n        </div>\r\n        \r\n        <h1 className=\"post-title\">{post.title}</h1>\r\n        \r\n        <div className=\"post-content\">\r\n          {post.content.split('\\n').map((para, i) => (\r\n            <p key={i}>{para}</p>\r\n          ))}\r\n          {/* 添加帖子图片展示 */}\r\n          {post.imageUrl && (\r\n            <div className=\"post-image-container\">\r\n              <img \r\n                src={`http://localhost:8088${post.imageUrl}`} \r\n                alt=\"帖子图片\" \r\n                className=\"post-image\"\r\n                // onError={(e) => {\r\n                //   e.target.onerror = null; \r\n                //   e.target.src = 'https://via.placeholder.com/400x300?text=图片加载失败';\r\n                //   console.error('图片加载失败:', post.imageUrl);\r\n                // }}\r\n              />\r\n            </div>\r\n          )}\r\n        </div>\r\n        \r\n        <div className=\"post-actions\">\r\n          <button \r\n            className={`like-button ${post.isLiked ? 'liked' : ''}`}\r\n            onClick={handleLikePost}\r\n          >\r\n            👍 点赞 ({post.likeCount})\r\n          </button>\r\n          <button \r\n            className={`solve-button ${post.isSolved ? 'solved' : ''}`}\r\n            onClick={handleMarkSolved}\r\n          >\r\n            {post.isSolved ? '✓ 已解决' : '标记为已解决'}\r\n          </button>\r\n        </div>\r\n      </div>\r\n      \r\n       <div className=\"comments-section\">\r\n        <h2>评论 ({post.replyCount})</h2>\r\n        \r\n        <form onSubmit={handleCommentSubmit} className=\"comment-form\">\r\n          <textarea\r\n            value={newComment}\r\n            onChange={(e) => setNewComment(e.target.value)}\r\n            placeholder=\"写下你的评论...\"\r\n            rows=\"3\"\r\n            required\r\n          />\r\n          <button type=\"submit\">发表评论</button>\r\n\r\n          {/* 图片上传部分 */}\r\n          <div className=\"form-group\">\r\n            <div className=\"upload-image-btn\">\r\n              <input \r\n                type=\"file\" \r\n                accept=\"image/*\" \r\n                onChange={(e) => setCommentImage(e.target.files[0])} \r\n                data-testid=\"comment-image-input\"  \r\n              />\r\n            </div>\r\n          </div>\r\n        </form>\r\n        \r\n        \r\n        <div className=\"comment-list\">\r\n          {comments.map(comment => renderComment(comment))}\r\n        </div>\r\n\r\n        {replyModal.visible && (\r\n          <div className=\"reply-modal-overlay\">\r\n            <div className=\"reply-modal\">\r\n              <div className=\"modal-header\">\r\n                <h3>回复 @{replyModal.replyingToUsername}</h3>\r\n                <button onClick={closeReplyModal} className=\"close-modal\">&times;</button>\r\n              </div>\r\n              <form onSubmit={handleReplySubmit}>\r\n                <textarea\r\n                  value={replyContent}\r\n                  onChange={(e) => setReplyContent(e.target.value)}\r\n                  placeholder={`回复 @${replyModal.replyingToUsername}...`}\r\n                  rows=\"5\"\r\n                  autoFocus\r\n                  required\r\n                />\r\n\r\n                {/* 图片上传部分 */}\r\n                <div className=\"form-group\">\r\n                  <div className=\"upload-image-btn\">\r\n                    <input \r\n                      type=\"file\" \r\n                      accept=\"image/*\" \r\n                      onChange={(e) => setReplyImage(e.target.files[0])} \r\n                    />\r\n                  </div>\r\n                </div>\r\n\r\n                <div className=\"modal-actions\">\r\n                  <button type=\"button\" onClick={closeReplyModal} className=\"cancel-btn\">\r\n                    取消\r\n                  </button>\r\n                  <button type=\"submit\" className=\"submit-btn\">\r\n                    发送回复\r\n                  </button>\r\n                </div>\r\n              </form>\r\n            </div>\r\n          </div>\r\n        )}\r\n\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default HelpDetail;","import { api } from './auth';\r\n\r\nexport const likeHelpPostComment = (commentId) => {\r\n  return api.post(`/help/comments/${commentId}/like`);\r\n};\r\n\r\nexport const getHelpCommentReplies = (commentId) => {\r\n  return api.get(`/help/comments/${commentId}/replies`);\r\n};\r\n\r\nexport const addHelpCommentReply = (commentId, replyData) => {\r\n  const formData = new FormData();\r\n  formData.append('authorId', replyData.authorId);\r\n  formData.append('content', replyData.content);\r\n\r\n  // 如果有图片，添加到formData\r\n  if (replyData.image) {\r\n    formData.append('image', replyData.image);\r\n  }\r\n\r\n  return api.post(`/help/comments/${commentId}/replies`, formData);\r\n};\r\n\r\nexport const deleteHelpComment = (commentId, authorId) => {\r\n  return api.delete(`/help/comments/${commentId}`, {\r\n    params: { authorId }\r\n  });\r\n};","import React, { useState, useEffect } from 'react';\r\nimport { useNavigate, useLocation } from 'react-router-dom';\r\nimport { generateInviteCode, getUserInviteCodes, exchangeUpload, getUserInfo } from '../../api/personal';\r\nimport './personalSubpage.css';\r\n\r\nconst Exchange = () => {\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  const [inviteCodes, setInviteCodes] = useState([]);\r\n  const [userInfo, setUserInfo] = useState(null);\r\n  const [magicPoints, setMagicPoints] = useState('0'); \r\n  const [loading, setLoading] = useState(false);\r\n  const [error, setError] = useState(null);\r\n\r\n  // 获取用户信息和邀请码列表\r\n  useEffect(() => {\r\n    const fetchData = async () => {\r\n      try {\r\n        setLoading(true);\r\n        const [userData, codes] = await Promise.all([\r\n          getUserInfo(),\r\n          getUserInviteCodes()\r\n        ]);\r\n        setUserInfo(userData);\r\n        setInviteCodes(codes);\r\n      } catch (err) {\r\n        setError(err.message);\r\n      } finally {\r\n        setLoading(false);\r\n      }\r\n    };\r\n    fetchData();\r\n  }, []);\r\n\r\n  // 生成邀请码\r\n  const handleGenerateInviteCode = async () => {\r\n    try {\r\n      setLoading(true);\r\n      const newCode = await generateInviteCode();\r\n      setInviteCodes([...inviteCodes, newCode]);\r\n      // 刷新用户信息\r\n      const updatedUser = await getUserInfo();\r\n      setUserInfo(updatedUser);\r\n    } catch (err) {\r\n      setError(err.message);\r\n    } finally {\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  const handleExchangeUpload = async () => {\r\n    const points = Number(magicPoints);\r\n    if (!points || points <= 0) {\r\n      setError('请输入有效的魔力值');\r\n      return;\r\n    }\r\n    try {\r\n      setLoading(true);\r\n      await exchangeUpload(points);\r\n      // 刷新用户信息\r\n      const updatedUser = await getUserInfo();\r\n      setUserInfo(updatedUser);\r\n      setMagicPoints('0');\r\n      setError(null);\r\n    } catch (err) {\r\n      setError(err.message);\r\n    } finally {\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  const handleBack = () => {\r\n    // 返回个人中心，并携带来源标记\r\n    navigate('/personal', { \r\n      state: { \r\n        fromSubpage: true,  // 标记来自子页面\r\n        dashboardTab: location.state?.dashboardTab // 保留Dashboard的标签页状态\r\n      },\r\n      replace: true  // 替换当前历史记录\r\n    });\r\n  };\r\n\r\n  if (loading) {\r\n    return <div className=\"subpage-container\">加载中...</div>;\r\n  }\r\n\r\n  if (error) {\r\n    return (\r\n      <div className=\"subpage-container\">\r\n        <button className=\"back-button\" onClick={handleBack}>\r\n          ← 返回个人中心\r\n        </button>\r\n        <div className=\"error\">错误: {error}</div>\r\n      </div>\r\n    );\r\n  }\r\n\r\n  return (\r\n    <div className=\"subpage-container\">\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        ← 返回个人中心\r\n      </button>\r\n\r\n      <h2 className=\"page-title\">兑换区</h2>\r\n      \r\n      <div className=\"exchange-section\">\r\n        <h3>当前魔力值: {userInfo?.magicPoints || 0}</h3>\r\n        \r\n        <div className=\"exchange-card\">\r\n          <h4>兑换邀请码</h4>\r\n          <p>消耗10魔力值兑换一个邀请码</p>\r\n          <button \r\n            className=\"exchange-btn\"\r\n            onClick={handleGenerateInviteCode}\r\n            disabled={!userInfo || userInfo.magicPoints < 10}\r\n          >\r\n            兑换邀请码\r\n          </button>\r\n        </div>\r\n\r\n        <div className=\"exchange-card\">\r\n          <h4>兑换上传量</h4>\r\n          <p>1魔力值 = 1GB上传量</p>\r\n          <div className=\"exchange-input-group\">\r\n          <input\r\n            type=\"number\"\r\n            value={magicPoints}\r\n            onChange={(e) => {\r\n              // 允许空字符串或有效数字\r\n              const value = e.target.value;\r\n              if (value === '' || !isNaN(value)) {\r\n                setMagicPoints(value);\r\n              }\r\n            }}\r\n            min=\"1\"\r\n            max={userInfo?.magicPoints || 0}\r\n            placeholder=\"输入要兑换的魔力值\"\r\n          />\r\n\r\n          <button \r\n            className=\"exchange-btn\"\r\n            onClick={handleExchangeUpload}\r\n            disabled={\r\n              !magicPoints || \r\n              Number(magicPoints) <= 0 || \r\n              !userInfo || \r\n              Number(magicPoints) > userInfo.magicPoints\r\n            }\r\n          >\r\n            兑换上传量\r\n          </button>\r\n          </div>\r\n        </div>\r\n\r\n        {inviteCodes.length > 0 && (\r\n          <div className=\"invite-code-list\">\r\n            <h4>我的邀请码</h4>\r\n            <ul>\r\n              {inviteCodes.map((code, index) => (\r\n                <li key={index}>\r\n                  <span className=\"code\">{code.code}</span>\r\n                  <span className={`status ${code.isUsed ? 'used' : 'available'}`}>\r\n                    {code.isUsed ? '已使用' : '可用'}\r\n                  </span>\r\n                </li>\r\n              ))}\r\n            </ul>\r\n          </div>\r\n        )}\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default Exchange;","import React, { useState, useEffect } from 'react';\r\nimport { useNavigate, useLocation } from 'react-router-dom';\r\nimport { getUserTorrents, deleteTorrent } from '../../api/personal';\r\nimport './personalSubpage.css';\r\n\r\nconst Upload = ({ onLogout }) => {\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  const [torrents, setTorrents] = useState([]);\r\n  const [loading, setLoading] = useState(true);\r\n  const [error, setError] = useState(null);\r\n  const [pagination, setPagination] = useState({\r\n    page: 1,\r\n    size: 5,\r\n    total: 0\r\n  });\r\n\r\n\r\n\r\n  // 格式化日期\r\n  const formatDate = (dateString) => {\r\n    const date = new Date(dateString);\r\n    return date.toLocaleString();\r\n  };\r\n\r\n  // 获取上传记录\r\n  const fetchTorrents = async () => {\r\n    try {\r\n      setLoading(true);\r\n      const { records, total } = await getUserTorrents(pagination.page, pagination.size);\r\n      setTorrents(records);\r\n      setPagination(prev => ({ ...prev, total }));\r\n    } catch (err) {\r\n      setError(err.message);\r\n    } finally {\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  \r\n\r\n  // 删除种子\r\n  const handleDelete = async (id) => {\r\n    if (window.confirm('确定要删除这个种子吗？此操作不可撤销！')) {\r\n      try {\r\n        await deleteTorrent(id);\r\n        // 删除成功后刷新列表\r\n        fetchTorrents();\r\n      } catch (err) {\r\n        alert('删除失败: ' + err.message);\r\n      }\r\n    }\r\n  };\r\n\r\n  // 计算总页数\r\n  const totalPages = Math.ceil(pagination.total / pagination.size);\r\n\r\n  // 生成页码数组\r\n  const getPageNumbers = () => {\r\n    const pages = [];\r\n    const maxVisiblePages = 5; // 最多显示5个页码\r\n    \r\n    let startPage = Math.max(1, pagination.page - Math.floor(maxVisiblePages / 2));\r\n    let endPage = Math.min(totalPages, startPage + maxVisiblePages - 1);\r\n    \r\n    // 调整起始页码，确保始终显示 maxVisiblePages 个页码（如果总页数足够）\r\n    if (endPage - startPage + 1 < maxVisiblePages) {\r\n      startPage = Math.max(1, endPage - maxVisiblePages + 1);\r\n    }\r\n    \r\n    for (let i = startPage; i <= endPage; i++) {\r\n      pages.push(i);\r\n    }\r\n    \r\n    return pages;\r\n  };\r\n\r\n  // 直接跳转到指定页码\r\n  const jumpToPage = (page) => {\r\n    if (page >= 1 && page <= totalPages && page !== pagination.page) {\r\n      setPagination(prev => ({ ...prev, page }));\r\n    }\r\n  };\r\n\r\n  // 分页改变\r\n  const handlePageChange = (newPage) => {\r\n    setPagination(prev => ({ ...prev, page: newPage }));\r\n  };\r\n\r\n  useEffect(() => {\r\n    fetchTorrents();\r\n  }, [pagination.page]);\r\n\r\n  const handleBack = () => {\r\n    navigate('/personal', { \r\n      state: { \r\n        fromSubpage: true,\r\n        dashboardTab: location.state?.dashboardTab\r\n      },\r\n      replace: true\r\n    });\r\n  };\r\n\r\n  if (loading) {\r\n    return <div className=\"subpage-container\">加载中...</div>;\r\n  }\r\n\r\n  if (error) {\r\n    return <div className=\"subpage-container\">错误: {error}</div>;\r\n  }\r\n\r\n  return (\r\n    <div className=\"subpage-container\">\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        ← 返回个人中心\r\n      </button>\r\n\r\n      <h2 className=\"page-title\">上传记录</h2>\r\n      \r\n      <table className=\"uploads-table\">\r\n        <thead>\r\n          <tr>\r\n            <th>资源名称</th>\r\n            <th>大小</th>\r\n            <th>上传时间</th>\r\n            <th>下载次数</th>\r\n            <th>操作</th>\r\n          </tr>\r\n        </thead>\r\n        <tbody>\r\n          {torrents.map(torrent => (\r\n            <tr key={torrent.id} className=\"list-item\">\r\n              <td>{torrent.torrentName}</td>\r\n              <td>{torrent.formattedSize}</td>\r\n              <td>{formatDate(torrent.createTime)}</td>\r\n              <td>{torrent.downloadCount || 0}</td>\r\n              <td>\r\n                <button \r\n                  className=\"action-btn delete-btn\"\r\n                  onClick={() => handleDelete(torrent.id)}\r\n                >\r\n                  删除\r\n                </button>\r\n              </td>\r\n            </tr>\r\n          ))}\r\n        </tbody>\r\n      </table>\r\n\r\n     {/* 修改后的分页控件 */}\r\n     <div className=\"pagination\">\r\n        <button \r\n          disabled={pagination.page <= 1}\r\n          onClick={() => jumpToPage(1)}\r\n          className=\"page-nav\"\r\n        >\r\n          首页\r\n        </button>\r\n        <button \r\n          disabled={pagination.page <= 1}\r\n          onClick={() => jumpToPage(pagination.page - 1)}\r\n          className=\"page-nav\"\r\n        >\r\n          上一页\r\n        </button>\r\n        \r\n        {/* 显示页码 */}\r\n        {getPageNumbers().map(number => (\r\n          <button\r\n            key={number}\r\n            onClick={() => jumpToPage(number)}\r\n            className={`page-number ${pagination.page === number ? 'active' : ''}`}\r\n          >\r\n            {number}\r\n          </button>\r\n        ))}\r\n        \r\n        {/* 显示省略号（如果有更多页） */}\r\n        {totalPages > getPageNumbers()[getPageNumbers().length - 1] && (\r\n          <span className=\"ellipsis\">...</span>\r\n        )}\r\n        \r\n        <button \r\n          disabled={pagination.page >= totalPages}\r\n          onClick={() => jumpToPage(pagination.page + 1)}\r\n          className=\"page-nav\"\r\n        >\r\n          下一页\r\n        </button>\r\n        <button \r\n          disabled={pagination.page >= totalPages}\r\n          onClick={() => jumpToPage(totalPages)}\r\n          className=\"page-nav\"\r\n        >\r\n          末页\r\n        </button>\r\n        \r\n        <div className=\"page-info\">\r\n          <span>共 {totalPages} 页</span>\r\n          <span>跳至</span>\r\n          <input\r\n            type=\"number\"\r\n            min=\"1\"\r\n            max={totalPages}\r\n            onKeyDown={(e) => {\r\n              if (e.key === 'Enter') {\r\n                const page = parseInt(e.target.value);\r\n                if (!isNaN(page)) {\r\n                  jumpToPage(Math.max(1, Math.min(page, totalPages)));\r\n                  e.target.value = '';\r\n                }\r\n              }\r\n            }}\r\n          />\r\n          <span>页</span>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default Upload;","import React from 'react';\r\nimport { useNavigate,useLocation } from 'react-router-dom';\r\nimport './personalSubpage.css';\r\n\r\nconst Notice = ({ onLogout }) => {\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  // 模拟数据\r\n  const [notices] = React.useState([\r\n    { \r\n      id: 1, \r\n      title: '积分奖励到账', \r\n      content: '您上传的资源《盗梦空间》获得100积分奖励',\r\n      date: '2023-10-20',\r\n      read: false\r\n    },\r\n    { \r\n      id: 2, \r\n      title: '系统通知', \r\n      content: '服务器将于今晚2:00-4:00进行维护',\r\n      date: '2023-10-18',\r\n      read: true\r\n    }\r\n  ]);\r\n\r\n  const handleBack = () => {\r\n    // 返回个人中心，并携带来源标记\r\n    navigate('/personal', { \r\n      state: { \r\n        fromSubpage: true,  // 标记来自子页面\r\n        dashboardTab: location.state?.dashboardTab // 保留Dashboard的标签页状态\r\n      },\r\n      replace: true  // 替换当前历史记录\r\n    });\r\n  };\r\n\r\n  return (\r\n    <div className=\"subpage-container\">\r\n      <button className=\"back-button\" onClick={(handleBack)}>\r\n        ← 返回个人中心\r\n      </button>\r\n\r\n      <h2 className=\"page-title\">消息通知</h2>\r\n      \r\n      <div className=\"notice-list\">\r\n        {notices.map(notice => (\r\n          <div key={notice.id} className={`list-item ${!notice.read ? 'unread' : ''}`}>\r\n            <div className=\"notice-header\">\r\n              <h3>{notice.title}</h3>\r\n              <span className=\"notice-date\">{notice.date}</span>\r\n            </div>\r\n            <p className=\"notice-content\">{notice.content}</p>\r\n          </div>\r\n        ))}\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default Notice;","import React, { useState,useEffect } from 'react';\r\nimport { useNavigate, useLocation } from 'react-router-dom';\r\nimport { getUserInfo, updatePassword } from '../../api/personal';\r\nimport './personalSubpage.css';\r\n\r\nconst Setting = ({ onLogout }) => {\r\n  const navigate = useNavigate();\r\n  const location = useLocation();\r\n  const [userInfo, setUserInfo] = useState(null);\r\n  const [loading, setLoading] = useState(false);\r\n  const [error, setError] = useState(null);\r\n  const [success, setSuccess] = useState(null);\r\n  const [passwordForm, setPasswordForm] = useState({\r\n    oldPassword: '',\r\n    newPassword: '',\r\n    confirmPassword: ''\r\n  });\r\n\r\n  // 获取用户信息\r\n  useEffect(() => {\r\n    const fetchUserInfo = async () => {\r\n      try {\r\n        const info = await getUserInfo();\r\n        setUserInfo(info);\r\n      } catch (err) {\r\n        console.error('获取用户信息失败:', err);\r\n      }\r\n    };\r\n    fetchUserInfo();\r\n  }, []);\r\n\r\n  const handleBack = () => {\r\n    navigate('/personal', { \r\n      state: { \r\n        fromSubpage: true,\r\n        dashboardTab: location.state?.dashboardTab\r\n      },\r\n      replace: true\r\n    });\r\n  };\r\n\r\n  const handlePasswordChange = (e) => {\r\n    const { name, value } = e.target;\r\n    setPasswordForm(prev => ({\r\n      ...prev,\r\n      [name]: value\r\n    }));\r\n  };\r\n\r\n  const handlePasswordSubmit = async (e) => {\r\n    e.preventDefault();\r\n    setError(null);\r\n    setSuccess(null);\r\n\r\n    // 验证表单\r\n    if (!passwordForm.oldPassword || !passwordForm.newPassword || !passwordForm.confirmPassword) {\r\n      setError('请填写所有密码字段');\r\n      return;\r\n    }\r\n\r\n    if (passwordForm.newPassword !== passwordForm.confirmPassword) {\r\n      setError('新密码与确认密码不一致');\r\n      return;\r\n    }\r\n\r\n    if (passwordForm.newPassword.length < 6) {\r\n      setError('新密码长度至少为6位');\r\n      return;\r\n    }\r\n\r\n    try {\r\n      setLoading(true);\r\n      await updatePassword(passwordForm.oldPassword, passwordForm.newPassword);\r\n      setSuccess('密码修改成功');\r\n      setPasswordForm({\r\n        oldPassword: '',\r\n        newPassword: '',\r\n        confirmPassword: ''\r\n      });\r\n    } catch (err) {\r\n      setError(err.message || '修改密码失败');\r\n    } finally {\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  return (\r\n    <div className=\"subpage-container\">\r\n      <button className=\"back-button\" onClick={handleBack}>\r\n        ← 返回个人中心\r\n      </button>\r\n\r\n      <h2 className=\"page-title\">个人设置</h2>\r\n\r\n      <div className=\"setting-section\">\r\n        <div className=\"user-info-card\">\r\n          <h3>账户信息</h3>\r\n          <div className=\"info-item\">\r\n            <label>用户名:</label>\r\n            <span>{userInfo?.username || '加载中...'}</span>\r\n          </div>\r\n          <p className=\"info-note\">用户名不可更改</p>\r\n        </div>\r\n\r\n        <div className=\"password-form-card\">\r\n          <h3>修改密码</h3>\r\n          <form onSubmit={handlePasswordSubmit}>\r\n            <div className=\"form-group\">\r\n              <label htmlFor=\"oldPassword\">原密码:</label>\r\n              <input\r\n                type=\"password\"\r\n                id=\"oldPassword\"\r\n                name=\"oldPassword\"\r\n                value={passwordForm.oldPassword}\r\n                onChange={handlePasswordChange}\r\n                required\r\n              />\r\n            </div>\r\n\r\n            <div className=\"form-group\">\r\n              <label htmlFor=\"newPassword\">新密码:</label>\r\n              <input\r\n                type=\"password\"\r\n                id=\"newPassword\"\r\n                name=\"newPassword\"\r\n                value={passwordForm.newPassword}\r\n                onChange={handlePasswordChange}\r\n                required\r\n                minLength=\"6\"\r\n              />\r\n            </div>\r\n\r\n            <div className=\"form-group\">\r\n              <label htmlFor=\"confirmPassword\">确认新密码:</label>\r\n              <input\r\n                type=\"password\"\r\n                id=\"confirmPassword\"\r\n                name=\"confirmPassword\"\r\n                value={passwordForm.confirmPassword}\r\n                onChange={handlePasswordChange}\r\n                required\r\n                minLength=\"6\"\r\n              />\r\n            </div>\r\n\r\n            {error && <div className=\"error-message\">{error}</div>}\r\n            {success && <div className=\"success-message\">{success}</div>}\r\n\r\n            <button \r\n              type=\"submit\" \r\n              className=\"submit-button\"\r\n              disabled={loading}\r\n            >\r\n              {loading ? '处理中...' : '修改密码'}\r\n            </button>\r\n          </form>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default Setting;","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n *   return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n *   return constructFrom(\n *     date, // Use constructor from the given date\n *     date.getTime() // Use the date value to create a new date\n *   );\n * }\n */\nexport function constructFrom(date, value) {\n  if (typeof date === \"function\") return date(value);\n\n  if (date && typeof date === \"object\" && constructFromSymbol in date)\n    return date[constructFromSymbol](value);\n\n  if (date instanceof Date) return new date.constructor(value);\n\n  return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n  // [TODO] Get rid of `toDate` or `constructFrom`?\n  return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import {\n  millisecondsInHour,\n  millisecondsInMinute,\n} from \"./constants.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n  const invalidDate = () => constructFrom(options?.in, NaN);\n\n  const additionalDigits = options?.additionalDigits ?? 2;\n  const dateStrings = splitDateString(argument);\n\n  let date;\n  if (dateStrings.date) {\n    const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n    date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n  }\n\n  if (!date || isNaN(+date)) return invalidDate();\n\n  const timestamp = +date;\n  let time = 0;\n  let offset;\n\n  if (dateStrings.time) {\n    time = parseTime(dateStrings.time);\n    if (isNaN(time)) return invalidDate();\n  }\n\n  if (dateStrings.timezone) {\n    offset = parseTimezone(dateStrings.timezone);\n    if (isNaN(offset)) return invalidDate();\n  } else {\n    const tmpDate = new Date(timestamp + time);\n    const result = toDate(0, options?.in);\n    result.setFullYear(\n      tmpDate.getUTCFullYear(),\n      tmpDate.getUTCMonth(),\n      tmpDate.getUTCDate(),\n    );\n    result.setHours(\n      tmpDate.getUTCHours(),\n      tmpDate.getUTCMinutes(),\n      tmpDate.getUTCSeconds(),\n      tmpDate.getUTCMilliseconds(),\n    );\n    return result;\n  }\n\n  return toDate(timestamp + time + offset, options?.in);\n}\n\nconst patterns = {\n  dateTimeDelimiter: /[T ]/,\n  timeZoneDelimiter: /[Z ]/i,\n  timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n  /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n  /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n  const dateStrings = {};\n  const array = dateString.split(patterns.dateTimeDelimiter);\n  let timeString;\n\n  // The regex match should only return at maximum two array elements.\n  // [date], [time], or [date, time].\n  if (array.length > 2) {\n    return dateStrings;\n  }\n\n  if (/:/.test(array[0])) {\n    timeString = array[0];\n  } else {\n    dateStrings.date = array[0];\n    timeString = array[1];\n    if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n      dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n      timeString = dateString.substr(\n        dateStrings.date.length,\n        dateString.length,\n      );\n    }\n  }\n\n  if (timeString) {\n    const token = patterns.timezone.exec(timeString);\n    if (token) {\n      dateStrings.time = timeString.replace(token[1], \"\");\n      dateStrings.timezone = token[1];\n    } else {\n      dateStrings.time = timeString;\n    }\n  }\n\n  return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n  const regex = new RegExp(\n    \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n      (4 + additionalDigits) +\n      \"})|(\\\\d{2}|[+-]\\\\d{\" +\n      (2 + additionalDigits) +\n      \"})$)\",\n  );\n\n  const captures = dateString.match(regex);\n  // Invalid ISO-formatted year\n  if (!captures) return { year: NaN, restDateString: \"\" };\n\n  const year = captures[1] ? parseInt(captures[1]) : null;\n  const century = captures[2] ? parseInt(captures[2]) : null;\n\n  // either year or century is null, not both\n  return {\n    year: century === null ? year : century * 100,\n    restDateString: dateString.slice((captures[1] || captures[2]).length),\n  };\n}\n\nfunction parseDate(dateString, year) {\n  // Invalid ISO-formatted year\n  if (year === null) return new Date(NaN);\n\n  const captures = dateString.match(dateRegex);\n  // Invalid ISO-formatted string\n  if (!captures) return new Date(NaN);\n\n  const isWeekDate = !!captures[4];\n  const dayOfYear = parseDateUnit(captures[1]);\n  const month = parseDateUnit(captures[2]) - 1;\n  const day = parseDateUnit(captures[3]);\n  const week = parseDateUnit(captures[4]);\n  const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n  if (isWeekDate) {\n    if (!validateWeekDate(year, week, dayOfWeek)) {\n      return new Date(NaN);\n    }\n    return dayOfISOWeekYear(year, week, dayOfWeek);\n  } else {\n    const date = new Date(0);\n    if (\n      !validateDate(year, month, day) ||\n      !validateDayOfYearDate(year, dayOfYear)\n    ) {\n      return new Date(NaN);\n    }\n    date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n    return date;\n  }\n}\n\nfunction parseDateUnit(value) {\n  return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n  const captures = timeString.match(timeRegex);\n  if (!captures) return NaN; // Invalid ISO-formatted time\n\n  const hours = parseTimeUnit(captures[1]);\n  const minutes = parseTimeUnit(captures[2]);\n  const seconds = parseTimeUnit(captures[3]);\n\n  if (!validateTime(hours, minutes, seconds)) {\n    return NaN;\n  }\n\n  return (\n    hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n  );\n}\n\nfunction parseTimeUnit(value) {\n  return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n  if (timezoneString === \"Z\") return 0;\n\n  const captures = timezoneString.match(timezoneRegex);\n  if (!captures) return 0;\n\n  const sign = captures[1] === \"+\" ? -1 : 1;\n  const hours = parseInt(captures[2]);\n  const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n  if (!validateTimezone(hours, minutes)) {\n    return NaN;\n  }\n\n  return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n  const date = new Date(0);\n  date.setUTCFullYear(isoWeekYear, 0, 4);\n  const fourthOfJanuaryDay = date.getUTCDay() || 7;\n  const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n  date.setUTCDate(date.getUTCDate() + diff);\n  return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n  return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n  return (\n    month >= 0 &&\n    month <= 11 &&\n    date >= 1 &&\n    date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n  );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n  return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n  return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n  if (hours === 24) {\n    return minutes === 0 && seconds === 0;\n  }\n\n  return (\n    seconds >= 0 &&\n    seconds < 60 &&\n    minutes >= 0 &&\n    minutes < 60 &&\n    hours >= 0 &&\n    hours < 25\n  );\n}\n\nfunction validateTimezone(_hours, minutes) {\n  return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","const formatDistanceLocale = {\n  lessThanXSeconds: {\n    one: \"less than a second\",\n    other: \"less than {{count}} seconds\",\n  },\n\n  xSeconds: {\n    one: \"1 second\",\n    other: \"{{count}} seconds\",\n  },\n\n  halfAMinute: \"half a minute\",\n\n  lessThanXMinutes: {\n    one: \"less than a minute\",\n    other: \"less than {{count}} minutes\",\n  },\n\n  xMinutes: {\n    one: \"1 minute\",\n    other: \"{{count}} minutes\",\n  },\n\n  aboutXHours: {\n    one: \"about 1 hour\",\n    other: \"about {{count}} hours\",\n  },\n\n  xHours: {\n    one: \"1 hour\",\n    other: \"{{count}} hours\",\n  },\n\n  xDays: {\n    one: \"1 day\",\n    other: \"{{count}} days\",\n  },\n\n  aboutXWeeks: {\n    one: \"about 1 week\",\n    other: \"about {{count}} weeks\",\n  },\n\n  xWeeks: {\n    one: \"1 week\",\n    other: \"{{count}} weeks\",\n  },\n\n  aboutXMonths: {\n    one: \"about 1 month\",\n    other: \"about {{count}} months\",\n  },\n\n  xMonths: {\n    one: \"1 month\",\n    other: \"{{count}} months\",\n  },\n\n  aboutXYears: {\n    one: \"about 1 year\",\n    other: \"about {{count}} years\",\n  },\n\n  xYears: {\n    one: \"1 year\",\n    other: \"{{count}} years\",\n  },\n\n  overXYears: {\n    one: \"over 1 year\",\n    other: \"over {{count}} years\",\n  },\n\n  almostXYears: {\n    one: \"almost 1 year\",\n    other: \"almost {{count}} years\",\n  },\n};\n\nexport const formatDistance = (token, count, options) => {\n  let result;\n\n  const tokenValue = formatDistanceLocale[token];\n  if (typeof tokenValue === \"string\") {\n    result = tokenValue;\n  } else if (count === 1) {\n    result = tokenValue.one;\n  } else {\n    result = tokenValue.other.replace(\"{{count}}\", count.toString());\n  }\n\n  if (options?.addSuffix) {\n    if (options.comparison && options.comparison > 0) {\n      return \"in \" + result;\n    } else {\n      return result + \" ago\";\n    }\n  }\n\n  return result;\n};\n","export function buildFormatLongFn(args) {\n  return (options = {}) => {\n    // TODO: Remove String()\n    const width = options.width ? String(options.width) : args.defaultWidth;\n    const format = args.formats[width] || args.formats[args.defaultWidth];\n    return format;\n  };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n  full: \"EEEE, MMMM do, y\",\n  long: \"MMMM do, y\",\n  medium: \"MMM d, y\",\n  short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n  full: \"h:mm:ss a zzzz\",\n  long: \"h:mm:ss a z\",\n  medium: \"h:mm:ss a\",\n  short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n  full: \"{{date}} 'at' {{time}}\",\n  long: \"{{date}} 'at' {{time}}\",\n  medium: \"{{date}}, {{time}}\",\n  short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n  date: buildFormatLongFn({\n    formats: dateFormats,\n    defaultWidth: \"full\",\n  }),\n\n  time: buildFormatLongFn({\n    formats: timeFormats,\n    defaultWidth: \"full\",\n  }),\n\n  dateTime: buildFormatLongFn({\n    formats: dateTimeFormats,\n    defaultWidth: \"full\",\n  }),\n};\n","const formatRelativeLocale = {\n  lastWeek: \"'last' eeee 'at' p\",\n  yesterday: \"'yesterday at' p\",\n  today: \"'today at' p\",\n  tomorrow: \"'tomorrow at' p\",\n  nextWeek: \"eeee 'at' p\",\n  other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n  formatRelativeLocale[token];\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n  return (value, options) => {\n    const context = options?.context ? String(options.context) : \"standalone\";\n\n    let valuesArray;\n    if (context === \"formatting\" && args.formattingValues) {\n      const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n      const width = options?.width ? String(options.width) : defaultWidth;\n\n      valuesArray =\n        args.formattingValues[width] || args.formattingValues[defaultWidth];\n    } else {\n      const defaultWidth = args.defaultWidth;\n      const width = options?.width ? String(options.width) : args.defaultWidth;\n\n      valuesArray = args.values[width] || args.values[defaultWidth];\n    }\n    const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n    // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n    return valuesArray[index];\n  };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n  narrow: [\"B\", \"A\"],\n  abbreviated: [\"BC\", \"AD\"],\n  wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n  narrow: [\"1\", \"2\", \"3\", \"4\"],\n  abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n  wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n  narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n  abbreviated: [\n    \"Jan\",\n    \"Feb\",\n    \"Mar\",\n    \"Apr\",\n    \"May\",\n    \"Jun\",\n    \"Jul\",\n    \"Aug\",\n    \"Sep\",\n    \"Oct\",\n    \"Nov\",\n    \"Dec\",\n  ],\n\n  wide: [\n    \"January\",\n    \"February\",\n    \"March\",\n    \"April\",\n    \"May\",\n    \"June\",\n    \"July\",\n    \"August\",\n    \"September\",\n    \"October\",\n    \"November\",\n    \"December\",\n  ],\n};\n\nconst dayValues = {\n  narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n  short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n  abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n  wide: [\n    \"Sunday\",\n    \"Monday\",\n    \"Tuesday\",\n    \"Wednesday\",\n    \"Thursday\",\n    \"Friday\",\n    \"Saturday\",\n  ],\n};\n\nconst dayPeriodValues = {\n  narrow: {\n    am: \"a\",\n    pm: \"p\",\n    midnight: \"mi\",\n    noon: \"n\",\n    morning: \"morning\",\n    afternoon: \"afternoon\",\n    evening: \"evening\",\n    night: \"night\",\n  },\n  abbreviated: {\n    am: \"AM\",\n    pm: \"PM\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"morning\",\n    afternoon: \"afternoon\",\n    evening: \"evening\",\n    night: \"night\",\n  },\n  wide: {\n    am: \"a.m.\",\n    pm: \"p.m.\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"morning\",\n    afternoon: \"afternoon\",\n    evening: \"evening\",\n    night: \"night\",\n  },\n};\n\nconst formattingDayPeriodValues = {\n  narrow: {\n    am: \"a\",\n    pm: \"p\",\n    midnight: \"mi\",\n    noon: \"n\",\n    morning: \"in the morning\",\n    afternoon: \"in the afternoon\",\n    evening: \"in the evening\",\n    night: \"at night\",\n  },\n  abbreviated: {\n    am: \"AM\",\n    pm: \"PM\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"in the morning\",\n    afternoon: \"in the afternoon\",\n    evening: \"in the evening\",\n    night: \"at night\",\n  },\n  wide: {\n    am: \"a.m.\",\n    pm: \"p.m.\",\n    midnight: \"midnight\",\n    noon: \"noon\",\n    morning: \"in the morning\",\n    afternoon: \"in the afternoon\",\n    evening: \"in the evening\",\n    night: \"at night\",\n  },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n  const number = Number(dirtyNumber);\n\n  // If ordinal numbers depend on context, for example,\n  // if they are different for different grammatical genders,\n  // use `options.unit`.\n  //\n  // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n  // 'day', 'hour', 'minute', 'second'.\n\n  const rem100 = number % 100;\n  if (rem100 > 20 || rem100 < 10) {\n    switch (rem100 % 10) {\n      case 1:\n        return number + \"st\";\n      case 2:\n        return number + \"nd\";\n      case 3:\n        return number + \"rd\";\n    }\n  }\n  return number + \"th\";\n};\n\nexport const localize = {\n  ordinalNumber,\n\n  era: buildLocalizeFn({\n    values: eraValues,\n    defaultWidth: \"wide\",\n  }),\n\n  quarter: buildLocalizeFn({\n    values: quarterValues,\n    defaultWidth: \"wide\",\n    argumentCallback: (quarter) => quarter - 1,\n  }),\n\n  month: buildLocalizeFn({\n    values: monthValues,\n    defaultWidth: \"wide\",\n  }),\n\n  day: buildLocalizeFn({\n    values: dayValues,\n    defaultWidth: \"wide\",\n  }),\n\n  dayPeriod: buildLocalizeFn({\n    values: dayPeriodValues,\n    defaultWidth: \"wide\",\n    formattingValues: formattingDayPeriodValues,\n    defaultFormattingWidth: \"wide\",\n  }),\n};\n","export function buildMatchFn(args) {\n  return (string, options = {}) => {\n    const width = options.width;\n\n    const matchPattern =\n      (width && args.matchPatterns[width]) ||\n      args.matchPatterns[args.defaultMatchWidth];\n    const matchResult = string.match(matchPattern);\n\n    if (!matchResult) {\n      return null;\n    }\n    const matchedString = matchResult[0];\n\n    const parsePatterns =\n      (width && args.parsePatterns[width]) ||\n      args.parsePatterns[args.defaultParseWidth];\n\n    const key = Array.isArray(parsePatterns)\n      ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n      : // [TODO] -- I challenge you to fix the type\n        findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n    let value;\n\n    value = args.valueCallback ? args.valueCallback(key) : key;\n    value = options.valueCallback\n      ? // [TODO] -- I challenge you to fix the type\n        options.valueCallback(value)\n      : value;\n\n    const rest = string.slice(matchedString.length);\n\n    return { value, rest };\n  };\n}\n\nfunction findKey(object, predicate) {\n  for (const key in object) {\n    if (\n      Object.prototype.hasOwnProperty.call(object, key) &&\n      predicate(object[key])\n    ) {\n      return key;\n    }\n  }\n  return undefined;\n}\n\nfunction findIndex(array, predicate) {\n  for (let key = 0; key < array.length; key++) {\n    if (predicate(array[key])) {\n      return key;\n    }\n  }\n  return undefined;\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n  narrow: /^(b|a)/i,\n  abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n  wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n  any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n  narrow: /^[1234]/i,\n  abbreviated: /^q[1234]/i,\n  wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n  any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n  narrow: /^[jfmasond]/i,\n  abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n  wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n  narrow: [\n    /^j/i,\n    /^f/i,\n    /^m/i,\n    /^a/i,\n    /^m/i,\n    /^j/i,\n    /^j/i,\n    /^a/i,\n    /^s/i,\n    /^o/i,\n    /^n/i,\n    /^d/i,\n  ],\n\n  any: [\n    /^ja/i,\n    /^f/i,\n    /^mar/i,\n    /^ap/i,\n    /^may/i,\n    /^jun/i,\n    /^jul/i,\n    /^au/i,\n    /^s/i,\n    /^o/i,\n    /^n/i,\n    /^d/i,\n  ],\n};\n\nconst matchDayPatterns = {\n  narrow: /^[smtwf]/i,\n  short: /^(su|mo|tu|we|th|fr|sa)/i,\n  abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n  wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n  narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n  any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n  narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n  any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n  any: {\n    am: /^a/i,\n    pm: /^p/i,\n    midnight: /^mi/i,\n    noon: /^no/i,\n    morning: /morning/i,\n    afternoon: /afternoon/i,\n    evening: /evening/i,\n    night: /night/i,\n  },\n};\n\nexport const match = {\n  ordinalNumber: buildMatchPatternFn({\n    matchPattern: matchOrdinalNumberPattern,\n    parsePattern: parseOrdinalNumberPattern,\n    valueCallback: (value) => parseInt(value, 10),\n  }),\n\n  era: buildMatchFn({\n    matchPatterns: matchEraPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseEraPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  quarter: buildMatchFn({\n    matchPatterns: matchQuarterPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseQuarterPatterns,\n    defaultParseWidth: \"any\",\n    valueCallback: (index) => index + 1,\n  }),\n\n  month: buildMatchFn({\n    matchPatterns: matchMonthPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseMonthPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  day: buildMatchFn({\n    matchPatterns: matchDayPatterns,\n    defaultMatchWidth: \"wide\",\n    parsePatterns: parseDayPatterns,\n    defaultParseWidth: \"any\",\n  }),\n\n  dayPeriod: buildMatchFn({\n    matchPatterns: matchDayPeriodPatterns,\n    defaultMatchWidth: \"any\",\n    parsePatterns: parseDayPeriodPatterns,\n    defaultParseWidth: \"any\",\n  }),\n};\n","export function buildMatchPatternFn(args) {\n  return (string, options = {}) => {\n    const matchResult = string.match(args.matchPattern);\n    if (!matchResult) return null;\n    const matchedString = matchResult[0];\n\n    const parseResult = string.match(args.parsePattern);\n    if (!parseResult) return null;\n    let value = args.valueCallback\n      ? args.valueCallback(parseResult[0])\n      : parseResult[0];\n\n    // [TODO] I challenge you to fix the type\n    value = options.valueCallback ? options.valueCallback(value) : value;\n\n    const rest = string.slice(matchedString.length);\n\n    return { value, rest };\n  };\n}\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n  code: \"en-US\",\n  formatDistance: formatDistance,\n  formatLong: formatLong,\n  formatRelative: formatRelative,\n  localize: localize,\n  match: match,\n  options: {\n    weekStartsOn: 0 /* Sunday */,\n    firstWeekContainsDate: 1,\n  },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","const dateLongFormatter = (pattern, formatLong) => {\n  switch (pattern) {\n    case \"P\":\n      return formatLong.date({ width: \"short\" });\n    case \"PP\":\n      return formatLong.date({ width: \"medium\" });\n    case \"PPP\":\n      return formatLong.date({ width: \"long\" });\n    case \"PPPP\":\n    default:\n      return formatLong.date({ width: \"full\" });\n  }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n  switch (pattern) {\n    case \"p\":\n      return formatLong.time({ width: \"short\" });\n    case \"pp\":\n      return formatLong.time({ width: \"medium\" });\n    case \"ppp\":\n      return formatLong.time({ width: \"long\" });\n    case \"pppp\":\n    default:\n      return formatLong.time({ width: \"full\" });\n  }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n  const matchResult = pattern.match(/(P+)(p+)?/) || [];\n  const datePattern = matchResult[1];\n  const timePattern = matchResult[2];\n\n  if (!timePattern) {\n    return dateLongFormatter(pattern, formatLong);\n  }\n\n  let dateTimeFormat;\n\n  switch (datePattern) {\n    case \"P\":\n      dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n      break;\n    case \"PP\":\n      dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n      break;\n    case \"PPP\":\n      dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n      break;\n    case \"PPPP\":\n    default:\n      dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n      break;\n  }\n\n  return dateTimeFormat\n    .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n    .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n  p: timeLongFormatter,\n  P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n  return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n  return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n  const _message = message(token, format, input);\n  console.warn(_message);\n  if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n  const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n  return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n  return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n  defaultOptions = newOptions;\n}\n","import { getDefaultOptions as getInternalDefaultOptions } from \"./_lib/defaultOptions.js\";\n\n/**\n * @name getDefaultOptions\n * @category Common Helpers\n * @summary Get default options.\n * @pure false\n *\n * @description\n * Returns an object that contains defaults for\n * `options.locale`, `options.weekStartsOn` and `options.firstWeekContainsDate`\n * arguments for all functions.\n *\n * You can change these with [setDefaultOptions](https://date-fns.org/docs/setDefaultOptions).\n *\n * @returns The default options\n *\n * @example\n * const result = getDefaultOptions()\n * //=> {}\n *\n * @example\n * setDefaultOptions({ weekStarsOn: 1, firstWeekContainsDate: 4 })\n * const result = getDefaultOptions()\n * //=> { weekStarsOn: 1, firstWeekContainsDate: 4 }\n */\nexport function getDefaultOptions() {\n  return Object.assign({}, getInternalDefaultOptions());\n}\n\n// Fallback for modularized imports:\nexport default getDefaultOptions;\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name transpose\n * @category Generic Helpers\n * @summary Transpose the date to the given constructor.\n *\n * @description\n * The function transposes the date to the given constructor. It helps you\n * to transpose the date in the system time zone to say `UTCDate` or any other\n * date extension.\n *\n * @typeParam InputDate - The input `Date` type derived from the passed argument.\n * @typeParam ResultDate - The result `Date` type derived from the passed constructor.\n *\n * @param date - The date to use values from\n * @param constructor - The date constructor to use\n *\n * @returns Date transposed to the given constructor\n *\n * @example\n * // Create July 10, 2022 00:00 in locale time zone\n * const date = new Date(2022, 6, 10)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0800 (Singapore Standard Time)'\n *\n * @example\n * // Transpose the date to July 10, 2022 00:00 in UTC\n * transpose(date, UTCDate)\n * //=> 'Sun Jul 10 2022 00:00:00 GMT+0000 (Coordinated Universal Time)'\n */\nexport function transpose(date, constructor) {\n  const date_ = isConstructor(constructor)\n    ? new constructor(0)\n    : constructFrom(constructor, 0);\n  date_.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n  date_.setHours(\n    date.getHours(),\n    date.getMinutes(),\n    date.getSeconds(),\n    date.getMilliseconds(),\n  );\n  return date_;\n}\n\nfunction isConstructor(constructor) {\n  return (\n    typeof constructor === \"function\" &&\n    constructor.prototype?.constructor === constructor\n  );\n}\n\n// Fallback for modularized imports:\nexport default transpose;\n","import { constructFrom } from \"../../constructFrom.js\";\nimport { transpose } from \"../../transpose.js\";\n\nconst TIMEZONE_UNIT_PRIORITY = 10;\n\nexport class Setter {\n  subPriority = 0;\n\n  validate(_utcDate, _options) {\n    return true;\n  }\n}\n\nexport class ValueSetter extends Setter {\n  constructor(\n    value,\n\n    validateValue,\n\n    setValue,\n\n    priority,\n    subPriority,\n  ) {\n    super();\n    this.value = value;\n    this.validateValue = validateValue;\n    this.setValue = setValue;\n    this.priority = priority;\n    if (subPriority) {\n      this.subPriority = subPriority;\n    }\n  }\n\n  validate(date, options) {\n    return this.validateValue(date, this.value, options);\n  }\n\n  set(date, flags, options) {\n    return this.setValue(date, flags, this.value, options);\n  }\n}\n\nexport class DateTimezoneSetter extends Setter {\n  priority = TIMEZONE_UNIT_PRIORITY;\n  subPriority = -1;\n\n  constructor(context, reference) {\n    super();\n    this.context = context || ((date) => constructFrom(reference, date));\n  }\n\n  set(date, flags) {\n    if (flags.timestampIsSet) return date;\n    return constructFrom(date, transpose(date, this.context));\n  }\n}\n","import { ValueSetter } from \"./Setter.js\";\n\nexport class Parser {\n  run(dateString, token, match, options) {\n    const result = this.parse(dateString, token, match, options);\n    if (!result) {\n      return null;\n    }\n\n    return {\n      setter: new ValueSetter(\n        result.value,\n        this.validate,\n        this.set,\n        this.priority,\n        this.subPriority,\n      ),\n      rest: result.rest,\n    };\n  }\n\n  validate(_utcDate, _value, _options) {\n    return true;\n  }\n}\n","export const numericPatterns = {\n  month: /^(1[0-2]|0?\\d)/, // 0 to 12\n  date: /^(3[0-1]|[0-2]?\\d)/, // 0 to 31\n  dayOfYear: /^(36[0-6]|3[0-5]\\d|[0-2]?\\d?\\d)/, // 0 to 366\n  week: /^(5[0-3]|[0-4]?\\d)/, // 0 to 53\n  hour23h: /^(2[0-3]|[0-1]?\\d)/, // 0 to 23\n  hour24h: /^(2[0-4]|[0-1]?\\d)/, // 0 to 24\n  hour11h: /^(1[0-1]|0?\\d)/, // 0 to 11\n  hour12h: /^(1[0-2]|0?\\d)/, // 0 to 12\n  minute: /^[0-5]?\\d/, // 0 to 59\n  second: /^[0-5]?\\d/, // 0 to 59\n\n  singleDigit: /^\\d/, // 0 to 9\n  twoDigits: /^\\d{1,2}/, // 0 to 99\n  threeDigits: /^\\d{1,3}/, // 0 to 999\n  fourDigits: /^\\d{1,4}/, // 0 to 9999\n\n  anyDigitsSigned: /^-?\\d+/,\n  singleDigitSigned: /^-?\\d/, // 0 to 9, -0 to -9\n  twoDigitsSigned: /^-?\\d{1,2}/, // 0 to 99, -0 to -99\n  threeDigitsSigned: /^-?\\d{1,3}/, // 0 to 999, -0 to -999\n  fourDigitsSigned: /^-?\\d{1,4}/, // 0 to 9999, -0 to -9999\n};\n\nexport const timezonePatterns = {\n  basicOptionalMinutes: /^([+-])(\\d{2})(\\d{2})?|Z/,\n  basic: /^([+-])(\\d{2})(\\d{2})|Z/,\n  basicOptionalSeconds: /^([+-])(\\d{2})(\\d{2})((\\d{2}))?|Z/,\n  extended: /^([+-])(\\d{2}):(\\d{2})|Z/,\n  extendedOptionalSeconds: /^([+-])(\\d{2}):(\\d{2})(:(\\d{2}))?|Z/,\n};\n","import {\n  millisecondsInHour,\n  millisecondsInMinute,\n  millisecondsInSecond,\n} from \"../../constants.js\";\n\nimport { numericPatterns } from \"./constants.js\";\n\nexport function mapValue(parseFnResult, mapFn) {\n  if (!parseFnResult) {\n    return parseFnResult;\n  }\n\n  return {\n    value: mapFn(parseFnResult.value),\n    rest: parseFnResult.rest,\n  };\n}\n\nexport function parseNumericPattern(pattern, dateString) {\n  const matchResult = dateString.match(pattern);\n\n  if (!matchResult) {\n    return null;\n  }\n\n  return {\n    value: parseInt(matchResult[0], 10),\n    rest: dateString.slice(matchResult[0].length),\n  };\n}\n\nexport function parseTimezonePattern(pattern, dateString) {\n  const matchResult = dateString.match(pattern);\n\n  if (!matchResult) {\n    return null;\n  }\n\n  // Input is 'Z'\n  if (matchResult[0] === \"Z\") {\n    return {\n      value: 0,\n      rest: dateString.slice(1),\n    };\n  }\n\n  const sign = matchResult[1] === \"+\" ? 1 : -1;\n  const hours = matchResult[2] ? parseInt(matchResult[2], 10) : 0;\n  const minutes = matchResult[3] ? parseInt(matchResult[3], 10) : 0;\n  const seconds = matchResult[5] ? parseInt(matchResult[5], 10) : 0;\n\n  return {\n    value:\n      sign *\n      (hours * millisecondsInHour +\n        minutes * millisecondsInMinute +\n        seconds * millisecondsInSecond),\n    rest: dateString.slice(matchResult[0].length),\n  };\n}\n\nexport function parseAnyDigitsSigned(dateString) {\n  return parseNumericPattern(numericPatterns.anyDigitsSigned, dateString);\n}\n\nexport function parseNDigits(n, dateString) {\n  switch (n) {\n    case 1:\n      return parseNumericPattern(numericPatterns.singleDigit, dateString);\n    case 2:\n      return parseNumericPattern(numericPatterns.twoDigits, dateString);\n    case 3:\n      return parseNumericPattern(numericPatterns.threeDigits, dateString);\n    case 4:\n      return parseNumericPattern(numericPatterns.fourDigits, dateString);\n    default:\n      return parseNumericPattern(new RegExp(\"^\\\\d{1,\" + n + \"}\"), dateString);\n  }\n}\n\nexport function parseNDigitsSigned(n, dateString) {\n  switch (n) {\n    case 1:\n      return parseNumericPattern(numericPatterns.singleDigitSigned, dateString);\n    case 2:\n      return parseNumericPattern(numericPatterns.twoDigitsSigned, dateString);\n    case 3:\n      return parseNumericPattern(numericPatterns.threeDigitsSigned, dateString);\n    case 4:\n      return parseNumericPattern(numericPatterns.fourDigitsSigned, dateString);\n    default:\n      return parseNumericPattern(new RegExp(\"^-?\\\\d{1,\" + n + \"}\"), dateString);\n  }\n}\n\nexport function dayPeriodEnumToHours(dayPeriod) {\n  switch (dayPeriod) {\n    case \"morning\":\n      return 4;\n    case \"evening\":\n      return 17;\n    case \"pm\":\n    case \"noon\":\n    case \"afternoon\":\n      return 12;\n    case \"am\":\n    case \"midnight\":\n    case \"night\":\n    default:\n      return 0;\n  }\n}\n\nexport function normalizeTwoDigitYear(twoDigitYear, currentYear) {\n  const isCommonEra = currentYear > 0;\n  // Absolute number of the current year:\n  // 1 -> 1 AC\n  // 0 -> 1 BC\n  // -1 -> 2 BC\n  const absCurrentYear = isCommonEra ? currentYear : 1 - currentYear;\n\n  let result;\n  if (absCurrentYear <= 50) {\n    result = twoDigitYear || 100;\n  } else {\n    const rangeEnd = absCurrentYear + 50;\n    const rangeEndCentury = Math.trunc(rangeEnd / 100) * 100;\n    const isPreviousCentury = twoDigitYear >= rangeEnd % 100;\n    result = twoDigitYear + rangeEndCentury - (isPreviousCentury ? 100 : 0);\n  }\n\n  return isCommonEra ? result : 1 - result;\n}\n\nexport function isLeapYearIndex(year) {\n  return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n  const defaultOptions = getDefaultOptions();\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const _date = toDate(date, options?.in);\n  const day = _date.getDay();\n  const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n  _date.setDate(_date.getDate() - diff);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n\n  const defaultOptions = getDefaultOptions();\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n  firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n  firstWeekOfNextYear.setHours(0, 0, 0, 0);\n  const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n  const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n  firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n  firstWeekOfThisYear.setHours(0, 0, 0, 0);\n  const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n  if (+_date >= +startOfNextYear) {\n    return year + 1;\n  } else if (+_date >= +startOfThisYear) {\n    return year;\n  } else {\n    return year - 1;\n  }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n  return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n *   weekStartsOn: 1,\n *   firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n  const defaultOptions = getDefaultOptions();\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const year = getWeekYear(date, options);\n  const firstWeek = constructFrom(options?.in || date, 0);\n  firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n  firstWeek.setHours(0, 0, 0, 0);\n  const _date = startOfWeek(firstWeek, options);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n *   weekStartsOn: 1,\n *   firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n  const _date = toDate(date, options?.in);\n  const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n  // Round the number of weeks to the nearest integer because the number of\n  // milliseconds in a week is not constant (e.g. it's different in the week of\n  // the daylight saving time clock shift).\n  return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","import { getWeek } from \"./getWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setWeek} function options.\n */\n\n/**\n * @name setWeek\n * @category Week Helpers\n * @summary Set the local week to the given date.\n *\n * @description\n * Set the local week to the given date, saving the weekday number.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param week - The week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the local week set\n *\n * @example\n * // Set the 1st week to 2 January 2005 with default options:\n * const result = setWeek(new Date(2005, 0, 2), 1)\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // Set the 1st week to 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January:\n * const result = setWeek(new Date(2005, 0, 2), 1, {\n *   weekStartsOn: 1,\n *   firstWeekContainsDate: 4\n * })\n * //=> Sun Jan 4 2004 00:00:00\n */\nexport function setWeek(date, week, options) {\n  const date_ = toDate(date, options?.in);\n  const diff = getWeek(date_, options) - week;\n  date_.setDate(date_.getDate() - diff * 7);\n  return toDate(date_, options?.in);\n}\n\n// Fallback for modularized imports:\nexport default setWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n\n  const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n  fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n  fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n  const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n  const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n  fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n  fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n  const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n  if (_date.getTime() >= startOfNextYear.getTime()) {\n    return year + 1;\n  } else if (_date.getTime() >= startOfThisYear.getTime()) {\n    return year;\n  } else {\n    return year - 1;\n  }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n  const year = getISOWeekYear(date, options);\n  const fourthOfJanuary = constructFrom(options?.in || date, 0);\n  fourthOfJanuary.setFullYear(year, 0, 4);\n  fourthOfJanuary.setHours(0, 0, 0, 0);\n  return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n  const _date = toDate(date, options?.in);\n  const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n  // Round the number of weeks to the nearest integer because the number of\n  // milliseconds in a week is not constant (e.g. it's different in the week of\n  // the daylight saving time clock shift).\n  return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getISOWeek } from \"./getISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISOWeek} function options.\n */\n\n/**\n * @name setISOWeek\n * @category ISO Week Helpers\n * @summary Set the ISO week to the given date.\n *\n * @description\n * Set the ISO week to the given date, saving the weekday number.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The `Date` type of the context function.\n *\n * @param date - The date to be changed\n * @param week - The ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the ISO week set\n *\n * @example\n * // Set the 53rd ISO week to 7 August 2004:\n * const result = setISOWeek(new Date(2004, 7, 7), 53)\n * //=> Sat Jan 01 2005 00:00:00\n */\nexport function setISOWeek(date, week, options) {\n  const _date = toDate(date, options?.in);\n  const diff = getISOWeek(_date, options) - week;\n  _date.setDate(_date.getDate() - diff * 7);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setISOWeek;\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n  isLeapYearIndex,\n  parseNDigits,\n  parseNumericPattern,\n} from \"../utils.js\";\n\nconst DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nconst DAYS_IN_MONTH_LEAP_YEAR = [\n  31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31,\n];\n\n// Day of the month\nexport class DateParser extends Parser {\n  priority = 90;\n  subPriority = 1;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"d\":\n        return parseNumericPattern(numericPatterns.date, dateString);\n      case \"do\":\n        return match.ordinalNumber(dateString, { unit: \"date\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(date, value) {\n    const year = date.getFullYear();\n    const isLeapYear = isLeapYearIndex(year);\n    const month = date.getMonth();\n    if (isLeapYear) {\n      return value >= 1 && value <= DAYS_IN_MONTH_LEAP_YEAR[month];\n    } else {\n      return value >= 1 && value <= DAYS_IN_MONTH[month];\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setDate(value);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"w\",\n    \"I\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addDays} function options.\n */\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n * @param options - An object with options\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nexport function addDays(date, amount, options) {\n  const _date = toDate(date, options?.in);\n  if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n\n  // If 0 days, no-op to avoid changing times in the hour before end of DST\n  if (!amount) return _date;\n\n  _date.setDate(_date.getDate() + amount);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { addDays } from \"./addDays.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setDay} function options.\n */\n\n/**\n * @name setDay\n * @category Weekday Helpers\n * @summary Set the day of the week to the given date.\n *\n * @description\n * Set the day of the week to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the week of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the day of the week set\n *\n * @example\n * // Set week day to Sunday, with the default weekStartsOn of Sunday:\n * const result = setDay(new Date(2014, 8, 1), 0)\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // Set week day to Sunday, with a weekStartsOn of Monday:\n * const result = setDay(new Date(2014, 8, 1), 0, { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setDay(date, day, options) {\n  const defaultOptions = getDefaultOptions();\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const date_ = toDate(date, options?.in);\n  const currentDay = date_.getDay();\n\n  const remainder = day % 7;\n  const dayIndex = (remainder + 7) % 7;\n\n  const delta = 7 - weekStartsOn;\n  const diff =\n    day < 0 || day > 6\n      ? day - ((currentDay + delta) % 7)\n      : ((dayIndex + delta) % 7) - ((currentDay + delta) % 7);\n  return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setDay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISODay} function options.\n */\n\n/**\n * @name getISODay\n * @category Weekday Helpers\n * @summary Get the day of the ISO week of the given date.\n *\n * @description\n * Get the day of the ISO week of the given date,\n * which is 7 for Sunday, 1 for Monday etc.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The day of ISO week\n *\n * @example\n * // Which day of the ISO week is 26 February 2012?\n * const result = getISODay(new Date(2012, 1, 26))\n * //=> 7\n */\nexport function getISODay(date, options) {\n  const day = toDate(date, options?.in).getDay();\n  return day === 0 ? 7 : day;\n}\n\n// Fallback for modularized imports:\nexport default getISODay;\n","import { addDays } from \"./addDays.js\";\nimport { getISODay } from \"./getISODay.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setISODay} function options.\n */\n\n/**\n * @name setISODay\n * @category Weekday Helpers\n * @summary Set the day of the ISO week to the given date.\n *\n * @description\n * Set the day of the ISO week to the given date.\n * ISO week starts with Monday.\n * 7 is the index of Sunday, 1 is the index of Monday, etc.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param day - The day of the ISO week of the new date\n * @param options - An object with options\n *\n * @returns The new date with the day of the ISO week set\n *\n * @example\n * // Set Sunday to 1 September 2014:\n * const result = setISODay(new Date(2014, 8, 1), 7)\n * //=> Sun Sep 07 2014 00:00:00\n */\nexport function setISODay(date, day, options) {\n  const date_ = toDate(date, options?.in);\n  const currentDay = getISODay(date_, options);\n  const diff = day - currentDay;\n  return addDays(date_, diff, options);\n}\n\n// Fallback for modularized imports:\nexport default setISODay;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n  const _date = toDate(date);\n  const utcDate = new Date(\n    Date.UTC(\n      _date.getFullYear(),\n      _date.getMonth(),\n      _date.getDate(),\n      _date.getHours(),\n      _date.getMinutes(),\n      _date.getSeconds(),\n      _date.getMilliseconds(),\n    ),\n  );\n  utcDate.setUTCFullYear(_date.getFullYear());\n  return +date - +utcDate;\n}\n","import { EraParser } from \"./parsers/EraParser.js\";\nimport { YearParser } from \"./parsers/YearParser.js\";\nimport { LocalWeekYearParser } from \"./parsers/LocalWeekYearParser.js\";\nimport { ISOWeekYearParser } from \"./parsers/ISOWeekYearParser.js\";\nimport { ExtendedYearParser } from \"./parsers/ExtendedYearParser.js\";\nimport { QuarterParser } from \"./parsers/QuarterParser.js\";\nimport { StandAloneQuarterParser } from \"./parsers/StandAloneQuarterParser.js\";\nimport { MonthParser } from \"./parsers/MonthParser.js\";\nimport { StandAloneMonthParser } from \"./parsers/StandAloneMonthParser.js\";\nimport { LocalWeekParser } from \"./parsers/LocalWeekParser.js\";\nimport { ISOWeekParser } from \"./parsers/ISOWeekParser.js\";\nimport { DateParser } from \"./parsers/DateParser.js\";\nimport { DayOfYearParser } from \"./parsers/DayOfYearParser.js\";\nimport { DayParser } from \"./parsers/DayParser.js\";\nimport { LocalDayParser } from \"./parsers/LocalDayParser.js\";\nimport { StandAloneLocalDayParser } from \"./parsers/StandAloneLocalDayParser.js\";\nimport { ISODayParser } from \"./parsers/ISODayParser.js\";\nimport { AMPMParser } from \"./parsers/AMPMParser.js\";\nimport { AMPMMidnightParser } from \"./parsers/AMPMMidnightParser.js\";\nimport { DayPeriodParser } from \"./parsers/DayPeriodParser.js\";\nimport { Hour1to12Parser } from \"./parsers/Hour1to12Parser.js\";\nimport { Hour0to23Parser } from \"./parsers/Hour0to23Parser.js\";\nimport { Hour0To11Parser } from \"./parsers/Hour0To11Parser.js\";\nimport { Hour1To24Parser } from \"./parsers/Hour1To24Parser.js\";\nimport { MinuteParser } from \"./parsers/MinuteParser.js\";\nimport { SecondParser } from \"./parsers/SecondParser.js\";\nimport { FractionOfSecondParser } from \"./parsers/FractionOfSecondParser.js\";\nimport { ISOTimezoneWithZParser } from \"./parsers/ISOTimezoneWithZParser.js\";\nimport { ISOTimezoneParser } from \"./parsers/ISOTimezoneParser.js\";\nimport { TimestampSecondsParser } from \"./parsers/TimestampSecondsParser.js\";\nimport { TimestampMillisecondsParser } from \"./parsers/TimestampMillisecondsParser.js\";\n\n/*\n * |     | Unit                           |     | Unit                           |\n * |-----|--------------------------------|-----|--------------------------------|\n * |  a  | AM, PM                         |  A* | Milliseconds in day            |\n * |  b  | AM, PM, noon, midnight         |  B  | Flexible day period            |\n * |  c  | Stand-alone local day of week  |  C* | Localized hour w/ day period   |\n * |  d  | Day of month                   |  D  | Day of year                    |\n * |  e  | Local day of week              |  E  | Day of week                    |\n * |  f  |                                |  F* | Day of week in month           |\n * |  g* | Modified Julian day            |  G  | Era                            |\n * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n * |  i! | ISO day of week                |  I! | ISO week of year               |\n * |  j* | Localized hour w/ day period   |  J* | Localized hour w/o day period  |\n * |  k  | Hour [1-24]                    |  K  | Hour [0-11]                    |\n * |  l* | (deprecated)                   |  L  | Stand-alone month              |\n * |  m  | Minute                         |  M  | Month                          |\n * |  n  |                                |  N  |                                |\n * |  o! | Ordinal number modifier        |  O* | Timezone (GMT)                 |\n * |  p  |                                |  P  |                                |\n * |  q  | Stand-alone quarter            |  Q  | Quarter                        |\n * |  r* | Related Gregorian year         |  R! | ISO week-numbering year        |\n * |  s  | Second                         |  S  | Fraction of second             |\n * |  t! | Seconds timestamp              |  T! | Milliseconds timestamp         |\n * |  u  | Extended year                  |  U* | Cyclic year                    |\n * |  v* | Timezone (generic non-locat.)  |  V* | Timezone (location)            |\n * |  w  | Local week of year             |  W* | Week of month                  |\n * |  x  | Timezone (ISO-8601 w/o Z)      |  X  | Timezone (ISO-8601)            |\n * |  y  | Year (abs)                     |  Y  | Local week-numbering year      |\n * |  z* | Timezone (specific non-locat.) |  Z* | Timezone (aliases)             |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `parse` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n *   i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n *   `R` is supposed to be used in conjunction with `I` and `i`\n *   for universal ISO week-numbering date, whereas\n *   `Y` is supposed to be used in conjunction with `w` and `e`\n *   for week-numbering date specific to the locale.\n */\nexport const parsers = {\n  G: new EraParser(),\n  y: new YearParser(),\n  Y: new LocalWeekYearParser(),\n  R: new ISOWeekYearParser(),\n  u: new ExtendedYearParser(),\n  Q: new QuarterParser(),\n  q: new StandAloneQuarterParser(),\n  M: new MonthParser(),\n  L: new StandAloneMonthParser(),\n  w: new LocalWeekParser(),\n  I: new ISOWeekParser(),\n  d: new DateParser(),\n  D: new DayOfYearParser(),\n  E: new DayParser(),\n  e: new LocalDayParser(),\n  c: new StandAloneLocalDayParser(),\n  i: new ISODayParser(),\n  a: new AMPMParser(),\n  b: new AMPMMidnightParser(),\n  B: new DayPeriodParser(),\n  h: new Hour1to12Parser(),\n  H: new Hour0to23Parser(),\n  K: new Hour0To11Parser(),\n  k: new Hour1To24Parser(),\n  m: new MinuteParser(),\n  s: new SecondParser(),\n  S: new FractionOfSecondParser(),\n  X: new ISOTimezoneWithZParser(),\n  x: new ISOTimezoneParser(),\n  t: new TimestampSecondsParser(),\n  T: new TimestampMillisecondsParser(),\n};\n","import { Parser } from \"../Parser.js\";\n\nexport class EraParser extends Parser {\n  priority = 140;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // AD, BC\n      case \"G\":\n      case \"GG\":\n      case \"GGG\":\n        return (\n          match.era(dateString, { width: \"abbreviated\" }) ||\n          match.era(dateString, { width: \"narrow\" })\n        );\n\n      // A, B\n      case \"GGGGG\":\n        return match.era(dateString, { width: \"narrow\" });\n      // Anno Domini, Before Christ\n      case \"GGGG\":\n      default:\n        return (\n          match.era(dateString, { width: \"wide\" }) ||\n          match.era(dateString, { width: \"abbreviated\" }) ||\n          match.era(dateString, { width: \"narrow\" })\n        );\n    }\n  }\n\n  set(date, flags, value) {\n    flags.era = value;\n    date.setFullYear(value, 0, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"R\", \"u\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_Patterns\n// | Year     |     y | yy |   yyy |  yyyy | yyyyy |\n// |----------|-------|----|-------|-------|-------|\n// | AD 1     |     1 | 01 |   001 |  0001 | 00001 |\n// | AD 12    |    12 | 12 |   012 |  0012 | 00012 |\n// | AD 123   |   123 | 23 |   123 |  0123 | 00123 |\n// | AD 1234  |  1234 | 34 |  1234 |  1234 | 01234 |\n// | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\nexport class YearParser extends Parser {\n  priority = 130;\n  incompatibleTokens = [\"Y\", \"R\", \"u\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n\n  parse(dateString, token, match) {\n    const valueCallback = (year) => ({\n      year,\n      isTwoDigitYear: token === \"yy\",\n    });\n\n    switch (token) {\n      case \"y\":\n        return mapValue(parseNDigits(4, dateString), valueCallback);\n      case \"yo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"year\",\n          }),\n          valueCallback,\n        );\n      default:\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n    }\n  }\n\n  validate(_date, value) {\n    return value.isTwoDigitYear || value.year > 0;\n  }\n\n  set(date, flags, value) {\n    const currentYear = date.getFullYear();\n\n    if (value.isTwoDigitYear) {\n      const normalizedTwoDigitYear = normalizeTwoDigitYear(\n        value.year,\n        currentYear,\n      );\n      date.setFullYear(normalizedTwoDigitYear, 0, 1);\n      date.setHours(0, 0, 0, 0);\n      return date;\n    }\n\n    const year =\n      !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n    date.setFullYear(year, 0, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n}\n","import { getWeekYear } from \"../../../getWeekYear.js\";\n\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, normalizeTwoDigitYear, parseNDigits } from \"../utils.js\";\n\n// Local week-numbering year\nexport class LocalWeekYearParser extends Parser {\n  priority = 130;\n\n  parse(dateString, token, match) {\n    const valueCallback = (year) => ({\n      year,\n      isTwoDigitYear: token === \"YY\",\n    });\n\n    switch (token) {\n      case \"Y\":\n        return mapValue(parseNDigits(4, dateString), valueCallback);\n      case \"Yo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"year\",\n          }),\n          valueCallback,\n        );\n      default:\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n    }\n  }\n\n  validate(_date, value) {\n    return value.isTwoDigitYear || value.year > 0;\n  }\n\n  set(date, flags, value, options) {\n    const currentYear = getWeekYear(date, options);\n\n    if (value.isTwoDigitYear) {\n      const normalizedTwoDigitYear = normalizeTwoDigitYear(\n        value.year,\n        currentYear,\n      );\n      date.setFullYear(\n        normalizedTwoDigitYear,\n        0,\n        options.firstWeekContainsDate,\n      );\n      date.setHours(0, 0, 0, 0);\n      return startOfWeek(date, options);\n    }\n\n    const year =\n      !(\"era\" in flags) || flags.era === 1 ? value.year : 1 - value.year;\n    date.setFullYear(year, 0, options.firstWeekContainsDate);\n    date.setHours(0, 0, 0, 0);\n    return startOfWeek(date, options);\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"Q\",\n    \"q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\n// ISO week-numbering year\nexport class ISOWeekYearParser extends Parser {\n  priority = 130;\n\n  parse(dateString, token) {\n    if (token === \"R\") {\n      return parseNDigitsSigned(4, dateString);\n    }\n\n    return parseNDigitsSigned(token.length, dateString);\n  }\n\n  set(date, _flags, value) {\n    const firstWeekOfYear = constructFrom(date, 0);\n    firstWeekOfYear.setFullYear(value, 0, 4);\n    firstWeekOfYear.setHours(0, 0, 0, 0);\n    return startOfISOWeek(firstWeekOfYear);\n  }\n\n  incompatibleTokens = [\n    \"G\",\n    \"y\",\n    \"Y\",\n    \"u\",\n    \"Q\",\n    \"q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"d\",\n    \"D\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigitsSigned } from \"../utils.js\";\n\nexport class ExtendedYearParser extends Parser {\n  priority = 130;\n\n  parse(dateString, token) {\n    if (token === \"u\") {\n      return parseNDigitsSigned(4, dateString);\n    }\n\n    return parseNDigitsSigned(token.length, dateString);\n  }\n\n  set(date, _flags, value) {\n    date.setFullYear(value, 0, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"G\", \"y\", \"Y\", \"R\", \"w\", \"I\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class QuarterParser extends Parser {\n  priority = 120;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"Q\":\n      case \"QQ\": // 01, 02, 03, 04\n        return parseNDigits(token.length, dateString);\n      // 1st, 2nd, 3rd, 4th\n      case \"Qo\":\n        return match.ordinalNumber(dateString, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"QQQ\":\n        return (\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"QQQQQ\":\n        return match.quarter(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"QQQQ\":\n      default:\n        return (\n          match.quarter(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 4;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth((value - 1) * 3, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { parseNDigits } from \"../utils.js\";\n\nexport class StandAloneQuarterParser extends Parser {\n  priority = 120;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"q\":\n      case \"qq\": // 01, 02, 03, 04\n        return parseNDigits(token.length, dateString);\n      // 1st, 2nd, 3rd, 4th\n      case \"qo\":\n        return match.ordinalNumber(dateString, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"qqq\":\n        return (\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"standalone\",\n          })\n        );\n\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"qqqqq\":\n        return match.quarter(dateString, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"qqqq\":\n      default:\n        return (\n          match.quarter(dateString, {\n            width: \"wide\",\n            context: \"standalone\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.quarter(dateString, {\n            width: \"narrow\",\n            context: \"standalone\",\n          })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 4;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth((value - 1) * 3, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MonthParser extends Parser {\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n\n  priority = 110;\n\n  parse(dateString, token, match) {\n    const valueCallback = (value) => value - 1;\n\n    switch (token) {\n      // 1, 2, ..., 12\n      case \"M\":\n        return mapValue(\n          parseNumericPattern(numericPatterns.month, dateString),\n          valueCallback,\n        );\n      // 01, 02, ..., 12\n      case \"MM\":\n        return mapValue(parseNDigits(2, dateString), valueCallback);\n      // 1st, 2nd, ..., 12th\n      case \"Mo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"month\",\n          }),\n          valueCallback,\n        );\n      // Jan, Feb, ..., Dec\n      case \"MMM\":\n        return (\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // J, F, ..., D\n      case \"MMMMM\":\n        return match.month(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // January, February, ..., December\n      case \"MMMM\":\n      default:\n        return (\n          match.month(dateString, { width: \"wide\", context: \"formatting\" }) ||\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 11;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth(value, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class StandAloneMonthParser extends Parser {\n  priority = 110;\n\n  parse(dateString, token, match) {\n    const valueCallback = (value) => value - 1;\n\n    switch (token) {\n      // 1, 2, ..., 12\n      case \"L\":\n        return mapValue(\n          parseNumericPattern(numericPatterns.month, dateString),\n          valueCallback,\n        );\n      // 01, 02, ..., 12\n      case \"LL\":\n        return mapValue(parseNDigits(2, dateString), valueCallback);\n      // 1st, 2nd, ..., 12th\n      case \"Lo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"month\",\n          }),\n          valueCallback,\n        );\n      // Jan, Feb, ..., Dec\n      case \"LLL\":\n        return (\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n\n      // J, F, ..., D\n      case \"LLLLL\":\n        return match.month(dateString, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // January, February, ..., December\n      case \"LLLL\":\n      default:\n        return (\n          match.month(dateString, { width: \"wide\", context: \"standalone\" }) ||\n          match.month(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.month(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 11;\n  }\n\n  set(date, _flags, value) {\n    date.setMonth(value, 1);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"w\",\n    \"I\",\n    \"D\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { setWeek } from \"../../../setWeek.js\";\nimport { startOfWeek } from \"../../../startOfWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// Local week of year\nexport class LocalWeekParser extends Parser {\n  priority = 100;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"w\":\n        return parseNumericPattern(numericPatterns.week, dateString);\n      case \"wo\":\n        return match.ordinalNumber(dateString, { unit: \"week\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 53;\n  }\n\n  set(date, _flags, value, options) {\n    return startOfWeek(setWeek(date, value, options), options);\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"i\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { setISOWeek } from \"../../../setISOWeek.js\";\nimport { startOfISOWeek } from \"../../../startOfISOWeek.js\";\nimport { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\n// ISO week of year\nexport class ISOWeekParser extends Parser {\n  priority = 100;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"I\":\n        return parseNumericPattern(numericPatterns.week, dateString);\n      case \"Io\":\n        return match.ordinalNumber(dateString, { unit: \"week\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 53;\n  }\n\n  set(date, _flags, value) {\n    return startOfISOWeek(setISOWeek(date, value));\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"Y\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"d\",\n    \"D\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport {\n  isLeapYearIndex,\n  parseNDigits,\n  parseNumericPattern,\n} from \"../utils.js\";\n\nexport class DayOfYearParser extends Parser {\n  priority = 90;\n\n  subpriority = 1;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"D\":\n      case \"DD\":\n        return parseNumericPattern(numericPatterns.dayOfYear, dateString);\n      case \"Do\":\n        return match.ordinalNumber(dateString, { unit: \"date\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(date, value) {\n    const year = date.getFullYear();\n    const isLeapYear = isLeapYearIndex(year);\n    if (isLeapYear) {\n      return value >= 1 && value <= 366;\n    } else {\n      return value >= 1 && value <= 365;\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setMonth(0, value);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"Y\",\n    \"R\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"I\",\n    \"d\",\n    \"E\",\n    \"i\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\n// Day of week\nexport class DayParser extends Parser {\n  priority = 90;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      // Tue\n      case \"E\":\n      case \"EE\":\n      case \"EEE\":\n        return (\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // T\n      case \"EEEEE\":\n        return match.day(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"EEEEEE\":\n        return (\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // Tuesday\n      case \"EEEE\":\n      default:\n        return (\n          match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 6;\n  }\n\n  set(date, _flags, value, options) {\n    date = setDay(date, value, options);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"D\", \"i\", \"e\", \"c\", \"t\", \"T\"];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Local day of week\nexport class LocalDayParser extends Parser {\n  priority = 90;\n  parse(dateString, token, match, options) {\n    const valueCallback = (value) => {\n      // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n      const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n      return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n    };\n\n    switch (token) {\n      // 3\n      case \"e\":\n      case \"ee\": // 03\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n      // 3rd\n      case \"eo\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"day\",\n          }),\n          valueCallback,\n        );\n      // Tue\n      case \"eee\":\n        return (\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // T\n      case \"eeeee\":\n        return match.day(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"eeeeee\":\n        return (\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n\n      // Tuesday\n      case \"eeee\":\n      default:\n        return (\n          match.day(dateString, { width: \"wide\", context: \"formatting\" }) ||\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"formatting\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"formatting\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 6;\n  }\n\n  set(date, _flags, value, options) {\n    date = setDay(date, value, options);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"E\",\n    \"i\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { setDay } from \"../../../setDay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// Stand-alone local day of week\nexport class StandAloneLocalDayParser extends Parser {\n  priority = 90;\n\n  parse(dateString, token, match, options) {\n    const valueCallback = (value) => {\n      // We want here floor instead of trunc, so we get -7 for value 0 instead of 0\n      const wholeWeekDays = Math.floor((value - 1) / 7) * 7;\n      return ((value + options.weekStartsOn + 6) % 7) + wholeWeekDays;\n    };\n\n    switch (token) {\n      // 3\n      case \"c\":\n      case \"cc\": // 03\n        return mapValue(parseNDigits(token.length, dateString), valueCallback);\n      // 3rd\n      case \"co\":\n        return mapValue(\n          match.ordinalNumber(dateString, {\n            unit: \"day\",\n          }),\n          valueCallback,\n        );\n      // Tue\n      case \"ccc\":\n        return (\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n\n      // T\n      case \"ccccc\":\n        return match.day(dateString, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // Tu\n      case \"cccccc\":\n        return (\n          match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n\n      // Tuesday\n      case \"cccc\":\n      default:\n        return (\n          match.day(dateString, { width: \"wide\", context: \"standalone\" }) ||\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"standalone\",\n          }) ||\n          match.day(dateString, { width: \"short\", context: \"standalone\" }) ||\n          match.day(dateString, { width: \"narrow\", context: \"standalone\" })\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 6;\n  }\n\n  set(date, _flags, value, options) {\n    date = setDay(date, value, options);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"R\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"I\",\n    \"d\",\n    \"D\",\n    \"E\",\n    \"i\",\n    \"e\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { setISODay } from \"../../../setISODay.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\n// ISO day of week\nexport class ISODayParser extends Parser {\n  priority = 90;\n\n  parse(dateString, token, match) {\n    const valueCallback = (value) => {\n      if (value === 0) {\n        return 7;\n      }\n      return value;\n    };\n\n    switch (token) {\n      // 2\n      case \"i\":\n      case \"ii\": // 02\n        return parseNDigits(token.length, dateString);\n      // 2nd\n      case \"io\":\n        return match.ordinalNumber(dateString, { unit: \"day\" });\n      // Tue\n      case \"iii\":\n        return mapValue(\n          match.day(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n            match.day(dateString, {\n              width: \"short\",\n              context: \"formatting\",\n            }) ||\n            match.day(dateString, {\n              width: \"narrow\",\n              context: \"formatting\",\n            }),\n          valueCallback,\n        );\n      // T\n      case \"iiiii\":\n        return mapValue(\n          match.day(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          }),\n          valueCallback,\n        );\n      // Tu\n      case \"iiiiii\":\n        return mapValue(\n          match.day(dateString, {\n            width: \"short\",\n            context: \"formatting\",\n          }) ||\n            match.day(dateString, {\n              width: \"narrow\",\n              context: \"formatting\",\n            }),\n          valueCallback,\n        );\n      // Tuesday\n      case \"iiii\":\n      default:\n        return mapValue(\n          match.day(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n            match.day(dateString, {\n              width: \"abbreviated\",\n              context: \"formatting\",\n            }) ||\n            match.day(dateString, {\n              width: \"short\",\n              context: \"formatting\",\n            }) ||\n            match.day(dateString, {\n              width: \"narrow\",\n              context: \"formatting\",\n            }),\n          valueCallback,\n        );\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 7;\n  }\n\n  set(date, _flags, value) {\n    date = setISODay(date, value);\n    date.setHours(0, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\n    \"y\",\n    \"Y\",\n    \"u\",\n    \"q\",\n    \"Q\",\n    \"M\",\n    \"L\",\n    \"w\",\n    \"d\",\n    \"D\",\n    \"E\",\n    \"e\",\n    \"c\",\n    \"t\",\n    \"T\",\n  ];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMParser extends Parser {\n  priority = 80;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"a\":\n      case \"aa\":\n      case \"aaa\":\n        return (\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      case \"aaaaa\":\n        return match.dayPeriod(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"aaaa\":\n      default:\n        return (\n          match.dayPeriod(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"b\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\nexport class AMPMMidnightParser extends Parser {\n  priority = 80;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"b\":\n      case \"bb\":\n      case \"bbb\":\n        return (\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      case \"bbbbb\":\n        return match.dayPeriod(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"bbbb\":\n      default:\n        return (\n          match.dayPeriod(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"B\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { dayPeriodEnumToHours } from \"../utils.js\";\n\n// in the morning, in the afternoon, in the evening, at night\nexport class DayPeriodParser extends Parser {\n  priority = 80;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"B\":\n      case \"BB\":\n      case \"BBB\":\n        return (\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n\n      case \"BBBBB\":\n        return match.dayPeriod(dateString, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"BBBB\":\n      default:\n        return (\n          match.dayPeriod(dateString, {\n            width: \"wide\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          }) ||\n          match.dayPeriod(dateString, {\n            width: \"narrow\",\n            context: \"formatting\",\n          })\n        );\n    }\n  }\n\n  set(date, _flags, value) {\n    date.setHours(dayPeriodEnumToHours(value), 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"b\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1to12Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"h\":\n        return parseNumericPattern(numericPatterns.hour12h, dateString);\n      case \"ho\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 12;\n  }\n\n  set(date, _flags, value) {\n    const isPM = date.getHours() >= 12;\n    if (isPM && value < 12) {\n      date.setHours(value + 12, 0, 0, 0);\n    } else if (!isPM && value === 12) {\n      date.setHours(0, 0, 0, 0);\n    } else {\n      date.setHours(value, 0, 0, 0);\n    }\n    return date;\n  }\n\n  incompatibleTokens = [\"H\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0to23Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"H\":\n        return parseNumericPattern(numericPatterns.hour23h, dateString);\n      case \"Ho\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 23;\n  }\n\n  set(date, _flags, value) {\n    date.setHours(value, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"b\", \"h\", \"K\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour0To11Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"K\":\n        return parseNumericPattern(numericPatterns.hour11h, dateString);\n      case \"Ko\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 11;\n  }\n\n  set(date, _flags, value) {\n    const isPM = date.getHours() >= 12;\n    if (isPM && value < 12) {\n      date.setHours(value + 12, 0, 0, 0);\n    } else {\n      date.setHours(value, 0, 0, 0);\n    }\n    return date;\n  }\n\n  incompatibleTokens = [\"h\", \"H\", \"k\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class Hour1To24Parser extends Parser {\n  priority = 70;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"k\":\n        return parseNumericPattern(numericPatterns.hour24h, dateString);\n      case \"ko\":\n        return match.ordinalNumber(dateString, { unit: \"hour\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 1 && value <= 24;\n  }\n\n  set(date, _flags, value) {\n    const hours = value <= 24 ? value % 24 : value;\n    date.setHours(hours, 0, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"a\", \"b\", \"h\", \"H\", \"K\", \"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class MinuteParser extends Parser {\n  priority = 60;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"m\":\n        return parseNumericPattern(numericPatterns.minute, dateString);\n      case \"mo\":\n        return match.ordinalNumber(dateString, { unit: \"minute\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 59;\n  }\n\n  set(date, _flags, value) {\n    date.setMinutes(value, 0, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"t\", \"T\"];\n}\n","import { numericPatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseNDigits, parseNumericPattern } from \"../utils.js\";\n\nexport class SecondParser extends Parser {\n  priority = 50;\n\n  parse(dateString, token, match) {\n    switch (token) {\n      case \"s\":\n        return parseNumericPattern(numericPatterns.second, dateString);\n      case \"so\":\n        return match.ordinalNumber(dateString, { unit: \"second\" });\n      default:\n        return parseNDigits(token.length, dateString);\n    }\n  }\n\n  validate(_date, value) {\n    return value >= 0 && value <= 59;\n  }\n\n  set(date, _flags, value) {\n    date.setSeconds(value, 0);\n    return date;\n  }\n\n  incompatibleTokens = [\"t\", \"T\"];\n}\n","import { Parser } from \"../Parser.js\";\n\nimport { mapValue, parseNDigits } from \"../utils.js\";\n\nexport class FractionOfSecondParser extends Parser {\n  priority = 30;\n\n  parse(dateString, token) {\n    const valueCallback = (value) =>\n      Math.trunc(value * Math.pow(10, -token.length + 3));\n    return mapValue(parseNDigits(token.length, dateString), valueCallback);\n  }\n\n  set(date, _flags, value) {\n    date.setMilliseconds(value);\n    return date;\n  }\n\n  incompatibleTokens = [\"t\", \"T\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601. +00:00 is `'Z'`)\nexport class ISOTimezoneWithZParser extends Parser {\n  priority = 10;\n\n  parse(dateString, token) {\n    switch (token) {\n      case \"X\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalMinutes,\n          dateString,\n        );\n      case \"XX\":\n        return parseTimezonePattern(timezonePatterns.basic, dateString);\n      case \"XXXX\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalSeconds,\n          dateString,\n        );\n      case \"XXXXX\":\n        return parseTimezonePattern(\n          timezonePatterns.extendedOptionalSeconds,\n          dateString,\n        );\n      case \"XXX\":\n      default:\n        return parseTimezonePattern(timezonePatterns.extended, dateString);\n    }\n  }\n\n  set(date, flags, value) {\n    if (flags.timestampIsSet) return date;\n    return constructFrom(\n      date,\n      date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n    );\n  }\n\n  incompatibleTokens = [\"t\", \"T\", \"x\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { getTimezoneOffsetInMilliseconds } from \"../../../_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { timezonePatterns } from \"../constants.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseTimezonePattern } from \"../utils.js\";\n\n// Timezone (ISO-8601)\nexport class ISOTimezoneParser extends Parser {\n  priority = 10;\n\n  parse(dateString, token) {\n    switch (token) {\n      case \"x\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalMinutes,\n          dateString,\n        );\n      case \"xx\":\n        return parseTimezonePattern(timezonePatterns.basic, dateString);\n      case \"xxxx\":\n        return parseTimezonePattern(\n          timezonePatterns.basicOptionalSeconds,\n          dateString,\n        );\n      case \"xxxxx\":\n        return parseTimezonePattern(\n          timezonePatterns.extendedOptionalSeconds,\n          dateString,\n        );\n      case \"xxx\":\n      default:\n        return parseTimezonePattern(timezonePatterns.extended, dateString);\n    }\n  }\n\n  set(date, flags, value) {\n    if (flags.timestampIsSet) return date;\n    return constructFrom(\n      date,\n      date.getTime() - getTimezoneOffsetInMilliseconds(date) - value,\n    );\n  }\n\n  incompatibleTokens = [\"t\", \"T\", \"X\"];\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampSecondsParser extends Parser {\n  priority = 40;\n\n  parse(dateString) {\n    return parseAnyDigitsSigned(dateString);\n  }\n\n  set(date, _flags, value) {\n    return [constructFrom(date, value * 1000), { timestampIsSet: true }];\n  }\n\n  incompatibleTokens = \"*\";\n}\n","import { constructFrom } from \"../../../constructFrom.js\";\nimport { Parser } from \"../Parser.js\";\n\nimport { parseAnyDigitsSigned } from \"../utils.js\";\n\nexport class TimestampMillisecondsParser extends Parser {\n  priority = 20;\n\n  parse(dateString) {\n    return parseAnyDigitsSigned(dateString);\n  }\n\n  set(date, _flags, value) {\n    return [constructFrom(date, value), { timestampIsSet: true }];\n  }\n\n  incompatibleTokens = \"*\";\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n  isProtectedDayOfYearToken,\n  isProtectedWeekYearToken,\n  warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getDefaultOptions } from \"./getDefaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\nimport { DateTimezoneSetter } from \"./parse/_lib/Setter.js\";\nimport { parsers } from \"./parse/_lib/parsers.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { longFormatters, parsers };\n\n/**\n * The {@link parse} function options.\n */\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n//   (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n//   except a single quote symbol, which ends the sequence.\n//   Two quote characters do not end the sequence.\n//   If there is no matching single quote\n//   then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n  /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\n\nconst notWhitespaceRegExp = /\\S/;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\n/**\n * @name parse\n * @category Common Helpers\n * @summary Parse the date.\n *\n * @description\n * Return the date parsed from string using the given format string.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters in the format string wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n *\n * Format of the format string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 5 below the table).\n *\n * Not all tokens are compatible. Combinations that don't make sense or could lead to bugs are prohibited\n * and will throw `RangeError`. For example usage of 24-hour format token with AM/PM token will throw an exception:\n *\n * ```javascript\n * parse('23 AM', 'HH a', new Date())\n * //=> RangeError: The format string mustn't contain `HH` and `a` at the same time\n * ```\n *\n * See the compatibility table: https://docs.google.com/spreadsheets/d/e/2PACX-1vQOPU3xUhplll6dyoMmVUXHKl_8CRDs6_ueLmex3SoqwhuolkuN3O05l4rqx5h1dKX8eb46Ul-CCSrq/pubhtml?gid=0&single=true\n *\n * Accepted format string patterns:\n * | Unit                            |Prior| Pattern | Result examples                   | Notes |\n * |---------------------------------|-----|---------|-----------------------------------|-------|\n * | Era                             | 140 | G..GGG  | AD, BC                            |       |\n * |                                 |     | GGGG    | Anno Domini, Before Christ        | 2     |\n * |                                 |     | GGGGG   | A, B                              |       |\n * | Calendar year                   | 130 | y       | 44, 1, 1900, 2017, 9999           | 4     |\n * |                                 |     | yo      | 44th, 1st, 1900th, 9999999th      | 4,5   |\n * |                                 |     | yy      | 44, 01, 00, 17                    | 4     |\n * |                                 |     | yyy     | 044, 001, 123, 999                | 4     |\n * |                                 |     | yyyy    | 0044, 0001, 1900, 2017            | 4     |\n * |                                 |     | yyyyy   | ...                               | 2,4   |\n * | Local week-numbering year       | 130 | Y       | 44, 1, 1900, 2017, 9000           | 4     |\n * |                                 |     | Yo      | 44th, 1st, 1900th, 9999999th      | 4,5   |\n * |                                 |     | YY      | 44, 01, 00, 17                    | 4,6   |\n * |                                 |     | YYY     | 044, 001, 123, 999                | 4     |\n * |                                 |     | YYYY    | 0044, 0001, 1900, 2017            | 4,6   |\n * |                                 |     | YYYYY   | ...                               | 2,4   |\n * | ISO week-numbering year         | 130 | R       | -43, 1, 1900, 2017, 9999, -9999   | 4,5   |\n * |                                 |     | RR      | -43, 01, 00, 17                   | 4,5   |\n * |                                 |     | RRR     | -043, 001, 123, 999, -999         | 4,5   |\n * |                                 |     | RRRR    | -0043, 0001, 2017, 9999, -9999    | 4,5   |\n * |                                 |     | RRRRR   | ...                               | 2,4,5 |\n * | Extended year                   | 130 | u       | -43, 1, 1900, 2017, 9999, -999    | 4     |\n * |                                 |     | uu      | -43, 01, 99, -99                  | 4     |\n * |                                 |     | uuu     | -043, 001, 123, 999, -999         | 4     |\n * |                                 |     | uuuu    | -0043, 0001, 2017, 9999, -9999    | 4     |\n * |                                 |     | uuuuu   | ...                               | 2,4   |\n * | Quarter (formatting)            | 120 | Q       | 1, 2, 3, 4                        |       |\n * |                                 |     | Qo      | 1st, 2nd, 3rd, 4th                | 5     |\n * |                                 |     | QQ      | 01, 02, 03, 04                    |       |\n * |                                 |     | QQQ     | Q1, Q2, Q3, Q4                    |       |\n * |                                 |     | QQQQ    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 |     | QQQQQ   | 1, 2, 3, 4                        | 4     |\n * | Quarter (stand-alone)           | 120 | q       | 1, 2, 3, 4                        |       |\n * |                                 |     | qo      | 1st, 2nd, 3rd, 4th                | 5     |\n * |                                 |     | qq      | 01, 02, 03, 04                    |       |\n * |                                 |     | qqq     | Q1, Q2, Q3, Q4                    |       |\n * |                                 |     | qqqq    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 |     | qqqqq   | 1, 2, 3, 4                        | 3     |\n * | Month (formatting)              | 110 | M       | 1, 2, ..., 12                     |       |\n * |                                 |     | Mo      | 1st, 2nd, ..., 12th               | 5     |\n * |                                 |     | MM      | 01, 02, ..., 12                   |       |\n * |                                 |     | MMM     | Jan, Feb, ..., Dec                |       |\n * |                                 |     | MMMM    | January, February, ..., December  | 2     |\n * |                                 |     | MMMMM   | J, F, ..., D                      |       |\n * | Month (stand-alone)             | 110 | L       | 1, 2, ..., 12                     |       |\n * |                                 |     | Lo      | 1st, 2nd, ..., 12th               | 5     |\n * |                                 |     | LL      | 01, 02, ..., 12                   |       |\n * |                                 |     | LLL     | Jan, Feb, ..., Dec                |       |\n * |                                 |     | LLLL    | January, February, ..., December  | 2     |\n * |                                 |     | LLLLL   | J, F, ..., D                      |       |\n * | Local week of year              | 100 | w       | 1, 2, ..., 53                     |       |\n * |                                 |     | wo      | 1st, 2nd, ..., 53th               | 5     |\n * |                                 |     | ww      | 01, 02, ..., 53                   |       |\n * | ISO week of year                | 100 | I       | 1, 2, ..., 53                     | 5     |\n * |                                 |     | Io      | 1st, 2nd, ..., 53th               | 5     |\n * |                                 |     | II      | 01, 02, ..., 53                   | 5     |\n * | Day of month                    |  90 | d       | 1, 2, ..., 31                     |       |\n * |                                 |     | do      | 1st, 2nd, ..., 31st               | 5     |\n * |                                 |     | dd      | 01, 02, ..., 31                   |       |\n * | Day of year                     |  90 | D       | 1, 2, ..., 365, 366               | 7     |\n * |                                 |     | Do      | 1st, 2nd, ..., 365th, 366th       | 5     |\n * |                                 |     | DD      | 01, 02, ..., 365, 366             | 7     |\n * |                                 |     | DDD     | 001, 002, ..., 365, 366           |       |\n * |                                 |     | DDDD    | ...                               | 2     |\n * | Day of week (formatting)        |  90 | E..EEE  | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 |     | EEEE    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 |     | EEEEE   | M, T, W, T, F, S, S               |       |\n * |                                 |     | EEEEEE  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | ISO day of week (formatting)    |  90 | i       | 1, 2, 3, ..., 7                   | 5     |\n * |                                 |     | io      | 1st, 2nd, ..., 7th                | 5     |\n * |                                 |     | ii      | 01, 02, ..., 07                   | 5     |\n * |                                 |     | iii     | Mon, Tue, Wed, ..., Sun           | 5     |\n * |                                 |     | iiii    | Monday, Tuesday, ..., Sunday      | 2,5   |\n * |                                 |     | iiiii   | M, T, W, T, F, S, S               | 5     |\n * |                                 |     | iiiiii  | Mo, Tu, We, Th, Fr, Sa, Su        | 5     |\n * | Local day of week (formatting)  |  90 | e       | 2, 3, 4, ..., 1                   |       |\n * |                                 |     | eo      | 2nd, 3rd, ..., 1st                | 5     |\n * |                                 |     | ee      | 02, 03, ..., 01                   |       |\n * |                                 |     | eee     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 |     | eeee    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 |     | eeeee   | M, T, W, T, F, S, S               |       |\n * |                                 |     | eeeeee  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | Local day of week (stand-alone) |  90 | c       | 2, 3, 4, ..., 1                   |       |\n * |                                 |     | co      | 2nd, 3rd, ..., 1st                | 5     |\n * |                                 |     | cc      | 02, 03, ..., 01                   |       |\n * |                                 |     | ccc     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 |     | cccc    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 |     | ccccc   | M, T, W, T, F, S, S               |       |\n * |                                 |     | cccccc  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | AM, PM                          |  80 | a..aaa  | AM, PM                            |       |\n * |                                 |     | aaaa    | a.m., p.m.                        | 2     |\n * |                                 |     | aaaaa   | a, p                              |       |\n * | AM, PM, noon, midnight          |  80 | b..bbb  | AM, PM, noon, midnight            |       |\n * |                                 |     | bbbb    | a.m., p.m., noon, midnight        | 2     |\n * |                                 |     | bbbbb   | a, p, n, mi                       |       |\n * | Flexible day period             |  80 | B..BBB  | at night, in the morning, ...     |       |\n * |                                 |     | BBBB    | at night, in the morning, ...     | 2     |\n * |                                 |     | BBBBB   | at night, in the morning, ...     |       |\n * | Hour [1-12]                     |  70 | h       | 1, 2, ..., 11, 12                 |       |\n * |                                 |     | ho      | 1st, 2nd, ..., 11th, 12th         | 5     |\n * |                                 |     | hh      | 01, 02, ..., 11, 12               |       |\n * | Hour [0-23]                     |  70 | H       | 0, 1, 2, ..., 23                  |       |\n * |                                 |     | Ho      | 0th, 1st, 2nd, ..., 23rd          | 5     |\n * |                                 |     | HH      | 00, 01, 02, ..., 23               |       |\n * | Hour [0-11]                     |  70 | K       | 1, 2, ..., 11, 0                  |       |\n * |                                 |     | Ko      | 1st, 2nd, ..., 11th, 0th          | 5     |\n * |                                 |     | KK      | 01, 02, ..., 11, 00               |       |\n * | Hour [1-24]                     |  70 | k       | 24, 1, 2, ..., 23                 |       |\n * |                                 |     | ko      | 24th, 1st, 2nd, ..., 23rd         | 5     |\n * |                                 |     | kk      | 24, 01, 02, ..., 23               |       |\n * | Minute                          |  60 | m       | 0, 1, ..., 59                     |       |\n * |                                 |     | mo      | 0th, 1st, ..., 59th               | 5     |\n * |                                 |     | mm      | 00, 01, ..., 59                   |       |\n * | Second                          |  50 | s       | 0, 1, ..., 59                     |       |\n * |                                 |     | so      | 0th, 1st, ..., 59th               | 5     |\n * |                                 |     | ss      | 00, 01, ..., 59                   |       |\n * | Seconds timestamp               |  40 | t       | 512969520                         |       |\n * |                                 |     | tt      | ...                               | 2     |\n * | Fraction of second              |  30 | S       | 0, 1, ..., 9                      |       |\n * |                                 |     | SS      | 00, 01, ..., 99                   |       |\n * |                                 |     | SSS     | 000, 001, ..., 999                |       |\n * |                                 |     | SSSS    | ...                               | 2     |\n * | Milliseconds timestamp          |  20 | T       | 512969520900                      |       |\n * |                                 |     | TT      | ...                               | 2     |\n * | Timezone (ISO-8601 w/ Z)        |  10 | X       | -08, +0530, Z                     |       |\n * |                                 |     | XX      | -0800, +0530, Z                   |       |\n * |                                 |     | XXX     | -08:00, +05:30, Z                 |       |\n * |                                 |     | XXXX    | -0800, +0530, Z, +123456          | 2     |\n * |                                 |     | XXXXX   | -08:00, +05:30, Z, +12:34:56      |       |\n * | Timezone (ISO-8601 w/o Z)       |  10 | x       | -08, +0530, +00                   |       |\n * |                                 |     | xx      | -0800, +0530, +0000               |       |\n * |                                 |     | xxx     | -08:00, +05:30, +00:00            | 2     |\n * |                                 |     | xxxx    | -0800, +0530, +0000, +123456      |       |\n * |                                 |     | xxxxx   | -08:00, +05:30, +00:00, +12:34:56 |       |\n * | Long localized date             |  NA | P       | 05/29/1453                        | 5,8   |\n * |                                 |     | PP      | May 29, 1453                      |       |\n * |                                 |     | PPP     | May 29th, 1453                    |       |\n * |                                 |     | PPPP    | Sunday, May 29th, 1453            | 2,5,8 |\n * | Long localized time             |  NA | p       | 12:00 AM                          | 5,8   |\n * |                                 |     | pp      | 12:00:00 AM                       |       |\n * | Combination of date and time    |  NA | Pp      | 05/29/1453, 12:00 AM              |       |\n * |                                 |     | PPpp    | May 29, 1453, 12:00:00 AM         |       |\n * |                                 |     | PPPpp   | May 29th, 1453 at ...             |       |\n * |                                 |     | PPPPpp  | Sunday, May 29th, 1453 at ...     | 2,5,8 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n *    are the same as \"stand-alone\" units, but are different in some languages.\n *    \"Formatting\" units are declined according to the rules of the language\n *    in the context of a date. \"Stand-alone\" units are always nominative singular.\n *    In `format` function, they will produce different result:\n *\n *    `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n *    `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n *    `parse` will try to match both formatting and stand-alone units interchangeably.\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n *    the single quote characters (see below).\n *    If the sequence is longer than listed in table:\n *    - for numerical units (`yyyyyyyy`) `parse` will try to match a number\n *      as wide as the sequence\n *    - for text units (`MMMMMMMM`) `parse` will try to match the widest variation of the unit.\n *      These variations are marked with \"2\" in the last column of the table.\n *\n * 3. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n *    These tokens represent the shortest form of the quarter.\n *\n * 4. The main difference between `y` and `u` patterns are B.C. years:\n *\n *    | Year | `y` | `u` |\n *    |------|-----|-----|\n *    | AC 1 |   1 |   1 |\n *    | BC 1 |   1 |   0 |\n *    | BC 2 |   2 |  -1 |\n *\n *    Also `yy` will try to guess the century of two digit year by proximity with `referenceDate`:\n *\n *    `parse('50', 'yy', new Date(2018, 0, 1)) //=> Sat Jan 01 2050 00:00:00`\n *\n *    `parse('75', 'yy', new Date(2018, 0, 1)) //=> Wed Jan 01 1975 00:00:00`\n *\n *    while `uu` will just assign the year as is:\n *\n *    `parse('50', 'uu', new Date(2018, 0, 1)) //=> Sat Jan 01 0050 00:00:00`\n *\n *    `parse('75', 'uu', new Date(2018, 0, 1)) //=> Tue Jan 01 0075 00:00:00`\n *\n *    The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n *    except local week-numbering years are dependent on `options.weekStartsOn`\n *    and `options.firstWeekContainsDate` (compare [setISOWeekYear](https://date-fns.org/docs/setISOWeekYear)\n *    and [setWeekYear](https://date-fns.org/docs/setWeekYear)).\n *\n * 5. These patterns are not in the Unicode Technical Standard #35:\n *    - `i`: ISO day of week\n *    - `I`: ISO week of year\n *    - `R`: ISO week-numbering year\n *    - `o`: ordinal number modifier\n *    - `P`: long localized date\n *    - `p`: long localized time\n *\n * 6. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n *    You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 7. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n *    You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 8. `P+` tokens do not have a defined priority since they are merely aliases to other tokens based\n *    on the given locale.\n *\n *    using `en-US` locale: `P` => `MM/dd/yyyy`\n *    using `en-US` locale: `p` => `hh:mm a`\n *    using `pt-BR` locale: `P` => `dd/MM/yyyy`\n *    using `pt-BR` locale: `p` => `HH:mm`\n *\n * Values will be assigned to the date in the descending order of its unit's priority.\n * Units of an equal priority overwrite each other in the order of appearance.\n *\n * If no values of higher priority are parsed (e.g. when parsing string 'January 1st' without a year),\n * the values will be taken from 3rd argument `referenceDate` which works as a context of parsing.\n *\n * `referenceDate` must be passed for correct work of the function.\n * If you're not sure which `referenceDate` to supply, create a new instance of Date:\n * `parse('02/11/2014', 'MM/dd/yyyy', new Date())`\n * In this case parsing will be done in the context of the current date.\n * If `referenceDate` is `Invalid Date` or a value not convertible to valid `Date`,\n * then `Invalid Date` will be returned.\n *\n * The result may vary by locale.\n *\n * If `formatString` matches with `dateString` but does not provides tokens, `referenceDate` will be returned.\n *\n * If parsing failed, `Invalid Date` will be returned.\n * Invalid Date is a Date, whose time value is NaN.\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dateStr - The string to parse\n * @param formatStr - The string of tokens\n * @param referenceDate - defines values missing from the parsed dateString\n * @param options - An object with options.\n *   see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *   see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @returns The parsed date\n *\n * @throws `options.locale` must contain `match` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Parse 11 February 2014 from middle-endian format:\n * var result = parse('02/11/2014', 'MM/dd/yyyy', new Date())\n * //=> Tue Feb 11 2014 00:00:00\n *\n * @example\n * // Parse 28th of February in Esperanto locale in the context of 2010 year:\n * import eo from 'date-fns/locale/eo'\n * var result = parse('28-a de februaro', \"do 'de' MMMM\", new Date(2010, 0, 1), {\n *   locale: eo\n * })\n * //=> Sun Feb 28 2010 00:00:00\n */\nexport function parse(dateStr, formatStr, referenceDate, options) {\n  const invalidDate = () => constructFrom(options?.in || referenceDate, NaN);\n  const defaultOptions = getDefaultOptions();\n  const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  if (!formatStr)\n    return dateStr ? invalidDate() : toDate(referenceDate, options?.in);\n\n  const subFnOptions = {\n    firstWeekContainsDate,\n    weekStartsOn,\n    locale,\n  };\n\n  // If timezone isn't specified, it will try to use the context or\n  // the reference date and fallback to the system time zone.\n  const setters = [new DateTimezoneSetter(options?.in, referenceDate)];\n\n  const tokens = formatStr\n    .match(longFormattingTokensRegExp)\n    .map((substring) => {\n      const firstCharacter = substring[0];\n      if (firstCharacter in longFormatters) {\n        const longFormatter = longFormatters[firstCharacter];\n        return longFormatter(substring, locale.formatLong);\n      }\n      return substring;\n    })\n    .join(\"\")\n    .match(formattingTokensRegExp);\n\n  const usedTokens = [];\n\n  for (let token of tokens) {\n    if (\n      !options?.useAdditionalWeekYearTokens &&\n      isProtectedWeekYearToken(token)\n    ) {\n      warnOrThrowProtectedError(token, formatStr, dateStr);\n    }\n    if (\n      !options?.useAdditionalDayOfYearTokens &&\n      isProtectedDayOfYearToken(token)\n    ) {\n      warnOrThrowProtectedError(token, formatStr, dateStr);\n    }\n\n    const firstCharacter = token[0];\n    const parser = parsers[firstCharacter];\n    if (parser) {\n      const { incompatibleTokens } = parser;\n      if (Array.isArray(incompatibleTokens)) {\n        const incompatibleToken = usedTokens.find(\n          (usedToken) =>\n            incompatibleTokens.includes(usedToken.token) ||\n            usedToken.token === firstCharacter,\n        );\n        if (incompatibleToken) {\n          throw new RangeError(\n            `The format string mustn't contain \\`${incompatibleToken.fullToken}\\` and \\`${token}\\` at the same time`,\n          );\n        }\n      } else if (parser.incompatibleTokens === \"*\" && usedTokens.length > 0) {\n        throw new RangeError(\n          `The format string mustn't contain \\`${token}\\` and any other token at the same time`,\n        );\n      }\n\n      usedTokens.push({ token: firstCharacter, fullToken: token });\n\n      const parseResult = parser.run(\n        dateStr,\n        token,\n        locale.match,\n        subFnOptions,\n      );\n\n      if (!parseResult) {\n        return invalidDate();\n      }\n\n      setters.push(parseResult.setter);\n\n      dateStr = parseResult.rest;\n    } else {\n      if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n        throw new RangeError(\n          \"Format string contains an unescaped latin alphabet character `\" +\n            firstCharacter +\n            \"`\",\n        );\n      }\n\n      // Replace two single quote characters with one single quote character\n      if (token === \"''\") {\n        token = \"'\";\n      } else if (firstCharacter === \"'\") {\n        token = cleanEscapedString(token);\n      }\n\n      // Cut token from string, or, if string doesn't match the token, return Invalid Date\n      if (dateStr.indexOf(token) === 0) {\n        dateStr = dateStr.slice(token.length);\n      } else {\n        return invalidDate();\n      }\n    }\n  }\n\n  // Check if the remaining input contains something other than whitespace\n  if (dateStr.length > 0 && notWhitespaceRegExp.test(dateStr)) {\n    return invalidDate();\n  }\n\n  const uniquePrioritySetters = setters\n    .map((setter) => setter.priority)\n    .sort((a, b) => b - a)\n    .filter((priority, index, array) => array.indexOf(priority) === index)\n    .map((priority) =>\n      setters\n        .filter((setter) => setter.priority === priority)\n        .sort((a, b) => b.subPriority - a.subPriority),\n    )\n    .map((setterArray) => setterArray[0]);\n\n  let date = toDate(referenceDate, options?.in);\n\n  if (isNaN(+date)) return invalidDate();\n\n  const flags = {};\n  for (const setter of uniquePrioritySetters) {\n    if (!setter.validate(date, subFnOptions)) {\n      return invalidDate();\n    }\n\n    const result = setter.set(date, flags, subFnOptions);\n    // Result is tuple (date, flags)\n    if (Array.isArray(result)) {\n      date = result[0];\n      Object.assign(flags, result[1]);\n      // Result is date\n    } else {\n      date = result;\n    }\n  }\n\n  return date;\n}\n\nfunction cleanEscapedString(input) {\n  return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default parse;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n  return (\n    value instanceof Date ||\n    (typeof value === \"object\" &&\n      Object.prototype.toString.call(value) === \"[object Date]\")\n  );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n  return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isBefore\n * @category Common Helpers\n * @summary Is the first date before the second one?\n *\n * @description\n * Is the first date before the second one?\n *\n * @param date - The date that should be before the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is before the second date\n *\n * @example\n * // Is 10 July 1989 before 11 February 1987?\n * const result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> false\n */\nexport function isBefore(date, dateToCompare) {\n  return +toDate(date) < +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isBefore;\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n  const normalize = constructFrom.bind(\n    null,\n    context || dates.find((date) => typeof date === \"object\"),\n  );\n  return dates.map(normalize);\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n  const _date = toDate(date, options?.in);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n *   new Date(2012, 6, 2, 0, 0),\n *   new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n *   new Date(2011, 6, 3, 0, 1),\n *   new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n\n  const laterStartOfDay = startOfDay(laterDate_);\n  const earlierStartOfDay = startOfDay(earlierDate_);\n\n  const laterTimestamp =\n    +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n  const earlierTimestamp =\n    +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n  // Round the number of days to the nearest integer because the number of\n  // milliseconds in a day is not constant (e.g. it's different in the week of\n  // the daylight saving time clock shift).\n  return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n  const date_ = toDate(date, options?.in);\n  date_.setFullYear(date_.getFullYear(), 0, 1);\n  date_.setHours(0, 0, 0, 0);\n  return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const diff = differenceInCalendarDays(_date, startOfYear(_date));\n  const dayOfYear = diff + 1;\n  return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","export function addLeadingZeros(number, targetLength) {\n  const sign = number < 0 ? \"-\" : \"\";\n  const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n  return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * |     | Unit                           |     | Unit                           |\n * |-----|--------------------------------|-----|--------------------------------|\n * |  a  | AM, PM                         |  A* |                                |\n * |  d  | Day of month                   |  D  |                                |\n * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n * |  m  | Minute                         |  M  | Month                          |\n * |  s  | Second                         |  S  | Fraction of second             |\n * |  y  | Year (abs)                     |  Y  |                                |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n  // Year\n  y(date, token) {\n    // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n    // | Year     |     y | yy |   yyy |  yyyy | yyyyy |\n    // |----------|-------|----|-------|-------|-------|\n    // | AD 1     |     1 | 01 |   001 |  0001 | 00001 |\n    // | AD 12    |    12 | 12 |   012 |  0012 | 00012 |\n    // | AD 123   |   123 | 23 |   123 |  0123 | 00123 |\n    // | AD 1234  |  1234 | 34 |  1234 |  1234 | 01234 |\n    // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n    const signedYear = date.getFullYear();\n    // Returns 1 for 1 BC (which is year 0 in JavaScript)\n    const year = signedYear > 0 ? signedYear : 1 - signedYear;\n    return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n  },\n\n  // Month\n  M(date, token) {\n    const month = date.getMonth();\n    return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n  },\n\n  // Day of the month\n  d(date, token) {\n    return addLeadingZeros(date.getDate(), token.length);\n  },\n\n  // AM or PM\n  a(date, token) {\n    const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n    switch (token) {\n      case \"a\":\n      case \"aa\":\n        return dayPeriodEnumValue.toUpperCase();\n      case \"aaa\":\n        return dayPeriodEnumValue;\n      case \"aaaaa\":\n        return dayPeriodEnumValue[0];\n      case \"aaaa\":\n      default:\n        return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n    }\n  },\n\n  // Hour [1-12]\n  h(date, token) {\n    return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n  },\n\n  // Hour [0-23]\n  H(date, token) {\n    return addLeadingZeros(date.getHours(), token.length);\n  },\n\n  // Minute\n  m(date, token) {\n    return addLeadingZeros(date.getMinutes(), token.length);\n  },\n\n  // Second\n  s(date, token) {\n    return addLeadingZeros(date.getSeconds(), token.length);\n  },\n\n  // Fraction of second\n  S(date, token) {\n    const numberOfDigits = token.length;\n    const milliseconds = date.getMilliseconds();\n    const fractionalSeconds = Math.trunc(\n      milliseconds * Math.pow(10, numberOfDigits - 3),\n    );\n    return addLeadingZeros(fractionalSeconds, token.length);\n  },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n  am: \"am\",\n  pm: \"pm\",\n  midnight: \"midnight\",\n  noon: \"noon\",\n  morning: \"morning\",\n  afternoon: \"afternoon\",\n  evening: \"evening\",\n  night: \"night\",\n};\n\n/*\n * |     | Unit                           |     | Unit                           |\n * |-----|--------------------------------|-----|--------------------------------|\n * |  a  | AM, PM                         |  A* | Milliseconds in day            |\n * |  b  | AM, PM, noon, midnight         |  B  | Flexible day period            |\n * |  c  | Stand-alone local day of week  |  C* | Localized hour w/ day period   |\n * |  d  | Day of month                   |  D  | Day of year                    |\n * |  e  | Local day of week              |  E  | Day of week                    |\n * |  f  |                                |  F* | Day of week in month           |\n * |  g* | Modified Julian day            |  G  | Era                            |\n * |  h  | Hour [1-12]                    |  H  | Hour [0-23]                    |\n * |  i! | ISO day of week                |  I! | ISO week of year               |\n * |  j* | Localized hour w/ day period   |  J* | Localized hour w/o day period  |\n * |  k  | Hour [1-24]                    |  K  | Hour [0-11]                    |\n * |  l* | (deprecated)                   |  L  | Stand-alone month              |\n * |  m  | Minute                         |  M  | Month                          |\n * |  n  |                                |  N  |                                |\n * |  o! | Ordinal number modifier        |  O  | Timezone (GMT)                 |\n * |  p! | Long localized time            |  P! | Long localized date            |\n * |  q  | Stand-alone quarter            |  Q  | Quarter                        |\n * |  r* | Related Gregorian year         |  R! | ISO week-numbering year        |\n * |  s  | Second                         |  S  | Fraction of second             |\n * |  t! | Seconds timestamp              |  T! | Milliseconds timestamp         |\n * |  u  | Extended year                  |  U* | Cyclic year                    |\n * |  v* | Timezone (generic non-locat.)  |  V* | Timezone (location)            |\n * |  w  | Local week of year             |  W* | Week of month                  |\n * |  x  | Timezone (ISO-8601 w/o Z)      |  X  | Timezone (ISO-8601)            |\n * |  y  | Year (abs)                     |  Y  | Local week-numbering year      |\n * |  z  | Timezone (specific non-locat.) |  Z* | Timezone (aliases)             |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n *   i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n *   `R` is supposed to be used in conjunction with `I` and `i`\n *   for universal ISO week-numbering date, whereas\n *   `Y` is supposed to be used in conjunction with `w` and `e`\n *   for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n  // Era\n  G: function (date, token, localize) {\n    const era = date.getFullYear() > 0 ? 1 : 0;\n    switch (token) {\n      // AD, BC\n      case \"G\":\n      case \"GG\":\n      case \"GGG\":\n        return localize.era(era, { width: \"abbreviated\" });\n      // A, B\n      case \"GGGGG\":\n        return localize.era(era, { width: \"narrow\" });\n      // Anno Domini, Before Christ\n      case \"GGGG\":\n      default:\n        return localize.era(era, { width: \"wide\" });\n    }\n  },\n\n  // Year\n  y: function (date, token, localize) {\n    // Ordinal number\n    if (token === \"yo\") {\n      const signedYear = date.getFullYear();\n      // Returns 1 for 1 BC (which is year 0 in JavaScript)\n      const year = signedYear > 0 ? signedYear : 1 - signedYear;\n      return localize.ordinalNumber(year, { unit: \"year\" });\n    }\n\n    return lightFormatters.y(date, token);\n  },\n\n  // Local week-numbering year\n  Y: function (date, token, localize, options) {\n    const signedWeekYear = getWeekYear(date, options);\n    // Returns 1 for 1 BC (which is year 0 in JavaScript)\n    const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n    // Two digit year\n    if (token === \"YY\") {\n      const twoDigitYear = weekYear % 100;\n      return addLeadingZeros(twoDigitYear, 2);\n    }\n\n    // Ordinal number\n    if (token === \"Yo\") {\n      return localize.ordinalNumber(weekYear, { unit: \"year\" });\n    }\n\n    // Padding\n    return addLeadingZeros(weekYear, token.length);\n  },\n\n  // ISO week-numbering year\n  R: function (date, token) {\n    const isoWeekYear = getISOWeekYear(date);\n\n    // Padding\n    return addLeadingZeros(isoWeekYear, token.length);\n  },\n\n  // Extended year. This is a single number designating the year of this calendar system.\n  // The main difference between `y` and `u` localizers are B.C. years:\n  // | Year | `y` | `u` |\n  // |------|-----|-----|\n  // | AC 1 |   1 |   1 |\n  // | BC 1 |   1 |   0 |\n  // | BC 2 |   2 |  -1 |\n  // Also `yy` always returns the last two digits of a year,\n  // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n  u: function (date, token) {\n    const year = date.getFullYear();\n    return addLeadingZeros(year, token.length);\n  },\n\n  // Quarter\n  Q: function (date, token, localize) {\n    const quarter = Math.ceil((date.getMonth() + 1) / 3);\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"Q\":\n        return String(quarter);\n      // 01, 02, 03, 04\n      case \"QQ\":\n        return addLeadingZeros(quarter, 2);\n      // 1st, 2nd, 3rd, 4th\n      case \"Qo\":\n        return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"QQQ\":\n        return localize.quarter(quarter, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"QQQQQ\":\n        return localize.quarter(quarter, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"QQQQ\":\n      default:\n        return localize.quarter(quarter, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Stand-alone quarter\n  q: function (date, token, localize) {\n    const quarter = Math.ceil((date.getMonth() + 1) / 3);\n    switch (token) {\n      // 1, 2, 3, 4\n      case \"q\":\n        return String(quarter);\n      // 01, 02, 03, 04\n      case \"qq\":\n        return addLeadingZeros(quarter, 2);\n      // 1st, 2nd, 3rd, 4th\n      case \"qo\":\n        return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n      // Q1, Q2, Q3, Q4\n      case \"qqq\":\n        return localize.quarter(quarter, {\n          width: \"abbreviated\",\n          context: \"standalone\",\n        });\n      // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n      case \"qqqqq\":\n        return localize.quarter(quarter, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // 1st quarter, 2nd quarter, ...\n      case \"qqqq\":\n      default:\n        return localize.quarter(quarter, {\n          width: \"wide\",\n          context: \"standalone\",\n        });\n    }\n  },\n\n  // Month\n  M: function (date, token, localize) {\n    const month = date.getMonth();\n    switch (token) {\n      case \"M\":\n      case \"MM\":\n        return lightFormatters.M(date, token);\n      // 1st, 2nd, ..., 12th\n      case \"Mo\":\n        return localize.ordinalNumber(month + 1, { unit: \"month\" });\n      // Jan, Feb, ..., Dec\n      case \"MMM\":\n        return localize.month(month, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // J, F, ..., D\n      case \"MMMMM\":\n        return localize.month(month, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // January, February, ..., December\n      case \"MMMM\":\n      default:\n        return localize.month(month, { width: \"wide\", context: \"formatting\" });\n    }\n  },\n\n  // Stand-alone month\n  L: function (date, token, localize) {\n    const month = date.getMonth();\n    switch (token) {\n      // 1, 2, ..., 12\n      case \"L\":\n        return String(month + 1);\n      // 01, 02, ..., 12\n      case \"LL\":\n        return addLeadingZeros(month + 1, 2);\n      // 1st, 2nd, ..., 12th\n      case \"Lo\":\n        return localize.ordinalNumber(month + 1, { unit: \"month\" });\n      // Jan, Feb, ..., Dec\n      case \"LLL\":\n        return localize.month(month, {\n          width: \"abbreviated\",\n          context: \"standalone\",\n        });\n      // J, F, ..., D\n      case \"LLLLL\":\n        return localize.month(month, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // January, February, ..., December\n      case \"LLLL\":\n      default:\n        return localize.month(month, { width: \"wide\", context: \"standalone\" });\n    }\n  },\n\n  // Local week of year\n  w: function (date, token, localize, options) {\n    const week = getWeek(date, options);\n\n    if (token === \"wo\") {\n      return localize.ordinalNumber(week, { unit: \"week\" });\n    }\n\n    return addLeadingZeros(week, token.length);\n  },\n\n  // ISO week of year\n  I: function (date, token, localize) {\n    const isoWeek = getISOWeek(date);\n\n    if (token === \"Io\") {\n      return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n    }\n\n    return addLeadingZeros(isoWeek, token.length);\n  },\n\n  // Day of the month\n  d: function (date, token, localize) {\n    if (token === \"do\") {\n      return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n    }\n\n    return lightFormatters.d(date, token);\n  },\n\n  // Day of year\n  D: function (date, token, localize) {\n    const dayOfYear = getDayOfYear(date);\n\n    if (token === \"Do\") {\n      return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n    }\n\n    return addLeadingZeros(dayOfYear, token.length);\n  },\n\n  // Day of week\n  E: function (date, token, localize) {\n    const dayOfWeek = date.getDay();\n    switch (token) {\n      // Tue\n      case \"E\":\n      case \"EE\":\n      case \"EEE\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // T\n      case \"EEEEE\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"EEEEEE\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"formatting\",\n        });\n      // Tuesday\n      case \"EEEE\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Local day of week\n  e: function (date, token, localize, options) {\n    const dayOfWeek = date.getDay();\n    const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n    switch (token) {\n      // Numerical value (Nth day of week with current locale or weekStartsOn)\n      case \"e\":\n        return String(localDayOfWeek);\n      // Padded numerical value\n      case \"ee\":\n        return addLeadingZeros(localDayOfWeek, 2);\n      // 1st, 2nd, ..., 7th\n      case \"eo\":\n        return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n      case \"eee\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // T\n      case \"eeeee\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"eeeeee\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"formatting\",\n        });\n      // Tuesday\n      case \"eeee\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Stand-alone local day of week\n  c: function (date, token, localize, options) {\n    const dayOfWeek = date.getDay();\n    const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n    switch (token) {\n      // Numerical value (same as in `e`)\n      case \"c\":\n        return String(localDayOfWeek);\n      // Padded numerical value\n      case \"cc\":\n        return addLeadingZeros(localDayOfWeek, token.length);\n      // 1st, 2nd, ..., 7th\n      case \"co\":\n        return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n      case \"ccc\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"standalone\",\n        });\n      // T\n      case \"ccccc\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"standalone\",\n        });\n      // Tu\n      case \"cccccc\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"standalone\",\n        });\n      // Tuesday\n      case \"cccc\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"standalone\",\n        });\n    }\n  },\n\n  // ISO day of week\n  i: function (date, token, localize) {\n    const dayOfWeek = date.getDay();\n    const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n    switch (token) {\n      // 2\n      case \"i\":\n        return String(isoDayOfWeek);\n      // 02\n      case \"ii\":\n        return addLeadingZeros(isoDayOfWeek, token.length);\n      // 2nd\n      case \"io\":\n        return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n      // Tue\n      case \"iii\":\n        return localize.day(dayOfWeek, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      // T\n      case \"iiiii\":\n        return localize.day(dayOfWeek, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      // Tu\n      case \"iiiiii\":\n        return localize.day(dayOfWeek, {\n          width: \"short\",\n          context: \"formatting\",\n        });\n      // Tuesday\n      case \"iiii\":\n      default:\n        return localize.day(dayOfWeek, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // AM or PM\n  a: function (date, token, localize) {\n    const hours = date.getHours();\n    const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n    switch (token) {\n      case \"a\":\n      case \"aa\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      case \"aaa\":\n        return localize\n          .dayPeriod(dayPeriodEnumValue, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          })\n          .toLowerCase();\n      case \"aaaaa\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"aaaa\":\n      default:\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // AM, PM, midnight, noon\n  b: function (date, token, localize) {\n    const hours = date.getHours();\n    let dayPeriodEnumValue;\n    if (hours === 12) {\n      dayPeriodEnumValue = dayPeriodEnum.noon;\n    } else if (hours === 0) {\n      dayPeriodEnumValue = dayPeriodEnum.midnight;\n    } else {\n      dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n    }\n\n    switch (token) {\n      case \"b\":\n      case \"bb\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      case \"bbb\":\n        return localize\n          .dayPeriod(dayPeriodEnumValue, {\n            width: \"abbreviated\",\n            context: \"formatting\",\n          })\n          .toLowerCase();\n      case \"bbbbb\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"bbbb\":\n      default:\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // in the morning, in the afternoon, in the evening, at night\n  B: function (date, token, localize) {\n    const hours = date.getHours();\n    let dayPeriodEnumValue;\n    if (hours >= 17) {\n      dayPeriodEnumValue = dayPeriodEnum.evening;\n    } else if (hours >= 12) {\n      dayPeriodEnumValue = dayPeriodEnum.afternoon;\n    } else if (hours >= 4) {\n      dayPeriodEnumValue = dayPeriodEnum.morning;\n    } else {\n      dayPeriodEnumValue = dayPeriodEnum.night;\n    }\n\n    switch (token) {\n      case \"B\":\n      case \"BB\":\n      case \"BBB\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"abbreviated\",\n          context: \"formatting\",\n        });\n      case \"BBBBB\":\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"narrow\",\n          context: \"formatting\",\n        });\n      case \"BBBB\":\n      default:\n        return localize.dayPeriod(dayPeriodEnumValue, {\n          width: \"wide\",\n          context: \"formatting\",\n        });\n    }\n  },\n\n  // Hour [1-12]\n  h: function (date, token, localize) {\n    if (token === \"ho\") {\n      let hours = date.getHours() % 12;\n      if (hours === 0) hours = 12;\n      return localize.ordinalNumber(hours, { unit: \"hour\" });\n    }\n\n    return lightFormatters.h(date, token);\n  },\n\n  // Hour [0-23]\n  H: function (date, token, localize) {\n    if (token === \"Ho\") {\n      return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n    }\n\n    return lightFormatters.H(date, token);\n  },\n\n  // Hour [0-11]\n  K: function (date, token, localize) {\n    const hours = date.getHours() % 12;\n\n    if (token === \"Ko\") {\n      return localize.ordinalNumber(hours, { unit: \"hour\" });\n    }\n\n    return addLeadingZeros(hours, token.length);\n  },\n\n  // Hour [1-24]\n  k: function (date, token, localize) {\n    let hours = date.getHours();\n    if (hours === 0) hours = 24;\n\n    if (token === \"ko\") {\n      return localize.ordinalNumber(hours, { unit: \"hour\" });\n    }\n\n    return addLeadingZeros(hours, token.length);\n  },\n\n  // Minute\n  m: function (date, token, localize) {\n    if (token === \"mo\") {\n      return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n    }\n\n    return lightFormatters.m(date, token);\n  },\n\n  // Second\n  s: function (date, token, localize) {\n    if (token === \"so\") {\n      return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n    }\n\n    return lightFormatters.s(date, token);\n  },\n\n  // Fraction of second\n  S: function (date, token) {\n    return lightFormatters.S(date, token);\n  },\n\n  // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n  X: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    if (timezoneOffset === 0) {\n      return \"Z\";\n    }\n\n    switch (token) {\n      // Hours and optional minutes\n      case \"X\":\n        return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n      // Hours, minutes and optional seconds without `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `XX`\n      case \"XXXX\":\n      case \"XX\": // Hours and minutes without `:` delimiter\n        return formatTimezone(timezoneOffset);\n\n      // Hours, minutes and optional seconds with `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `XXX`\n      case \"XXXXX\":\n      case \"XXX\": // Hours and minutes with `:` delimiter\n      default:\n        return formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n  x: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    switch (token) {\n      // Hours and optional minutes\n      case \"x\":\n        return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n      // Hours, minutes and optional seconds without `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `xx`\n      case \"xxxx\":\n      case \"xx\": // Hours and minutes without `:` delimiter\n        return formatTimezone(timezoneOffset);\n\n      // Hours, minutes and optional seconds with `:` delimiter\n      // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n      // so this token always has the same output as `xxx`\n      case \"xxxxx\":\n      case \"xxx\": // Hours and minutes with `:` delimiter\n      default:\n        return formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Timezone (GMT)\n  O: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    switch (token) {\n      // Short\n      case \"O\":\n      case \"OO\":\n      case \"OOO\":\n        return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n      // Long\n      case \"OOOO\":\n      default:\n        return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Timezone (specific non-location)\n  z: function (date, token, _localize) {\n    const timezoneOffset = date.getTimezoneOffset();\n\n    switch (token) {\n      // Short\n      case \"z\":\n      case \"zz\":\n      case \"zzz\":\n        return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n      // Long\n      case \"zzzz\":\n      default:\n        return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n    }\n  },\n\n  // Seconds timestamp\n  t: function (date, token, _localize) {\n    const timestamp = Math.trunc(+date / 1000);\n    return addLeadingZeros(timestamp, token.length);\n  },\n\n  // Milliseconds timestamp\n  T: function (date, token, _localize) {\n    return addLeadingZeros(+date, token.length);\n  },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n  const sign = offset > 0 ? \"-\" : \"+\";\n  const absOffset = Math.abs(offset);\n  const hours = Math.trunc(absOffset / 60);\n  const minutes = absOffset % 60;\n  if (minutes === 0) {\n    return sign + String(hours);\n  }\n  return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n  if (offset % 60 === 0) {\n    const sign = offset > 0 ? \"-\" : \"+\";\n    return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n  }\n  return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n  const sign = offset > 0 ? \"-\" : \"+\";\n  const absOffset = Math.abs(offset);\n  const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n  const minutes = addLeadingZeros(absOffset % 60, 2);\n  return sign + hours + delimiter + minutes;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n  isProtectedDayOfYearToken,\n  isProtectedWeekYearToken,\n  warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n//   (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n//   except a single quote symbol, which ends the sequence.\n//   Two quote characters do not end the sequence.\n//   If there is no matching single quote\n//   then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n  /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit                            | Pattern | Result examples                   | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era                             | G..GGG  | AD, BC                            |       |\n * |                                 | GGGG    | Anno Domini, Before Christ        | 2     |\n * |                                 | GGGGG   | A, B                              |       |\n * | Calendar year                   | y       | 44, 1, 1900, 2017                 | 5     |\n * |                                 | yo      | 44th, 1st, 0th, 17th              | 5,7   |\n * |                                 | yy      | 44, 01, 00, 17                    | 5     |\n * |                                 | yyy     | 044, 001, 1900, 2017              | 5     |\n * |                                 | yyyy    | 0044, 0001, 1900, 2017            | 5     |\n * |                                 | yyyyy   | ...                               | 3,5   |\n * | Local week-numbering year       | Y       | 44, 1, 1900, 2017                 | 5     |\n * |                                 | Yo      | 44th, 1st, 1900th, 2017th         | 5,7   |\n * |                                 | YY      | 44, 01, 00, 17                    | 5,8   |\n * |                                 | YYY     | 044, 001, 1900, 2017              | 5     |\n * |                                 | YYYY    | 0044, 0001, 1900, 2017            | 5,8   |\n * |                                 | YYYYY   | ...                               | 3,5   |\n * | ISO week-numbering year         | R       | -43, 0, 1, 1900, 2017             | 5,7   |\n * |                                 | RR      | -43, 00, 01, 1900, 2017           | 5,7   |\n * |                                 | RRR     | -043, 000, 001, 1900, 2017        | 5,7   |\n * |                                 | RRRR    | -0043, 0000, 0001, 1900, 2017     | 5,7   |\n * |                                 | RRRRR   | ...                               | 3,5,7 |\n * | Extended year                   | u       | -43, 0, 1, 1900, 2017             | 5     |\n * |                                 | uu      | -43, 01, 1900, 2017               | 5     |\n * |                                 | uuu     | -043, 001, 1900, 2017             | 5     |\n * |                                 | uuuu    | -0043, 0001, 1900, 2017           | 5     |\n * |                                 | uuuuu   | ...                               | 3,5   |\n * | Quarter (formatting)            | Q       | 1, 2, 3, 4                        |       |\n * |                                 | Qo      | 1st, 2nd, 3rd, 4th                | 7     |\n * |                                 | QQ      | 01, 02, 03, 04                    |       |\n * |                                 | QQQ     | Q1, Q2, Q3, Q4                    |       |\n * |                                 | QQQQ    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 | QQQQQ   | 1, 2, 3, 4                        | 4     |\n * | Quarter (stand-alone)           | q       | 1, 2, 3, 4                        |       |\n * |                                 | qo      | 1st, 2nd, 3rd, 4th                | 7     |\n * |                                 | qq      | 01, 02, 03, 04                    |       |\n * |                                 | qqq     | Q1, Q2, Q3, Q4                    |       |\n * |                                 | qqqq    | 1st quarter, 2nd quarter, ...     | 2     |\n * |                                 | qqqqq   | 1, 2, 3, 4                        | 4     |\n * | Month (formatting)              | M       | 1, 2, ..., 12                     |       |\n * |                                 | Mo      | 1st, 2nd, ..., 12th               | 7     |\n * |                                 | MM      | 01, 02, ..., 12                   |       |\n * |                                 | MMM     | Jan, Feb, ..., Dec                |       |\n * |                                 | MMMM    | January, February, ..., December  | 2     |\n * |                                 | MMMMM   | J, F, ..., D                      |       |\n * | Month (stand-alone)             | L       | 1, 2, ..., 12                     |       |\n * |                                 | Lo      | 1st, 2nd, ..., 12th               | 7     |\n * |                                 | LL      | 01, 02, ..., 12                   |       |\n * |                                 | LLL     | Jan, Feb, ..., Dec                |       |\n * |                                 | LLLL    | January, February, ..., December  | 2     |\n * |                                 | LLLLL   | J, F, ..., D                      |       |\n * | Local week of year              | w       | 1, 2, ..., 53                     |       |\n * |                                 | wo      | 1st, 2nd, ..., 53th               | 7     |\n * |                                 | ww      | 01, 02, ..., 53                   |       |\n * | ISO week of year                | I       | 1, 2, ..., 53                     | 7     |\n * |                                 | Io      | 1st, 2nd, ..., 53th               | 7     |\n * |                                 | II      | 01, 02, ..., 53                   | 7     |\n * | Day of month                    | d       | 1, 2, ..., 31                     |       |\n * |                                 | do      | 1st, 2nd, ..., 31st               | 7     |\n * |                                 | dd      | 01, 02, ..., 31                   |       |\n * | Day of year                     | D       | 1, 2, ..., 365, 366               | 9     |\n * |                                 | Do      | 1st, 2nd, ..., 365th, 366th       | 7     |\n * |                                 | DD      | 01, 02, ..., 365, 366             | 9     |\n * |                                 | DDD     | 001, 002, ..., 365, 366           |       |\n * |                                 | DDDD    | ...                               | 3     |\n * | Day of week (formatting)        | E..EEE  | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 | EEEE    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 | EEEEE   | M, T, W, T, F, S, S               |       |\n * |                                 | EEEEEE  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | ISO day of week (formatting)    | i       | 1, 2, 3, ..., 7                   | 7     |\n * |                                 | io      | 1st, 2nd, ..., 7th                | 7     |\n * |                                 | ii      | 01, 02, ..., 07                   | 7     |\n * |                                 | iii     | Mon, Tue, Wed, ..., Sun           | 7     |\n * |                                 | iiii    | Monday, Tuesday, ..., Sunday      | 2,7   |\n * |                                 | iiiii   | M, T, W, T, F, S, S               | 7     |\n * |                                 | iiiiii  | Mo, Tu, We, Th, Fr, Sa, Su        | 7     |\n * | Local day of week (formatting)  | e       | 2, 3, 4, ..., 1                   |       |\n * |                                 | eo      | 2nd, 3rd, ..., 1st                | 7     |\n * |                                 | ee      | 02, 03, ..., 01                   |       |\n * |                                 | eee     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 | eeee    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 | eeeee   | M, T, W, T, F, S, S               |       |\n * |                                 | eeeeee  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | Local day of week (stand-alone) | c       | 2, 3, 4, ..., 1                   |       |\n * |                                 | co      | 2nd, 3rd, ..., 1st                | 7     |\n * |                                 | cc      | 02, 03, ..., 01                   |       |\n * |                                 | ccc     | Mon, Tue, Wed, ..., Sun           |       |\n * |                                 | cccc    | Monday, Tuesday, ..., Sunday      | 2     |\n * |                                 | ccccc   | M, T, W, T, F, S, S               |       |\n * |                                 | cccccc  | Mo, Tu, We, Th, Fr, Sa, Su        |       |\n * | AM, PM                          | a..aa   | AM, PM                            |       |\n * |                                 | aaa     | am, pm                            |       |\n * |                                 | aaaa    | a.m., p.m.                        | 2     |\n * |                                 | aaaaa   | a, p                              |       |\n * | AM, PM, noon, midnight          | b..bb   | AM, PM, noon, midnight            |       |\n * |                                 | bbb     | am, pm, noon, midnight            |       |\n * |                                 | bbbb    | a.m., p.m., noon, midnight        | 2     |\n * |                                 | bbbbb   | a, p, n, mi                       |       |\n * | Flexible day period             | B..BBB  | at night, in the morning, ...     |       |\n * |                                 | BBBB    | at night, in the morning, ...     | 2     |\n * |                                 | BBBBB   | at night, in the morning, ...     |       |\n * | Hour [1-12]                     | h       | 1, 2, ..., 11, 12                 |       |\n * |                                 | ho      | 1st, 2nd, ..., 11th, 12th         | 7     |\n * |                                 | hh      | 01, 02, ..., 11, 12               |       |\n * | Hour [0-23]                     | H       | 0, 1, 2, ..., 23                  |       |\n * |                                 | Ho      | 0th, 1st, 2nd, ..., 23rd          | 7     |\n * |                                 | HH      | 00, 01, 02, ..., 23               |       |\n * | Hour [0-11]                     | K       | 1, 2, ..., 11, 0                  |       |\n * |                                 | Ko      | 1st, 2nd, ..., 11th, 0th          | 7     |\n * |                                 | KK      | 01, 02, ..., 11, 00               |       |\n * | Hour [1-24]                     | k       | 24, 1, 2, ..., 23                 |       |\n * |                                 | ko      | 24th, 1st, 2nd, ..., 23rd         | 7     |\n * |                                 | kk      | 24, 01, 02, ..., 23               |       |\n * | Minute                          | m       | 0, 1, ..., 59                     |       |\n * |                                 | mo      | 0th, 1st, ..., 59th               | 7     |\n * |                                 | mm      | 00, 01, ..., 59                   |       |\n * | Second                          | s       | 0, 1, ..., 59                     |       |\n * |                                 | so      | 0th, 1st, ..., 59th               | 7     |\n * |                                 | ss      | 00, 01, ..., 59                   |       |\n * | Fraction of second              | S       | 0, 1, ..., 9                      |       |\n * |                                 | SS      | 00, 01, ..., 99                   |       |\n * |                                 | SSS     | 000, 001, ..., 999                |       |\n * |                                 | SSSS    | ...                               | 3     |\n * | Timezone (ISO-8601 w/ Z)        | X       | -08, +0530, Z                     |       |\n * |                                 | XX      | -0800, +0530, Z                   |       |\n * |                                 | XXX     | -08:00, +05:30, Z                 |       |\n * |                                 | XXXX    | -0800, +0530, Z, +123456          | 2     |\n * |                                 | XXXXX   | -08:00, +05:30, Z, +12:34:56      |       |\n * | Timezone (ISO-8601 w/o Z)       | x       | -08, +0530, +00                   |       |\n * |                                 | xx      | -0800, +0530, +0000               |       |\n * |                                 | xxx     | -08:00, +05:30, +00:00            | 2     |\n * |                                 | xxxx    | -0800, +0530, +0000, +123456      |       |\n * |                                 | xxxxx   | -08:00, +05:30, +00:00, +12:34:56 |       |\n * | Timezone (GMT)                  | O...OOO | GMT-8, GMT+5:30, GMT+0            |       |\n * |                                 | OOOO    | GMT-08:00, GMT+05:30, GMT+00:00   | 2     |\n * | Timezone (specific non-locat.)  | z...zzz | GMT-8, GMT+5:30, GMT+0            | 6     |\n * |                                 | zzzz    | GMT-08:00, GMT+05:30, GMT+00:00   | 2,6   |\n * | Seconds timestamp               | t       | 512969520                         | 7     |\n * |                                 | tt      | ...                               | 3,7   |\n * | Milliseconds timestamp          | T       | 512969520900                      | 7     |\n * |                                 | TT      | ...                               | 3,7   |\n * | Long localized date             | P       | 04/29/1453                        | 7     |\n * |                                 | PP      | Apr 29, 1453                      | 7     |\n * |                                 | PPP     | April 29th, 1453                  | 7     |\n * |                                 | PPPP    | Friday, April 29th, 1453          | 2,7   |\n * | Long localized time             | p       | 12:00 AM                          | 7     |\n * |                                 | pp      | 12:00:00 AM                       | 7     |\n * |                                 | ppp     | 12:00:00 AM GMT+2                 | 7     |\n * |                                 | pppp    | 12:00:00 AM GMT+02:00             | 2,7   |\n * | Combination of date and time    | Pp      | 04/29/1453, 12:00 AM              | 7     |\n * |                                 | PPpp    | Apr 29, 1453, 12:00:00 AM         | 7     |\n * |                                 | PPPppp  | April 29th, 1453 at ...           | 7     |\n * |                                 | PPPPpppp| Friday, April 29th, 1453 at ...   | 2,7   |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n *    are the same as \"stand-alone\" units, but are different in some languages.\n *    \"Formatting\" units are declined according to the rules of the language\n *    in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n *    `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n *    `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n *    the single quote characters (see below).\n *    If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n *    the output will be the same as default pattern for this unit, usually\n *    the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n *    are marked with \"2\" in the last column of the table.\n *\n *    `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n *    `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n *    The output will be padded with zeros to match the length of the pattern.\n *\n *    `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n *    These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n *    | Year | `y` | `u` |\n *    |------|-----|-----|\n *    | AC 1 |   1 |   1 |\n *    | BC 1 |   1 |   0 |\n *    | BC 2 |   2 |  -1 |\n *\n *    Also `yy` always returns the last two digits of a year,\n *    while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n *    | Year | `yy` | `uu` |\n *    |------|------|------|\n *    | 1    |   01 |   01 |\n *    | 14   |   14 |   14 |\n *    | 376  |   76 |  376 |\n *    | 1453 |   53 | 1453 |\n *\n *    The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n *    except local week-numbering years are dependent on `options.weekStartsOn`\n *    and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n *    and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n *    so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n *    - `i`: ISO day of week\n *    - `I`: ISO week of year\n *    - `R`: ISO week-numbering year\n *    - `t`: seconds timestamp\n *    - `T`: milliseconds timestamp\n *    - `o`: ordinal number modifier\n *    - `P`: long localized date\n *    - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n *    You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n *    You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n *   locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n  const defaultOptions = getDefaultOptions();\n  const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n  const firstWeekContainsDate =\n    options?.firstWeekContainsDate ??\n    options?.locale?.options?.firstWeekContainsDate ??\n    defaultOptions.firstWeekContainsDate ??\n    defaultOptions.locale?.options?.firstWeekContainsDate ??\n    1;\n\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const originalDate = toDate(date, options?.in);\n\n  if (!isValid(originalDate)) {\n    throw new RangeError(\"Invalid time value\");\n  }\n\n  let parts = formatStr\n    .match(longFormattingTokensRegExp)\n    .map((substring) => {\n      const firstCharacter = substring[0];\n      if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n        const longFormatter = longFormatters[firstCharacter];\n        return longFormatter(substring, locale.formatLong);\n      }\n      return substring;\n    })\n    .join(\"\")\n    .match(formattingTokensRegExp)\n    .map((substring) => {\n      // Replace two single quote characters with one single quote character\n      if (substring === \"''\") {\n        return { isToken: false, value: \"'\" };\n      }\n\n      const firstCharacter = substring[0];\n      if (firstCharacter === \"'\") {\n        return { isToken: false, value: cleanEscapedString(substring) };\n      }\n\n      if (formatters[firstCharacter]) {\n        return { isToken: true, value: substring };\n      }\n\n      if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n        throw new RangeError(\n          \"Format string contains an unescaped latin alphabet character `\" +\n            firstCharacter +\n            \"`\",\n        );\n      }\n\n      return { isToken: false, value: substring };\n    });\n\n  // invoke localize preprocessor (only for french locales at the moment)\n  if (locale.localize.preprocessor) {\n    parts = locale.localize.preprocessor(originalDate, parts);\n  }\n\n  const formatterOptions = {\n    firstWeekContainsDate,\n    weekStartsOn,\n    locale,\n  };\n\n  return parts\n    .map((part) => {\n      if (!part.isToken) return part.value;\n\n      const token = part.value;\n\n      if (\n        (!options?.useAdditionalWeekYearTokens &&\n          isProtectedWeekYearToken(token)) ||\n        (!options?.useAdditionalDayOfYearTokens &&\n          isProtectedDayOfYearToken(token))\n      ) {\n        warnOrThrowProtectedError(token, formatStr, String(date));\n      }\n\n      const formatter = formatters[token[0]];\n      return formatter(originalDate, token, locale.localize, formatterOptions);\n    })\n    .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n  const matched = input.match(escapedStringRegExp);\n\n  if (!matched) {\n    return input;\n  }\n\n  return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setHours} function options.\n */\n\n/**\n * @name setHours\n * @category Hour Helpers\n * @summary Set the hours to the given date.\n *\n * @description\n * Set the hours to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param hours - The hours of the new date\n * @param options - An object with options\n *\n * @returns The new date with the hours set\n *\n * @example\n * // Set 4 hours to 1 September 2014 11:30:00:\n * const result = setHours(new Date(2014, 8, 1, 11, 30), 4)\n * //=> Mon Sep 01 2014 04:30:00\n */\nexport function setHours(date, hours, options) {\n  const _date = toDate(date, options?.in);\n  _date.setHours(hours);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setHours;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setMinutes} function options.\n */\n\n/**\n * @name setMinutes\n * @category Minute Helpers\n * @summary Set the minutes to the given date.\n *\n * @description\n * Set the minutes to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows using extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, returned from the context function, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param minutes - The minutes of the new date\n * @param options - An object with options\n *\n * @returns The new date with the minutes set\n *\n * @example\n * // Set 45 minutes to 1 September 2014 11:30:40:\n * const result = setMinutes(new Date(2014, 8, 1, 11, 30, 40), 45)\n * //=> Mon Sep 01 2014 11:45:40\n */\nexport function setMinutes(date, minutes, options) {\n  const date_ = toDate(date, options?.in);\n  date_.setMinutes(minutes);\n  return date_;\n}\n\n// Fallback for modularized imports:\nexport default setMinutes;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setSeconds} function options.\n */\n\n/**\n * @name setSeconds\n * @category Second Helpers\n * @summary Set the seconds to the given date, with context support.\n *\n * @description\n * Set the seconds to the given date, with an optional context for time zone specification.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param seconds - The seconds of the new date\n * @param options - An object with options\n *\n * @returns The new date with the seconds set\n *\n * @example\n * // Set 45 seconds to 1 September 2014 11:30:40:\n * const result = setSeconds(new Date(2014, 8, 1, 11, 30, 40), 45)\n * //=> Mon Sep 01 2014 11:30:45\n */\nexport function setSeconds(date, seconds, options) {\n  const _date = toDate(date, options?.in);\n  _date.setSeconds(seconds);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setSeconds;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfMonth} function options.\n */\n\n/**\n * @name startOfMonth\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date. The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments.\n * Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed,\n * or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfMonth(date, options) {\n  const _date = toDate(date, options?.in);\n  _date.setDate(1);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfQuarter} function options.\n */\n\n/**\n * @name startOfQuarter\n * @category Quarter Helpers\n * @summary Return the start of a year quarter for the given date.\n *\n * @description\n * Return the start of a year quarter for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a quarter\n *\n * @example\n * // The start of a quarter for 2 September 2014 11:55:00:\n * const result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Jul 01 2014 00:00:00\n */\nexport function startOfQuarter(date, options) {\n  const _date = toDate(date, options?.in);\n  const currentMonth = _date.getMonth();\n  const month = currentMonth - (currentMonth % 3);\n  _date.setMonth(month, 1);\n  _date.setHours(0, 0, 0, 0);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfQuarter;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfDay} function options.\n */\n\n/**\n * @name endOfDay\n * @category Day Helpers\n * @summary Return the end of a day for the given date.\n *\n * @description\n * Return the end of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a day\n *\n * @example\n * // The end of a day for 2 September 2014 11:55:00:\n * const result = endOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 23:59:59.999\n */\nexport function endOfDay(date, options) {\n  const _date = toDate(date, options?.in);\n  _date.setHours(23, 59, 59, 999);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfDay;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfWeek} function options.\n */\n\n/**\n * @name endOfWeek\n * @category Week Helpers\n * @summary Return the end of a week for the given date.\n *\n * @description\n * Return the end of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a week\n *\n * @example\n * // The end of a week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 23:59:59.999\n *\n * @example\n * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfWeek(date, options) {\n  const defaultOptions = getDefaultOptions();\n  const weekStartsOn =\n    options?.weekStartsOn ??\n    options?.locale?.options?.weekStartsOn ??\n    defaultOptions.weekStartsOn ??\n    defaultOptions.locale?.options?.weekStartsOn ??\n    0;\n\n  const _date = toDate(date, options?.in);\n  const day = _date.getDay();\n  const diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n\n  _date.setDate(_date.getDate() + diff);\n  _date.setHours(23, 59, 59, 999);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfWeek;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfMonth} function options.\n */\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date, options) {\n  const _date = toDate(date, options?.in);\n  const month = _date.getMonth();\n  _date.setFullYear(_date.getFullYear(), month + 1, 0);\n  _date.setHours(23, 59, 59, 999);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link isSameYear} function options.\n */\n\n/**\n * @name isSameYear\n * @category Year Helpers\n * @summary Are the given dates in the same year?\n *\n * @description\n * Are the given dates in the same year?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same year\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same year?\n * const result = isSameYear(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n */\nexport function isSameYear(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n  return laterDate_.getFullYear() === earlierDate_.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default isSameYear;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link isSameMonth} function options.\n */\n\n/**\n * @name isSameMonth\n * @category Month Helpers\n * @summary Are the given dates in the same month (and year)?\n *\n * @description\n * Are the given dates in the same month (and year)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same month (and year)\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n *\n * @example\n * // Are 2 September 2014 and 25 September 2015 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2015, 8, 25))\n * //=> false\n */\nexport function isSameMonth(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n  return (\n    laterDate_.getFullYear() === earlierDate_.getFullYear() &&\n    laterDate_.getMonth() === earlierDate_.getMonth()\n  );\n}\n\n// Fallback for modularized imports:\nexport default isSameMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfQuarter } from \"./startOfQuarter.js\";\n\n/**\n * The {@link isSameQuarter} function options.\n */\n\n/**\n * @name isSameQuarter\n * @category Quarter Helpers\n * @summary Are the given dates in the same quarter (and year)?\n *\n * @description\n * Are the given dates in the same quarter (and year)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same quarter (and year)\n *\n * @example\n * // Are 1 January 2014 and 8 March 2014 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2014, 2, 8))\n * //=> true\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same quarter?\n * const result = isSameQuarter(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameQuarter(laterDate, earlierDate, options) {\n  const [dateLeft_, dateRight_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n  return +startOfQuarter(dateLeft_) === +startOfQuarter(dateRight_);\n}\n\n// Fallback for modularized imports:\nexport default isSameQuarter;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link isSameDay} function options.\n */\n\n/**\n * @name isSameDay\n * @category Day Helpers\n * @summary Are the given dates in the same day (and year and month)?\n *\n * @description\n * Are the given dates in the same day (and year and month)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same day (and year and month)\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4, 6, 0), new Date(2014, 8, 4, 18, 0))\n * //=> true\n *\n * @example\n * // Are 4 September and 4 October in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2014, 9, 4))\n * //=> false\n *\n * @example\n * // Are 4 September, 2014 and 4 September, 2015 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2015, 8, 4))\n * //=> false\n */\nexport function isSameDay(laterDate, earlierDate, options) {\n  const [dateLeft_, dateRight_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n  return +startOfDay(dateLeft_) === +startOfDay(dateRight_);\n}\n\n// Fallback for modularized imports:\nexport default isSameDay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isEqual\n * @category Common Helpers\n * @summary Are the given dates equal?\n *\n * @description\n * Are the given dates equal?\n *\n * @param dateLeft - The first date to compare\n * @param dateRight - The second date to compare\n *\n * @returns The dates are equal\n *\n * @example\n * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?\n * const result = isEqual(\n *   new Date(2014, 6, 2, 6, 30, 45, 0),\n *   new Date(2014, 6, 2, 6, 30, 45, 500)\n * )\n * //=> false\n */\nexport function isEqual(leftDate, rightDate) {\n  return +toDate(leftDate) === +toDate(rightDate);\n}\n\n// Fallback for modularized imports:\nexport default isEqual;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link isWithinInterval} function options.\n */\n\n/**\n * @name isWithinInterval\n * @category Interval Helpers\n * @summary Is the given date within the interval?\n *\n * @description\n * Is the given date within the interval? (Including start and end.)\n *\n * @param date - The date to check\n * @param interval - The interval to check\n * @param options - An object with options\n *\n * @returns The date is within the interval\n *\n * @example\n * // For the date within the interval:\n * isWithinInterval(new Date(2014, 0, 3), {\n *   start: new Date(2014, 0, 1),\n *   end: new Date(2014, 0, 7)\n * })\n * // => true\n *\n * @example\n * // For the date outside of the interval:\n * isWithinInterval(new Date(2014, 0, 10), {\n *   start: new Date(2014, 0, 1),\n *   end: new Date(2014, 0, 7)\n * })\n * // => false\n *\n * @example\n * // For date equal to the interval start:\n * isWithinInterval(date, { start, end: date })\n * // => true\n *\n * @example\n * // For date equal to the interval end:\n * isWithinInterval(date, { start: date, end })\n * // => true\n */\nexport function isWithinInterval(date, interval, options) {\n  const time = +toDate(date, options?.in);\n  const [startTime, endTime] = [\n    +toDate(interval.start, options?.in),\n    +toDate(interval.end, options?.in),\n  ].sort((a, b) => a - b);\n\n  return time >= startTime && time <= endTime;\n}\n\n// Fallback for modularized imports:\nexport default isWithinInterval;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDaysInMonth} function options.\n */\n\n/**\n * @name getDaysInMonth\n * @category Month Helpers\n * @summary Get the number of days in a month of the given date.\n *\n * @description\n * Get the number of days in a month of the given date, considering the context if provided.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The number of days in a month\n *\n * @example\n * // How many days are in February 2000?\n * const result = getDaysInMonth(new Date(2000, 1))\n * //=> 29\n */\nexport function getDaysInMonth(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n  const monthIndex = _date.getMonth();\n  const lastDayOfMonth = constructFrom(_date, 0);\n  lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);\n  lastDayOfMonth.setHours(0, 0, 0, 0);\n  return lastDayOfMonth.getDate();\n}\n\n// Fallback for modularized imports:\nexport default getDaysInMonth;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getDaysInMonth } from \"./getDaysInMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setMonth} function options.\n */\n\n/**\n * @name setMonth\n * @category Month Helpers\n * @summary Set the month to the given date.\n *\n * @description\n * Set the month to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param month - The month index to set (0-11)\n * @param options - The options\n *\n * @returns The new date with the month set\n *\n * @example\n * // Set February to 1 September 2014:\n * const result = setMonth(new Date(2014, 8, 1), 1)\n * //=> Sat Feb 01 2014 00:00:00\n */\nexport function setMonth(date, month, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n  const day = _date.getDate();\n\n  const midMonth = constructFrom(options?.in || date, 0);\n  midMonth.setFullYear(year, month, 15);\n  midMonth.setHours(0, 0, 0, 0);\n  const daysInMonth = getDaysInMonth(midMonth);\n\n  // Set the earlier date, allows to wrap Jan 31 to Feb 28\n  _date.setMonth(month, Math.min(day, daysInMonth));\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default setMonth;\n","import { setMonth } from \"./setMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setQuarter} function options.\n */\n\n/**\n * @name setQuarter\n * @category Quarter Helpers\n * @summary Set the year quarter to the given date.\n *\n * @description\n * Set the year quarter to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param quarter - The quarter of the new date\n * @param options - The options\n *\n * @returns The new date with the quarter set\n *\n * @example\n * // Set the 2nd quarter to 2 July 2014:\n * const result = setQuarter(new Date(2014, 6, 2), 2)\n * //=> Wed Apr 02 2014 00:00:00\n */\nexport function setQuarter(date, quarter, options) {\n  const date_ = toDate(date, options?.in);\n  const oldQuarter = Math.trunc(date_.getMonth() / 3) + 1;\n  const diff = quarter - oldQuarter;\n  return setMonth(date_, date_.getMonth() + diff * 3);\n}\n\n// Fallback for modularized imports:\nexport default setQuarter;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getYear} function options.\n */\n\n/**\n * @name getYear\n * @category Year Helpers\n * @summary Get the year of the given date.\n *\n * @description\n * Get the year of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The year\n *\n * @example\n * // Which year is 2 July 2014?\n * const result = getYear(new Date(2014, 6, 2))\n * //=> 2014\n */\nexport function getYear(date, options) {\n  return toDate(date, options?.in).getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default getYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getMonth} function options.\n */\n\n/**\n * @name getMonth\n * @category Month Helpers\n * @summary Get the month of the given date.\n *\n * @description\n * Get the month of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The month index (0-11)\n *\n * @example\n * // Which month is 29 February 2012?\n * const result = getMonth(new Date(2012, 1, 29))\n * //=> 1\n */\nexport function getMonth(date, options) {\n  return toDate(date, options?.in).getMonth();\n}\n\n// Fallback for modularized imports:\nexport default getMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfYear} function options.\n */\n\n/**\n * @name endOfYear\n * @category Year Helpers\n * @summary Return the end of a year for the given date.\n *\n * @description\n * Return the end of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The end of a year\n *\n * @example\n * // The end of a year for 2 September 2014 11:55:00:\n * const result = endOfYear(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Wed Dec 31 2014 23:59:59.999\n */\nexport function endOfYear(date, options) {\n  const _date = toDate(date, options?.in);\n  const year = _date.getFullYear();\n  _date.setFullYear(year + 1, 0, 0);\n  _date.setHours(23, 59, 59, 999);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getQuarter} function options.\n */\n\n/**\n * @name getQuarter\n * @category Quarter Helpers\n * @summary Get the year quarter of the given date.\n *\n * @description\n * Get the year quarter of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The quarter\n *\n * @example\n * // Which quarter is 2 July 2014?\n * const result = getQuarter(new Date(2014, 6, 2));\n * //=> 3\n */\nexport function getQuarter(date, options) {\n  const _date = toDate(date, options?.in);\n  const quarter = Math.trunc(_date.getMonth() / 3) + 1;\n  return quarter;\n}\n\n// Fallback for modularized imports:\nexport default getQuarter;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getHours} function options.\n */\n\n/**\n * @name getHours\n * @category Hour Helpers\n * @summary Get the hours of the given date.\n *\n * @description\n * Get the hours of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The hours\n *\n * @example\n * // Get the hours of 29 February 2012 11:45:00:\n * const result = getHours(new Date(2012, 1, 29, 11, 45))\n * //=> 11\n */\nexport function getHours(date, options) {\n  return toDate(date, options?.in).getHours();\n}\n\n// Fallback for modularized imports:\nexport default getHours;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getMinutes} function options.\n */\n\n/**\n * @name getMinutes\n * @category Minute Helpers\n * @summary Get the minutes of the given date.\n *\n * @description\n * Get the minutes of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The minutes\n *\n * @example\n * // Get the minutes of 29 February 2012 11:45:05:\n * const result = getMinutes(new Date(2012, 1, 29, 11, 45, 5))\n * //=> 45\n */\nexport function getMinutes(date, options) {\n  return toDate(date, options?.in).getMinutes();\n}\n\n// Fallback for modularized imports:\nexport default getMinutes;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name getSeconds\n * @category Second Helpers\n * @summary Get the seconds of the given date.\n *\n * @description\n * Get the seconds of the given date.\n *\n * @param date - The given date\n *\n * @returns The seconds\n *\n * @example\n * // Get the seconds of 29 February 2012 11:45:05.123:\n * const result = getSeconds(new Date(2012, 1, 29, 11, 45, 5, 123))\n * //=> 5\n */\nexport function getSeconds(date) {\n  return toDate(date).getSeconds();\n}\n\n// Fallback for modularized imports:\nexport default getSeconds;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMonths} function options.\n */\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n * @param options - The options object\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount, options) {\n  const _date = toDate(date, options?.in);\n  if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n  if (!amount) {\n    // If 0 months, no-op to avoid changing times in the hour before end of DST\n    return _date;\n  }\n  const dayOfMonth = _date.getDate();\n\n  // The JS Date object supports date math by accepting out-of-bounds values for\n  // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n  // new Date(2020, 13, 1) returns 1 Feb 2021.  This is *almost* the behavior we\n  // want except that dates will wrap around the end of a month, meaning that\n  // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n  // we'll default to the end of the desired month by adding 1 to the desired\n  // month and using a date of 0 to back up one day to the end of the desired\n  // month.\n  const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());\n  endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n  const daysInMonth = endOfDesiredMonth.getDate();\n  if (dayOfMonth >= daysInMonth) {\n    // If we're already at the end of the month, then this is the correct date\n    // and we're done.\n    return endOfDesiredMonth;\n  } else {\n    // Otherwise, we now know that setting the original day-of-month value won't\n    // cause an overflow, so set the desired day-of-month. Note that we can't\n    // just set the date of `endOfDesiredMonth` because that object may have had\n    // its time changed in the unusual case where where a DST transition was on\n    // the last day of the month and its local time was in the hour skipped or\n    // repeated next to a DST transition.  So we use `date` instead which is\n    // guaranteed to still have the original time.\n    _date.setFullYear(\n      endOfDesiredMonth.getFullYear(),\n      endOfDesiredMonth.getMonth(),\n      dayOfMonth,\n    );\n    return _date;\n  }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n  return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarMonths} function options.\n */\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n *   new Date(2014, 8, 1),\n *   new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n\n  const yearsDiff = laterDate_.getFullYear() - earlierDate_.getFullYear();\n  const monthsDiff = laterDate_.getMonth() - earlierDate_.getMonth();\n\n  return yearsDiff * 12 + monthsDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addQuarters} function options.\n */\n\n/**\n * @name addQuarters\n * @category Quarter Helpers\n * @summary Add the specified number of year quarters to the given date.\n *\n * @description\n * Add the specified number of year quarters to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of quarters to be added.\n * @param options - An object with options\n *\n * @returns The new date with the quarters added\n *\n * @example\n * // Add 1 quarter to 1 September 2014:\n * const result = addQuarters(new Date(2014, 8, 1), 1)\n * //=; Mon Dec 01 2014 00:00:00\n */\nexport function addQuarters(date, amount, options) {\n  return addMonths(date, amount * 3, options);\n}\n\n// Fallback for modularized imports:\nexport default addQuarters;\n","import { addQuarters } from \"./addQuarters.js\";\n\n/**\n * The {@link subQuarters} function options.\n */\n\n/**\n * @name subQuarters\n * @category Quarter Helpers\n * @summary Subtract the specified number of year quarters from the given date.\n *\n * @description\n * Subtract the specified number of year quarters from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of quarters to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the quarters subtracted\n *\n * @example\n * // Subtract 3 quarters from 1 September 2014:\n * const result = subQuarters(new Date(2014, 8, 1), 3)\n * //=> Sun Dec 01 2013 00:00:00\n */\nexport function subQuarters(date, amount, options) {\n  return addQuarters(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subQuarters;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { getQuarter } from \"./getQuarter.js\";\n\n/**\n * The {@link differenceInCalendarQuarters} function options.\n */\n\n/**\n * @name differenceInCalendarQuarters\n * @category Quarter Helpers\n * @summary Get the number of calendar quarters between the given dates.\n *\n * @description\n * Get the number of calendar quarters between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of calendar quarters\n *\n * @example\n * // How many calendar quarters are between 31 December 2013 and 2 July 2014?\n * const result = differenceInCalendarQuarters(\n *   new Date(2014, 6, 2),\n *   new Date(2013, 11, 31)\n * )\n * //=> 3\n */\nexport function differenceInCalendarQuarters(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n\n  const yearsDiff = laterDate_.getFullYear() - earlierDate_.getFullYear();\n  const quartersDiff = getQuarter(laterDate_) - getQuarter(earlierDate_);\n\n  return yearsDiff * 4 + quartersDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarQuarters;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addYears} function options.\n */\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n * @param options - The options\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount, options) {\n  return addMonths(date, amount * 12, options);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { addYears } from \"./addYears.js\";\n\n/**\n * The {@link subYears} function options.\n */\n\n/**\n * @name subYears\n * @category Year Helpers\n * @summary Subtract the specified number of years from the given date.\n *\n * @description\n * Subtract the specified number of years from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the years subtracted\n *\n * @example\n * // Subtract 5 years from 1 September 2014:\n * const result = subYears(new Date(2014, 8, 1), 5)\n * //=> Tue Sep 01 2009 00:00:00\n */\nexport function subYears(date, amount, options) {\n  return addYears(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subYears;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarYears} function options.\n */\n\n/**\n * @name differenceInCalendarYears\n * @category Year Helpers\n * @summary Get the number of calendar years between the given dates.\n *\n * @description\n * Get the number of calendar years between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n\n * @returns The number of calendar years\n *\n * @example\n * // How many calendar years are between 31 December 2013 and 11 February 2015?\n * const result = differenceInCalendarYears(\n *   new Date(2015, 1, 11),\n *   new Date(2013, 11, 31)\n * );\n * //=> 2\n */\nexport function differenceInCalendarYears(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n  return laterDate_.getFullYear() - earlierDate_.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarYears;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link min} function options.\n */\n\n/**\n * @name min\n * @category Common Helpers\n * @summary Returns the earliest of the given dates.\n *\n * @description\n * Returns the earliest of the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dates - The dates to compare\n *\n * @returns The earliest of the dates\n *\n * @example\n * // Which of these dates is the earliest?\n * const result = min([\n *   new Date(1989, 6, 10),\n *   new Date(1987, 1, 11),\n *   new Date(1995, 6, 2),\n *   new Date(1990, 0, 1)\n * ])\n * //=> Wed Feb 11 1987 00:00:00\n */\nexport function min(dates, options) {\n  let result;\n  let context = options?.in;\n\n  dates.forEach((date) => {\n    // Use the first date object as the context function\n    if (!context && typeof date === \"object\")\n      context = constructFrom.bind(null, date);\n\n    const date_ = toDate(date, context);\n    if (!result || result > date_ || isNaN(+date_)) result = date_;\n  });\n\n  return constructFrom(context, result || NaN);\n}\n\n// Fallback for modularized imports:\nexport default min;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link max} function options.\n */\n\n/**\n * @name max\n * @category Common Helpers\n * @summary Return the latest of the given dates.\n *\n * @description\n * Return the latest of the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dates - The dates to compare\n *\n * @returns The latest of the dates\n *\n * @example\n * // Which of these dates is the latest?\n * const result = max([\n *   new Date(1989, 6, 10),\n *   new Date(1987, 1, 11),\n *   new Date(1995, 6, 2),\n *   new Date(1990, 0, 1)\n * ])\n * //=> Sun Jul 02 1995 00:00:00\n */\nexport function max(dates, options) {\n  let result;\n  let context = options?.in;\n\n  dates.forEach((date) => {\n    // Use the first date object as the context function\n    if (!context && typeof date === \"object\")\n      context = constructFrom.bind(null, date);\n\n    const date_ = toDate(date, context);\n    if (!result || result < date_ || isNaN(+date_)) result = date_;\n  });\n\n  return constructFrom(context, result || NaN);\n}\n\n// Fallback for modularized imports:\nexport default max;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMilliseconds} function options.\n */\n\n/**\n * @name addMilliseconds\n * @category Millisecond Helpers\n * @summary Add the specified number of milliseconds to the given date.\n *\n * @description\n * Add the specified number of milliseconds to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of milliseconds to be added.\n * @param options - The options object\n *\n * @returns The new date with the milliseconds added\n *\n * @example\n * // Add 750 milliseconds to 10 July 2014 12:45:30.000:\n * const result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:30.750\n */\nexport function addMilliseconds(date, amount, options) {\n  return constructFrom(options?.in || date, +toDate(date) + amount);\n}\n\n// Fallback for modularized imports:\nexport default addMilliseconds;\n","import { addMilliseconds } from \"./addMilliseconds.js\";\nimport { millisecondsInHour } from \"./constants.js\";\n\n/**\n * The {@link addHours} function options.\n */\n\n/**\n * @name addHours\n * @category Hour Helpers\n * @summary Add the specified number of hours to the given date.\n *\n * @description\n * Add the specified number of hours to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of hours to be added\n * @param options - An object with options\n *\n * @returns The new date with the hours added\n *\n * @example\n * // Add 2 hours to 10 July 2014 23:00:00:\n * const result = addHours(new Date(2014, 6, 10, 23, 0), 2)\n * //=> Fri Jul 11 2014 01:00:00\n */\nexport function addHours(date, amount, options) {\n  return addMilliseconds(date, amount * millisecondsInHour, options);\n}\n\n// Fallback for modularized imports:\nexport default addHours;\n","import { millisecondsInMinute } from \"./constants.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMinutes} function options.\n */\n\n/**\n * @name addMinutes\n * @category Minute Helpers\n * @summary Add the specified number of minutes to the given date.\n *\n * @description\n * Add the specified number of minutes to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of minutes to be added.\n * @param options - An object with options\n *\n * @returns The new date with the minutes added\n *\n * @example\n * // Add 30 minutes to 10 July 2014 12:00:00:\n * const result = addMinutes(new Date(2014, 6, 10, 12, 0), 30)\n * //=> Thu Jul 10 2014 12:30:00\n */\nexport function addMinutes(date, amount, options) {\n  const _date = toDate(date, options?.in);\n  _date.setTime(_date.getTime() + amount * millisecondsInMinute);\n  return _date;\n}\n\n// Fallback for modularized imports:\nexport default addMinutes;\n","import { addMilliseconds } from \"./addMilliseconds.js\";\n\n/**\n * The {@link addSeconds} function options.\n */\n\n/**\n * @name addSeconds\n * @category Second Helpers\n * @summary Add the specified number of seconds to the given date.\n *\n * @description\n * Add the specified number of seconds to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of seconds to be added.\n * @param options - An object with options\n *\n * @returns The new date with the seconds added\n *\n * @example\n * // Add 30 seconds to 10 July 2014 12:45:00:\n * const result = addSeconds(new Date(2014, 6, 10, 12, 45, 0), 30)\n * //=> Thu Jul 10 2014 12:45:30\n */\nexport function addSeconds(date, amount, options) {\n  return addMilliseconds(date, amount * 1000, options);\n}\n\n// Fallback for modularized imports:\nexport default addSeconds;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isAfter\n * @category Common Helpers\n * @summary Is the first date after the second one?\n *\n * @description\n * Is the first date after the second one?\n *\n * @param date - The date that should be after the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is after the second date\n *\n * @example\n * // Is 10 July 1989 after 11 February 1987?\n * const result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> true\n */\nexport function isAfter(date, dateToCompare) {\n  return +toDate(date) > +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isAfter;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDay} function options.\n */\n\n/**\n * @name getDay\n * @category Weekday Helpers\n * @summary Get the day of the week of the given date.\n *\n * @description\n * Get the day of the week of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of week, 0 represents Sunday\n *\n * @example\n * // Which day of the week is 29 February 2012?\n * const result = getDay(new Date(2012, 1, 29))\n * //=> 3\n */\nexport function getDay(date, options) {\n  return toDate(date, options?.in).getDay();\n}\n\n// Fallback for modularized imports:\nexport default getDay;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDate} function options.\n */\n\n/**\n * @name getDate\n * @category Day Helpers\n * @summary Get the day of the month of the given date.\n *\n * @description\n * Get the day of the month of the given date.\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The day of month\n *\n * @example\n * // Which day of the month is 29 February 2012?\n * const result = getDate(new Date(2012, 1, 29))\n * //=> 29\n */\nexport function getDate(date, options) {\n  return toDate(date, options?.in).getDate();\n}\n\n// Fallback for modularized imports:\nexport default getDate;\n","import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link addWeeks} function options.\n */\n\n/**\n * @name addWeeks\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of weeks to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be added.\n * @param options - An object with options\n *\n * @returns The new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * const result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nexport function addWeeks(date, amount, options) {\n  return addDays(date, amount * 7, options);\n}\n\n// Fallback for modularized imports:\nexport default addWeeks;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name getTime\n * @category Timestamp Helpers\n * @summary Get the milliseconds timestamp of the given date.\n *\n * @description\n * Get the milliseconds timestamp of the given date.\n *\n * @param date - The given date\n *\n * @returns The timestamp\n *\n * @example\n * // Get the timestamp of 29 February 2012 11:45:05.123:\n * const result = getTime(new Date(2012, 1, 29, 11, 45, 5, 123))\n * //=> 1330515905123\n */\nexport function getTime(date) {\n  return +toDate(date);\n}\n\n// Fallback for modularized imports:\nexport default getTime;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setYear} function options.\n */\n\n/**\n * @name setYear\n * @category Year Helpers\n * @summary Set the year to the given date.\n *\n * @description\n * Set the year to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param year - The year of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the year set\n *\n * @example\n * // Set year 2013 to 1 September 2014:\n * const result = setYear(new Date(2014, 8, 1), 2013)\n * //=> Sun Sep 01 2013 00:00:00\n */\nexport function setYear(date, year, options) {\n  const date_ = toDate(date, options?.in);\n\n  // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date\n  if (isNaN(+date_)) return constructFrom(options?.in || date, NaN);\n\n  date_.setFullYear(year);\n  return date_;\n}\n\n// Fallback for modularized imports:\nexport default setYear;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\n\n/**\n * The {@link differenceInDays} function options.\n */\n\n/**\n * @name differenceInDays\n * @category Day Helpers\n * @summary Get the number of full days between the given dates.\n *\n * @description\n * Get the number of full day periods between two dates. Fractional days are\n * truncated towards zero.\n *\n * One \"full day\" is the distance between a local time in one day to the same\n * local time on the next or previous day. A full day can sometimes be less than\n * or more than 24 hours if a daylight savings change happens between two dates.\n *\n * To ignore DST and only measure exact 24-hour periods, use this instead:\n * `Math.trunc(differenceInHours(dateLeft, dateRight)/24)|0`.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of full days according to the local timezone\n *\n * @example\n * // How many full days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInDays(\n *   new Date(2012, 6, 2, 0, 0),\n *   new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 365\n *\n * @example\n * // How many full days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInDays(\n *   new Date(2011, 6, 3, 0, 1),\n *   new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 0\n *\n * @example\n * // How many full days are between\n * // 1 March 2020 0:00 and 1 June 2020 0:00 ?\n * // Note: because local time is used, the\n * // result will always be 92 days, even in\n * // time zones where DST starts and the\n * // period has only 92*24-1 hours.\n * const result = differenceInDays(\n *   new Date(2020, 5, 1),\n *   new Date(2020, 2, 1)\n * )\n * //=> 92\n */\nexport function differenceInDays(laterDate, earlierDate, options) {\n  const [laterDate_, earlierDate_] = normalizeDates(\n    options?.in,\n    laterDate,\n    earlierDate,\n  );\n\n  const sign = compareLocalAsc(laterDate_, earlierDate_);\n  const difference = Math.abs(\n    differenceInCalendarDays(laterDate_, earlierDate_),\n  );\n\n  laterDate_.setDate(laterDate_.getDate() - sign * difference);\n\n  // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full\n  // If so, result must be decreased by 1 in absolute value\n  const isLastDayNotFull = Number(\n    compareLocalAsc(laterDate_, earlierDate_) === -sign,\n  );\n\n  const result = sign * (difference - isLastDayNotFull);\n  // Prevent negative zero\n  return result === 0 ? 0 : result;\n}\n\n// Like `compareAsc` but uses local time not UTC, which is needed\n// for accurate equality comparisons of UTC timestamps that end up\n// having the same representation in local time, e.g. one hour before\n// DST ends vs. the instant that DST ends.\nfunction compareLocalAsc(laterDate, earlierDate) {\n  const diff =\n    laterDate.getFullYear() - earlierDate.getFullYear() ||\n    laterDate.getMonth() - earlierDate.getMonth() ||\n    laterDate.getDate() - earlierDate.getDate() ||\n    laterDate.getHours() - earlierDate.getHours() ||\n    laterDate.getMinutes() - earlierDate.getMinutes() ||\n    laterDate.getSeconds() - earlierDate.getSeconds() ||\n    laterDate.getMilliseconds() - earlierDate.getMilliseconds();\n\n  if (diff < 0) return -1;\n  if (diff > 0) return 1;\n\n  // Return 0 if diff is 0; return NaN if diff is NaN\n  return diff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInDays;\n","import { addWeeks } from \"./addWeeks.js\";\n\n/**\n * The {@link subWeeks} function options.\n */\n\n/**\n * @name subWeeks\n * @category Week Helpers\n * @summary Subtract the specified number of weeks from the given date.\n *\n * @description\n * Subtract the specified number of weeks from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the weeks subtracted\n *\n * @example\n * // Subtract 4 weeks from 1 September 2014:\n * const result = subWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Aug 04 2014 00:00:00\n */\nexport function subWeeks(date, amount, options) {\n  return addWeeks(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subWeeks;\n","import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link subDays} function options.\n */\n\n/**\n * @name subDays\n * @category Day Helpers\n * @summary Subtract the specified number of days from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the days subtracted\n *\n * @example\n * // Subtract 10 days from 1 September 2014:\n * const result = subDays(new Date(2014, 8, 1), 10)\n * //=> Fri Aug 22 2014 00:00:00\n */\nexport function subDays(date, amount, options) {\n  return addDays(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subDays;\n","import { isShadowRoot, isHTMLElement } from '@floating-ui/utils/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport { floor } from '@floating-ui/utils';\nimport { tabbable } from 'tabbable';\n\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n  const uaData = navigator.userAgentData;\n  if (uaData != null && uaData.platform) {\n    return uaData.platform;\n  }\n  return navigator.platform;\n}\nfunction getUserAgent() {\n  const uaData = navigator.userAgentData;\n  if (uaData && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(_ref => {\n      let {\n        brand,\n        version\n      } = _ref;\n      return brand + \"/\" + version;\n    }).join(' ');\n  }\n  return navigator.userAgent;\n}\nfunction isSafari() {\n  // Chrome DevTools does not complain about navigator.vendor\n  return /apple/i.test(navigator.vendor);\n}\nfunction isAndroid() {\n  const re = /android/i;\n  return re.test(getPlatform()) || re.test(getUserAgent());\n}\nfunction isMac() {\n  return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n  return getUserAgent().includes('jsdom/');\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction activeElement(doc) {\n  let activeElement = doc.activeElement;\n  while (((_activeElement = activeElement) == null || (_activeElement = _activeElement.shadowRoot) == null ? void 0 : _activeElement.activeElement) != null) {\n    var _activeElement;\n    activeElement = activeElement.shadowRoot.activeElement;\n  }\n  return activeElement;\n}\nfunction contains(parent, child) {\n  if (!parent || !child) {\n    return false;\n  }\n  const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n  // First, attempt with faster native method\n  if (parent.contains(child)) {\n    return true;\n  }\n\n  // then fallback to custom implementation with Shadow DOM support\n  if (rootNode && isShadowRoot(rootNode)) {\n    let next = child;\n    while (next) {\n      if (parent === next) {\n        return true;\n      }\n      // @ts-ignore\n      next = next.parentNode || next.host;\n    }\n  }\n\n  // Give up, the result is false\n  return false;\n}\nfunction getTarget(event) {\n  if ('composedPath' in event) {\n    return event.composedPath()[0];\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support\n  // `composedPath()`, but browsers without shadow DOM don't.\n  return event.target;\n}\nfunction isEventTargetWithin(event, node) {\n  if (node == null) {\n    return false;\n  }\n  if ('composedPath' in event) {\n    return event.composedPath().includes(node);\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n  const e = event;\n  return e.target != null && node.contains(e.target);\n}\nfunction isRootElement(element) {\n  return element.matches('html,body');\n}\nfunction getDocument(node) {\n  return (node == null ? void 0 : node.ownerDocument) || document;\n}\nfunction isTypeableElement(element) {\n  return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction isTypeableCombobox(element) {\n  if (!element) return false;\n  return element.getAttribute('role') === 'combobox' && isTypeableElement(element);\n}\nfunction matchesFocusVisible(element) {\n  // We don't want to block focus from working with `visibleOnly`\n  // (JSDOM doesn't match `:focus-visible` when the element has `:focus`)\n  if (!element || isJSDOM()) return true;\n  try {\n    return element.matches(':focus-visible');\n  } catch (_e) {\n    return true;\n  }\n}\nfunction getFloatingFocusElement(floatingElement) {\n  if (!floatingElement) {\n    return null;\n  }\n  // Try to find the element that has `{...getFloatingProps()}` spread on it.\n  // This indicates the floating element is acting as a positioning wrapper, and\n  // so focus should be managed on the child element with the event handlers and\n  // aria props.\n  return floatingElement.hasAttribute(FOCUSABLE_ATTRIBUTE) ? floatingElement : floatingElement.querySelector(\"[\" + FOCUSABLE_ATTRIBUTE + \"]\") || floatingElement;\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n  if (onlyOpenChildren === void 0) {\n    onlyOpenChildren = true;\n  }\n  let allChildren = nodes.filter(node => {\n    var _node$context;\n    return node.parentId === id && ((_node$context = node.context) == null ? void 0 : _node$context.open);\n  });\n  let currentChildren = allChildren;\n  while (currentChildren.length) {\n    currentChildren = onlyOpenChildren ? nodes.filter(node => {\n      var _currentChildren;\n      return (_currentChildren = currentChildren) == null ? void 0 : _currentChildren.some(n => {\n        var _node$context2;\n        return node.parentId === n.id && ((_node$context2 = node.context) == null ? void 0 : _node$context2.open);\n      });\n    }) : nodes;\n    allChildren = allChildren.concat(currentChildren);\n  }\n  return allChildren;\n}\nfunction getDeepestNode(nodes, id) {\n  let deepestNodeId;\n  let maxDepth = -1;\n  function findDeepest(nodeId, depth) {\n    if (depth > maxDepth) {\n      deepestNodeId = nodeId;\n      maxDepth = depth;\n    }\n    const children = getNodeChildren(nodes, nodeId);\n    children.forEach(child => {\n      findDeepest(child.id, depth + 1);\n    });\n  }\n  findDeepest(id, 0);\n  return nodes.find(node => node.id === deepestNodeId);\n}\nfunction getNodeAncestors(nodes, id) {\n  var _nodes$find;\n  let allAncestors = [];\n  let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n  while (currentParentId) {\n    const currentNode = nodes.find(node => node.id === currentParentId);\n    currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n    if (currentNode) {\n      allAncestors = allAncestors.concat(currentNode);\n    }\n  }\n  return allAncestors;\n}\n\nfunction stopEvent(event) {\n  event.preventDefault();\n  event.stopPropagation();\n}\nfunction isReactEvent(event) {\n  return 'nativeEvent' in event;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n  // FIXME: Firefox is now emitting a deprecation warning for `mozInputSource`.\n  // Try to find a workaround for this. `react-aria` source still has the check.\n  if (event.mozInputSource === 0 && event.isTrusted) {\n    return true;\n  }\n  if (isAndroid() && event.pointerType) {\n    return event.type === 'click' && event.buttons === 1;\n  }\n  return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n  if (isJSDOM()) return false;\n  return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse' ||\n  // iOS VoiceOver returns 0.333• for width/height.\n  event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'touch';\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n  // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n  // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n  const values = ['mouse', 'pen'];\n  if (!strict) {\n    values.push('', undefined);\n  }\n  return values.includes(pointerType);\n}\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n  ...React\n};\n\nfunction useLatestRef(value) {\n  const ref = React.useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\nconst useInsertionEffect = SafeReact.useInsertionEffect;\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEffectEvent(callback) {\n  const ref = React.useRef(() => {\n    if (process.env.NODE_ENV !== \"production\") {\n      throw new Error('Cannot call an event handler while rendering.');\n    }\n  });\n  useSafeInsertionEffect(() => {\n    ref.current = callback;\n  });\n  return React.useCallback(function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return ref.current == null ? void 0 : ref.current(...args);\n  }, []);\n}\n\nfunction isDifferentGridRow(index, cols, prevRow) {\n  return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfListBounds(listRef, index) {\n  return index < 0 || index >= listRef.current.length;\n}\nfunction getMinListIndex(listRef, disabledIndices) {\n  return findNonDisabledListIndex(listRef, {\n    disabledIndices\n  });\n}\nfunction getMaxListIndex(listRef, disabledIndices) {\n  return findNonDisabledListIndex(listRef, {\n    decrement: true,\n    startingIndex: listRef.current.length,\n    disabledIndices\n  });\n}\nfunction findNonDisabledListIndex(listRef, _temp) {\n  let {\n    startingIndex = -1,\n    decrement = false,\n    disabledIndices,\n    amount = 1\n  } = _temp === void 0 ? {} : _temp;\n  let index = startingIndex;\n  do {\n    index += decrement ? -amount : amount;\n  } while (index >= 0 && index <= listRef.current.length - 1 && isListIndexDisabled(listRef, index, disabledIndices));\n  return index;\n}\nfunction getGridNavigatedIndex(listRef, _ref) {\n  let {\n    event,\n    orientation,\n    loop,\n    rtl,\n    cols,\n    disabledIndices,\n    minIndex,\n    maxIndex,\n    prevIndex,\n    stopEvent: stop = false\n  } = _ref;\n  let nextIndex = prevIndex;\n  if (event.key === ARROW_UP) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = maxIndex;\n    } else {\n      nextIndex = findNonDisabledListIndex(listRef, {\n        startingIndex: nextIndex,\n        amount: cols,\n        decrement: true,\n        disabledIndices\n      });\n      if (loop && (prevIndex - cols < minIndex || nextIndex < 0)) {\n        const col = prevIndex % cols;\n        const maxCol = maxIndex % cols;\n        const offset = maxIndex - (maxCol - col);\n        if (maxCol === col) {\n          nextIndex = maxIndex;\n        } else {\n          nextIndex = maxCol > col ? offset : offset - cols;\n        }\n      }\n    }\n    if (isIndexOutOfListBounds(listRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n  if (event.key === ARROW_DOWN) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = minIndex;\n    } else {\n      nextIndex = findNonDisabledListIndex(listRef, {\n        startingIndex: prevIndex,\n        amount: cols,\n        disabledIndices\n      });\n      if (loop && prevIndex + cols > maxIndex) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex % cols - cols,\n          amount: cols,\n          disabledIndices\n        });\n      }\n    }\n    if (isIndexOutOfListBounds(listRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n\n  // Remains on the same row/column.\n  if (orientation === 'both') {\n    const prevRow = floor(prevIndex / cols);\n    if (event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT)) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== cols - 1) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex,\n          disabledIndices\n        });\n        if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledListIndex(listRef, {\n            startingIndex: prevIndex - prevIndex % cols - 1,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      }\n      if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    if (event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT)) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== 0) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex,\n          decrement: true,\n          disabledIndices\n        });\n        if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledListIndex(listRef, {\n            startingIndex: prevIndex + (cols - prevIndex % cols),\n            decrement: true,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex + (cols - prevIndex % cols),\n          decrement: true,\n          disabledIndices\n        });\n      }\n      if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    const lastRow = floor(maxIndex / cols) === prevRow;\n    if (isIndexOutOfListBounds(listRef, nextIndex)) {\n      if (loop && lastRow) {\n        nextIndex = event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT) ? maxIndex : findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      } else {\n        nextIndex = prevIndex;\n      }\n    }\n  }\n  return nextIndex;\n}\n\n/** For each cell index, gets the item index that occupies that cell */\nfunction createGridCellMap(sizes, cols, dense) {\n  const cellMap = [];\n  let startIndex = 0;\n  sizes.forEach((_ref2, index) => {\n    let {\n      width,\n      height\n    } = _ref2;\n    if (width > cols) {\n      if (process.env.NODE_ENV !== \"production\") {\n        throw new Error(\"[Floating UI]: Invalid grid - item width at index \" + index + \" is greater than grid columns\");\n      }\n    }\n    let itemPlaced = false;\n    if (dense) {\n      startIndex = 0;\n    }\n    while (!itemPlaced) {\n      const targetCells = [];\n      for (let i = 0; i < width; i++) {\n        for (let j = 0; j < height; j++) {\n          targetCells.push(startIndex + i + j * cols);\n        }\n      }\n      if (startIndex % cols + width <= cols && targetCells.every(cell => cellMap[cell] == null)) {\n        targetCells.forEach(cell => {\n          cellMap[cell] = index;\n        });\n        itemPlaced = true;\n      } else {\n        startIndex++;\n      }\n    }\n  });\n\n  // convert into a non-sparse array\n  return [...cellMap];\n}\n\n/** Gets cell index of an item's corner or -1 when index is -1. */\nfunction getGridCellIndexOfCorner(index, sizes, cellMap, cols, corner) {\n  if (index === -1) return -1;\n  const firstCellIndex = cellMap.indexOf(index);\n  const sizeItem = sizes[index];\n  switch (corner) {\n    case 'tl':\n      return firstCellIndex;\n    case 'tr':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + sizeItem.width - 1;\n    case 'bl':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + (sizeItem.height - 1) * cols;\n    case 'br':\n      return cellMap.lastIndexOf(index);\n  }\n}\n\n/** Gets all cell indices that correspond to the specified indices */\nfunction getGridCellIndices(indices, cellMap) {\n  return cellMap.flatMap((index, cellIndex) => indices.includes(index) ? [cellIndex] : []);\n}\nfunction isListIndexDisabled(listRef, index, disabledIndices) {\n  if (disabledIndices) {\n    return disabledIndices.includes(index);\n  }\n  const element = listRef.current[index];\n  return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nconst getTabbableOptions = () => ({\n  getShadowRoot: true,\n  displayCheck:\n  // JSDOM does not support the `tabbable` library. To solve this we can\n  // check if `ResizeObserver` is a real function (not polyfilled), which\n  // determines if the current environment is JSDOM-like.\n  typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, dir) {\n  const list = tabbable(container, getTabbableOptions());\n  const len = list.length;\n  if (len === 0) return;\n  const active = activeElement(getDocument(container));\n  const index = list.indexOf(active);\n  const nextIndex = index === -1 ? dir === 1 ? 0 : len - 1 : index + dir;\n  return list[nextIndex];\n}\nfunction getNextTabbable(referenceElement) {\n  return getTabbableIn(getDocument(referenceElement).body, 1) || referenceElement;\n}\nfunction getPreviousTabbable(referenceElement) {\n  return getTabbableIn(getDocument(referenceElement).body, -1) || referenceElement;\n}\nfunction isOutsideEvent(event, container) {\n  const containerElement = container || event.currentTarget;\n  const relatedTarget = event.relatedTarget;\n  return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n  const tabbableElements = tabbable(container, getTabbableOptions());\n  tabbableElements.forEach(element => {\n    element.dataset.tabindex = element.getAttribute('tabindex') || '';\n    element.setAttribute('tabindex', '-1');\n  });\n}\nfunction enableFocusInside(container) {\n  const elements = container.querySelectorAll('[data-tabindex]');\n  elements.forEach(element => {\n    const tabindex = element.dataset.tabindex;\n    delete element.dataset.tabindex;\n    if (tabindex) {\n      element.setAttribute('tabindex', tabindex);\n    } else {\n      element.removeAttribute('tabindex');\n    }\n  });\n}\n\nexport { activeElement, contains, createGridCellMap, disableFocusInside, enableFocusInside, findNonDisabledListIndex, getDeepestNode, getDocument, getFloatingFocusElement, getGridCellIndexOfCorner, getGridCellIndices, getGridNavigatedIndex, getMaxListIndex, getMinListIndex, getNextTabbable, getNodeAncestors, getNodeChildren, getPlatform, getPreviousTabbable, getTabbableOptions, getTarget, getUserAgent, isAndroid, isDifferentGridRow, isEventTargetWithin, isIndexOutOfListBounds, isJSDOM, isListIndexDisabled, isMac, isMouseLikePointerType, isOutsideEvent, isReactEvent, isRootElement, isSafari, isTypeableCombobox, isTypeableElement, isVirtualClick, isVirtualPointerEvent, matchesFocusVisible, stopEvent, useEffectEvent, useLatestRef, index as useModernLayoutEffect };\n","function hasWindow() {\n  return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);\n}\nfunction isTableElement(element) {\n  return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isTopLayer(element) {\n  return [':popover-open', ':modal'].some(selector => {\n    try {\n      return element.matches(selector);\n    } catch (e) {\n      return false;\n    }\n  });\n}\nfunction isContainingBlock(elementOrCss) {\n  const webkit = isWebKit();\n  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n  return ['transform', 'translate', 'scale', 'rotate', 'perspective'].some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    } else if (isTopLayer(currentNode)) {\n      return null;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (typeof CSS === 'undefined' || !CSS.supports) return false;\n  return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nfunction isLastTraversableNode(node) {\n  return ['html', 'body', '#document'].includes(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.scrollX,\n    scrollTop: element.scrollY\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return node.ownerDocument ? node.ownerDocument.body : node.body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    const frameElement = getFrameElement(win);\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n  }\n  return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n  x: v,\n  y: v\n});\nconst oppositeSideMap = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n  start: 'end',\n  end: 'start'\n};\nfunction clamp(start, value, end) {\n  return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n  return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n  return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n  return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n  return axis === 'y' ? 'height' : 'width';\n}\nfunction getSideAxis(placement) {\n  return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n  return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n  if (rtl === void 0) {\n    rtl = false;\n  }\n  const alignment = getAlignment(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const length = getAxisLength(alignmentAxis);\n  let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n  if (rects.reference[length] > rects.floating[length]) {\n    mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n  }\n  return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n  const oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n  return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nfunction getSideList(side, isStart, rtl) {\n  const lr = ['left', 'right'];\n  const rl = ['right', 'left'];\n  const tb = ['top', 'bottom'];\n  const bt = ['bottom', 'top'];\n  switch (side) {\n    case 'top':\n    case 'bottom':\n      if (rtl) return isStart ? rl : lr;\n      return isStart ? lr : rl;\n    case 'left':\n    case 'right':\n      return isStart ? tb : bt;\n    default:\n      return [];\n  }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n  const alignment = getAlignment(placement);\n  let list = getSideList(getSide(placement), direction === 'start', rtl);\n  if (alignment) {\n    list = list.map(side => side + \"-\" + alignment);\n    if (flipAlignment) {\n      list = list.concat(list.map(getOppositeAlignmentPlacement));\n    }\n  }\n  return list;\n}\nfunction getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    ...padding\n  };\n}\nfunction getPaddingObject(padding) {\n  return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n    top: padding,\n    right: padding,\n    bottom: padding,\n    left: padding\n  };\n}\nfunction rectToClientRect(rect) {\n  const {\n    x,\n    y,\n    width,\n    height\n  } = rect;\n  return {\n    width,\n    height,\n    top: y,\n    left: x,\n    right: x + width,\n    bottom: y + height,\n    x,\n    y\n  };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n  let {\n    reference,\n    floating\n  } = _ref;\n  const sideAxis = getSideAxis(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const alignLength = getAxisLength(alignmentAxis);\n  const side = getSide(placement);\n  const isVertical = sideAxis === 'y';\n  const commonX = reference.x + reference.width / 2 - floating.width / 2;\n  const commonY = reference.y + reference.height / 2 - floating.height / 2;\n  const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n  let coords;\n  switch (side) {\n    case 'top':\n      coords = {\n        x: commonX,\n        y: reference.y - floating.height\n      };\n      break;\n    case 'bottom':\n      coords = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n    case 'right':\n      coords = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n    case 'left':\n      coords = {\n        x: reference.x - floating.width,\n        y: commonY\n      };\n      break;\n    default:\n      coords = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n  switch (getAlignment(placement)) {\n    case 'start':\n      coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n    case 'end':\n      coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n  }\n  return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform\n  } = config;\n  const validMiddleware = middleware.filter(Boolean);\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n  let rects = await platform.getElementRects({\n    reference,\n    floating,\n    strategy\n  });\n  let {\n    x,\n    y\n  } = computeCoordsFromPlacement(rects, placement, rtl);\n  let statefulPlacement = placement;\n  let middlewareData = {};\n  let resetCount = 0;\n  for (let i = 0; i < validMiddleware.length; i++) {\n    const {\n      name,\n      fn\n    } = validMiddleware[i];\n    const {\n      x: nextX,\n      y: nextY,\n      data,\n      reset\n    } = await fn({\n      x,\n      y,\n      initialPlacement: placement,\n      placement: statefulPlacement,\n      strategy,\n      middlewareData,\n      rects,\n      platform,\n      elements: {\n        reference,\n        floating\n      }\n    });\n    x = nextX != null ? nextX : x;\n    y = nextY != null ? nextY : y;\n    middlewareData = {\n      ...middlewareData,\n      [name]: {\n        ...middlewareData[name],\n        ...data\n      }\n    };\n    if (reset && resetCount <= 50) {\n      resetCount++;\n      if (typeof reset === 'object') {\n        if (reset.placement) {\n          statefulPlacement = reset.placement;\n        }\n        if (reset.rects) {\n          rects = reset.rects === true ? await platform.getElementRects({\n            reference,\n            floating,\n            strategy\n          }) : reset.rects;\n        }\n        ({\n          x,\n          y\n        } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n      }\n      i = -1;\n    }\n  }\n  return {\n    x,\n    y,\n    placement: statefulPlacement,\n    strategy,\n    middlewareData\n  };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n  var _await$platform$isEle;\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    x,\n    y,\n    platform,\n    rects,\n    elements,\n    strategy\n  } = state;\n  const {\n    boundary = 'clippingAncestors',\n    rootBoundary = 'viewport',\n    elementContext = 'floating',\n    altBoundary = false,\n    padding = 0\n  } = evaluate(options, state);\n  const paddingObject = getPaddingObject(padding);\n  const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n  const element = elements[altBoundary ? altContext : elementContext];\n  const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n    element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n    boundary,\n    rootBoundary,\n    strategy\n  }));\n  const rect = elementContext === 'floating' ? {\n    x,\n    y,\n    width: rects.floating.width,\n    height: rects.floating.height\n  } : rects.reference;\n  const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n  const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n    x: 1,\n    y: 1\n  } : {\n    x: 1,\n    y: 1\n  };\n  const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  }) : rect);\n  return {\n    top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n    bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n    left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n    right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n  };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n  name: 'arrow',\n  options,\n  async fn(state) {\n    const {\n      x,\n      y,\n      placement,\n      rects,\n      platform,\n      elements,\n      middlewareData\n    } = state;\n    // Since `element` is required, we don't Partial<> the type.\n    const {\n      element,\n      padding = 0\n    } = evaluate(options, state) || {};\n    if (element == null) {\n      return {};\n    }\n    const paddingObject = getPaddingObject(padding);\n    const coords = {\n      x,\n      y\n    };\n    const axis = getAlignmentAxis(placement);\n    const length = getAxisLength(axis);\n    const arrowDimensions = await platform.getDimensions(element);\n    const isYAxis = axis === 'y';\n    const minProp = isYAxis ? 'top' : 'left';\n    const maxProp = isYAxis ? 'bottom' : 'right';\n    const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n    const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n    const startDiff = coords[axis] - rects.reference[axis];\n    const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n    let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n    // DOM platform can return `window` as the `offsetParent`.\n    if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n      clientSize = elements.floating[clientProp] || rects.floating[length];\n    }\n    const centerToReference = endDiff / 2 - startDiff / 2;\n\n    // If the padding is large enough that it causes the arrow to no longer be\n    // centered, modify the padding so that it is centered.\n    const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n    const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n    const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n    // Make sure the arrow doesn't overflow the floating element if the center\n    // point is outside the floating element's bounds.\n    const min$1 = minPadding;\n    const max = clientSize - arrowDimensions[length] - maxPadding;\n    const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n    const offset = clamp(min$1, center, max);\n\n    // If the reference is small enough that the arrow's padding causes it to\n    // to point to nothing for an aligned placement, adjust the offset of the\n    // floating element itself. To ensure `shift()` continues to take action,\n    // a single reset is performed when this is true.\n    const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n    const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n    return {\n      [axis]: coords[axis] + alignmentOffset,\n      data: {\n        [axis]: offset,\n        centerOffset: center - offset - alignmentOffset,\n        ...(shouldAddOffset && {\n          alignmentOffset\n        })\n      },\n      reset: shouldAddOffset\n    };\n  }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n  const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n  return allowedPlacementsSortedByAlignment.filter(placement => {\n    if (alignment) {\n      return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n    }\n    return true;\n  });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'autoPlacement',\n    options,\n    async fn(state) {\n      var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n      const {\n        rects,\n        middlewareData,\n        placement,\n        platform,\n        elements\n      } = state;\n      const {\n        crossAxis = false,\n        alignment,\n        allowedPlacements = placements,\n        autoAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n      const currentPlacement = placements$1[currentIndex];\n      if (currentPlacement == null) {\n        return {};\n      }\n      const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n      // Make `computeCoords` start from the right place.\n      if (placement !== currentPlacement) {\n        return {\n          reset: {\n            placement: placements$1[0]\n          }\n        };\n      }\n      const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n      const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n        placement: currentPlacement,\n        overflows: currentOverflows\n      }];\n      const nextPlacement = placements$1[currentIndex + 1];\n\n      // There are more placements to check.\n      if (nextPlacement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: nextPlacement\n          }\n        };\n      }\n      const placementsSortedByMostSpace = allOverflows.map(d => {\n        const alignment = getAlignment(d.placement);\n        return [d.placement, alignment && crossAxis ?\n        // Check along the mainAxis and main crossAxis side.\n        d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n        // Check only the mainAxis.\n        d.overflows[0], d.overflows];\n      }).sort((a, b) => a[1] - b[1]);\n      const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n      // Aligned placements should not check their opposite crossAxis\n      // side.\n      getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n      const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n      if (resetPlacement !== placement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: resetPlacement\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'flip',\n    options,\n    async fn(state) {\n      var _middlewareData$arrow, _middlewareData$flip;\n      const {\n        placement,\n        middlewareData,\n        rects,\n        initialPlacement,\n        platform,\n        elements\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true,\n        fallbackPlacements: specifiedFallbackPlacements,\n        fallbackStrategy = 'bestFit',\n        fallbackAxisSideDirection = 'none',\n        flipAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n\n      // If a reset by the arrow was caused due to an alignment offset being\n      // added, we should skip any logic now since `flip()` has already done its\n      // work.\n      // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n      if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      const side = getSide(placement);\n      const initialSideAxis = getSideAxis(initialPlacement);\n      const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n      const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n      const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n      const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n      if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n        fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n      }\n      const placements = [initialPlacement, ...fallbackPlacements];\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const overflows = [];\n      let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n      if (checkMainAxis) {\n        overflows.push(overflow[side]);\n      }\n      if (checkCrossAxis) {\n        const sides = getAlignmentSides(placement, rects, rtl);\n        overflows.push(overflow[sides[0]], overflow[sides[1]]);\n      }\n      overflowsData = [...overflowsData, {\n        placement,\n        overflows\n      }];\n\n      // One or more sides is overflowing.\n      if (!overflows.every(side => side <= 0)) {\n        var _middlewareData$flip2, _overflowsData$filter;\n        const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n        const nextPlacement = placements[nextIndex];\n        if (nextPlacement) {\n          var _overflowsData$;\n          const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n          const hasInitialMainAxisOverflow = ((_overflowsData$ = overflowsData[0]) == null ? void 0 : _overflowsData$.overflows[0]) > 0;\n          if (!ignoreCrossAxisOverflow || hasInitialMainAxisOverflow) {\n            // Try next placement and re-run the lifecycle.\n            return {\n              data: {\n                index: nextIndex,\n                overflows: overflowsData\n              },\n              reset: {\n                placement: nextPlacement\n              }\n            };\n          }\n        }\n\n        // First, find the candidates that fit on the mainAxis side of overflow,\n        // then find the placement that fits the best on the main crossAxis side.\n        let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n        // Otherwise fallback.\n        if (!resetPlacement) {\n          switch (fallbackStrategy) {\n            case 'bestFit':\n              {\n                var _overflowsData$filter2;\n                const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n                  if (hasFallbackAxisSideDirection) {\n                    const currentSideAxis = getSideAxis(d.placement);\n                    return currentSideAxis === initialSideAxis ||\n                    // Create a bias to the `y` side axis due to horizontal\n                    // reading directions favoring greater width.\n                    currentSideAxis === 'y';\n                  }\n                  return true;\n                }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n                if (placement) {\n                  resetPlacement = placement;\n                }\n                break;\n              }\n            case 'initialPlacement':\n              resetPlacement = initialPlacement;\n              break;\n          }\n        }\n        if (placement !== resetPlacement) {\n          return {\n            reset: {\n              placement: resetPlacement\n            }\n          };\n        }\n      }\n      return {};\n    }\n  };\n};\n\nfunction getSideOffsets(overflow, rect) {\n  return {\n    top: overflow.top - rect.height,\n    right: overflow.right - rect.width,\n    bottom: overflow.bottom - rect.height,\n    left: overflow.left - rect.width\n  };\n}\nfunction isAnySideFullyClipped(overflow) {\n  return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'hide',\n    options,\n    async fn(state) {\n      const {\n        rects\n      } = state;\n      const {\n        strategy = 'referenceHidden',\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      switch (strategy) {\n        case 'referenceHidden':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              elementContext: 'reference'\n            });\n            const offsets = getSideOffsets(overflow, rects.reference);\n            return {\n              data: {\n                referenceHiddenOffsets: offsets,\n                referenceHidden: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        case 'escaped':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              altBoundary: true\n            });\n            const offsets = getSideOffsets(overflow, rects.floating);\n            return {\n              data: {\n                escapedOffsets: offsets,\n                escaped: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        default:\n          {\n            return {};\n          }\n      }\n    }\n  };\n};\n\nfunction getBoundingRect(rects) {\n  const minX = min(...rects.map(rect => rect.left));\n  const minY = min(...rects.map(rect => rect.top));\n  const maxX = max(...rects.map(rect => rect.right));\n  const maxY = max(...rects.map(rect => rect.bottom));\n  return {\n    x: minX,\n    y: minY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction getRectsByLine(rects) {\n  const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n  const groups = [];\n  let prevRect = null;\n  for (let i = 0; i < sortedRects.length; i++) {\n    const rect = sortedRects[i];\n    if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n      groups.push([rect]);\n    } else {\n      groups[groups.length - 1].push(rect);\n    }\n    prevRect = rect;\n  }\n  return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'inline',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        elements,\n        rects,\n        platform,\n        strategy\n      } = state;\n      // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n      // ClientRect's bounds, despite the event listener being triggered. A\n      // padding of 2 seems to handle this issue.\n      const {\n        padding = 2,\n        x,\n        y\n      } = evaluate(options, state);\n      const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n      const clientRects = getRectsByLine(nativeClientRects);\n      const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n      const paddingObject = getPaddingObject(padding);\n      function getBoundingClientRect() {\n        // There are two rects and they are disjoined.\n        if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n          // Find the first rect in which the point is fully inside.\n          return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n        }\n\n        // There are 2 or more connected rects.\n        if (clientRects.length >= 2) {\n          if (getSideAxis(placement) === 'y') {\n            const firstRect = clientRects[0];\n            const lastRect = clientRects[clientRects.length - 1];\n            const isTop = getSide(placement) === 'top';\n            const top = firstRect.top;\n            const bottom = lastRect.bottom;\n            const left = isTop ? firstRect.left : lastRect.left;\n            const right = isTop ? firstRect.right : lastRect.right;\n            const width = right - left;\n            const height = bottom - top;\n            return {\n              top,\n              bottom,\n              left,\n              right,\n              width,\n              height,\n              x: left,\n              y: top\n            };\n          }\n          const isLeftSide = getSide(placement) === 'left';\n          const maxRight = max(...clientRects.map(rect => rect.right));\n          const minLeft = min(...clientRects.map(rect => rect.left));\n          const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n          const top = measureRects[0].top;\n          const bottom = measureRects[measureRects.length - 1].bottom;\n          const left = minLeft;\n          const right = maxRight;\n          const width = right - left;\n          const height = bottom - top;\n          return {\n            top,\n            bottom,\n            left,\n            right,\n            width,\n            height,\n            x: left,\n            y: top\n          };\n        }\n        return fallback;\n      }\n      const resetRects = await platform.getElementRects({\n        reference: {\n          getBoundingClientRect\n        },\n        floating: elements.floating,\n        strategy\n      });\n      if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n        return {\n          reset: {\n            rects: resetRects\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n  const {\n    placement,\n    platform,\n    elements\n  } = state;\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n  const side = getSide(placement);\n  const alignment = getAlignment(placement);\n  const isVertical = getSideAxis(placement) === 'y';\n  const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n  const crossAxisMulti = rtl && isVertical ? -1 : 1;\n  const rawValue = evaluate(options, state);\n\n  // eslint-disable-next-line prefer-const\n  let {\n    mainAxis,\n    crossAxis,\n    alignmentAxis\n  } = typeof rawValue === 'number' ? {\n    mainAxis: rawValue,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: rawValue.mainAxis || 0,\n    crossAxis: rawValue.crossAxis || 0,\n    alignmentAxis: rawValue.alignmentAxis\n  };\n  if (alignment && typeof alignmentAxis === 'number') {\n    crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n  }\n  return isVertical ? {\n    x: crossAxis * crossAxisMulti,\n    y: mainAxis * mainAxisMulti\n  } : {\n    x: mainAxis * mainAxisMulti,\n    y: crossAxis * crossAxisMulti\n  };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n  if (options === void 0) {\n    options = 0;\n  }\n  return {\n    name: 'offset',\n    options,\n    async fn(state) {\n      var _middlewareData$offse, _middlewareData$arrow;\n      const {\n        x,\n        y,\n        placement,\n        middlewareData\n      } = state;\n      const diffCoords = await convertValueToCoords(state, options);\n\n      // If the placement is the same and the arrow caused an alignment offset\n      // then we don't need to change the positioning coordinates.\n      if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      return {\n        x: x + diffCoords.x,\n        y: y + diffCoords.y,\n        data: {\n          ...diffCoords,\n          placement\n        }\n      };\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'shift',\n    options,\n    async fn(state) {\n      const {\n        x,\n        y,\n        placement\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = false,\n        limiter = {\n          fn: _ref => {\n            let {\n              x,\n              y\n            } = _ref;\n            return {\n              x,\n              y\n            };\n          }\n        },\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const crossAxis = getSideAxis(getSide(placement));\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      if (checkMainAxis) {\n        const minSide = mainAxis === 'y' ? 'top' : 'left';\n        const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n        const min = mainAxisCoord + overflow[minSide];\n        const max = mainAxisCoord - overflow[maxSide];\n        mainAxisCoord = clamp(min, mainAxisCoord, max);\n      }\n      if (checkCrossAxis) {\n        const minSide = crossAxis === 'y' ? 'top' : 'left';\n        const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n        const min = crossAxisCoord + overflow[minSide];\n        const max = crossAxisCoord - overflow[maxSide];\n        crossAxisCoord = clamp(min, crossAxisCoord, max);\n      }\n      const limitedCoords = limiter.fn({\n        ...state,\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      });\n      return {\n        ...limitedCoords,\n        data: {\n          x: limitedCoords.x - x,\n          y: limitedCoords.y - y,\n          enabled: {\n            [mainAxis]: checkMainAxis,\n            [crossAxis]: checkCrossAxis\n          }\n        }\n      };\n    }\n  };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    options,\n    fn(state) {\n      const {\n        x,\n        y,\n        placement,\n        rects,\n        middlewareData\n      } = state;\n      const {\n        offset = 0,\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const rawOffset = evaluate(offset, state);\n      const computedOffset = typeof rawOffset === 'number' ? {\n        mainAxis: rawOffset,\n        crossAxis: 0\n      } : {\n        mainAxis: 0,\n        crossAxis: 0,\n        ...rawOffset\n      };\n      if (checkMainAxis) {\n        const len = mainAxis === 'y' ? 'height' : 'width';\n        const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n        const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n        if (mainAxisCoord < limitMin) {\n          mainAxisCoord = limitMin;\n        } else if (mainAxisCoord > limitMax) {\n          mainAxisCoord = limitMax;\n        }\n      }\n      if (checkCrossAxis) {\n        var _middlewareData$offse, _middlewareData$offse2;\n        const len = mainAxis === 'y' ? 'width' : 'height';\n        const isOriginSide = ['top', 'left'].includes(getSide(placement));\n        const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n        const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n        if (crossAxisCoord < limitMin) {\n          crossAxisCoord = limitMin;\n        } else if (crossAxisCoord > limitMax) {\n          crossAxisCoord = limitMax;\n        }\n      }\n      return {\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      };\n    }\n  };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'size',\n    options,\n    async fn(state) {\n      var _state$middlewareData, _state$middlewareData2;\n      const {\n        placement,\n        rects,\n        platform,\n        elements\n      } = state;\n      const {\n        apply = () => {},\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const side = getSide(placement);\n      const alignment = getAlignment(placement);\n      const isYAxis = getSideAxis(placement) === 'y';\n      const {\n        width,\n        height\n      } = rects.floating;\n      let heightSide;\n      let widthSide;\n      if (side === 'top' || side === 'bottom') {\n        heightSide = side;\n        widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n      } else {\n        widthSide = side;\n        heightSide = alignment === 'end' ? 'top' : 'bottom';\n      }\n      const maximumClippingHeight = height - overflow.top - overflow.bottom;\n      const maximumClippingWidth = width - overflow.left - overflow.right;\n      const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n      const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n      const noShift = !state.middlewareData.shift;\n      let availableHeight = overflowAvailableHeight;\n      let availableWidth = overflowAvailableWidth;\n      if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n        availableWidth = maximumClippingWidth;\n      }\n      if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n        availableHeight = maximumClippingHeight;\n      }\n      if (noShift && !alignment) {\n        const xMin = max(overflow.left, 0);\n        const xMax = max(overflow.right, 0);\n        const yMin = max(overflow.top, 0);\n        const yMax = max(overflow.bottom, 0);\n        if (isYAxis) {\n          availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n        } else {\n          availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n        }\n      }\n      await apply({\n        ...state,\n        availableWidth,\n        availableHeight\n      });\n      const nextDimensions = await platform.getDimensions(elements.floating);\n      if (width !== nextDimensions.width || height !== nextDimensions.height) {\n        return {\n          reset: {\n            rects: true\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n  const css = getComputedStyle(element);\n  // In testing environments, the `width` and `height` properties are empty\n  // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n  let width = parseFloat(css.width) || 0;\n  let height = parseFloat(css.height) || 0;\n  const hasOffset = isHTMLElement(element);\n  const offsetWidth = hasOffset ? element.offsetWidth : width;\n  const offsetHeight = hasOffset ? element.offsetHeight : height;\n  const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n  if (shouldFallback) {\n    width = offsetWidth;\n    height = offsetHeight;\n  }\n  return {\n    width,\n    height,\n    $: shouldFallback\n  };\n}\n\nfunction unwrapElement(element) {\n  return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n  const domElement = unwrapElement(element);\n  if (!isHTMLElement(domElement)) {\n    return createCoords(1);\n  }\n  const rect = domElement.getBoundingClientRect();\n  const {\n    width,\n    height,\n    $\n  } = getCssDimensions(domElement);\n  let x = ($ ? round(rect.width) : rect.width) / width;\n  let y = ($ ? round(rect.height) : rect.height) / height;\n\n  // 0, NaN, or Infinity should always fallback to 1.\n\n  if (!x || !Number.isFinite(x)) {\n    x = 1;\n  }\n  if (!y || !Number.isFinite(y)) {\n    y = 1;\n  }\n  return {\n    x,\n    y\n  };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n  const win = getWindow(element);\n  if (!isWebKit() || !win.visualViewport) {\n    return noOffsets;\n  }\n  return {\n    x: win.visualViewport.offsetLeft,\n    y: win.visualViewport.offsetTop\n  };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n  if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n    return false;\n  }\n  return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n  const clientRect = element.getBoundingClientRect();\n  const domElement = unwrapElement(element);\n  let scale = createCoords(1);\n  if (includeScale) {\n    if (offsetParent) {\n      if (isElement(offsetParent)) {\n        scale = getScale(offsetParent);\n      }\n    } else {\n      scale = getScale(element);\n    }\n  }\n  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n  let x = (clientRect.left + visualOffsets.x) / scale.x;\n  let y = (clientRect.top + visualOffsets.y) / scale.y;\n  let width = clientRect.width / scale.x;\n  let height = clientRect.height / scale.y;\n  if (domElement) {\n    const win = getWindow(domElement);\n    const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n    let currentWin = win;\n    let currentIFrame = getFrameElement(currentWin);\n    while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n      const iframeScale = getScale(currentIFrame);\n      const iframeRect = currentIFrame.getBoundingClientRect();\n      const css = getComputedStyle(currentIFrame);\n      const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n      const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n      x *= iframeScale.x;\n      y *= iframeScale.y;\n      width *= iframeScale.x;\n      height *= iframeScale.y;\n      x += left;\n      y += top;\n      currentWin = getWindow(currentIFrame);\n      currentIFrame = getFrameElement(currentWin);\n    }\n  }\n  return rectToClientRect({\n    width,\n    height,\n    x,\n    y\n  });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n  const leftScroll = getNodeScroll(element).scrollLeft;\n  if (!rect) {\n    return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n  }\n  return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n  if (ignoreScrollbarX === void 0) {\n    ignoreScrollbarX = false;\n  }\n  const htmlRect = documentElement.getBoundingClientRect();\n  const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n  // RTL <body> scrollbar.\n  getWindowScrollBarX(documentElement, htmlRect));\n  const y = htmlRect.top + scroll.scrollTop;\n  return {\n    x,\n    y\n  };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n  let {\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  } = _ref;\n  const isFixed = strategy === 'fixed';\n  const documentElement = getDocumentElement(offsetParent);\n  const topLayer = elements ? isTopLayer(elements.floating) : false;\n  if (offsetParent === documentElement || topLayer && isFixed) {\n    return rect;\n  }\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  let scale = createCoords(1);\n  const offsets = createCoords(0);\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isHTMLElement(offsetParent)) {\n      const offsetRect = getBoundingClientRect(offsetParent);\n      scale = getScale(offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n  return {\n    width: rect.width * scale.x,\n    height: rect.height * scale.y,\n    x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n    y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n  };\n}\n\nfunction getClientRects(element) {\n  return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n  const html = getDocumentElement(element);\n  const scroll = getNodeScroll(element);\n  const body = element.ownerDocument.body;\n  const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n  const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n  let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n  const y = -scroll.scrollTop;\n  if (getComputedStyle(body).direction === 'rtl') {\n    x += max(html.clientWidth, body.clientWidth) - width;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\nfunction getViewportRect(element, strategy) {\n  const win = getWindow(element);\n  const html = getDocumentElement(element);\n  const visualViewport = win.visualViewport;\n  let width = html.clientWidth;\n  let height = html.clientHeight;\n  let x = 0;\n  let y = 0;\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    const visualViewportBased = isWebKit();\n    if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n  const top = clientRect.top + element.clientTop;\n  const left = clientRect.left + element.clientLeft;\n  const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n  const width = element.clientWidth * scale.x;\n  const height = element.clientHeight * scale.y;\n  const x = left * scale.x;\n  const y = top * scale.y;\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n  let rect;\n  if (clippingAncestor === 'viewport') {\n    rect = getViewportRect(element, strategy);\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element));\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n  } else {\n    const visualOffsets = getVisualOffsets(element);\n    rect = {\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y,\n      width: clippingAncestor.width,\n      height: clippingAncestor.height\n    };\n  }\n  return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n  const parentNode = getParentNode(element);\n  if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n    return false;\n  }\n  return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n  const cachedResult = cache.get(element);\n  if (cachedResult) {\n    return cachedResult;\n  }\n  let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n  let currentContainingBlockComputedStyle = null;\n  const elementIsFixed = getComputedStyle(element).position === 'fixed';\n  let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle(currentNode);\n    const currentNodeIsContaining = isContainingBlock(currentNode);\n    if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n      currentContainingBlockComputedStyle = null;\n    }\n    const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter(ancestor => ancestor !== currentNode);\n    } else {\n      // Record last containing block for next iteration.\n      currentContainingBlockComputedStyle = computedStyle;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  cache.set(element, result);\n  return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n  let {\n    element,\n    boundary,\n    rootBoundary,\n    strategy\n  } = _ref;\n  const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n  const firstClippingAncestor = clippingAncestors[0];\n  const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n    const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n  return {\n    width: clippingRect.right - clippingRect.left,\n    height: clippingRect.bottom - clippingRect.top,\n    x: clippingRect.left,\n    y: clippingRect.top\n  };\n}\n\nfunction getDimensions(element) {\n  const {\n    width,\n    height\n  } = getCssDimensions(element);\n  return {\n    width,\n    height\n  };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  const documentElement = getDocumentElement(offsetParent);\n  const isFixed = strategy === 'fixed';\n  const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const offsets = createCoords(0);\n\n  // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n  // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n  function setLeftRTLScrollbarOffset() {\n    offsets.x = getWindowScrollBarX(documentElement);\n  }\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    } else if (documentElement) {\n      setLeftRTLScrollbarOffset();\n    }\n  }\n  if (isFixed && !isOffsetParentAnElement && documentElement) {\n    setLeftRTLScrollbarOffset();\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n  const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n  return {\n    x,\n    y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\nfunction isStaticPositioned(element) {\n  return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n  if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n  if (polyfill) {\n    return polyfill(element);\n  }\n  let rawOffsetParent = element.offsetParent;\n\n  // Firefox returns the <html> element as the offsetParent if it's non-static,\n  // while Chrome and Safari return the <body> element. The <body> element must\n  // be used to perform the correct calculations even if the <html> element is\n  // non-static.\n  if (getDocumentElement(element) === rawOffsetParent) {\n    rawOffsetParent = rawOffsetParent.ownerDocument.body;\n  }\n  return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n  const win = getWindow(element);\n  if (isTopLayer(element)) {\n    return win;\n  }\n  if (!isHTMLElement(element)) {\n    let svgOffsetParent = getParentNode(element);\n    while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n      if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n        return svgOffsetParent;\n      }\n      svgOffsetParent = getParentNode(svgOffsetParent);\n    }\n    return win;\n  }\n  let offsetParent = getTrueOffsetParent(element, polyfill);\n  while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n    offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n  }\n  if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n    return win;\n  }\n  return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n  const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n  const getDimensionsFn = this.getDimensions;\n  const floatingDimensions = await getDimensionsFn(data.floating);\n  return {\n    reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: floatingDimensions.width,\n      height: floatingDimensions.height\n    }\n  };\n};\n\nfunction isRTL(element) {\n  return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n  convertOffsetParentRelativeRectToViewportRelativeRect,\n  getDocumentElement,\n  getClippingRect,\n  getOffsetParent,\n  getElementRects,\n  getClientRects,\n  getDimensions,\n  getScale,\n  isElement,\n  isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n  return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n  let io = null;\n  let timeoutId;\n  const root = getDocumentElement(element);\n  function cleanup() {\n    var _io;\n    clearTimeout(timeoutId);\n    (_io = io) == null || _io.disconnect();\n    io = null;\n  }\n  function refresh(skip, threshold) {\n    if (skip === void 0) {\n      skip = false;\n    }\n    if (threshold === void 0) {\n      threshold = 1;\n    }\n    cleanup();\n    const elementRectForRootMargin = element.getBoundingClientRect();\n    const {\n      left,\n      top,\n      width,\n      height\n    } = elementRectForRootMargin;\n    if (!skip) {\n      onMove();\n    }\n    if (!width || !height) {\n      return;\n    }\n    const insetTop = floor(top);\n    const insetRight = floor(root.clientWidth - (left + width));\n    const insetBottom = floor(root.clientHeight - (top + height));\n    const insetLeft = floor(left);\n    const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n    const options = {\n      rootMargin,\n      threshold: max(0, min(1, threshold)) || 1\n    };\n    let isFirstUpdate = true;\n    function handleObserve(entries) {\n      const ratio = entries[0].intersectionRatio;\n      if (ratio !== threshold) {\n        if (!isFirstUpdate) {\n          return refresh();\n        }\n        if (!ratio) {\n          // If the reference is clipped, the ratio is 0. Throttle the refresh\n          // to prevent an infinite loop of updates.\n          timeoutId = setTimeout(() => {\n            refresh(false, 1e-7);\n          }, 1000);\n        } else {\n          refresh(false, ratio);\n        }\n      }\n      if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n        // It's possible that even though the ratio is reported as 1, the\n        // element is not actually fully within the IntersectionObserver's root\n        // area anymore. This can happen under performance constraints. This may\n        // be a bug in the browser's IntersectionObserver implementation. To\n        // work around this, we compare the element's bounding rect now with\n        // what it was at the time we created the IntersectionObserver. If they\n        // are not equal then the element moved, so we refresh.\n        refresh();\n      }\n      isFirstUpdate = false;\n    }\n\n    // Older browsers don't support a `document` as the root and will throw an\n    // error.\n    try {\n      io = new IntersectionObserver(handleObserve, {\n        ...options,\n        // Handle <iframe>s\n        root: root.ownerDocument\n      });\n    } catch (_e) {\n      io = new IntersectionObserver(handleObserve, options);\n    }\n    io.observe(element);\n  }\n  refresh(true);\n  return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    ancestorScroll = true,\n    ancestorResize = true,\n    elementResize = typeof ResizeObserver === 'function',\n    layoutShift = typeof IntersectionObserver === 'function',\n    animationFrame = false\n  } = options;\n  const referenceEl = unwrapElement(reference);\n  const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n  ancestors.forEach(ancestor => {\n    ancestorScroll && ancestor.addEventListener('scroll', update, {\n      passive: true\n    });\n    ancestorResize && ancestor.addEventListener('resize', update);\n  });\n  const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n  let reobserveFrame = -1;\n  let resizeObserver = null;\n  if (elementResize) {\n    resizeObserver = new ResizeObserver(_ref => {\n      let [firstEntry] = _ref;\n      if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n        // Prevent update loops when using the `size` middleware.\n        // https://github.com/floating-ui/floating-ui/issues/1740\n        resizeObserver.unobserve(floating);\n        cancelAnimationFrame(reobserveFrame);\n        reobserveFrame = requestAnimationFrame(() => {\n          var _resizeObserver;\n          (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n        });\n      }\n      update();\n    });\n    if (referenceEl && !animationFrame) {\n      resizeObserver.observe(referenceEl);\n    }\n    resizeObserver.observe(floating);\n  }\n  let frameId;\n  let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n  if (animationFrame) {\n    frameLoop();\n  }\n  function frameLoop() {\n    const nextRefRect = getBoundingClientRect(reference);\n    if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n      update();\n    }\n    prevRefRect = nextRefRect;\n    frameId = requestAnimationFrame(frameLoop);\n  }\n  update();\n  return () => {\n    var _resizeObserver2;\n    ancestors.forEach(ancestor => {\n      ancestorScroll && ancestor.removeEventListener('scroll', update);\n      ancestorResize && ancestor.removeEventListener('resize', update);\n    });\n    cleanupIo == null || cleanupIo();\n    (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n    resizeObserver = null;\n    if (animationFrame) {\n      cancelAnimationFrame(frameId);\n    }\n  };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n  // This caches the expensive `getClippingElementAncestors` function so that\n  // multiple lifecycle resets re-use the same result. It only lives for a\n  // single call. If other functions become expensive, we can add them as well.\n  const cache = new Map();\n  const mergedOptions = {\n    platform,\n    ...options\n  };\n  const platformWithCache = {\n    ...mergedOptions.platform,\n    _c: cache\n  };\n  return computePosition$1(reference, floating, {\n    ...mergedOptions,\n    platform: platformWithCache\n  });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { computePosition, arrow as arrow$2, offset as offset$1, shift as shift$1, limitShift as limitShift$1, flip as flip$1, size as size$1, autoPlacement as autoPlacement$1, hide as hide$1, inline as inline$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect, useEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar index = typeof document !== 'undefined' ? useLayoutEffect : useEffect;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  if (typeof a === 'function' && a.toString() === b.toString()) {\n    return true;\n  }\n  let length;\n  let i;\n  let keys;\n  if (a && b && typeof a === 'object') {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length !== b.length) return false;\n      for (i = length; i-- !== 0;) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n    for (i = length; i-- !== 0;) {\n      if (!{}.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n    for (i = length; i-- !== 0;) {\n      const key = keys[i];\n      if (key === '_owner' && a.$$typeof) {\n        continue;\n      }\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n  if (typeof window === 'undefined') {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n  const ref = React.useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform,\n    elements: {\n      reference: externalReference,\n      floating: externalFloating\n    } = {},\n    transform = true,\n    whileElementsMounted,\n    open\n  } = options;\n  const [data, setData] = React.useState({\n    x: 0,\n    y: 0,\n    strategy,\n    placement,\n    middlewareData: {},\n    isPositioned: false\n  });\n  const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n  if (!deepEqual(latestMiddleware, middleware)) {\n    setLatestMiddleware(middleware);\n  }\n  const [_reference, _setReference] = React.useState(null);\n  const [_floating, _setFloating] = React.useState(null);\n  const setReference = React.useCallback(node => {\n    if (node !== referenceRef.current) {\n      referenceRef.current = node;\n      _setReference(node);\n    }\n  }, []);\n  const setFloating = React.useCallback(node => {\n    if (node !== floatingRef.current) {\n      floatingRef.current = node;\n      _setFloating(node);\n    }\n  }, []);\n  const referenceEl = externalReference || _reference;\n  const floatingEl = externalFloating || _floating;\n  const referenceRef = React.useRef(null);\n  const floatingRef = React.useRef(null);\n  const dataRef = React.useRef(data);\n  const hasWhileElementsMounted = whileElementsMounted != null;\n  const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n  const platformRef = useLatestRef(platform);\n  const openRef = useLatestRef(open);\n  const update = React.useCallback(() => {\n    if (!referenceRef.current || !floatingRef.current) {\n      return;\n    }\n    const config = {\n      placement,\n      strategy,\n      middleware: latestMiddleware\n    };\n    if (platformRef.current) {\n      config.platform = platformRef.current;\n    }\n    computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n      const fullData = {\n        ...data,\n        // The floating element's position may be recomputed while it's closed\n        // but still mounted (such as when transitioning out). To ensure\n        // `isPositioned` will be `false` initially on the next open, avoid\n        // setting it to `true` when `open === false` (must be specified).\n        isPositioned: openRef.current !== false\n      };\n      if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n        dataRef.current = fullData;\n        ReactDOM.flushSync(() => {\n          setData(fullData);\n        });\n      }\n    });\n  }, [latestMiddleware, placement, strategy, platformRef, openRef]);\n  index(() => {\n    if (open === false && dataRef.current.isPositioned) {\n      dataRef.current.isPositioned = false;\n      setData(data => ({\n        ...data,\n        isPositioned: false\n      }));\n    }\n  }, [open]);\n  const isMountedRef = React.useRef(false);\n  index(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n  index(() => {\n    if (referenceEl) referenceRef.current = referenceEl;\n    if (floatingEl) floatingRef.current = floatingEl;\n    if (referenceEl && floatingEl) {\n      if (whileElementsMountedRef.current) {\n        return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n      }\n      update();\n    }\n  }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n  const refs = React.useMemo(() => ({\n    reference: referenceRef,\n    floating: floatingRef,\n    setReference,\n    setFloating\n  }), [setReference, setFloating]);\n  const elements = React.useMemo(() => ({\n    reference: referenceEl,\n    floating: floatingEl\n  }), [referenceEl, floatingEl]);\n  const floatingStyles = React.useMemo(() => {\n    const initialStyles = {\n      position: strategy,\n      left: 0,\n      top: 0\n    };\n    if (!elements.floating) {\n      return initialStyles;\n    }\n    const x = roundByDPR(elements.floating, data.x);\n    const y = roundByDPR(elements.floating, data.y);\n    if (transform) {\n      return {\n        ...initialStyles,\n        transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n        ...(getDPR(elements.floating) >= 1.5 && {\n          willChange: 'transform'\n        })\n      };\n    }\n    return {\n      position: strategy,\n      left: x,\n      top: y\n    };\n  }, [strategy, transform, elements.floating, data.x, data.y]);\n  return React.useMemo(() => ({\n    ...data,\n    update,\n    refs,\n    elements,\n    floatingStyles\n  }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n  function isRef(value) {\n    return {}.hasOwnProperty.call(value, 'current');\n  }\n  return {\n    name: 'arrow',\n    options,\n    fn(state) {\n      const {\n        element,\n        padding\n      } = typeof options === 'function' ? options(state) : options;\n      if (element && isRef(element)) {\n        if (element.current != null) {\n          return arrow$2({\n            element: element.current,\n            padding\n          }).fn(state);\n        }\n        return {};\n      }\n      if (element) {\n        return arrow$2({\n          element,\n          padding\n        }).fn(state);\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => ({\n  ...offset$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => ({\n  ...shift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => ({\n  ...limitShift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => ({\n  ...flip$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => ({\n  ...size$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => ({\n  ...autoPlacement$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => ({\n  ...hide$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => ({\n  ...inline$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => ({\n  ...arrow$1(options),\n  options: [options, deps]\n});\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","import * as React from 'react';\nimport { useModernLayoutEffect, useEffectEvent, getMinListIndex, getMaxListIndex, createGridCellMap, isListIndexDisabled, getGridNavigatedIndex, getGridCellIndexOfCorner, getGridCellIndices, findNonDisabledListIndex, isIndexOutOfListBounds, useLatestRef, getDocument as getDocument$1, isMouseLikePointerType, contains as contains$1, isSafari, enableFocusInside, isOutsideEvent, getPreviousTabbable, getNextTabbable, disableFocusInside, isTypeableCombobox, getFloatingFocusElement, getTabbableOptions, getNodeAncestors, activeElement, getNodeChildren as getNodeChildren$1, stopEvent, getTarget as getTarget$1, isVirtualClick, isVirtualPointerEvent, getPlatform, isTypeableElement, isReactEvent, isRootElement, isEventTargetWithin, matchesFocusVisible, isMac, getDeepestNode, getUserAgent } from '@floating-ui/react/utils';\nimport { jsx, jsxs, Fragment } from 'react/jsx-runtime';\nimport { getComputedStyle, isElement, isShadowRoot, getNodeName, isHTMLElement, getWindow, isLastTraversableNode, getParentNode, isWebKit } from '@floating-ui/utils/dom';\nimport { tabbable, isTabbable, focusable } from 'tabbable';\nimport * as ReactDOM from 'react-dom';\nimport { getOverflowAncestors, useFloating as useFloating$1, offset, detectOverflow } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\nimport { evaluate, max, round, min } from '@floating-ui/utils';\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n */\nfunction useMergeRefs(refs) {\n  const cleanupRef = React.useRef(undefined);\n  const refEffect = React.useCallback(instance => {\n    const cleanups = refs.map(ref => {\n      if (ref == null) {\n        return;\n      }\n      if (typeof ref === 'function') {\n        const refCallback = ref;\n        const refCleanup = refCallback(instance);\n        return typeof refCleanup === 'function' ? refCleanup : () => {\n          refCallback(null);\n        };\n      }\n      ref.current = instance;\n      return () => {\n        ref.current = null;\n      };\n    });\n    return () => {\n      cleanups.forEach(refCleanup => refCleanup == null ? void 0 : refCleanup());\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n  return React.useMemo(() => {\n    if (refs.every(ref => ref == null)) {\n      return null;\n    }\n    return value => {\n      if (cleanupRef.current) {\n        cleanupRef.current();\n        cleanupRef.current = undefined;\n      }\n      if (value != null) {\n        cleanupRef.current = refEffect(value);\n      }\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n}\n\nfunction sortByDocumentPosition(a, b) {\n  const position = a.compareDocumentPosition(b);\n  if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n    return -1;\n  }\n  if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n    return 1;\n  }\n  return 0;\n}\nconst FloatingListContext = /*#__PURE__*/React.createContext({\n  register: () => {},\n  unregister: () => {},\n  map: /*#__PURE__*/new Map(),\n  elementsRef: {\n    current: []\n  }\n});\n/**\n * Provides context for a list of items within the floating element.\n * @see https://floating-ui.com/docs/FloatingList\n */\nfunction FloatingList(props) {\n  const {\n    children,\n    elementsRef,\n    labelsRef\n  } = props;\n  const [nodes, setNodes] = React.useState(() => new Set());\n  const register = React.useCallback(node => {\n    setNodes(prevSet => new Set(prevSet).add(node));\n  }, []);\n  const unregister = React.useCallback(node => {\n    setNodes(prevSet => {\n      const set = new Set(prevSet);\n      set.delete(node);\n      return set;\n    });\n  }, []);\n  const map = React.useMemo(() => {\n    const newMap = new Map();\n    const sortedNodes = Array.from(nodes.keys()).sort(sortByDocumentPosition);\n    sortedNodes.forEach((node, index) => {\n      newMap.set(node, index);\n    });\n    return newMap;\n  }, [nodes]);\n  return /*#__PURE__*/jsx(FloatingListContext.Provider, {\n    value: React.useMemo(() => ({\n      register,\n      unregister,\n      map,\n      elementsRef,\n      labelsRef\n    }), [register, unregister, map, elementsRef, labelsRef]),\n    children: children\n  });\n}\n/**\n * Used to register a list item and its index (DOM position) in the\n * `FloatingList`.\n * @see https://floating-ui.com/docs/FloatingList#uselistitem\n */\nfunction useListItem(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    label\n  } = props;\n  const {\n    register,\n    unregister,\n    map,\n    elementsRef,\n    labelsRef\n  } = React.useContext(FloatingListContext);\n  const [index, setIndex] = React.useState(null);\n  const componentRef = React.useRef(null);\n  const ref = React.useCallback(node => {\n    componentRef.current = node;\n    if (index !== null) {\n      elementsRef.current[index] = node;\n      if (labelsRef) {\n        var _node$textContent;\n        const isLabelDefined = label !== undefined;\n        labelsRef.current[index] = isLabelDefined ? label : (_node$textContent = node == null ? void 0 : node.textContent) != null ? _node$textContent : null;\n      }\n    }\n  }, [index, elementsRef, labelsRef, label]);\n  useModernLayoutEffect(() => {\n    const node = componentRef.current;\n    if (node) {\n      register(node);\n      return () => {\n        unregister(node);\n      };\n    }\n  }, [register, unregister]);\n  useModernLayoutEffect(() => {\n    const index = componentRef.current ? map.get(componentRef.current) : null;\n    if (index != null) {\n      setIndex(index);\n    }\n  }, [map]);\n  return React.useMemo(() => ({\n    ref,\n    index: index == null ? -1 : index\n  }), [index, ref]);\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst ACTIVE_KEY = 'active';\nconst SELECTED_KEY = 'selected';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction renderJsx(render, computedProps) {\n  if (typeof render === 'function') {\n    return render(computedProps);\n  }\n  if (render) {\n    return /*#__PURE__*/React.cloneElement(render, computedProps);\n  }\n  return /*#__PURE__*/jsx(\"div\", {\n    ...computedProps\n  });\n}\nconst CompositeContext = /*#__PURE__*/React.createContext({\n  activeIndex: 0,\n  onNavigate: () => {}\n});\nconst horizontalKeys = [ARROW_LEFT, ARROW_RIGHT];\nconst verticalKeys = [ARROW_UP, ARROW_DOWN];\nconst allKeys = [...horizontalKeys, ...verticalKeys];\n\n/**\n * Creates a single tab stop whose items are navigated by arrow keys, which\n * provides list navigation outside of floating element contexts.\n *\n * This is useful to enable navigation of a list of items that aren’t part of a\n * floating element. A menubar is an example of a composite, with each reference\n * element being an item.\n * @see https://floating-ui.com/docs/Composite\n */\nconst Composite = /*#__PURE__*/React.forwardRef(function Composite(props, forwardedRef) {\n  const {\n    render,\n    orientation = 'both',\n    loop = true,\n    rtl = false,\n    cols = 1,\n    disabledIndices,\n    activeIndex: externalActiveIndex,\n    onNavigate: externalSetActiveIndex,\n    itemSizes,\n    dense = false,\n    ...domProps\n  } = props;\n  const [internalActiveIndex, internalSetActiveIndex] = React.useState(0);\n  const activeIndex = externalActiveIndex != null ? externalActiveIndex : internalActiveIndex;\n  const onNavigate = useEffectEvent(externalSetActiveIndex != null ? externalSetActiveIndex : internalSetActiveIndex);\n  const elementsRef = React.useRef([]);\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const contextValue = React.useMemo(() => ({\n    activeIndex,\n    onNavigate\n  }), [activeIndex, onNavigate]);\n  const isGrid = cols > 1;\n  function handleKeyDown(event) {\n    if (!allKeys.includes(event.key)) return;\n    let nextIndex = activeIndex;\n    const minIndex = getMinListIndex(elementsRef, disabledIndices);\n    const maxIndex = getMaxListIndex(elementsRef, disabledIndices);\n    const horizontalEndKey = rtl ? ARROW_LEFT : ARROW_RIGHT;\n    const horizontalStartKey = rtl ? ARROW_RIGHT : ARROW_LEFT;\n    if (isGrid) {\n      const sizes = itemSizes || Array.from({\n        length: elementsRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = createGridCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      const maybeNextIndex = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex ? elementsRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        rtl,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getGridCellIndices([...(disabledIndices || elementsRef.current.map((_, index) => isListIndexDisabled(elementsRef, index) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getGridCellIndexOfCorner(activeIndex > maxIndex ? minIndex : activeIndex, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction we're\n        // moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === horizontalEndKey ? 'tr' : 'tl')\n      })];\n      if (maybeNextIndex != null) {\n        nextIndex = maybeNextIndex;\n      }\n    }\n    const toEndKeys = {\n      horizontal: [horizontalEndKey],\n      vertical: [ARROW_DOWN],\n      both: [horizontalEndKey, ARROW_DOWN]\n    }[orientation];\n    const toStartKeys = {\n      horizontal: [horizontalStartKey],\n      vertical: [ARROW_UP],\n      both: [horizontalStartKey, ARROW_UP]\n    }[orientation];\n    const preventedKeys = isGrid ? allKeys : {\n      horizontal: horizontalKeys,\n      vertical: verticalKeys,\n      both: allKeys\n    }[orientation];\n    if (nextIndex === activeIndex && [...toEndKeys, ...toStartKeys].includes(event.key)) {\n      if (loop && nextIndex === maxIndex && toEndKeys.includes(event.key)) {\n        nextIndex = minIndex;\n      } else if (loop && nextIndex === minIndex && toStartKeys.includes(event.key)) {\n        nextIndex = maxIndex;\n      } else {\n        nextIndex = findNonDisabledListIndex(elementsRef, {\n          startingIndex: nextIndex,\n          decrement: toStartKeys.includes(event.key),\n          disabledIndices\n        });\n      }\n    }\n    if (nextIndex !== activeIndex && !isIndexOutOfListBounds(elementsRef, nextIndex)) {\n      var _elementsRef$current$;\n      event.stopPropagation();\n      if (preventedKeys.includes(event.key)) {\n        event.preventDefault();\n      }\n      onNavigate(nextIndex);\n      (_elementsRef$current$ = elementsRef.current[nextIndex]) == null || _elementsRef$current$.focus();\n    }\n  }\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: forwardedRef,\n    'aria-orientation': orientation === 'both' ? undefined : orientation,\n    onKeyDown(e) {\n      domProps.onKeyDown == null || domProps.onKeyDown(e);\n      renderElementProps.onKeyDown == null || renderElementProps.onKeyDown(e);\n      handleKeyDown(e);\n    }\n  };\n  return /*#__PURE__*/jsx(CompositeContext.Provider, {\n    value: contextValue,\n    children: /*#__PURE__*/jsx(FloatingList, {\n      elementsRef: elementsRef,\n      children: renderJsx(render, computedProps)\n    })\n  });\n});\n/**\n * @see https://floating-ui.com/docs/Composite\n */\nconst CompositeItem = /*#__PURE__*/React.forwardRef(function CompositeItem(props, forwardedRef) {\n  const {\n    render,\n    ...domProps\n  } = props;\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const {\n    activeIndex,\n    onNavigate\n  } = React.useContext(CompositeContext);\n  const {\n    ref,\n    index\n  } = useListItem();\n  const mergedRef = useMergeRefs([ref, forwardedRef, renderElementProps.ref]);\n  const isActive = activeIndex === index;\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: mergedRef,\n    tabIndex: isActive ? 0 : -1,\n    'data-active': isActive ? '' : undefined,\n    onFocus(e) {\n      domProps.onFocus == null || domProps.onFocus(e);\n      renderElementProps.onFocus == null || renderElementProps.onFocus(e);\n      onNavigate(index);\n    }\n  };\n  return renderJsx(render, computedProps);\n});\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n  ...React\n};\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => // Ensure the id is unique with multiple independent versions of Floating UI\n// on <React 18\n\"floating-ui-\" + Math.random().toString(36).slice(2, 6) + count++;\nfunction useFloatingId() {\n  const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n  useModernLayoutEffect(() => {\n    if (id == null) {\n      setId(genId());\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n  React.useEffect(() => {\n    serverHandoffComplete = true;\n  }, []);\n  return id;\n}\nconst useReactId = SafeReact.useId;\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/react-utils#useid\n */\nconst useId = useReactId || useFloatingId;\n\nlet devMessageSet;\nif (process.env.NODE_ENV !== \"production\") {\n  devMessageSet = /*#__PURE__*/new Set();\n}\nfunction warn() {\n  var _devMessageSet;\n  for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {\n    messages[_key] = arguments[_key];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet = devMessageSet) != null && _devMessageSet.has(message))) {\n    var _devMessageSet2;\n    (_devMessageSet2 = devMessageSet) == null || _devMessageSet2.add(message);\n    console.warn(message);\n  }\n}\nfunction error() {\n  var _devMessageSet3;\n  for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    messages[_key2] = arguments[_key2];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {\n    var _devMessageSet4;\n    (_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);\n    console.error(message);\n  }\n}\n\n/**\n * Renders a pointing arrow triangle.\n * @see https://floating-ui.com/docs/FloatingArrow\n */\nconst FloatingArrow = /*#__PURE__*/React.forwardRef(function FloatingArrow(props, ref) {\n  const {\n    context: {\n      placement,\n      elements: {\n        floating\n      },\n      middlewareData: {\n        arrow,\n        shift\n      }\n    },\n    width = 14,\n    height = 7,\n    tipRadius = 0,\n    strokeWidth = 0,\n    staticOffset,\n    stroke,\n    d,\n    style: {\n      transform,\n      ...restStyle\n    } = {},\n    ...rest\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!ref) {\n      warn('The `ref` prop is required for `FloatingArrow`.');\n    }\n  }\n  const clipPathId = useId();\n  const [isRTL, setIsRTL] = React.useState(false);\n\n  // https://github.com/floating-ui/floating-ui/issues/2932\n  useModernLayoutEffect(() => {\n    if (!floating) return;\n    const isRTL = getComputedStyle(floating).direction === 'rtl';\n    if (isRTL) {\n      setIsRTL(true);\n    }\n  }, [floating]);\n  if (!floating) {\n    return null;\n  }\n  const [side, alignment] = placement.split('-');\n  const isVerticalSide = side === 'top' || side === 'bottom';\n  let computedStaticOffset = staticOffset;\n  if (isVerticalSide && shift != null && shift.x || !isVerticalSide && shift != null && shift.y) {\n    computedStaticOffset = null;\n  }\n\n  // Strokes must be double the border width, this ensures the stroke's width\n  // works as you'd expect.\n  const computedStrokeWidth = strokeWidth * 2;\n  const halfStrokeWidth = computedStrokeWidth / 2;\n  const svgX = width / 2 * (tipRadius / -8 + 1);\n  const svgY = height / 2 * tipRadius / 4;\n  const isCustomShape = !!d;\n  const yOffsetProp = computedStaticOffset && alignment === 'end' ? 'bottom' : 'top';\n  let xOffsetProp = computedStaticOffset && alignment === 'end' ? 'right' : 'left';\n  if (computedStaticOffset && isRTL) {\n    xOffsetProp = alignment === 'end' ? 'left' : 'right';\n  }\n  const arrowX = (arrow == null ? void 0 : arrow.x) != null ? computedStaticOffset || arrow.x : '';\n  const arrowY = (arrow == null ? void 0 : arrow.y) != null ? computedStaticOffset || arrow.y : '';\n  const dValue = d || 'M0,0' + (\" H\" + width) + (\" L\" + (width - svgX) + \",\" + (height - svgY)) + (\" Q\" + width / 2 + \",\" + height + \" \" + svgX + \",\" + (height - svgY)) + ' Z';\n  const rotation = {\n    top: isCustomShape ? 'rotate(180deg)' : '',\n    left: isCustomShape ? 'rotate(90deg)' : 'rotate(-90deg)',\n    bottom: isCustomShape ? '' : 'rotate(180deg)',\n    right: isCustomShape ? 'rotate(-90deg)' : 'rotate(90deg)'\n  }[side];\n  return /*#__PURE__*/jsxs(\"svg\", {\n    ...rest,\n    \"aria-hidden\": true,\n    ref: ref,\n    width: isCustomShape ? width : width + computedStrokeWidth,\n    height: width,\n    viewBox: \"0 0 \" + width + \" \" + (height > width ? height : width),\n    style: {\n      position: 'absolute',\n      pointerEvents: 'none',\n      [xOffsetProp]: arrowX,\n      [yOffsetProp]: arrowY,\n      [side]: isVerticalSide || isCustomShape ? '100%' : \"calc(100% - \" + computedStrokeWidth / 2 + \"px)\",\n      transform: [rotation, transform].filter(t => !!t).join(' '),\n      ...restStyle\n    },\n    children: [computedStrokeWidth > 0 && /*#__PURE__*/jsx(\"path\", {\n      clipPath: \"url(#\" + clipPathId + \")\",\n      fill: \"none\",\n      stroke: stroke\n      // Account for the stroke on the fill path rendered below.\n      ,\n      strokeWidth: computedStrokeWidth + (d ? 0 : 1),\n      d: dValue\n    }), /*#__PURE__*/jsx(\"path\", {\n      stroke: computedStrokeWidth && !d ? rest.fill : 'none',\n      d: dValue\n    }), /*#__PURE__*/jsx(\"clipPath\", {\n      id: clipPathId,\n      children: /*#__PURE__*/jsx(\"rect\", {\n        x: -halfStrokeWidth,\n        y: halfStrokeWidth * (isCustomShape ? -1 : 1),\n        width: width + computedStrokeWidth,\n        height: width\n      })\n    })]\n  });\n});\n\nfunction createEventEmitter() {\n  const map = new Map();\n  return {\n    emit(event, data) {\n      var _map$get;\n      (_map$get = map.get(event)) == null || _map$get.forEach(listener => listener(data));\n    },\n    on(event, listener) {\n      if (!map.has(event)) {\n        map.set(event, new Set());\n      }\n      map.get(event).add(listener);\n    },\n    off(event, listener) {\n      var _map$get2;\n      (_map$get2 = map.get(event)) == null || _map$get2.delete(listener);\n    }\n  };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the parent node id for nested floating elements, if available.\n * Returns `null` for top-level floating elements.\n */\nconst useFloatingParentNodeId = () => {\n  var _React$useContext;\n  return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\n\n/**\n * Returns the nearest floating tree context, if available.\n */\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the `FloatingTree`, returning its id.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction useFloatingNodeId(customParentId) {\n  const id = useId();\n  const tree = useFloatingTree();\n  const reactParentId = useFloatingParentNodeId();\n  const parentId = customParentId || reactParentId;\n  useModernLayoutEffect(() => {\n    if (!id) return;\n    const node = {\n      id,\n      parentId\n    };\n    tree == null || tree.addNode(node);\n    return () => {\n      tree == null || tree.removeNode(node);\n    };\n  }, [tree, id, parentId]);\n  return id;\n}\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingNode(props) {\n  const {\n    children,\n    id\n  } = props;\n  const parentId = useFloatingParentNodeId();\n  return /*#__PURE__*/jsx(FloatingNodeContext.Provider, {\n    value: React.useMemo(() => ({\n      id,\n      parentId\n    }), [id, parentId]),\n    children: children\n  });\n}\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM.\n * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:\n * - The `bubbles` option in the `useDismiss()` Hook\n * - Nested virtual list navigation\n * - Nested floating elements that each open on hover\n * - Custom communication between parent and child floating elements\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingTree(props) {\n  const {\n    children\n  } = props;\n  const nodesRef = React.useRef([]);\n  const addNode = React.useCallback(node => {\n    nodesRef.current = [...nodesRef.current, node];\n  }, []);\n  const removeNode = React.useCallback(node => {\n    nodesRef.current = nodesRef.current.filter(n => n !== node);\n  }, []);\n  const [events] = React.useState(() => createEventEmitter());\n  return /*#__PURE__*/jsx(FloatingTreeContext.Provider, {\n    value: React.useMemo(() => ({\n      nodesRef,\n      addNode,\n      removeNode,\n      events\n    }), [addNode, removeNode, events]),\n    children: children\n  });\n}\n\nfunction createAttribute(name) {\n  return \"data-floating-ui-\" + name;\n}\n\nfunction clearTimeoutIfSet(timeoutRef) {\n  if (timeoutRef.current !== -1) {\n    clearTimeout(timeoutRef.current);\n    timeoutRef.current = -1;\n  }\n}\n\nconst safePolygonIdentifier = /*#__PURE__*/createAttribute('safe-polygon');\nfunction getDelay(value, prop, pointerType) {\n  if (pointerType && !isMouseLikePointerType(pointerType)) {\n    return 0;\n  }\n  if (typeof value === 'number') {\n    return value;\n  }\n  if (typeof value === 'function') {\n    const result = value();\n    if (typeof result === 'number') {\n      return result;\n    }\n    return result == null ? void 0 : result[prop];\n  }\n  return value == null ? void 0 : value[prop];\n}\nfunction getRestMs(value) {\n  if (typeof value === 'function') {\n    return value();\n  }\n  return value;\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nfunction useHover(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    events,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    delay = 0,\n    handleClose = null,\n    mouseOnly = false,\n    restMs = 0,\n    move = true\n  } = props;\n  const tree = useFloatingTree();\n  const parentId = useFloatingParentNodeId();\n  const handleCloseRef = useLatestRef(handleClose);\n  const delayRef = useLatestRef(delay);\n  const openRef = useLatestRef(open);\n  const restMsRef = useLatestRef(restMs);\n  const pointerTypeRef = React.useRef();\n  const timeoutRef = React.useRef(-1);\n  const handlerRef = React.useRef();\n  const restTimeoutRef = React.useRef(-1);\n  const blockMouseMoveRef = React.useRef(true);\n  const performedPointerEventsMutationRef = React.useRef(false);\n  const unbindMouseMoveRef = React.useRef(() => {});\n  const restTimeoutPendingRef = React.useRef(false);\n  const isHoverOpen = React.useCallback(() => {\n    var _dataRef$current$open;\n    const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n    return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n  }, [dataRef]);\n\n  // When closing before opening, clear the delay timeouts to cancel it\n  // from showing.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        open\n      } = _ref;\n      if (!open) {\n        clearTimeoutIfSet(timeoutRef);\n        clearTimeoutIfSet(restTimeoutRef);\n        blockMouseMoveRef.current = true;\n        restTimeoutPendingRef.current = false;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [enabled, events]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    if (!handleCloseRef.current) return;\n    if (!open) return;\n    function onLeave(event) {\n      if (isHoverOpen()) {\n        onOpenChange(false, event, 'hover');\n      }\n    }\n    const html = getDocument$1(elements.floating).documentElement;\n    html.addEventListener('mouseleave', onLeave);\n    return () => {\n      html.removeEventListener('mouseleave', onLeave);\n    };\n  }, [elements.floating, open, onOpenChange, enabled, handleCloseRef, isHoverOpen]);\n  const closeWithDelay = React.useCallback(function (event, runElseBranch, reason) {\n    if (runElseBranch === void 0) {\n      runElseBranch = true;\n    }\n    if (reason === void 0) {\n      reason = 'hover';\n    }\n    const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n    if (closeDelay && !handlerRef.current) {\n      clearTimeoutIfSet(timeoutRef);\n      timeoutRef.current = window.setTimeout(() => onOpenChange(false, event, reason), closeDelay);\n    } else if (runElseBranch) {\n      clearTimeoutIfSet(timeoutRef);\n      onOpenChange(false, event, reason);\n    }\n  }, [delayRef, onOpenChange]);\n  const cleanupMouseMoveHandler = useEffectEvent(() => {\n    unbindMouseMoveRef.current();\n    handlerRef.current = undefined;\n  });\n  const clearPointerEvents = useEffectEvent(() => {\n    if (performedPointerEventsMutationRef.current) {\n      const body = getDocument$1(elements.floating).body;\n      body.style.pointerEvents = '';\n      body.removeAttribute(safePolygonIdentifier);\n      performedPointerEventsMutationRef.current = false;\n    }\n  });\n  const isClickLikeOpenEvent = useEffectEvent(() => {\n    return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n  });\n\n  // Registering the mouse events on the reference directly to bypass React's\n  // delegation system. If the cursor was on a disabled element and then entered\n  // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onReferenceMouseEnter(event) {\n      clearTimeoutIfSet(timeoutRef);\n      blockMouseMoveRef.current = false;\n      if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || getRestMs(restMsRef.current) > 0 && !getDelay(delayRef.current, 'open')) {\n        return;\n      }\n      const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n      if (openDelay) {\n        timeoutRef.current = window.setTimeout(() => {\n          if (!openRef.current) {\n            onOpenChange(true, event, 'hover');\n          }\n        }, openDelay);\n      } else if (!open) {\n        onOpenChange(true, event, 'hover');\n      }\n    }\n    function onReferenceMouseLeave(event) {\n      if (isClickLikeOpenEvent()) {\n        clearPointerEvents();\n        return;\n      }\n      unbindMouseMoveRef.current();\n      const doc = getDocument$1(elements.floating);\n      clearTimeoutIfSet(restTimeoutRef);\n      restTimeoutPendingRef.current = false;\n      if (handleCloseRef.current && dataRef.current.floatingContext) {\n        // Prevent clearing `onScrollMouseLeave` timeout.\n        if (!open) {\n          clearTimeoutIfSet(timeoutRef);\n        }\n        handlerRef.current = handleCloseRef.current({\n          ...dataRef.current.floatingContext,\n          tree,\n          x: event.clientX,\n          y: event.clientY,\n          onClose() {\n            clearPointerEvents();\n            cleanupMouseMoveHandler();\n            if (!isClickLikeOpenEvent()) {\n              closeWithDelay(event, true, 'safe-polygon');\n            }\n          }\n        });\n        const handler = handlerRef.current;\n        doc.addEventListener('mousemove', handler);\n        unbindMouseMoveRef.current = () => {\n          doc.removeEventListener('mousemove', handler);\n        };\n        return;\n      }\n\n      // Allow interactivity without `safePolygon` on touch devices. With a\n      // pointer, a short close delay is an alternative, so it should work\n      // consistently.\n      const shouldClose = pointerTypeRef.current === 'touch' ? !contains$1(elements.floating, event.relatedTarget) : true;\n      if (shouldClose) {\n        closeWithDelay(event);\n      }\n    }\n\n    // Ensure the floating element closes after scrolling even if the pointer\n    // did not move.\n    // https://github.com/floating-ui/floating-ui/discussions/1692\n    function onScrollMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      if (!dataRef.current.floatingContext) return;\n      handleCloseRef.current == null || handleCloseRef.current({\n        ...dataRef.current.floatingContext,\n        tree,\n        x: event.clientX,\n        y: event.clientY,\n        onClose() {\n          clearPointerEvents();\n          cleanupMouseMoveHandler();\n          if (!isClickLikeOpenEvent()) {\n            closeWithDelay(event);\n          }\n        }\n      })(event);\n    }\n    function onFloatingMouseEnter() {\n      clearTimeoutIfSet(timeoutRef);\n    }\n    function onFloatingMouseLeave(event) {\n      if (!isClickLikeOpenEvent()) {\n        closeWithDelay(event, false);\n      }\n    }\n    if (isElement(elements.domReference)) {\n      const reference = elements.domReference;\n      const floating = elements.floating;\n      if (open) {\n        reference.addEventListener('mouseleave', onScrollMouseLeave);\n      }\n      if (move) {\n        reference.addEventListener('mousemove', onReferenceMouseEnter, {\n          once: true\n        });\n      }\n      reference.addEventListener('mouseenter', onReferenceMouseEnter);\n      reference.addEventListener('mouseleave', onReferenceMouseLeave);\n      if (floating) {\n        floating.addEventListener('mouseleave', onScrollMouseLeave);\n        floating.addEventListener('mouseenter', onFloatingMouseEnter);\n        floating.addEventListener('mouseleave', onFloatingMouseLeave);\n      }\n      return () => {\n        if (open) {\n          reference.removeEventListener('mouseleave', onScrollMouseLeave);\n        }\n        if (move) {\n          reference.removeEventListener('mousemove', onReferenceMouseEnter);\n        }\n        reference.removeEventListener('mouseenter', onReferenceMouseEnter);\n        reference.removeEventListener('mouseleave', onReferenceMouseLeave);\n        if (floating) {\n          floating.removeEventListener('mouseleave', onScrollMouseLeave);\n          floating.removeEventListener('mouseenter', onFloatingMouseEnter);\n          floating.removeEventListener('mouseleave', onFloatingMouseLeave);\n        }\n      };\n    }\n  }, [elements, enabled, context, mouseOnly, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, openRef, tree, delayRef, handleCloseRef, dataRef, isClickLikeOpenEvent, restMsRef]);\n\n  // Block pointer-events of every element other than the reference and floating\n  // while the floating element is open and has a `handleClose` handler. Also\n  // handles nested floating elements.\n  // https://github.com/floating-ui/floating-ui/issues/1722\n  useModernLayoutEffect(() => {\n    var _handleCloseRef$curre;\n    if (!enabled) return;\n    if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && _handleCloseRef$curre.__options.blockPointerEvents && isHoverOpen()) {\n      performedPointerEventsMutationRef.current = true;\n      const floatingEl = elements.floating;\n      if (isElement(elements.domReference) && floatingEl) {\n        var _tree$nodesRef$curren;\n        const body = getDocument$1(elements.floating).body;\n        body.setAttribute(safePolygonIdentifier, '');\n        const ref = elements.domReference;\n        const parentFloating = tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren.elements.floating;\n        if (parentFloating) {\n          parentFloating.style.pointerEvents = '';\n        }\n        body.style.pointerEvents = 'none';\n        ref.style.pointerEvents = 'auto';\n        floatingEl.style.pointerEvents = 'auto';\n        return () => {\n          body.style.pointerEvents = '';\n          ref.style.pointerEvents = '';\n          floatingEl.style.pointerEvents = '';\n        };\n      }\n    }\n  }, [enabled, open, parentId, elements, tree, handleCloseRef, isHoverOpen]);\n  useModernLayoutEffect(() => {\n    if (!open) {\n      pointerTypeRef.current = undefined;\n      restTimeoutPendingRef.current = false;\n      cleanupMouseMoveHandler();\n      clearPointerEvents();\n    }\n  }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n  React.useEffect(() => {\n    return () => {\n      cleanupMouseMoveHandler();\n      clearTimeoutIfSet(timeoutRef);\n      clearTimeoutIfSet(restTimeoutRef);\n      clearPointerEvents();\n    };\n  }, [enabled, elements.domReference, cleanupMouseMoveHandler, clearPointerEvents]);\n  const reference = React.useMemo(() => {\n    function setPointerRef(event) {\n      pointerTypeRef.current = event.pointerType;\n    }\n    return {\n      onPointerDown: setPointerRef,\n      onPointerEnter: setPointerRef,\n      onMouseMove(event) {\n        const {\n          nativeEvent\n        } = event;\n        function handleMouseMove() {\n          if (!blockMouseMoveRef.current && !openRef.current) {\n            onOpenChange(true, nativeEvent, 'hover');\n          }\n        }\n        if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {\n          return;\n        }\n        if (open || getRestMs(restMsRef.current) === 0) {\n          return;\n        }\n\n        // Ignore insignificant movements to account for tremors.\n        if (restTimeoutPendingRef.current && event.movementX ** 2 + event.movementY ** 2 < 2) {\n          return;\n        }\n        clearTimeoutIfSet(restTimeoutRef);\n        if (pointerTypeRef.current === 'touch') {\n          handleMouseMove();\n        } else {\n          restTimeoutPendingRef.current = true;\n          restTimeoutRef.current = window.setTimeout(handleMouseMove, getRestMs(restMsRef.current));\n        }\n      }\n    };\n  }, [mouseOnly, onOpenChange, open, openRef, restMsRef]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst NOOP = () => {};\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n  delay: 0,\n  initialDelay: 0,\n  timeoutMs: 0,\n  currentId: null,\n  setCurrentId: NOOP,\n  setState: NOOP,\n  isInstantPhase: false\n});\n\n/**\n * @deprecated\n * Use the return value of `useDelayGroup()` instead.\n */\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction FloatingDelayGroup(props) {\n  const {\n    children,\n    delay,\n    timeoutMs = 0\n  } = props;\n  const [state, setState] = React.useReducer((prev, next) => ({\n    ...prev,\n    ...next\n  }), {\n    delay,\n    timeoutMs,\n    initialDelay: delay,\n    currentId: null,\n    isInstantPhase: false\n  });\n  const initialCurrentIdRef = React.useRef(null);\n  const setCurrentId = React.useCallback(currentId => {\n    setState({\n      currentId\n    });\n  }, []);\n  useModernLayoutEffect(() => {\n    if (state.currentId) {\n      if (initialCurrentIdRef.current === null) {\n        initialCurrentIdRef.current = state.currentId;\n      } else if (!state.isInstantPhase) {\n        setState({\n          isInstantPhase: true\n        });\n      }\n    } else {\n      if (state.isInstantPhase) {\n        setState({\n          isInstantPhase: false\n        });\n      }\n      initialCurrentIdRef.current = null;\n    }\n  }, [state.currentId, state.isInstantPhase]);\n  return /*#__PURE__*/jsx(FloatingDelayGroupContext.Provider, {\n    value: React.useMemo(() => ({\n      ...state,\n      setState,\n      setCurrentId\n    }), [state, setCurrentId]),\n    children: children\n  });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `FloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useDelayGroup(context, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    floatingId\n  } = context;\n  const {\n    id: optionId,\n    enabled = true\n  } = options;\n  const id = optionId != null ? optionId : floatingId;\n  const groupContext = useDelayGroupContext();\n  const {\n    currentId,\n    setCurrentId,\n    initialDelay,\n    setState,\n    timeoutMs\n  } = groupContext;\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!currentId) return;\n    setState({\n      delay: {\n        open: 1,\n        close: getDelay(initialDelay, 'close')\n      }\n    });\n    if (currentId !== id) {\n      onOpenChange(false);\n    }\n  }, [enabled, id, onOpenChange, setState, currentId, initialDelay]);\n  useModernLayoutEffect(() => {\n    function unset() {\n      onOpenChange(false);\n      setState({\n        delay: initialDelay,\n        currentId: null\n      });\n    }\n    if (!enabled) return;\n    if (!currentId) return;\n    if (!open && currentId === id) {\n      if (timeoutMs) {\n        const timeout = window.setTimeout(unset, timeoutMs);\n        return () => {\n          clearTimeout(timeout);\n        };\n      }\n      unset();\n    }\n  }, [enabled, open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (setCurrentId === NOOP || !open) return;\n    setCurrentId(id);\n  }, [enabled, open, setCurrentId, id]);\n  return groupContext;\n}\n\nconst NextFloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n  hasProvider: false,\n  timeoutMs: 0,\n  delayRef: {\n    current: 0\n  },\n  initialDelayRef: {\n    current: 0\n  },\n  timeoutIdRef: {\n    current: -1\n  },\n  currentIdRef: {\n    current: null\n  },\n  currentContextRef: {\n    current: null\n  }\n});\n/**\n * Experimental next version of `FloatingDelayGroup` to become the default\n * in the future. This component is not yet stable.\n * Provides context for a group of floating elements that should share a\n * `delay`. Unlike `FloatingDelayGroup`, `useNextDelayGroup` with this\n * component does not cause a re-render of unrelated consumers of the\n * context when the delay changes.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction NextFloatingDelayGroup(props) {\n  const {\n    children,\n    delay,\n    timeoutMs = 0\n  } = props;\n  const delayRef = React.useRef(delay);\n  const initialDelayRef = React.useRef(delay);\n  const currentIdRef = React.useRef(null);\n  const currentContextRef = React.useRef(null);\n  const timeoutIdRef = React.useRef(-1);\n  return /*#__PURE__*/jsx(NextFloatingDelayGroupContext.Provider, {\n    value: React.useMemo(() => ({\n      hasProvider: true,\n      delayRef,\n      initialDelayRef,\n      currentIdRef,\n      timeoutMs,\n      currentContextRef,\n      timeoutIdRef\n    }), [timeoutMs]),\n    children: children\n  });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `NextFloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useNextDelayGroup(context, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    floatingId\n  } = context;\n  const {\n    enabled = true\n  } = options;\n  const groupContext = React.useContext(NextFloatingDelayGroupContext);\n  const {\n    currentIdRef,\n    delayRef,\n    timeoutMs,\n    initialDelayRef,\n    currentContextRef,\n    hasProvider,\n    timeoutIdRef\n  } = groupContext;\n  const [isInstantPhase, setIsInstantPhase] = React.useState(false);\n  useModernLayoutEffect(() => {\n    function unset() {\n      var _currentContextRef$cu;\n      setIsInstantPhase(false);\n      (_currentContextRef$cu = currentContextRef.current) == null || _currentContextRef$cu.setIsInstantPhase(false);\n      currentIdRef.current = null;\n      currentContextRef.current = null;\n      delayRef.current = initialDelayRef.current;\n    }\n    if (!enabled) return;\n    if (!currentIdRef.current) return;\n    if (!open && currentIdRef.current === floatingId) {\n      setIsInstantPhase(false);\n      if (timeoutMs) {\n        timeoutIdRef.current = window.setTimeout(unset, timeoutMs);\n        return () => {\n          clearTimeout(timeoutIdRef.current);\n        };\n      }\n      unset();\n    }\n  }, [enabled, open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!open) return;\n    const prevContext = currentContextRef.current;\n    const prevId = currentIdRef.current;\n    currentContextRef.current = {\n      onOpenChange,\n      setIsInstantPhase\n    };\n    currentIdRef.current = floatingId;\n    delayRef.current = {\n      open: 0,\n      close: getDelay(initialDelayRef.current, 'close')\n    };\n    if (prevId !== null && prevId !== floatingId) {\n      clearTimeoutIfSet(timeoutIdRef);\n      setIsInstantPhase(true);\n      prevContext == null || prevContext.setIsInstantPhase(true);\n      prevContext == null || prevContext.onOpenChange(false);\n    } else {\n      setIsInstantPhase(false);\n      prevContext == null || prevContext.setIsInstantPhase(false);\n    }\n  }, [enabled, open, floatingId, onOpenChange, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n  useModernLayoutEffect(() => {\n    return () => {\n      currentContextRef.current = null;\n    };\n  }, [currentContextRef]);\n  return React.useMemo(() => ({\n    hasProvider,\n    delayRef,\n    isInstantPhase\n  }), [hasProvider, delayRef, isInstantPhase]);\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    preventScroll = false,\n    cancelPrevious = true,\n    sync = false\n  } = options;\n  cancelPrevious && cancelAnimationFrame(rafId);\n  const exec = () => el == null ? void 0 : el.focus({\n    preventScroll\n  });\n  if (sync) {\n    exec();\n  } else {\n    rafId = requestAnimationFrame(exec);\n  }\n}\n\nfunction contains(parent, child) {\n  if (!parent || !child) {\n    return false;\n  }\n  const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n  // First, attempt with faster native method\n  if (parent.contains(child)) {\n    return true;\n  }\n\n  // then fallback to custom implementation with Shadow DOM support\n  if (rootNode && isShadowRoot(rootNode)) {\n    let next = child;\n    while (next) {\n      if (parent === next) {\n        return true;\n      }\n      // @ts-ignore\n      next = next.parentNode || next.host;\n    }\n  }\n\n  // Give up, the result is false\n  return false;\n}\nfunction getTarget(event) {\n  if ('composedPath' in event) {\n    return event.composedPath()[0];\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support\n  // `composedPath()`, but browsers without shadow DOM don't.\n  return event.target;\n}\nfunction getDocument(node) {\n  return (node == null ? void 0 : node.ownerDocument) || document;\n}\n\n// Modified to add conditional `aria-hidden` support:\n// https://github.com/theKashey/aria-hidden/blob/9220c8f4a4fd35f63bee5510a9f41a37264382d4/src/index.ts\nlet counterMap = /*#__PURE__*/new WeakMap();\nlet uncontrolledElementsSet = /*#__PURE__*/new WeakSet();\nlet markerMap = {};\nlet lockCount$1 = 0;\nconst supportsInert = () => typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\nconst unwrapHost = node => node && (node.host || unwrapHost(node.parentNode));\nconst correctElements = (parent, targets) => targets.map(target => {\n  if (parent.contains(target)) {\n    return target;\n  }\n  const correctedTarget = unwrapHost(target);\n  if (parent.contains(correctedTarget)) {\n    return correctedTarget;\n  }\n  return null;\n}).filter(x => x != null);\nfunction applyAttributeToOthers(uncorrectedAvoidElements, body, ariaHidden, inert) {\n  const markerName = 'data-floating-ui-inert';\n  const controlAttribute = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n  const avoidElements = correctElements(body, uncorrectedAvoidElements);\n  const elementsToKeep = new Set();\n  const elementsToStop = new Set(avoidElements);\n  const hiddenElements = [];\n  if (!markerMap[markerName]) {\n    markerMap[markerName] = new WeakMap();\n  }\n  const markerCounter = markerMap[markerName];\n  avoidElements.forEach(keep);\n  deep(body);\n  elementsToKeep.clear();\n  function keep(el) {\n    if (!el || elementsToKeep.has(el)) {\n      return;\n    }\n    elementsToKeep.add(el);\n    el.parentNode && keep(el.parentNode);\n  }\n  function deep(parent) {\n    if (!parent || elementsToStop.has(parent)) {\n      return;\n    }\n    [].forEach.call(parent.children, node => {\n      if (getNodeName(node) === 'script') return;\n      if (elementsToKeep.has(node)) {\n        deep(node);\n      } else {\n        const attr = controlAttribute ? node.getAttribute(controlAttribute) : null;\n        const alreadyHidden = attr !== null && attr !== 'false';\n        const currentCounterValue = counterMap.get(node) || 0;\n        const counterValue = controlAttribute ? currentCounterValue + 1 : currentCounterValue;\n        const markerValue = (markerCounter.get(node) || 0) + 1;\n        counterMap.set(node, counterValue);\n        markerCounter.set(node, markerValue);\n        hiddenElements.push(node);\n        if (counterValue === 1 && alreadyHidden) {\n          uncontrolledElementsSet.add(node);\n        }\n        if (markerValue === 1) {\n          node.setAttribute(markerName, '');\n        }\n        if (!alreadyHidden && controlAttribute) {\n          node.setAttribute(controlAttribute, controlAttribute === 'inert' ? '' : 'true');\n        }\n      }\n    });\n  }\n  lockCount$1++;\n  return () => {\n    hiddenElements.forEach(element => {\n      const currentCounterValue = counterMap.get(element) || 0;\n      const counterValue = controlAttribute ? currentCounterValue - 1 : currentCounterValue;\n      const markerValue = (markerCounter.get(element) || 0) - 1;\n      counterMap.set(element, counterValue);\n      markerCounter.set(element, markerValue);\n      if (!counterValue) {\n        if (!uncontrolledElementsSet.has(element) && controlAttribute) {\n          element.removeAttribute(controlAttribute);\n        }\n        uncontrolledElementsSet.delete(element);\n      }\n      if (!markerValue) {\n        element.removeAttribute(markerName);\n      }\n    });\n    lockCount$1--;\n    if (!lockCount$1) {\n      counterMap = new WeakMap();\n      counterMap = new WeakMap();\n      uncontrolledElementsSet = new WeakSet();\n      markerMap = {};\n    }\n  };\n}\nfunction markOthers(avoidElements, ariaHidden, inert) {\n  if (ariaHidden === void 0) {\n    ariaHidden = false;\n  }\n  if (inert === void 0) {\n    inert = false;\n  }\n  const body = getDocument(avoidElements[0]).body;\n  return applyAttributeToOthers(avoidElements.concat(Array.from(body.querySelectorAll('[aria-live]'))), body, ariaHidden, inert);\n}\n\nconst HIDDEN_STYLES = {\n  border: 0,\n  clip: 'rect(0 0 0 0)',\n  height: '1px',\n  margin: '-1px',\n  overflow: 'hidden',\n  padding: 0,\n  position: 'fixed',\n  whiteSpace: 'nowrap',\n  width: '1px',\n  top: 0,\n  left: 0\n};\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n  const [role, setRole] = React.useState();\n  useModernLayoutEffect(() => {\n    if (isSafari()) {\n      // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n      // on VoiceOver does trigger the onFocus event, so we can use the focus\n      // trap element. On Safari, only buttons trigger the onFocus event.\n      // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n      // button role.\n      setRole('button');\n    }\n  }, []);\n  const restProps = {\n    ref,\n    tabIndex: 0,\n    // Role is only for VoiceOver\n    role,\n    'aria-hidden': role ? undefined : true,\n    [createAttribute('focus-guard')]: '',\n    style: HIDDEN_STYLES\n  };\n  return /*#__PURE__*/jsx(\"span\", {\n    ...props,\n    ...restProps\n  });\n});\n\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst attr = /*#__PURE__*/createAttribute('portal');\n/**\n * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode\n */\nfunction useFloatingPortalNode(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    id,\n    root\n  } = props;\n  const uniqueId = useId();\n  const portalContext = usePortalContext();\n  const [portalNode, setPortalNode] = React.useState(null);\n  const portalNodeRef = React.useRef(null);\n  useModernLayoutEffect(() => {\n    return () => {\n      portalNode == null || portalNode.remove();\n      // Allow the subsequent layout effects to create a new node on updates.\n      // The portal node will still be cleaned up on unmount.\n      // https://github.com/floating-ui/floating-ui/issues/2454\n      queueMicrotask(() => {\n        portalNodeRef.current = null;\n      });\n    };\n  }, [portalNode]);\n  useModernLayoutEffect(() => {\n    // Wait for the uniqueId to be generated before creating the portal node in\n    // React <18 (using `useFloatingId` instead of the native `useId`).\n    // https://github.com/floating-ui/floating-ui/issues/2778\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    const existingIdRoot = id ? document.getElementById(id) : null;\n    if (!existingIdRoot) return;\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    existingIdRoot.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, uniqueId]);\n  useModernLayoutEffect(() => {\n    // Wait for the root to exist before creating the portal node. The root must\n    // be stored in state, not a ref, for this to work reactively.\n    if (root === null) return;\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    let container = root || (portalContext == null ? void 0 : portalContext.portalNode);\n    if (container && !isElement(container)) container = container.current;\n    container = container || document.body;\n    let idWrapper = null;\n    if (id) {\n      idWrapper = document.createElement('div');\n      idWrapper.id = id;\n      container.appendChild(idWrapper);\n    }\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    container = idWrapper || container;\n    container.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, root, uniqueId, portalContext]);\n  return portalNode;\n}\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * This is necessary to ensure the floating element can appear outside any\n * potential parent containers that cause clipping (such as `overflow: hidden`),\n * while retaining its location in the React tree.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nfunction FloatingPortal(props) {\n  const {\n    children,\n    id,\n    root,\n    preserveTabOrder = true\n  } = props;\n  const portalNode = useFloatingPortalNode({\n    id,\n    root\n  });\n  const [focusManagerState, setFocusManagerState] = React.useState(null);\n  const beforeOutsideRef = React.useRef(null);\n  const afterOutsideRef = React.useRef(null);\n  const beforeInsideRef = React.useRef(null);\n  const afterInsideRef = React.useRef(null);\n  const modal = focusManagerState == null ? void 0 : focusManagerState.modal;\n  const open = focusManagerState == null ? void 0 : focusManagerState.open;\n  const shouldRenderGuards =\n  // The FocusManager and therefore floating element are currently open/\n  // rendered.\n  !!focusManagerState &&\n  // Guards are only for non-modal focus management.\n  !focusManagerState.modal &&\n  // Don't render if unmount is transitioning.\n  focusManagerState.open && preserveTabOrder && !!(root || portalNode);\n\n  // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n  React.useEffect(() => {\n    if (!portalNode || !preserveTabOrder || modal) {\n      return;\n    }\n\n    // Make sure elements inside the portal element are tabbable only when the\n    // portal has already been focused, either by tabbing into a focus trap\n    // element outside or using the mouse.\n    function onFocus(event) {\n      if (portalNode && isOutsideEvent(event)) {\n        const focusing = event.type === 'focusin';\n        const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n        manageFocus(portalNode);\n      }\n    }\n    // Listen to the event on the capture phase so they run before the focus\n    // trap elements onFocus prop is called.\n    portalNode.addEventListener('focusin', onFocus, true);\n    portalNode.addEventListener('focusout', onFocus, true);\n    return () => {\n      portalNode.removeEventListener('focusin', onFocus, true);\n      portalNode.removeEventListener('focusout', onFocus, true);\n    };\n  }, [portalNode, preserveTabOrder, modal]);\n  React.useEffect(() => {\n    if (!portalNode) return;\n    if (open) return;\n    enableFocusInside(portalNode);\n  }, [open, portalNode]);\n  return /*#__PURE__*/jsxs(PortalContext.Provider, {\n    value: React.useMemo(() => ({\n      preserveTabOrder,\n      beforeOutsideRef,\n      afterOutsideRef,\n      beforeInsideRef,\n      afterInsideRef,\n      portalNode,\n      setFocusManagerState\n    }), [preserveTabOrder, portalNode]),\n    children: [shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"outside\",\n      ref: beforeOutsideRef,\n      onFocus: event => {\n        if (isOutsideEvent(event, portalNode)) {\n          var _beforeInsideRef$curr;\n          (_beforeInsideRef$curr = beforeInsideRef.current) == null || _beforeInsideRef$curr.focus();\n        } else {\n          const domReference = focusManagerState ? focusManagerState.domReference : null;\n          const prevTabbable = getPreviousTabbable(domReference);\n          prevTabbable == null || prevTabbable.focus();\n        }\n      }\n    }), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(\"span\", {\n      \"aria-owns\": portalNode.id,\n      style: HIDDEN_STYLES\n    }), portalNode && /*#__PURE__*/ReactDOM.createPortal(children, portalNode), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"outside\",\n      ref: afterOutsideRef,\n      onFocus: event => {\n        if (isOutsideEvent(event, portalNode)) {\n          var _afterInsideRef$curre;\n          (_afterInsideRef$curre = afterInsideRef.current) == null || _afterInsideRef$curre.focus();\n        } else {\n          const domReference = focusManagerState ? focusManagerState.domReference : null;\n          const nextTabbable = getNextTabbable(domReference);\n          nextTabbable == null || nextTabbable.focus();\n          (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, event.nativeEvent, 'focus-out'));\n        }\n      }\n    })]\n  });\n}\nconst usePortalContext = () => React.useContext(PortalContext);\n\nfunction useLiteMergeRefs(refs) {\n  return React.useMemo(() => {\n    return value => {\n      refs.forEach(ref => {\n        if (ref) {\n          ref.current = value;\n        }\n      });\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n}\n\nconst LIST_LIMIT = 20;\nlet previouslyFocusedElements = [];\nfunction addPreviouslyFocusedElement(element) {\n  previouslyFocusedElements = previouslyFocusedElements.filter(el => el.isConnected);\n  if (element && getNodeName(element) !== 'body') {\n    previouslyFocusedElements.push(element);\n    if (previouslyFocusedElements.length > LIST_LIMIT) {\n      previouslyFocusedElements = previouslyFocusedElements.slice(-20);\n    }\n  }\n}\nfunction getPreviouslyFocusedElement() {\n  return previouslyFocusedElements.slice().reverse().find(el => el.isConnected);\n}\nfunction getFirstTabbableElement(container) {\n  const tabbableOptions = getTabbableOptions();\n  if (isTabbable(container, tabbableOptions)) {\n    return container;\n  }\n  return tabbable(container, tabbableOptions)[0] || container;\n}\nfunction handleTabIndex(floatingFocusElement, orderRef) {\n  var _floatingFocusElement;\n  if (!orderRef.current.includes('floating') && !((_floatingFocusElement = floatingFocusElement.getAttribute('role')) != null && _floatingFocusElement.includes('dialog'))) {\n    return;\n  }\n  const options = getTabbableOptions();\n  const focusableElements = focusable(floatingFocusElement, options);\n  const tabbableContent = focusableElements.filter(element => {\n    const dataTabIndex = element.getAttribute('data-tabindex') || '';\n    return isTabbable(element, options) || element.hasAttribute('data-tabindex') && !dataTabIndex.startsWith('-');\n  });\n  const tabIndex = floatingFocusElement.getAttribute('tabindex');\n  if (orderRef.current.includes('floating') || tabbableContent.length === 0) {\n    if (tabIndex !== '0') {\n      floatingFocusElement.setAttribute('tabindex', '0');\n    }\n  } else if (tabIndex !== '-1' || floatingFocusElement.hasAttribute('data-tabindex') && floatingFocusElement.getAttribute('data-tabindex') !== '-1') {\n    floatingFocusElement.setAttribute('tabindex', '-1');\n    floatingFocusElement.setAttribute('data-tabindex', '-1');\n  }\n}\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n  return /*#__PURE__*/jsx(\"button\", {\n    ...props,\n    type: \"button\",\n    ref: ref,\n    tabIndex: -1,\n    style: HIDDEN_STYLES\n  });\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(props) {\n  const {\n    context,\n    children,\n    disabled = false,\n    order = ['content'],\n    guards: _guards = true,\n    initialFocus = 0,\n    returnFocus = true,\n    restoreFocus = false,\n    modal = true,\n    visuallyHiddenDismiss = false,\n    closeOnFocusOut = true,\n    outsideElementsInert = false,\n    getInsideElements: _getInsideElements = () => []\n  } = props;\n  const {\n    open,\n    onOpenChange,\n    events,\n    dataRef,\n    elements: {\n      domReference,\n      floating\n    }\n  } = context;\n  const getNodeId = useEffectEvent(() => {\n    var _dataRef$current$floa;\n    return (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n  });\n  const getInsideElements = useEffectEvent(_getInsideElements);\n  const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n  // If the reference is a combobox and is typeable (e.g. input/textarea),\n  // there are different focus semantics. The guards should not be rendered, but\n  // aria-hidden should be applied to all nodes still. Further, the visually\n  // hidden dismiss button should only appear at the end of the list, not the\n  // start.\n  const isUntrappedTypeableCombobox = isTypeableCombobox(domReference) && ignoreInitialFocus;\n\n  // Force the guards to be rendered if the `inert` attribute is not supported.\n  const inertSupported = supportsInert();\n  const guards = inertSupported ? _guards : true;\n  const useInert = !guards || inertSupported && outsideElementsInert;\n  const orderRef = useLatestRef(order);\n  const initialFocusRef = useLatestRef(initialFocus);\n  const returnFocusRef = useLatestRef(returnFocus);\n  const tree = useFloatingTree();\n  const portalContext = usePortalContext();\n  const startDismissButtonRef = React.useRef(null);\n  const endDismissButtonRef = React.useRef(null);\n  const preventReturnFocusRef = React.useRef(false);\n  const isPointerDownRef = React.useRef(false);\n  const tabbableIndexRef = React.useRef(-1);\n  const isInsidePortal = portalContext != null;\n  const floatingFocusElement = getFloatingFocusElement(floating);\n  const getTabbableContent = useEffectEvent(function (container) {\n    if (container === void 0) {\n      container = floatingFocusElement;\n    }\n    return container ? tabbable(container, getTabbableOptions()) : [];\n  });\n  const getTabbableElements = useEffectEvent(container => {\n    const content = getTabbableContent(container);\n    return orderRef.current.map(type => {\n      if (domReference && type === 'reference') {\n        return domReference;\n      }\n      if (floatingFocusElement && type === 'floating') {\n        return floatingFocusElement;\n      }\n      return content;\n    }).filter(Boolean).flat();\n  });\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!modal) return;\n    function onKeyDown(event) {\n      if (event.key === 'Tab') {\n        // The focus guards have nothing to focus, so we need to stop the event.\n        if (contains$1(floatingFocusElement, activeElement(getDocument$1(floatingFocusElement))) && getTabbableContent().length === 0 && !isUntrappedTypeableCombobox) {\n          stopEvent(event);\n        }\n        const els = getTabbableElements();\n        const target = getTarget$1(event);\n        if (orderRef.current[0] === 'reference' && target === domReference) {\n          stopEvent(event);\n          if (event.shiftKey) {\n            enqueueFocus(els[els.length - 1]);\n          } else {\n            enqueueFocus(els[1]);\n          }\n        }\n        if (orderRef.current[1] === 'floating' && target === floatingFocusElement && event.shiftKey) {\n          stopEvent(event);\n          enqueueFocus(els[0]);\n        }\n      }\n    }\n    const doc = getDocument$1(floatingFocusElement);\n    doc.addEventListener('keydown', onKeyDown);\n    return () => {\n      doc.removeEventListener('keydown', onKeyDown);\n    };\n  }, [disabled, domReference, floatingFocusElement, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent, getTabbableElements]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!floating) return;\n    function handleFocusIn(event) {\n      const target = getTarget$1(event);\n      const tabbableContent = getTabbableContent();\n      const tabbableIndex = tabbableContent.indexOf(target);\n      if (tabbableIndex !== -1) {\n        tabbableIndexRef.current = tabbableIndex;\n      }\n    }\n    floating.addEventListener('focusin', handleFocusIn);\n    return () => {\n      floating.removeEventListener('focusin', handleFocusIn);\n    };\n  }, [disabled, floating, getTabbableContent]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!closeOnFocusOut) return;\n\n    // In Safari, buttons lose focus when pressing them.\n    function handlePointerDown() {\n      isPointerDownRef.current = true;\n      setTimeout(() => {\n        isPointerDownRef.current = false;\n      });\n    }\n    function handleFocusOutside(event) {\n      const relatedTarget = event.relatedTarget;\n      const currentTarget = event.currentTarget;\n      queueMicrotask(() => {\n        const nodeId = getNodeId();\n        const movedToUnrelatedNode = !(contains$1(domReference, relatedTarget) || contains$1(floating, relatedTarget) || contains$1(relatedTarget, floating) || contains$1(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute(createAttribute('focus-guard')) || tree && (getNodeChildren$1(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context, _node$context2;\n          return contains$1((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains$1((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n        }) || getNodeAncestors(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context3, _node$context4, _node$context5;\n          return [(_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating, getFloatingFocusElement((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.floating)].includes(relatedTarget) || ((_node$context5 = node.context) == null ? void 0 : _node$context5.elements.domReference) === relatedTarget;\n        })));\n        if (currentTarget === domReference && floatingFocusElement) {\n          handleTabIndex(floatingFocusElement, orderRef);\n        }\n\n        // Restore focus to the previous tabbable element index to prevent\n        // focus from being lost outside the floating tree.\n        if (restoreFocus && movedToUnrelatedNode && activeElement(getDocument$1(floatingFocusElement)) === getDocument$1(floatingFocusElement).body) {\n          // Let `FloatingPortal` effect knows that focus is still inside the\n          // floating tree.\n          if (isHTMLElement(floatingFocusElement)) {\n            floatingFocusElement.focus();\n          }\n          const prevTabbableIndex = tabbableIndexRef.current;\n          const tabbableContent = getTabbableContent();\n          const nodeToFocus = tabbableContent[prevTabbableIndex] || tabbableContent[tabbableContent.length - 1] || floatingFocusElement;\n          if (isHTMLElement(nodeToFocus)) {\n            nodeToFocus.focus();\n          }\n        }\n\n        // Focus did not move inside the floating tree, and there are no tabbable\n        // portal guards to handle closing.\n        if ((isUntrappedTypeableCombobox ? true : !modal) && relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n        // Fix React 18 Strict Mode returnFocus due to double rendering.\n        relatedTarget !== getPreviouslyFocusedElement()) {\n          preventReturnFocusRef.current = true;\n          onOpenChange(false, event, 'focus-out');\n        }\n      });\n    }\n    if (floating && isHTMLElement(domReference)) {\n      domReference.addEventListener('focusout', handleFocusOutside);\n      domReference.addEventListener('pointerdown', handlePointerDown);\n      floating.addEventListener('focusout', handleFocusOutside);\n      return () => {\n        domReference.removeEventListener('focusout', handleFocusOutside);\n        domReference.removeEventListener('pointerdown', handlePointerDown);\n        floating.removeEventListener('focusout', handleFocusOutside);\n      };\n    }\n  }, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, onOpenChange, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef]);\n  const beforeGuardRef = React.useRef(null);\n  const afterGuardRef = React.useRef(null);\n  const mergedBeforeGuardRef = useLiteMergeRefs([beforeGuardRef, portalContext == null ? void 0 : portalContext.beforeInsideRef]);\n  const mergedAfterGuardRef = useLiteMergeRefs([afterGuardRef, portalContext == null ? void 0 : portalContext.afterInsideRef]);\n  React.useEffect(() => {\n    var _portalContext$portal, _ancestors$find;\n    if (disabled) return;\n    if (!floating) return;\n\n    // Don't hide portals nested within the parent portal.\n    const portalNodes = Array.from((portalContext == null || (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll(\"[\" + createAttribute('portal') + \"]\")) || []);\n    const ancestors = tree ? getNodeAncestors(tree.nodesRef.current, getNodeId()) : [];\n    const ancestorFloatingNodes = tree && !modal ? ancestors.map(node => {\n      var _node$context6;\n      return (_node$context6 = node.context) == null ? void 0 : _node$context6.elements.floating;\n    }) : [];\n    const rootAncestorComboboxDomReference = (_ancestors$find = ancestors.find(node => {\n      var _node$context7;\n      return isTypeableCombobox(((_node$context7 = node.context) == null ? void 0 : _node$context7.elements.domReference) || null);\n    })) == null || (_ancestors$find = _ancestors$find.context) == null ? void 0 : _ancestors$find.elements.domReference;\n    const insideElements = [floating, rootAncestorComboboxDomReference, ...portalNodes, ...ancestorFloatingNodes, ...getInsideElements(), startDismissButtonRef.current, endDismissButtonRef.current, beforeGuardRef.current, afterGuardRef.current, portalContext == null ? void 0 : portalContext.beforeOutsideRef.current, portalContext == null ? void 0 : portalContext.afterOutsideRef.current, orderRef.current.includes('reference') || isUntrappedTypeableCombobox ? domReference : null].filter(x => x != null);\n    const cleanup = modal || isUntrappedTypeableCombobox ? markOthers(insideElements, !useInert, useInert) : markOthers(insideElements);\n    return () => {\n      cleanup();\n    };\n  }, [disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, guards, useInert, tree, getNodeId, getInsideElements]);\n  useModernLayoutEffect(() => {\n    if (disabled || !isHTMLElement(floatingFocusElement)) return;\n    const doc = getDocument$1(floatingFocusElement);\n    const previouslyFocusedElement = activeElement(doc);\n\n    // Wait for any layout effect state setters to execute to set `tabIndex`.\n    queueMicrotask(() => {\n      const focusableElements = getTabbableElements(floatingFocusElement);\n      const initialFocusValue = initialFocusRef.current;\n      const elToFocus = (typeof initialFocusValue === 'number' ? focusableElements[initialFocusValue] : initialFocusValue.current) || floatingFocusElement;\n      const focusAlreadyInsideFloatingEl = contains$1(floatingFocusElement, previouslyFocusedElement);\n      if (!ignoreInitialFocus && !focusAlreadyInsideFloatingEl && open) {\n        enqueueFocus(elToFocus, {\n          preventScroll: elToFocus === floatingFocusElement\n        });\n      }\n    });\n  }, [disabled, open, floatingFocusElement, ignoreInitialFocus, getTabbableElements, initialFocusRef]);\n  useModernLayoutEffect(() => {\n    if (disabled || !floatingFocusElement) return;\n    let preventReturnFocusScroll = false;\n    const doc = getDocument$1(floatingFocusElement);\n    const previouslyFocusedElement = activeElement(doc);\n    addPreviouslyFocusedElement(previouslyFocusedElement);\n\n    // Dismissing via outside press should always ignore `returnFocus` to\n    // prevent unwanted scrolling.\n    function onOpenChange(_ref) {\n      let {\n        reason,\n        event,\n        nested\n      } = _ref;\n      if (['hover', 'safe-polygon'].includes(reason) && event.type === 'mouseleave') {\n        preventReturnFocusRef.current = true;\n      }\n      if (reason !== 'outside-press') return;\n      if (nested) {\n        preventReturnFocusRef.current = false;\n        preventReturnFocusScroll = true;\n      } else if (isVirtualClick(event) || isVirtualPointerEvent(event)) {\n        preventReturnFocusRef.current = false;\n      } else {\n        let isPreventScrollSupported = false;\n        document.createElement('div').focus({\n          get preventScroll() {\n            isPreventScrollSupported = true;\n            return false;\n          }\n        });\n        if (isPreventScrollSupported) {\n          preventReturnFocusRef.current = false;\n          preventReturnFocusScroll = true;\n        } else {\n          preventReturnFocusRef.current = true;\n        }\n      }\n    }\n    events.on('openchange', onOpenChange);\n    const fallbackEl = doc.createElement('span');\n    fallbackEl.setAttribute('tabindex', '-1');\n    fallbackEl.setAttribute('aria-hidden', 'true');\n    Object.assign(fallbackEl.style, HIDDEN_STYLES);\n    if (isInsidePortal && domReference) {\n      domReference.insertAdjacentElement('afterend', fallbackEl);\n    }\n    function getReturnElement() {\n      if (typeof returnFocusRef.current === 'boolean') {\n        const el = domReference || getPreviouslyFocusedElement();\n        return el && el.isConnected ? el : fallbackEl;\n      }\n      return returnFocusRef.current.current || fallbackEl;\n    }\n    return () => {\n      events.off('openchange', onOpenChange);\n      const activeEl = activeElement(doc);\n      const isFocusInsideFloatingTree = contains$1(floating, activeEl) || tree && getNodeChildren$1(tree.nodesRef.current, getNodeId()).some(node => {\n        var _node$context8;\n        return contains$1((_node$context8 = node.context) == null ? void 0 : _node$context8.elements.floating, activeEl);\n      });\n      const returnElement = getReturnElement();\n      queueMicrotask(() => {\n        // This is `returnElement`, if it's tabbable, or its first tabbable child.\n        const tabbableReturnElement = getFirstTabbableElement(returnElement);\n        if (\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n        returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(tabbableReturnElement) && (\n        // If the focus moved somewhere else after mount, avoid returning focus\n        // since it likely entered a different element which should be\n        // respected: https://github.com/floating-ui/floating-ui/issues/2607\n        tabbableReturnElement !== activeEl && activeEl !== doc.body ? isFocusInsideFloatingTree : true)) {\n          tabbableReturnElement.focus({\n            preventScroll: preventReturnFocusScroll\n          });\n        }\n        fallbackEl.remove();\n      });\n    };\n  }, [disabled, floating, floatingFocusElement, returnFocusRef, dataRef, events, tree, isInsidePortal, domReference, getNodeId]);\n  React.useEffect(() => {\n    // The `returnFocus` cleanup behavior is inside a microtask; ensure we\n    // wait for it to complete before resetting the flag.\n    queueMicrotask(() => {\n      preventReturnFocusRef.current = false;\n    });\n  }, [disabled]);\n\n  // Synchronize the `context` & `modal` value to the FloatingPortal context.\n  // It will decide whether or not it needs to render its own guards.\n  useModernLayoutEffect(() => {\n    if (disabled) return;\n    if (!portalContext) return;\n    portalContext.setFocusManagerState({\n      modal,\n      closeOnFocusOut,\n      open,\n      onOpenChange,\n      domReference\n    });\n    return () => {\n      portalContext.setFocusManagerState(null);\n    };\n  }, [disabled, portalContext, modal, open, onOpenChange, closeOnFocusOut, domReference]);\n  useModernLayoutEffect(() => {\n    if (disabled) return;\n    if (!floatingFocusElement) return;\n    handleTabIndex(floatingFocusElement, orderRef);\n  }, [disabled, floatingFocusElement, orderRef]);\n  function renderDismissButton(location) {\n    if (disabled || !visuallyHiddenDismiss || !modal) {\n      return null;\n    }\n    return /*#__PURE__*/jsx(VisuallyHiddenDismiss, {\n      ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n      onClick: event => onOpenChange(false, event.nativeEvent),\n      children: typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss'\n    });\n  }\n  const shouldRenderGuards = !disabled && guards && (modal ? !isUntrappedTypeableCombobox : true) && (isInsidePortal || modal);\n  return /*#__PURE__*/jsxs(Fragment, {\n    children: [shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"inside\",\n      ref: mergedBeforeGuardRef,\n      onFocus: event => {\n        if (modal) {\n          const els = getTabbableElements();\n          enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n        } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n          preventReturnFocusRef.current = false;\n          if (isOutsideEvent(event, portalContext.portalNode)) {\n            const nextTabbable = getNextTabbable(domReference);\n            nextTabbable == null || nextTabbable.focus();\n          } else {\n            var _portalContext$before;\n            (_portalContext$before = portalContext.beforeOutsideRef.current) == null || _portalContext$before.focus();\n          }\n        }\n      }\n    }), !isUntrappedTypeableCombobox && renderDismissButton('start'), children, renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"inside\",\n      ref: mergedAfterGuardRef,\n      onFocus: event => {\n        if (modal) {\n          enqueueFocus(getTabbableElements()[0]);\n        } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n          if (closeOnFocusOut) {\n            preventReturnFocusRef.current = true;\n          }\n          if (isOutsideEvent(event, portalContext.portalNode)) {\n            const prevTabbable = getPreviousTabbable(domReference);\n            prevTabbable == null || prevTabbable.focus();\n          } else {\n            var _portalContext$afterO;\n            (_portalContext$afterO = portalContext.afterOutsideRef.current) == null || _portalContext$afterO.focus();\n          }\n        }\n      }\n    })]\n  });\n}\n\nlet lockCount = 0;\nfunction enableScrollLock() {\n  const isIOS = /iP(hone|ad|od)|iOS/.test(getPlatform());\n  const bodyStyle = document.body.style;\n  // RTL <body> scrollbar\n  const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n  const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n  const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n  const scrollX = bodyStyle.left ? parseFloat(bodyStyle.left) : window.scrollX;\n  const scrollY = bodyStyle.top ? parseFloat(bodyStyle.top) : window.scrollY;\n  bodyStyle.overflow = 'hidden';\n  if (scrollbarWidth) {\n    bodyStyle[paddingProp] = scrollbarWidth + \"px\";\n  }\n\n  // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n  // technique has fewer side effects.\n  if (isIOS) {\n    var _window$visualViewpor, _window$visualViewpor2;\n    // iOS 12 does not support `visualViewport`.\n    const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n    const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n    Object.assign(bodyStyle, {\n      position: 'fixed',\n      top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n      left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n      right: '0'\n    });\n  }\n  return () => {\n    Object.assign(bodyStyle, {\n      overflow: '',\n      [paddingProp]: ''\n    });\n    if (isIOS) {\n      Object.assign(bodyStyle, {\n        position: '',\n        top: '',\n        left: '',\n        right: ''\n      });\n      window.scrollTo(scrollX, scrollY);\n    }\n  };\n}\nlet cleanup = () => {};\n\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(props, ref) {\n  const {\n    lockScroll = false,\n    ...rest\n  } = props;\n  useModernLayoutEffect(() => {\n    if (!lockScroll) return;\n    lockCount++;\n    if (lockCount === 1) {\n      cleanup = enableScrollLock();\n    }\n    return () => {\n      lockCount--;\n      if (lockCount === 0) {\n        cleanup();\n      }\n    };\n  }, [lockScroll]);\n  return /*#__PURE__*/jsx(\"div\", {\n    ref: ref,\n    ...rest,\n    style: {\n      position: 'fixed',\n      overflow: 'auto',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      ...rest.style\n    }\n  });\n});\n\nfunction isButtonTarget(event) {\n  return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isAnchorTarget(event) {\n  return isHTMLElement(event.target) && event.target.tagName === 'A';\n}\nfunction isSpaceIgnored(element) {\n  return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nfunction useClick(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    elements: {\n      domReference\n    }\n  } = context;\n  const {\n    enabled = true,\n    event: eventOption = 'click',\n    toggle = true,\n    ignoreMouse = false,\n    keyboardHandlers = true,\n    stickIfOpen = true\n  } = props;\n  const pointerTypeRef = React.useRef();\n  const didKeyDownRef = React.useRef(false);\n  const reference = React.useMemo(() => ({\n    onPointerDown(event) {\n      pointerTypeRef.current = event.pointerType;\n    },\n    onMouseDown(event) {\n      const pointerType = pointerTypeRef.current;\n\n      // Ignore all buttons except for the \"main\" button.\n      // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n      if (event.button !== 0) return;\n      if (eventOption === 'click') return;\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        // Prevent stealing focus from the floating element\n        event.preventDefault();\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onClick(event) {\n      const pointerType = pointerTypeRef.current;\n      if (eventOption === 'mousedown' && pointerTypeRef.current) {\n        pointerTypeRef.current = undefined;\n        return;\n      }\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'click' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onKeyDown(event) {\n      pointerTypeRef.current = undefined;\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {\n        return;\n      }\n      if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n        // Prevent scrolling\n        event.preventDefault();\n        didKeyDownRef.current = true;\n      }\n      if (isAnchorTarget(event)) {\n        return;\n      }\n      if (event.key === 'Enter') {\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    },\n    onKeyUp(event) {\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event) || isSpaceIgnored(domReference)) {\n        return;\n      }\n      if (event.key === ' ' && didKeyDownRef.current) {\n        didKeyDownRef.current = false;\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    }\n  }), [dataRef, domReference, eventOption, ignoreMouse, keyboardHandlers, onOpenChange, open, stickIfOpen, toggle]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nfunction createVirtualElement(domElement, data) {\n  let offsetX = null;\n  let offsetY = null;\n  let isAutoUpdateEvent = false;\n  return {\n    contextElement: domElement || undefined,\n    getBoundingClientRect() {\n      var _data$dataRef$current;\n      const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || {\n        width: 0,\n        height: 0,\n        x: 0,\n        y: 0\n      };\n      const isXAxis = data.axis === 'x' || data.axis === 'both';\n      const isYAxis = data.axis === 'y' || data.axis === 'both';\n      const canTrackCursorOnAutoUpdate = ['mouseenter', 'mousemove'].includes(((_data$dataRef$current = data.dataRef.current.openEvent) == null ? void 0 : _data$dataRef$current.type) || '') && data.pointerType !== 'touch';\n      let width = domRect.width;\n      let height = domRect.height;\n      let x = domRect.x;\n      let y = domRect.y;\n      if (offsetX == null && data.x && isXAxis) {\n        offsetX = domRect.x - data.x;\n      }\n      if (offsetY == null && data.y && isYAxis) {\n        offsetY = domRect.y - data.y;\n      }\n      x -= offsetX || 0;\n      y -= offsetY || 0;\n      width = 0;\n      height = 0;\n      if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {\n        width = data.axis === 'y' ? domRect.width : 0;\n        height = data.axis === 'x' ? domRect.height : 0;\n        x = isXAxis && data.x != null ? data.x : x;\n        y = isYAxis && data.y != null ? data.y : y;\n      } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {\n        height = data.axis === 'x' ? domRect.height : height;\n        width = data.axis === 'y' ? domRect.width : width;\n      }\n      isAutoUpdateEvent = true;\n      return {\n        width,\n        height,\n        x,\n        y,\n        top: y,\n        right: x + width,\n        bottom: y + height,\n        left: x\n      };\n    }\n  };\n}\nfunction isMouseBasedEvent(event) {\n  return event != null && event.clientX != null;\n}\n/**\n * Positions the floating element relative to a client point (in the viewport),\n * such as the mouse position. By default, it follows the mouse cursor.\n * @see https://floating-ui.com/docs/useClientPoint\n */\nfunction useClientPoint(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    dataRef,\n    elements: {\n      floating,\n      domReference\n    },\n    refs\n  } = context;\n  const {\n    enabled = true,\n    axis = 'both',\n    x = null,\n    y = null\n  } = props;\n  const initialRef = React.useRef(false);\n  const cleanupListenerRef = React.useRef(null);\n  const [pointerType, setPointerType] = React.useState();\n  const [reactive, setReactive] = React.useState([]);\n  const setReference = useEffectEvent((x, y) => {\n    if (initialRef.current) return;\n\n    // Prevent setting if the open event was not a mouse-like one\n    // (e.g. focus to open, then hover over the reference element).\n    // Only apply if the event exists.\n    if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {\n      return;\n    }\n    refs.setPositionReference(createVirtualElement(domReference, {\n      x,\n      y,\n      axis,\n      dataRef,\n      pointerType\n    }));\n  });\n  const handleReferenceEnterOrMove = useEffectEvent(event => {\n    if (x != null || y != null) return;\n    if (!open) {\n      setReference(event.clientX, event.clientY);\n    } else if (!cleanupListenerRef.current) {\n      // If there's no cleanup, there's no listener, but we want to ensure\n      // we add the listener if the cursor landed on the floating element and\n      // then back on the reference (i.e. it's interactive).\n      setReactive([]);\n    }\n  });\n\n  // If the pointer is a mouse-like pointer, we want to continue following the\n  // mouse even if the floating element is transitioning out. On touch\n  // devices, this is undesirable because the floating element will move to\n  // the dismissal touch point.\n  const openCheck = isMouseLikePointerType(pointerType) ? floating : open;\n  const addListener = React.useCallback(() => {\n    // Explicitly specified `x`/`y` coordinates shouldn't add a listener.\n    if (!openCheck || !enabled || x != null || y != null) return;\n    const win = getWindow(floating);\n    function handleMouseMove(event) {\n      const target = getTarget$1(event);\n      if (!contains$1(floating, target)) {\n        setReference(event.clientX, event.clientY);\n      } else {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      }\n    }\n    if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {\n      win.addEventListener('mousemove', handleMouseMove);\n      const cleanup = () => {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      };\n      cleanupListenerRef.current = cleanup;\n      return cleanup;\n    }\n    refs.setPositionReference(domReference);\n  }, [openCheck, enabled, x, y, floating, dataRef, refs, domReference, setReference]);\n  React.useEffect(() => {\n    return addListener();\n  }, [addListener, reactive]);\n  React.useEffect(() => {\n    if (enabled && !floating) {\n      initialRef.current = false;\n    }\n  }, [enabled, floating]);\n  React.useEffect(() => {\n    if (!enabled && open) {\n      initialRef.current = true;\n    }\n  }, [enabled, open]);\n  useModernLayoutEffect(() => {\n    if (enabled && (x != null || y != null)) {\n      initialRef.current = false;\n      setReference(x, y);\n    }\n  }, [enabled, x, y, setReference]);\n  const reference = React.useMemo(() => {\n    function setPointerTypeRef(_ref) {\n      let {\n        pointerType\n      } = _ref;\n      setPointerType(pointerType);\n    }\n    return {\n      onPointerDown: setPointerTypeRef,\n      onPointerEnter: setPointerTypeRef,\n      onMouseMove: handleReferenceEnterOrMove,\n      onMouseEnter: handleReferenceEnterOrMove\n    };\n  }, [handleReferenceEnterOrMove]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst bubbleHandlerKeys = {\n  pointerdown: 'onPointerDown',\n  mousedown: 'onMouseDown',\n  click: 'onClick'\n};\nconst captureHandlerKeys = {\n  pointerdown: 'onPointerDownCapture',\n  mousedown: 'onMouseDownCapture',\n  click: 'onClickCapture'\n};\nconst normalizeProp = normalizable => {\n  var _normalizable$escapeK, _normalizable$outside;\n  return {\n    escapeKey: typeof normalizable === 'boolean' ? normalizable : (_normalizable$escapeK = normalizable == null ? void 0 : normalizable.escapeKey) != null ? _normalizable$escapeK : false,\n    outsidePress: typeof normalizable === 'boolean' ? normalizable : (_normalizable$outside = normalizable == null ? void 0 : normalizable.outsidePress) != null ? _normalizable$outside : true\n  };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nfunction useDismiss(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    elements,\n    dataRef\n  } = context;\n  const {\n    enabled = true,\n    escapeKey = true,\n    outsidePress: unstable_outsidePress = true,\n    outsidePressEvent = 'pointerdown',\n    referencePress = false,\n    referencePressEvent = 'pointerdown',\n    ancestorScroll = false,\n    bubbles,\n    capture\n  } = props;\n  const tree = useFloatingTree();\n  const outsidePressFn = useEffectEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n  const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n  const insideReactTreeRef = React.useRef(false);\n  const endedOrStartedInsideRef = React.useRef(false);\n  const {\n    escapeKey: escapeKeyBubbles,\n    outsidePress: outsidePressBubbles\n  } = normalizeProp(bubbles);\n  const {\n    escapeKey: escapeKeyCapture,\n    outsidePress: outsidePressCapture\n  } = normalizeProp(capture);\n  const isComposingRef = React.useRef(false);\n  const closeOnEscapeKeyDown = useEffectEvent(event => {\n    var _dataRef$current$floa;\n    if (!open || !enabled || !escapeKey || event.key !== 'Escape') {\n      return;\n    }\n\n    // Wait until IME is settled. Pressing `Escape` while composing should\n    // close the compose menu, but not the floating element.\n    if (isComposingRef.current) {\n      return;\n    }\n    const nodeId = (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n    const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n    if (!escapeKeyBubbles) {\n      event.stopPropagation();\n      if (children.length > 0) {\n        let shouldDismiss = true;\n        children.forEach(child => {\n          var _child$context;\n          if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n            shouldDismiss = false;\n            return;\n          }\n        });\n        if (!shouldDismiss) {\n          return;\n        }\n      }\n    }\n    onOpenChange(false, isReactEvent(event) ? event.nativeEvent : event, 'escape-key');\n  });\n  const closeOnEscapeKeyDownCapture = useEffectEvent(event => {\n    var _getTarget2;\n    const callback = () => {\n      var _getTarget;\n      closeOnEscapeKeyDown(event);\n      (_getTarget = getTarget$1(event)) == null || _getTarget.removeEventListener('keydown', callback);\n    };\n    (_getTarget2 = getTarget$1(event)) == null || _getTarget2.addEventListener('keydown', callback);\n  });\n  const closeOnPressOutside = useEffectEvent(event => {\n    var _dataRef$current$floa2;\n    // Given developers can stop the propagation of the synthetic event,\n    // we can only be confident with a positive value.\n    const insideReactTree = insideReactTreeRef.current;\n    insideReactTreeRef.current = false;\n\n    // When click outside is lazy (`click` event), handle dragging.\n    // Don't close if:\n    // - The click started inside the floating element.\n    // - The click ended inside the floating element.\n    const endedOrStartedInside = endedOrStartedInsideRef.current;\n    endedOrStartedInsideRef.current = false;\n    if (outsidePressEvent === 'click' && endedOrStartedInside) {\n      return;\n    }\n    if (insideReactTree) {\n      return;\n    }\n    if (typeof outsidePress === 'function' && !outsidePress(event)) {\n      return;\n    }\n    const target = getTarget$1(event);\n    const inertSelector = \"[\" + createAttribute('inert') + \"]\";\n    const markers = getDocument$1(elements.floating).querySelectorAll(inertSelector);\n    let targetRootAncestor = isElement(target) ? target : null;\n    while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {\n      const nextParent = getParentNode(targetRootAncestor);\n      if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {\n        break;\n      }\n      targetRootAncestor = nextParent;\n    }\n\n    // Check if the click occurred on a third-party element injected after the\n    // floating element rendered.\n    if (markers.length && isElement(target) && !isRootElement(target) &&\n    // Clicked on a direct ancestor (e.g. FloatingOverlay).\n    !contains$1(target, elements.floating) &&\n    // If the target root element contains none of the markers, then the\n    // element was injected after the floating element rendered.\n    Array.from(markers).every(marker => !contains$1(targetRootAncestor, marker))) {\n      return;\n    }\n\n    // Check if the click occurred on the scrollbar\n    if (isHTMLElement(target) && floating) {\n      const lastTraversableNode = isLastTraversableNode(target);\n      const style = getComputedStyle(target);\n      const scrollRe = /auto|scroll/;\n      const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX);\n      const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY);\n      const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth;\n      const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight;\n      const isRTL = style.direction === 'rtl';\n\n      // Check click position relative to scrollbar.\n      // In some browsers it is possible to change the <body> (or window)\n      // scrollbar to the left side, but is very rare and is difficult to\n      // check for. Plus, for modal dialogs with backdrops, it is more\n      // important that the backdrop is checked but not so much the window.\n      const pressedVerticalScrollbar = canScrollY && (isRTL ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth);\n      const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight;\n      if (pressedVerticalScrollbar || pressedHorizontalScrollbar) {\n        return;\n      }\n    }\n    const nodeId = (_dataRef$current$floa2 = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa2.nodeId;\n    const targetIsInsideChildren = tree && getNodeChildren$1(tree.nodesRef.current, nodeId).some(node => {\n      var _node$context;\n      return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n    });\n    if (isEventTargetWithin(event, elements.floating) || isEventTargetWithin(event, elements.domReference) || targetIsInsideChildren) {\n      return;\n    }\n    const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n    if (children.length > 0) {\n      let shouldDismiss = true;\n      children.forEach(child => {\n        var _child$context2;\n        if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n          shouldDismiss = false;\n          return;\n        }\n      });\n      if (!shouldDismiss) {\n        return;\n      }\n    }\n    onOpenChange(false, event, 'outside-press');\n  });\n  const closeOnPressOutsideCapture = useEffectEvent(event => {\n    var _getTarget4;\n    const callback = () => {\n      var _getTarget3;\n      closeOnPressOutside(event);\n      (_getTarget3 = getTarget$1(event)) == null || _getTarget3.removeEventListener(outsidePressEvent, callback);\n    };\n    (_getTarget4 = getTarget$1(event)) == null || _getTarget4.addEventListener(outsidePressEvent, callback);\n  });\n  React.useEffect(() => {\n    if (!open || !enabled) {\n      return;\n    }\n    dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n    dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n    let compositionTimeout = -1;\n    function onScroll(event) {\n      onOpenChange(false, event, 'ancestor-scroll');\n    }\n    function handleCompositionStart() {\n      window.clearTimeout(compositionTimeout);\n      isComposingRef.current = true;\n    }\n    function handleCompositionEnd() {\n      // Safari fires `compositionend` before `keydown`, so we need to wait\n      // until the next tick to set `isComposing` to `false`.\n      // https://bugs.webkit.org/show_bug.cgi?id=165004\n      compositionTimeout = window.setTimeout(() => {\n        isComposingRef.current = false;\n      },\n      // 0ms or 1ms don't work in Safari. 5ms appears to consistently work.\n      // Only apply to WebKit for the test to remain 0ms.\n      isWebKit() ? 5 : 0);\n    }\n    const doc = getDocument$1(elements.floating);\n    if (escapeKey) {\n      doc.addEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n      doc.addEventListener('compositionstart', handleCompositionStart);\n      doc.addEventListener('compositionend', handleCompositionEnd);\n    }\n    outsidePress && doc.addEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n    let ancestors = [];\n    if (ancestorScroll) {\n      if (isElement(elements.domReference)) {\n        ancestors = getOverflowAncestors(elements.domReference);\n      }\n      if (isElement(elements.floating)) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.floating));\n      }\n      if (!isElement(elements.reference) && elements.reference && elements.reference.contextElement) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.reference.contextElement));\n      }\n    }\n\n    // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n    ancestors = ancestors.filter(ancestor => {\n      var _doc$defaultView;\n      return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n    });\n    ancestors.forEach(ancestor => {\n      ancestor.addEventListener('scroll', onScroll, {\n        passive: true\n      });\n    });\n    return () => {\n      if (escapeKey) {\n        doc.removeEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n        doc.removeEventListener('compositionstart', handleCompositionStart);\n        doc.removeEventListener('compositionend', handleCompositionEnd);\n      }\n      outsidePress && doc.removeEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n      ancestors.forEach(ancestor => {\n        ancestor.removeEventListener('scroll', onScroll);\n      });\n      window.clearTimeout(compositionTimeout);\n    };\n  }, [dataRef, elements, escapeKey, outsidePress, outsidePressEvent, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, escapeKeyCapture, closeOnEscapeKeyDownCapture, closeOnPressOutside, outsidePressCapture, closeOnPressOutsideCapture]);\n  React.useEffect(() => {\n    insideReactTreeRef.current = false;\n  }, [outsidePress, outsidePressEvent]);\n  const reference = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    ...(referencePress && {\n      [bubbleHandlerKeys[referencePressEvent]]: event => {\n        onOpenChange(false, event.nativeEvent, 'reference-press');\n      },\n      ...(referencePressEvent !== 'click' && {\n        onClick(event) {\n          onOpenChange(false, event.nativeEvent, 'reference-press');\n        }\n      })\n    })\n  }), [closeOnEscapeKeyDown, onOpenChange, referencePress, referencePressEvent]);\n  const floating = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    onMouseDown() {\n      endedOrStartedInsideRef.current = true;\n    },\n    onMouseUp() {\n      endedOrStartedInsideRef.current = true;\n    },\n    [captureHandlerKeys[outsidePressEvent]]: () => {\n      insideReactTreeRef.current = true;\n    }\n  }), [closeOnEscapeKeyDown, outsidePressEvent]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction useFloatingRootContext(options) {\n  const {\n    open = false,\n    onOpenChange: onOpenChangeProp,\n    elements: elementsProp\n  } = options;\n  const floatingId = useId();\n  const dataRef = React.useRef({});\n  const [events] = React.useState(() => createEventEmitter());\n  const nested = useFloatingParentNodeId() != null;\n  if (process.env.NODE_ENV !== \"production\") {\n    const optionDomReference = elementsProp.reference;\n    if (optionDomReference && !isElement(optionDomReference)) {\n      error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');\n    }\n  }\n  const [positionReference, setPositionReference] = React.useState(elementsProp.reference);\n  const onOpenChange = useEffectEvent((open, event, reason) => {\n    dataRef.current.openEvent = open ? event : undefined;\n    events.emit('openchange', {\n      open,\n      event,\n      reason,\n      nested\n    });\n    onOpenChangeProp == null || onOpenChangeProp(open, event, reason);\n  });\n  const refs = React.useMemo(() => ({\n    setPositionReference\n  }), []);\n  const elements = React.useMemo(() => ({\n    reference: positionReference || elementsProp.reference || null,\n    floating: elementsProp.floating || null,\n    domReference: elementsProp.reference\n  }), [positionReference, elementsProp.reference, elementsProp.floating]);\n  return React.useMemo(() => ({\n    dataRef,\n    open,\n    onOpenChange,\n    elements,\n    events,\n    floatingId,\n    refs\n  }), [open, onOpenChange, elements, events, floatingId, refs]);\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    nodeId\n  } = options;\n  const internalRootContext = useFloatingRootContext({\n    ...options,\n    elements: {\n      reference: null,\n      floating: null,\n      ...options.elements\n    }\n  });\n  const rootContext = options.rootContext || internalRootContext;\n  const computedElements = rootContext.elements;\n  const [_domReference, setDomReference] = React.useState(null);\n  const [positionReference, _setPositionReference] = React.useState(null);\n  const optionDomReference = computedElements == null ? void 0 : computedElements.domReference;\n  const domReference = optionDomReference || _domReference;\n  const domReferenceRef = React.useRef(null);\n  const tree = useFloatingTree();\n  useModernLayoutEffect(() => {\n    if (domReference) {\n      domReferenceRef.current = domReference;\n    }\n  }, [domReference]);\n  const position = useFloating$1({\n    ...options,\n    elements: {\n      ...computedElements,\n      ...(positionReference && {\n        reference: positionReference\n      })\n    }\n  });\n  const setPositionReference = React.useCallback(node => {\n    const computedPositionReference = isElement(node) ? {\n      getBoundingClientRect: () => node.getBoundingClientRect(),\n      getClientRects: () => node.getClientRects(),\n      contextElement: node\n    } : node;\n    // Store the positionReference in state if the DOM reference is specified externally via the\n    // `elements.reference` option. This ensures that it won't be overridden on future renders.\n    _setPositionReference(computedPositionReference);\n    position.refs.setReference(computedPositionReference);\n  }, [position.refs]);\n  const setReference = React.useCallback(node => {\n    if (isElement(node) || node === null) {\n      domReferenceRef.current = node;\n      setDomReference(node);\n    }\n\n    // Backwards-compatibility for passing a virtual element to `reference`\n    // after it has set the DOM reference.\n    if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n    // Don't allow setting virtual elements using the old technique back to\n    // `null` to support `positionReference` + an unstable `reference`\n    // callback ref.\n    node !== null && !isElement(node)) {\n      position.refs.setReference(node);\n    }\n  }, [position.refs]);\n  const refs = React.useMemo(() => ({\n    ...position.refs,\n    setReference,\n    setPositionReference,\n    domReference: domReferenceRef\n  }), [position.refs, setReference, setPositionReference]);\n  const elements = React.useMemo(() => ({\n    ...position.elements,\n    domReference: domReference\n  }), [position.elements, domReference]);\n  const context = React.useMemo(() => ({\n    ...position,\n    ...rootContext,\n    refs,\n    elements,\n    nodeId\n  }), [position, refs, elements, nodeId, rootContext]);\n  useModernLayoutEffect(() => {\n    rootContext.dataRef.current.floatingContext = context;\n    const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n    if (node) {\n      node.context = context;\n    }\n  });\n  return React.useMemo(() => ({\n    ...position,\n    context,\n    refs,\n    elements\n  }), [position, refs, elements, context]);\n}\n\nfunction isMacSafari() {\n  return isMac() && isSafari();\n}\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nfunction useFocus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    events,\n    dataRef,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    visibleOnly = true\n  } = props;\n  const blockFocusRef = React.useRef(false);\n  const timeoutRef = React.useRef(-1);\n  const keyboardModalityRef = React.useRef(true);\n  React.useEffect(() => {\n    if (!enabled) return;\n    const win = getWindow(elements.domReference);\n\n    // If the reference was focused and the user left the tab/window, and the\n    // floating element was not open, the focus should be blocked when they\n    // return to the tab/window.\n    function onBlur() {\n      if (!open && isHTMLElement(elements.domReference) && elements.domReference === activeElement(getDocument$1(elements.domReference))) {\n        blockFocusRef.current = true;\n      }\n    }\n    function onKeyDown() {\n      keyboardModalityRef.current = true;\n    }\n    function onPointerDown() {\n      keyboardModalityRef.current = false;\n    }\n    win.addEventListener('blur', onBlur);\n    if (isMacSafari()) {\n      win.addEventListener('keydown', onKeyDown, true);\n      win.addEventListener('pointerdown', onPointerDown, true);\n    }\n    return () => {\n      win.removeEventListener('blur', onBlur);\n      if (isMacSafari()) {\n        win.removeEventListener('keydown', onKeyDown, true);\n        win.removeEventListener('pointerdown', onPointerDown, true);\n      }\n    };\n  }, [elements.domReference, open, enabled]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        reason\n      } = _ref;\n      if (reason === 'reference-press' || reason === 'escape-key') {\n        blockFocusRef.current = true;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [events, enabled]);\n  React.useEffect(() => {\n    return () => {\n      clearTimeoutIfSet(timeoutRef);\n    };\n  }, []);\n  const reference = React.useMemo(() => ({\n    onMouseLeave() {\n      blockFocusRef.current = false;\n    },\n    onFocus(event) {\n      if (blockFocusRef.current) return;\n      const target = getTarget$1(event.nativeEvent);\n      if (visibleOnly && isElement(target)) {\n        // Safari fails to match `:focus-visible` if focus was initially\n        // outside the document.\n        if (isMacSafari() && !event.relatedTarget) {\n          if (!keyboardModalityRef.current && !isTypeableElement(target)) {\n            return;\n          }\n        } else if (!matchesFocusVisible(target)) {\n          return;\n        }\n      }\n      onOpenChange(true, event.nativeEvent, 'focus');\n    },\n    onBlur(event) {\n      blockFocusRef.current = false;\n      const relatedTarget = event.relatedTarget;\n      const nativeEvent = event.nativeEvent;\n\n      // Hit the non-modal focus management portal guard. Focus will be\n      // moved into the floating element immediately after.\n      const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute('focus-guard')) && relatedTarget.getAttribute('data-type') === 'outside';\n\n      // Wait for the window blur listener to fire.\n      timeoutRef.current = window.setTimeout(() => {\n        var _dataRef$current$floa;\n        const activeEl = activeElement(elements.domReference ? elements.domReference.ownerDocument : document);\n\n        // Focus left the page, keep it open.\n        if (!relatedTarget && activeEl === elements.domReference) return;\n\n        // When focusing the reference element (e.g. regular click), then\n        // clicking into the floating element, prevent it from hiding.\n        // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n        // We can not rely on relatedTarget to point to the correct element\n        // as it will only point to the shadow host of the newly focused element\n        // and not the element that actually has received focus if it is located\n        // inside a shadow root.\n        if (contains$1((_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.refs.floating.current, activeEl) || contains$1(elements.domReference, activeEl) || movedToFocusGuard) {\n          return;\n        }\n        onOpenChange(false, nativeEvent, 'focus');\n      });\n    }\n  }), [dataRef, elements.domReference, onOpenChange, visibleOnly]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nfunction mergeProps(userProps, propsList, elementKey) {\n  const map = new Map();\n  const isItem = elementKey === 'item';\n  let domUserProps = userProps;\n  if (isItem && userProps) {\n    const {\n      [ACTIVE_KEY]: _,\n      [SELECTED_KEY]: __,\n      ...validProps\n    } = userProps;\n    domUserProps = validProps;\n  }\n  return {\n    ...(elementKey === 'floating' && {\n      tabIndex: -1,\n      [FOCUSABLE_ATTRIBUTE]: ''\n    }),\n    ...domUserProps,\n    ...propsList.map(value => {\n      const propsOrGetProps = value ? value[elementKey] : null;\n      if (typeof propsOrGetProps === 'function') {\n        return userProps ? propsOrGetProps(userProps) : null;\n      }\n      return propsOrGetProps;\n    }).concat(userProps).reduce((acc, props) => {\n      if (!props) {\n        return acc;\n      }\n      Object.entries(props).forEach(_ref => {\n        let [key, value] = _ref;\n        if (isItem && [ACTIVE_KEY, SELECTED_KEY].includes(key)) {\n          return;\n        }\n        if (key.indexOf('on') === 0) {\n          if (!map.has(key)) {\n            map.set(key, []);\n          }\n          if (typeof value === 'function') {\n            var _map$get;\n            (_map$get = map.get(key)) == null || _map$get.push(value);\n            acc[key] = function () {\n              var _map$get2;\n              for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n              }\n              return (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.map(fn => fn(...args)).find(val => val !== undefined);\n            };\n          }\n        } else {\n          acc[key] = value;\n        }\n      });\n      return acc;\n    }, {})\n  };\n}\n/**\n * Merges an array of interaction hooks' props into prop getters, allowing\n * event handler functions to be composed together without overwriting one\n * another.\n * @see https://floating-ui.com/docs/useInteractions\n */\nfunction useInteractions(propsList) {\n  if (propsList === void 0) {\n    propsList = [];\n  }\n  const referenceDeps = propsList.map(key => key == null ? void 0 : key.reference);\n  const floatingDeps = propsList.map(key => key == null ? void 0 : key.floating);\n  const itemDeps = propsList.map(key => key == null ? void 0 : key.item);\n  const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  referenceDeps);\n  const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  floatingDeps);\n  const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  itemDeps);\n  return React.useMemo(() => ({\n    getReferenceProps,\n    getFloatingProps,\n    getItemProps\n  }), [getReferenceProps, getFloatingProps, getItemProps]);\n}\n\nconst ESCAPE = 'Escape';\nfunction doSwitch(orientation, vertical, horizontal) {\n  switch (orientation) {\n    case 'vertical':\n      return vertical;\n    case 'horizontal':\n      return horizontal;\n    default:\n      return vertical || horizontal;\n  }\n}\nfunction isMainOrientationKey(key, orientation) {\n  const vertical = key === ARROW_UP || key === ARROW_DOWN;\n  const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n  const vertical = key === ARROW_DOWN;\n  const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key === ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  const horizontal = key === ARROW_DOWN;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl, cols) {\n  const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n  const horizontal = key === ARROW_UP;\n  if (orientation === 'both' || orientation === 'horizontal' && cols && cols > 1) {\n    return key === ESCAPE;\n  }\n  return doSwitch(orientation, vertical, horizontal);\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nfunction useListNavigation(context, props) {\n  const {\n    open,\n    onOpenChange,\n    elements,\n    floatingId\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onNavigate: unstable_onNavigate = () => {},\n    enabled = true,\n    selectedIndex = null,\n    allowEscape = false,\n    loop = false,\n    nested = false,\n    rtl = false,\n    virtual = false,\n    focusItemOnOpen = 'auto',\n    focusItemOnHover = true,\n    openOnArrowKeyDown = true,\n    disabledIndices = undefined,\n    orientation = 'vertical',\n    parentOrientation,\n    cols = 1,\n    scrollItemIntoView = true,\n    virtualItemRef,\n    itemSizes,\n    dense = false\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (allowEscape) {\n      if (!loop) {\n        warn('`useListNavigation` looping must be enabled to allow escaping.');\n      }\n      if (!virtual) {\n        warn('`useListNavigation` must be virtual to allow escaping.');\n      }\n    }\n    if (orientation === 'vertical' && cols > 1) {\n      warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either \"horizontal\" or \"both\".');\n    }\n  }\n  const floatingFocusElement = getFloatingFocusElement(elements.floating);\n  const floatingFocusElementRef = useLatestRef(floatingFocusElement);\n  const parentId = useFloatingParentNodeId();\n  const tree = useFloatingTree();\n  useModernLayoutEffect(() => {\n    context.dataRef.current.orientation = orientation;\n  }, [context, orientation]);\n  const onNavigate = useEffectEvent(() => {\n    unstable_onNavigate(indexRef.current === -1 ? null : indexRef.current);\n  });\n  const typeableComboboxReference = isTypeableCombobox(elements.domReference);\n  const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n  const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n  const keyRef = React.useRef(null);\n  const isPointerModalityRef = React.useRef(true);\n  const previousOnNavigateRef = React.useRef(onNavigate);\n  const previousMountedRef = React.useRef(!!elements.floating);\n  const previousOpenRef = React.useRef(open);\n  const forceSyncFocusRef = React.useRef(false);\n  const forceScrollIntoViewRef = React.useRef(false);\n  const disabledIndicesRef = useLatestRef(disabledIndices);\n  const latestOpenRef = useLatestRef(open);\n  const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n  const selectedIndexRef = useLatestRef(selectedIndex);\n  const [activeId, setActiveId] = React.useState();\n  const [virtualId, setVirtualId] = React.useState();\n  const focusItem = useEffectEvent(() => {\n    function runFocus(item) {\n      if (virtual) {\n        var _item$id;\n        if ((_item$id = item.id) != null && _item$id.endsWith('-fui-option')) {\n          item.id = floatingId + \"-\" + Math.random().toString(16).slice(2, 10);\n        }\n        setActiveId(item.id);\n        tree == null || tree.events.emit('virtualfocus', item);\n        if (virtualItemRef) {\n          virtualItemRef.current = item;\n        }\n      } else {\n        enqueueFocus(item, {\n          sync: forceSyncFocusRef.current,\n          preventScroll: true\n        });\n      }\n    }\n    const initialItem = listRef.current[indexRef.current];\n    const forceScrollIntoView = forceScrollIntoViewRef.current;\n    if (initialItem) {\n      runFocus(initialItem);\n    }\n    const scheduler = forceSyncFocusRef.current ? v => v() : requestAnimationFrame;\n    scheduler(() => {\n      const waitedItem = listRef.current[indexRef.current] || initialItem;\n      if (!waitedItem) return;\n      if (!initialItem) {\n        runFocus(waitedItem);\n      }\n      const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n      const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n      if (shouldScrollIntoView) {\n        // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n        // by all browsers.\n        waitedItem.scrollIntoView == null || waitedItem.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n          block: 'nearest',\n          inline: 'nearest'\n        } : scrollIntoViewOptions);\n      }\n    });\n  });\n\n  // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n  // element. Also, reset `activeIndex` upon closing the floating element.\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (open && elements.floating) {\n      if (focusItemOnOpenRef.current && selectedIndex != null) {\n        // Regardless of the pointer modality, we want to ensure the selected\n        // item comes into view when the floating element is opened.\n        forceScrollIntoViewRef.current = true;\n        indexRef.current = selectedIndex;\n        onNavigate();\n      }\n    } else if (previousMountedRef.current) {\n      // Since the user can specify `onNavigate` conditionally\n      // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n      // we store and call the previous function.\n      indexRef.current = -1;\n      previousOnNavigateRef.current();\n    }\n  }, [enabled, open, elements.floating, selectedIndex, onNavigate]);\n\n  // Sync `activeIndex` to be the focused item while the floating element is\n  // open.\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!open) return;\n    if (!elements.floating) return;\n    if (activeIndex == null) {\n      forceSyncFocusRef.current = false;\n      if (selectedIndexRef.current != null) {\n        return;\n      }\n\n      // Reset while the floating element was open (e.g. the list changed).\n      if (previousMountedRef.current) {\n        indexRef.current = -1;\n        focusItem();\n      }\n\n      // Initial sync.\n      if ((!previousOpenRef.current || !previousMountedRef.current) && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n        let runs = 0;\n        const waitForListPopulated = () => {\n          if (listRef.current[0] == null) {\n            // Avoid letting the browser paint if possible on the first try,\n            // otherwise use rAF. Don't try more than twice, since something\n            // is wrong otherwise.\n            if (runs < 2) {\n              const scheduler = runs ? requestAnimationFrame : queueMicrotask;\n              scheduler(waitForListPopulated);\n            }\n            runs++;\n          } else {\n            indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinListIndex(listRef, disabledIndicesRef.current) : getMaxListIndex(listRef, disabledIndicesRef.current);\n            keyRef.current = null;\n            onNavigate();\n          }\n        };\n        waitForListPopulated();\n      }\n    } else if (!isIndexOutOfListBounds(listRef, activeIndex)) {\n      indexRef.current = activeIndex;\n      focusItem();\n      forceScrollIntoViewRef.current = false;\n    }\n  }, [enabled, open, elements.floating, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n  // Ensure the parent floating element has focus when a nested child closes\n  // to allow arrow key navigation to work after the pointer leaves the child.\n  useModernLayoutEffect(() => {\n    var _nodes$find;\n    if (!enabled || elements.floating || !tree || virtual || !previousMountedRef.current) {\n      return;\n    }\n    const nodes = tree.nodesRef.current;\n    const parent = (_nodes$find = nodes.find(node => node.id === parentId)) == null || (_nodes$find = _nodes$find.context) == null ? void 0 : _nodes$find.elements.floating;\n    const activeEl = activeElement(getDocument$1(elements.floating));\n    const treeContainsActiveEl = nodes.some(node => node.context && contains$1(node.context.elements.floating, activeEl));\n    if (parent && !treeContainsActiveEl && isPointerModalityRef.current) {\n      parent.focus({\n        preventScroll: true\n      });\n    }\n  }, [enabled, elements.floating, tree, parentId, virtual]);\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!tree) return;\n    if (!virtual) return;\n    if (parentId) return;\n    function handleVirtualFocus(item) {\n      setVirtualId(item.id);\n      if (virtualItemRef) {\n        virtualItemRef.current = item;\n      }\n    }\n    tree.events.on('virtualfocus', handleVirtualFocus);\n    return () => {\n      tree.events.off('virtualfocus', handleVirtualFocus);\n    };\n  }, [enabled, tree, virtual, parentId, virtualItemRef]);\n  useModernLayoutEffect(() => {\n    previousOnNavigateRef.current = onNavigate;\n    previousOpenRef.current = open;\n    previousMountedRef.current = !!elements.floating;\n  });\n  useModernLayoutEffect(() => {\n    if (!open) {\n      keyRef.current = null;\n    }\n  }, [open]);\n  const hasActiveIndex = activeIndex != null;\n  const item = React.useMemo(() => {\n    function syncCurrentTarget(currentTarget) {\n      if (!open) return;\n      const index = listRef.current.indexOf(currentTarget);\n      if (index !== -1 && indexRef.current !== index) {\n        indexRef.current = index;\n        onNavigate();\n      }\n    }\n    const props = {\n      onFocus(_ref) {\n        let {\n          currentTarget\n        } = _ref;\n        forceSyncFocusRef.current = true;\n        syncCurrentTarget(currentTarget);\n      },\n      onClick: _ref2 => {\n        let {\n          currentTarget\n        } = _ref2;\n        return currentTarget.focus({\n          preventScroll: true\n        });\n      },\n      // Safari\n      ...(focusItemOnHover && {\n        onMouseMove(_ref3) {\n          let {\n            currentTarget\n          } = _ref3;\n          forceSyncFocusRef.current = true;\n          forceScrollIntoViewRef.current = false;\n          syncCurrentTarget(currentTarget);\n        },\n        onPointerLeave(_ref4) {\n          let {\n            pointerType\n          } = _ref4;\n          if (!isPointerModalityRef.current || pointerType === 'touch') {\n            return;\n          }\n          forceSyncFocusRef.current = true;\n          indexRef.current = -1;\n          onNavigate();\n          if (!virtual) {\n            var _floatingFocusElement;\n            (_floatingFocusElement = floatingFocusElementRef.current) == null || _floatingFocusElement.focus({\n              preventScroll: true\n            });\n          }\n        }\n      })\n    };\n    return props;\n  }, [open, floatingFocusElementRef, focusItemOnHover, listRef, onNavigate, virtual]);\n  const getParentOrientation = React.useCallback(() => {\n    var _tree$nodesRef$curren;\n    return parentOrientation != null ? parentOrientation : tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.dataRef) == null ? void 0 : _tree$nodesRef$curren.current.orientation;\n  }, [parentId, tree, parentOrientation]);\n  const commonOnKeyDown = useEffectEvent(event => {\n    isPointerModalityRef.current = false;\n    forceSyncFocusRef.current = true;\n\n    // When composing a character, Chrome fires ArrowDown twice. Firefox/Safari\n    // don't appear to suffer from this. `event.isComposing` is avoided due to\n    // Safari not supporting it properly (although it's not needed in the first\n    // place for Safari, just avoiding any possible issues).\n    if (event.which === 229) {\n      return;\n    }\n\n    // If the floating element is animating out, ignore navigation. Otherwise,\n    // the `activeIndex` gets set to 0 despite not being open so the next time\n    // the user ArrowDowns, the first item won't be focused.\n    if (!latestOpenRef.current && event.currentTarget === floatingFocusElementRef.current) {\n      return;\n    }\n    if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl, cols)) {\n      // If the nested list's close key is also the parent navigation key,\n      // let the parent navigate. Otherwise, stop propagating the event.\n      if (!isMainOrientationKey(event.key, getParentOrientation())) {\n        stopEvent(event);\n      }\n      onOpenChange(false, event.nativeEvent, 'list-navigation');\n      if (isHTMLElement(elements.domReference)) {\n        if (virtual) {\n          tree == null || tree.events.emit('virtualfocus', elements.domReference);\n        } else {\n          elements.domReference.focus();\n        }\n      }\n      return;\n    }\n    const currentIndex = indexRef.current;\n    const minIndex = getMinListIndex(listRef, disabledIndices);\n    const maxIndex = getMaxListIndex(listRef, disabledIndices);\n    if (!typeableComboboxReference) {\n      if (event.key === 'Home') {\n        stopEvent(event);\n        indexRef.current = minIndex;\n        onNavigate();\n      }\n      if (event.key === 'End') {\n        stopEvent(event);\n        indexRef.current = maxIndex;\n        onNavigate();\n      }\n    }\n\n    // Grid navigation.\n    if (cols > 1) {\n      const sizes = itemSizes || Array.from({\n        length: listRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = createGridCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(listRef, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(listRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      const index = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex != null ? listRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        rtl,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getGridCellIndices([...(disabledIndices || listRef.current.map((_, index) => isListIndexDisabled(listRef, index) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getGridCellIndexOfCorner(indexRef.current > maxIndex ? minIndex : indexRef.current, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction\n        // we're moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT) ? 'tr' : 'tl'),\n        stopEvent: true\n      })];\n      if (index != null) {\n        indexRef.current = index;\n        onNavigate();\n      }\n      if (orientation === 'both') {\n        return;\n      }\n    }\n    if (isMainOrientationKey(event.key, orientation)) {\n      stopEvent(event);\n\n      // Reset the index if no item is focused.\n      if (open && !virtual && activeElement(event.currentTarget.ownerDocument) === event.currentTarget) {\n        indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n        onNavigate();\n        return;\n      }\n      if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n        if (loop) {\n          indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.min(maxIndex, findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          }));\n        }\n      } else {\n        if (loop) {\n          indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.max(minIndex, findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          }));\n        }\n      }\n      if (isIndexOutOfListBounds(listRef, indexRef.current)) {\n        indexRef.current = -1;\n      }\n      onNavigate();\n    }\n  });\n  const ariaActiveDescendantProp = React.useMemo(() => {\n    return virtual && open && hasActiveIndex && {\n      'aria-activedescendant': virtualId || activeId\n    };\n  }, [virtual, open, hasActiveIndex, virtualId, activeId]);\n  const floating = React.useMemo(() => {\n    return {\n      'aria-orientation': orientation === 'both' ? undefined : orientation,\n      ...(!typeableComboboxReference ? ariaActiveDescendantProp : {}),\n      onKeyDown: commonOnKeyDown,\n      onPointerMove() {\n        isPointerModalityRef.current = true;\n      }\n    };\n  }, [ariaActiveDescendantProp, commonOnKeyDown, orientation, typeableComboboxReference]);\n  const reference = React.useMemo(() => {\n    function checkVirtualMouse(event) {\n      if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    function checkVirtualPointer(event) {\n      // `pointerdown` fires first, reset the state then perform the checks.\n      focusItemOnOpenRef.current = focusItemOnOpen;\n      if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    return {\n      ...ariaActiveDescendantProp,\n      onKeyDown(event) {\n        isPointerModalityRef.current = false;\n        const isArrowKey = event.key.startsWith('Arrow');\n        const isHomeOrEndKey = ['Home', 'End'].includes(event.key);\n        const isMoveKey = isArrowKey || isHomeOrEndKey;\n        const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);\n        const isCrossCloseKey = isCrossOrientationCloseKey(event.key, orientation, rtl, cols);\n        const isParentCrossOpenKey = isCrossOrientationOpenKey(event.key, getParentOrientation(), rtl);\n        const isMainKey = isMainOrientationKey(event.key, orientation);\n        const isNavigationKey = (nested ? isParentCrossOpenKey : isMainKey) || event.key === 'Enter' || event.key.trim() === '';\n        if (virtual && open) {\n          const rootNode = tree == null ? void 0 : tree.nodesRef.current.find(node => node.parentId == null);\n          const deepestNode = tree && rootNode ? getDeepestNode(tree.nodesRef.current, rootNode.id) : null;\n          if (isMoveKey && deepestNode && virtualItemRef) {\n            const eventObject = new KeyboardEvent('keydown', {\n              key: event.key,\n              bubbles: true\n            });\n            if (isCrossOpenKey || isCrossCloseKey) {\n              var _deepestNode$context, _deepestNode$context2;\n              const isCurrentTarget = ((_deepestNode$context = deepestNode.context) == null ? void 0 : _deepestNode$context.elements.domReference) === event.currentTarget;\n              const dispatchItem = isCrossCloseKey && !isCurrentTarget ? (_deepestNode$context2 = deepestNode.context) == null ? void 0 : _deepestNode$context2.elements.domReference : isCrossOpenKey ? listRef.current.find(item => (item == null ? void 0 : item.id) === activeId) : null;\n              if (dispatchItem) {\n                stopEvent(event);\n                dispatchItem.dispatchEvent(eventObject);\n                setVirtualId(undefined);\n              }\n            }\n            if ((isMainKey || isHomeOrEndKey) && deepestNode.context) {\n              if (deepestNode.context.open && deepestNode.parentId && event.currentTarget !== deepestNode.context.elements.domReference) {\n                var _deepestNode$context$;\n                stopEvent(event);\n                (_deepestNode$context$ = deepestNode.context.elements.domReference) == null || _deepestNode$context$.dispatchEvent(eventObject);\n                return;\n              }\n            }\n          }\n          return commonOnKeyDown(event);\n        }\n        // If a floating element should not open on arrow key down, avoid\n        // setting `activeIndex` while it's closed.\n        if (!open && !openOnArrowKeyDown && isArrowKey) {\n          return;\n        }\n        if (isNavigationKey) {\n          const isParentMainKey = isMainOrientationKey(event.key, getParentOrientation());\n          keyRef.current = nested && isParentMainKey ? null : event.key;\n        }\n        if (nested) {\n          if (isParentCrossOpenKey) {\n            stopEvent(event);\n            if (open) {\n              indexRef.current = getMinListIndex(listRef, disabledIndicesRef.current);\n              onNavigate();\n            } else {\n              onOpenChange(true, event.nativeEvent, 'list-navigation');\n            }\n          }\n          return;\n        }\n        if (isMainKey) {\n          if (selectedIndex != null) {\n            indexRef.current = selectedIndex;\n          }\n          stopEvent(event);\n          if (!open && openOnArrowKeyDown) {\n            onOpenChange(true, event.nativeEvent, 'list-navigation');\n          } else {\n            commonOnKeyDown(event);\n          }\n          if (open) {\n            onNavigate();\n          }\n        }\n      },\n      onFocus() {\n        if (open && !virtual) {\n          indexRef.current = -1;\n          onNavigate();\n        }\n      },\n      onPointerDown: checkVirtualPointer,\n      onPointerEnter: checkVirtualPointer,\n      onMouseDown: checkVirtualMouse,\n      onClick: checkVirtualMouse\n    };\n  }, [activeId, ariaActiveDescendantProp, cols, commonOnKeyDown, disabledIndicesRef, focusItemOnOpen, listRef, nested, onNavigate, onOpenChange, open, openOnArrowKeyDown, orientation, getParentOrientation, rtl, selectedIndex, tree, virtual, virtualItemRef]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\nconst componentRoleToAriaRoleMap = /*#__PURE__*/new Map([['select', 'listbox'], ['combobox', 'listbox'], ['label', false]]);\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nfunction useRole(context, props) {\n  var _elements$domReferenc, _componentRoleToAriaR;\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    elements,\n    floatingId: defaultFloatingId\n  } = context;\n  const {\n    enabled = true,\n    role = 'dialog'\n  } = props;\n  const defaultReferenceId = useId();\n  const referenceId = ((_elements$domReferenc = elements.domReference) == null ? void 0 : _elements$domReferenc.id) || defaultReferenceId;\n  const floatingId = React.useMemo(() => {\n    var _getFloatingFocusElem;\n    return ((_getFloatingFocusElem = getFloatingFocusElement(elements.floating)) == null ? void 0 : _getFloatingFocusElem.id) || defaultFloatingId;\n  }, [elements.floating, defaultFloatingId]);\n  const ariaRole = (_componentRoleToAriaR = componentRoleToAriaRoleMap.get(role)) != null ? _componentRoleToAriaR : role;\n  const parentId = useFloatingParentNodeId();\n  const isNested = parentId != null;\n  const reference = React.useMemo(() => {\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return {\n        [\"aria-\" + (role === 'label' ? 'labelledby' : 'describedby')]: open ? floatingId : undefined\n      };\n    }\n    return {\n      'aria-expanded': open ? 'true' : 'false',\n      'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,\n      'aria-controls': open ? floatingId : undefined,\n      ...(ariaRole === 'listbox' && {\n        role: 'combobox'\n      }),\n      ...(ariaRole === 'menu' && {\n        id: referenceId\n      }),\n      ...(ariaRole === 'menu' && isNested && {\n        role: 'menuitem'\n      }),\n      ...(role === 'select' && {\n        'aria-autocomplete': 'none'\n      }),\n      ...(role === 'combobox' && {\n        'aria-autocomplete': 'list'\n      })\n    };\n  }, [ariaRole, floatingId, isNested, open, referenceId, role]);\n  const floating = React.useMemo(() => {\n    const floatingProps = {\n      id: floatingId,\n      ...(ariaRole && {\n        role: ariaRole\n      })\n    };\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return floatingProps;\n    }\n    return {\n      ...floatingProps,\n      ...(ariaRole === 'menu' && {\n        'aria-labelledby': referenceId\n      })\n    };\n  }, [ariaRole, floatingId, referenceId, role]);\n  const item = React.useCallback(_ref => {\n    let {\n      active,\n      selected\n    } = _ref;\n    const commonProps = {\n      role: 'option',\n      ...(active && {\n        id: floatingId + \"-fui-option\"\n      })\n    };\n\n    // For `menu`, we are unable to tell if the item is a `menuitemradio`\n    // or `menuitemcheckbox`. For backwards-compatibility reasons, also\n    // avoid defaulting to `menuitem` as it may overwrite custom role props.\n    switch (role) {\n      case 'select':\n        return {\n          ...commonProps,\n          'aria-selected': active && selected\n        };\n      case 'combobox':\n        {\n          return {\n            ...commonProps,\n            'aria-selected': selected\n          };\n        }\n    }\n    return {};\n  }, [floatingId, role]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction execWithArgsOrReturn(valueOrFn, args) {\n  return typeof valueOrFn === 'function' ? valueOrFn(args) : valueOrFn;\n}\nfunction useDelayUnmount(open, durationMs) {\n  const [isMounted, setIsMounted] = React.useState(open);\n  if (open && !isMounted) {\n    setIsMounted(true);\n  }\n  React.useEffect(() => {\n    if (!open && isMounted) {\n      const timeout = setTimeout(() => setIsMounted(false), durationMs);\n      return () => clearTimeout(timeout);\n    }\n  }, [open, isMounted, durationMs]);\n  return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    elements: {\n      floating\n    }\n  } = context;\n  const {\n    duration = 250\n  } = props;\n  const isNumberDuration = typeof duration === 'number';\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [status, setStatus] = React.useState('unmounted');\n  const isMounted = useDelayUnmount(open, closeDuration);\n  if (!isMounted && status === 'close') {\n    setStatus('unmounted');\n  }\n  useModernLayoutEffect(() => {\n    if (!floating) return;\n    if (open) {\n      setStatus('initial');\n      const frame = requestAnimationFrame(() => {\n        // Ensure it opens before paint. With `FloatingDelayGroup`,\n        // this avoids a flicker when moving between floating elements\n        // to ensure one is always open with no missing frames.\n        ReactDOM.flushSync(() => {\n          setStatus('open');\n        });\n      });\n      return () => {\n        cancelAnimationFrame(frame);\n      };\n    }\n    setStatus('close');\n  }, [open, floating]);\n  return {\n    isMounted,\n    status\n  };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    initial: unstable_initial = {\n      opacity: 0\n    },\n    open: unstable_open,\n    close: unstable_close,\n    common: unstable_common,\n    duration = 250\n  } = props;\n  const placement = context.placement;\n  const side = placement.split('-')[0];\n  const fnArgs = React.useMemo(() => ({\n    side,\n    placement\n  }), [side, placement]);\n  const isNumberDuration = typeof duration === 'number';\n  const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [styles, setStyles] = React.useState(() => ({\n    ...execWithArgsOrReturn(unstable_common, fnArgs),\n    ...execWithArgsOrReturn(unstable_initial, fnArgs)\n  }));\n  const {\n    isMounted,\n    status\n  } = useTransitionStatus(context, {\n    duration\n  });\n  const initialRef = useLatestRef(unstable_initial);\n  const openRef = useLatestRef(unstable_open);\n  const closeRef = useLatestRef(unstable_close);\n  const commonRef = useLatestRef(unstable_common);\n  useModernLayoutEffect(() => {\n    const initialStyles = execWithArgsOrReturn(initialRef.current, fnArgs);\n    const closeStyles = execWithArgsOrReturn(closeRef.current, fnArgs);\n    const commonStyles = execWithArgsOrReturn(commonRef.current, fnArgs);\n    const openStyles = execWithArgsOrReturn(openRef.current, fnArgs) || Object.keys(initialStyles).reduce((acc, key) => {\n      acc[key] = '';\n      return acc;\n    }, {});\n    if (status === 'initial') {\n      setStyles(styles => ({\n        transitionProperty: styles.transitionProperty,\n        ...commonStyles,\n        ...initialStyles\n      }));\n    }\n    if (status === 'open') {\n      setStyles({\n        transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: openDuration + \"ms\",\n        ...commonStyles,\n        ...openStyles\n      });\n    }\n    if (status === 'close') {\n      const styles = closeStyles || initialStyles;\n      setStyles({\n        transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: closeDuration + \"ms\",\n        ...commonStyles,\n        ...styles\n      });\n    }\n  }, [closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status, fnArgs]);\n  return {\n    isMounted,\n    styles\n  };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nfunction useTypeahead(context, props) {\n  var _ref;\n  const {\n    open,\n    dataRef\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onMatch: unstable_onMatch,\n    onTypingChange: unstable_onTypingChange,\n    enabled = true,\n    findMatch = null,\n    resetMs = 750,\n    ignoreKeys = [],\n    selectedIndex = null\n  } = props;\n  const timeoutIdRef = React.useRef(-1);\n  const stringRef = React.useRef('');\n  const prevIndexRef = React.useRef((_ref = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref : -1);\n  const matchIndexRef = React.useRef(null);\n  const onMatch = useEffectEvent(unstable_onMatch);\n  const onTypingChange = useEffectEvent(unstable_onTypingChange);\n  const findMatchRef = useLatestRef(findMatch);\n  const ignoreKeysRef = useLatestRef(ignoreKeys);\n  useModernLayoutEffect(() => {\n    if (open) {\n      clearTimeoutIfSet(timeoutIdRef);\n      matchIndexRef.current = null;\n      stringRef.current = '';\n    }\n  }, [open]);\n  useModernLayoutEffect(() => {\n    // Sync arrow key navigation but not typeahead navigation.\n    if (open && stringRef.current === '') {\n      var _ref2;\n      prevIndexRef.current = (_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1;\n    }\n  }, [open, selectedIndex, activeIndex]);\n  const setTypingChange = useEffectEvent(value => {\n    if (value) {\n      if (!dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    } else {\n      if (dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    }\n  });\n  const onKeyDown = useEffectEvent(event => {\n    function getMatchingIndex(list, orderedList, string) {\n      const str = findMatchRef.current ? findMatchRef.current(orderedList, string) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(string.toLocaleLowerCase())) === 0);\n      return str ? list.indexOf(str) : -1;\n    }\n    const listContent = listRef.current;\n    if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n      if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {\n        setTypingChange(false);\n      } else if (event.key === ' ') {\n        stopEvent(event);\n      }\n    }\n    if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n    // Character key.\n    event.key.length !== 1 ||\n    // Modifier key.\n    event.ctrlKey || event.metaKey || event.altKey) {\n      return;\n    }\n    if (open && event.key !== ' ') {\n      stopEvent(event);\n      setTypingChange(true);\n    }\n\n    // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n    // allow it in this case, too.\n    const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n      var _text$, _text$2;\n      return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n    });\n\n    // Allows the user to cycle through items that start with the same letter\n    // in rapid succession.\n    if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n    }\n    stringRef.current += event.key;\n    clearTimeoutIfSet(timeoutIdRef);\n    timeoutIdRef.current = window.setTimeout(() => {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n      setTypingChange(false);\n    }, resetMs);\n    const prevIndex = prevIndexRef.current;\n    const index = getMatchingIndex(listContent, [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)], stringRef.current);\n    if (index !== -1) {\n      onMatch(index);\n      matchIndexRef.current = index;\n    } else if (event.key !== ' ') {\n      stringRef.current = '';\n      setTypingChange(false);\n    }\n  });\n  const reference = React.useMemo(() => ({\n    onKeyDown\n  }), [onKeyDown]);\n  const floating = React.useMemo(() => {\n    return {\n      onKeyDown,\n      onKeyUp(event) {\n        if (event.key === ' ') {\n          setTypingChange(false);\n        }\n      }\n    };\n  }, [onKeyDown, setTypingChange]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n  return {\n    ...state,\n    rects: {\n      ...state.rects,\n      floating: {\n        ...state.rects.floating,\n        height\n      }\n    }\n  };\n}\n/**\n * Positions the floating element such that an inner element inside of it is\n * anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nconst inner = props => ({\n  name: 'inner',\n  options: props,\n  async fn(state) {\n    const {\n      listRef,\n      overflowRef,\n      onFallbackChange,\n      offset: innerOffset = 0,\n      index = 0,\n      minItemsVisible = 4,\n      referenceOverflowThreshold = 0,\n      scrollRef,\n      ...detectOverflowOptions\n    } = evaluate(props, state);\n    const {\n      rects,\n      elements: {\n        floating\n      }\n    } = state;\n    const item = listRef.current[index];\n    const scrollEl = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n\n    // Valid combinations:\n    // 1. Floating element is the scrollRef and has a border (default)\n    // 2. Floating element is not the scrollRef, floating element has a border\n    // 3. Floating element is not the scrollRef, scrollRef has a border\n    // Floating > {...getFloatingProps()} wrapper > scrollRef > items is not\n    // allowed as VoiceOver doesn't work.\n    const clientTop = floating.clientTop || scrollEl.clientTop;\n    const floatingIsBordered = floating.clientTop !== 0;\n    const scrollElIsBordered = scrollEl.clientTop !== 0;\n    const floatingIsScrollEl = floating === scrollEl;\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!state.placement.startsWith('bottom')) {\n        warn('`placement` side must be \"bottom\" when using the `inner`', 'middleware.');\n      }\n    }\n    if (!item) {\n      return {};\n    }\n    const nextArgs = {\n      ...state,\n      ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n    };\n    const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, scrollEl.scrollHeight + clientTop + floating.clientTop), detectOverflowOptions);\n    const refOverflow = await detectOverflow(nextArgs, {\n      ...detectOverflowOptions,\n      elementContext: 'reference'\n    });\n    const diffY = max(0, overflow.top);\n    const nextY = nextArgs.y + diffY;\n    const isScrollable = scrollEl.scrollHeight > scrollEl.clientHeight;\n    const rounder = isScrollable ? v => v : round;\n    const maxHeight = rounder(max(0, scrollEl.scrollHeight + (floatingIsBordered && floatingIsScrollEl || scrollElIsBordered ? clientTop * 2 : 0) - diffY - max(0, overflow.bottom)));\n    scrollEl.style.maxHeight = maxHeight + \"px\";\n    scrollEl.scrollTop = diffY;\n\n    // There is not enough space, fallback to standard anchored positioning\n    if (onFallbackChange) {\n      const shouldFallback = scrollEl.offsetHeight < item.offsetHeight * min(minItemsVisible, listRef.current.length) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold;\n      ReactDOM.flushSync(() => onFallbackChange(shouldFallback));\n    }\n    if (overflowRef) {\n      overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({\n        ...nextArgs,\n        y: nextY\n      }, scrollEl.offsetHeight + clientTop + floating.clientTop), detectOverflowOptions);\n    }\n    return {\n      y: nextY\n    };\n  }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nfunction useInnerOffset(context, props) {\n  const {\n    open,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    overflowRef,\n    scrollRef,\n    onChange: unstable_onChange\n  } = props;\n  const onChange = useEffectEvent(unstable_onChange);\n  const controlledScrollingRef = React.useRef(false);\n  const prevScrollTopRef = React.useRef(null);\n  const initialOverflowRef = React.useRef(null);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onWheel(e) {\n      if (e.ctrlKey || !el || overflowRef.current == null) {\n        return;\n      }\n      const dY = e.deltaY;\n      const isAtTop = overflowRef.current.top >= -0.5;\n      const isAtBottom = overflowRef.current.bottom >= -0.5;\n      const remainingScroll = el.scrollHeight - el.clientHeight;\n      const sign = dY < 0 ? -1 : 1;\n      const method = dY < 0 ? 'max' : 'min';\n      if (el.scrollHeight <= el.clientHeight) {\n        return;\n      }\n      if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n        e.preventDefault();\n        ReactDOM.flushSync(() => {\n          onChange(d => d + Math[method](dY, remainingScroll * sign));\n        });\n      } else if (/firefox/i.test(getUserAgent())) {\n        // Needed to propagate scrolling during momentum scrolling phase once\n        // it gets limited by the boundary. UX improvement, not critical.\n        el.scrollTop += dY;\n      }\n    }\n    const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n    if (open && el) {\n      el.addEventListener('wheel', onWheel);\n\n      // Wait for the position to be ready.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n        if (overflowRef.current != null) {\n          initialOverflowRef.current = {\n            ...overflowRef.current\n          };\n        }\n      });\n      return () => {\n        prevScrollTopRef.current = null;\n        initialOverflowRef.current = null;\n        el.removeEventListener('wheel', onWheel);\n      };\n    }\n  }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n  const floating = React.useMemo(() => ({\n    onKeyDown() {\n      controlledScrollingRef.current = true;\n    },\n    onWheel() {\n      controlledScrollingRef.current = false;\n    },\n    onPointerMove() {\n      controlledScrollingRef.current = false;\n    },\n    onScroll() {\n      const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n      if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n        return;\n      }\n      if (prevScrollTopRef.current !== null) {\n        const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n        if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n          ReactDOM.flushSync(() => onChange(d => d + scrollDiff));\n        }\n      }\n\n      // [Firefox] Wait for the height change to have been applied.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n      });\n    }\n  }), [elements.floating, onChange, overflowRef, scrollRef]);\n  return React.useMemo(() => enabled ? {\n    floating\n  } : {}, [enabled, floating]);\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n  if (onlyOpenChildren === void 0) {\n    onlyOpenChildren = true;\n  }\n  let allChildren = nodes.filter(node => {\n    var _node$context;\n    return node.parentId === id && ((_node$context = node.context) == null ? void 0 : _node$context.open);\n  });\n  let currentChildren = allChildren;\n  while (currentChildren.length) {\n    currentChildren = onlyOpenChildren ? nodes.filter(node => {\n      var _currentChildren;\n      return (_currentChildren = currentChildren) == null ? void 0 : _currentChildren.some(n => {\n        var _node$context2;\n        return node.parentId === n.id && ((_node$context2 = node.context) == null ? void 0 : _node$context2.open);\n      });\n    }) : nodes;\n    allChildren = allChildren.concat(currentChildren);\n  }\n  return allChildren;\n}\n\nfunction isPointInPolygon(point, polygon) {\n  const [x, y] = point;\n  let isInside = false;\n  const length = polygon.length;\n  for (let i = 0, j = length - 1; i < length; j = i++) {\n    const [xi, yi] = polygon[i] || [0, 0];\n    const [xj, yj] = polygon[j] || [0, 0];\n    const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n    if (intersect) {\n      isInside = !isInside;\n    }\n  }\n  return isInside;\n}\nfunction isInside(point, rect) {\n  return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\n/**\n * Generates a safe polygon area that the user can traverse without closing the\n * floating element once leaving the reference element.\n * @see https://floating-ui.com/docs/useHover#safepolygon\n */\nfunction safePolygon(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    buffer = 0.5,\n    blockPointerEvents = false,\n    requireIntent = true\n  } = options;\n  let timeoutId;\n  let hasLanded = false;\n  let lastX = null;\n  let lastY = null;\n  let lastCursorTime = performance.now();\n  function getCursorSpeed(x, y) {\n    const currentTime = performance.now();\n    const elapsedTime = currentTime - lastCursorTime;\n    if (lastX === null || lastY === null || elapsedTime === 0) {\n      lastX = x;\n      lastY = y;\n      lastCursorTime = currentTime;\n      return null;\n    }\n    const deltaX = x - lastX;\n    const deltaY = y - lastY;\n    const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n    const speed = distance / elapsedTime; // px / ms\n\n    lastX = x;\n    lastY = y;\n    lastCursorTime = currentTime;\n    return speed;\n  }\n  const fn = _ref => {\n    let {\n      x,\n      y,\n      placement,\n      elements,\n      onClose,\n      nodeId,\n      tree\n    } = _ref;\n    return function onMouseMove(event) {\n      function close() {\n        clearTimeout(timeoutId);\n        onClose();\n      }\n      clearTimeout(timeoutId);\n      if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n        return;\n      }\n      const {\n        clientX,\n        clientY\n      } = event;\n      const clientPoint = [clientX, clientY];\n      const target = getTarget(event);\n      const isLeave = event.type === 'mouseleave';\n      const isOverFloatingEl = contains(elements.floating, target);\n      const isOverReferenceEl = contains(elements.domReference, target);\n      const refRect = elements.domReference.getBoundingClientRect();\n      const rect = elements.floating.getBoundingClientRect();\n      const side = placement.split('-')[0];\n      const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n      const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n      const isOverReferenceRect = isInside(clientPoint, refRect);\n      const isFloatingWider = rect.width > refRect.width;\n      const isFloatingTaller = rect.height > refRect.height;\n      const left = (isFloatingWider ? refRect : rect).left;\n      const right = (isFloatingWider ? refRect : rect).right;\n      const top = (isFloatingTaller ? refRect : rect).top;\n      const bottom = (isFloatingTaller ? refRect : rect).bottom;\n      if (isOverFloatingEl) {\n        hasLanded = true;\n        if (!isLeave) {\n          return;\n        }\n      }\n      if (isOverReferenceEl) {\n        hasLanded = false;\n      }\n      if (isOverReferenceEl && !isLeave) {\n        hasLanded = true;\n        return;\n      }\n\n      // Prevent overlapping floating element from being stuck in an open-close\n      // loop: https://github.com/floating-ui/floating-ui/issues/1910\n      if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n        return;\n      }\n\n      // If any nested child is open, abort.\n      if (tree && getNodeChildren(tree.nodesRef.current, nodeId).some(_ref2 => {\n        let {\n          context\n        } = _ref2;\n        return context == null ? void 0 : context.open;\n      })) {\n        return;\n      }\n\n      // If the pointer is leaving from the opposite side, the \"buffer\" logic\n      // creates a point where the floating element remains open, but should be\n      // ignored.\n      // A constant of 1 handles floating point rounding errors.\n      if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n        return close();\n      }\n\n      // Ignore when the cursor is within the rectangular trough between the\n      // two elements. Since the triangle is created from the cursor point,\n      // which can start beyond the ref element's edge, traversing back and\n      // forth from the ref to the floating element can cause it to close. This\n      // ensures it always remains open in that case.\n      let rectPoly = [];\n      switch (side) {\n        case 'top':\n          rectPoly = [[left, refRect.top + 1], [left, rect.bottom - 1], [right, rect.bottom - 1], [right, refRect.top + 1]];\n          break;\n        case 'bottom':\n          rectPoly = [[left, rect.top + 1], [left, refRect.bottom - 1], [right, refRect.bottom - 1], [right, rect.top + 1]];\n          break;\n        case 'left':\n          rectPoly = [[rect.right - 1, bottom], [rect.right - 1, top], [refRect.left + 1, top], [refRect.left + 1, bottom]];\n          break;\n        case 'right':\n          rectPoly = [[refRect.right - 1, bottom], [refRect.right - 1, top], [rect.left + 1, top], [rect.left + 1, bottom]];\n          break;\n      }\n      function getPolygon(_ref3) {\n        let [x, y] = _ref3;\n        switch (side) {\n          case 'top':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'bottom':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'left':\n            {\n              const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n              return [...commonPoints, cursorPointOne, cursorPointTwo];\n            }\n          case 'right':\n            {\n              const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n        }\n      }\n      if (isPointInPolygon([clientX, clientY], rectPoly)) {\n        return;\n      }\n      if (hasLanded && !isOverReferenceRect) {\n        return close();\n      }\n      if (!isLeave && requireIntent) {\n        const cursorSpeed = getCursorSpeed(event.clientX, event.clientY);\n        const cursorSpeedThreshold = 0.1;\n        if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {\n          return close();\n        }\n      }\n      if (!isPointInPolygon([clientX, clientY], getPolygon([x, y]))) {\n        close();\n      } else if (!hasLanded && requireIntent) {\n        timeoutId = window.setTimeout(close, 40);\n      }\n    };\n  };\n  fn.__options = {\n    blockPointerEvents\n  };\n  return fn;\n}\n\nexport { Composite, CompositeItem, FloatingArrow, FloatingDelayGroup, FloatingFocusManager, FloatingList, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, NextFloatingDelayGroup, inner, safePolygon, useClick, useClientPoint, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingRootContext, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListItem, useListNavigation, useMergeRefs, useNextDelayGroup, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n    function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n    var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n    var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n    var _, done = false;\r\n    for (var i = decorators.length - 1; i >= 0; i--) {\r\n        var context = {};\r\n        for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n        for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n        context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n        var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n        if (kind === \"accessor\") {\r\n            if (result === void 0) continue;\r\n            if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n            if (_ = accept(result.get)) descriptor.get = _;\r\n            if (_ = accept(result.set)) descriptor.set = _;\r\n            if (_ = accept(result.init)) initializers.unshift(_);\r\n        }\r\n        else if (_ = accept(result)) {\r\n            if (kind === \"field\") initializers.unshift(_);\r\n            else descriptor[key] = _;\r\n        }\r\n    }\r\n    if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n    done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n    var useValue = arguments.length > 2;\r\n    for (var i = 0; i < initializers.length; i++) {\r\n        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n    }\r\n    return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n    return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n    if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n    return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n    return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n    function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n    ownKeys = Object.getOwnPropertyNames || function (o) {\r\n        var ar = [];\r\n        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n        return ar;\r\n    };\r\n    return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n    return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n    if (value !== null && value !== void 0) {\r\n        if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n        var dispose, inner;\r\n        if (async) {\r\n            if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n            dispose = value[Symbol.asyncDispose];\r\n        }\r\n        if (dispose === void 0) {\r\n            if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n            dispose = value[Symbol.dispose];\r\n            if (async) inner = dispose;\r\n        }\r\n        if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n        if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n        env.stack.push({ value: value, dispose: dispose, async: async });\r\n    }\r\n    else if (async) {\r\n        env.stack.push({ async: true });\r\n    }\r\n    return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n    function fail(e) {\r\n        env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n        env.hasError = true;\r\n    }\r\n    var r, s = 0;\r\n    function next() {\r\n        while (r = env.stack.pop()) {\r\n            try {\r\n                if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n                if (r.dispose) {\r\n                    var result = r.dispose.call(r.value);\r\n                    if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n                }\r\n                else s |= 1;\r\n            }\r\n            catch (e) {\r\n                fail(e);\r\n            }\r\n        }\r\n        if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n        if (env.hasError) throw env.error;\r\n    }\r\n    return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n    if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n        return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n            return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n        });\r\n    }\r\n    return path;\r\n}\r\n\r\nexport default {\r\n    __extends: __extends,\r\n    __assign: __assign,\r\n    __rest: __rest,\r\n    __decorate: __decorate,\r\n    __param: __param,\r\n    __esDecorate: __esDecorate,\r\n    __runInitializers: __runInitializers,\r\n    __propKey: __propKey,\r\n    __setFunctionName: __setFunctionName,\r\n    __metadata: __metadata,\r\n    __awaiter: __awaiter,\r\n    __generator: __generator,\r\n    __createBinding: __createBinding,\r\n    __exportStar: __exportStar,\r\n    __values: __values,\r\n    __read: __read,\r\n    __spread: __spread,\r\n    __spreadArrays: __spreadArrays,\r\n    __spreadArray: __spreadArray,\r\n    __await: __await,\r\n    __asyncGenerator: __asyncGenerator,\r\n    __asyncDelegator: __asyncDelegator,\r\n    __asyncValues: __asyncValues,\r\n    __makeTemplateObject: __makeTemplateObject,\r\n    __importStar: __importStar,\r\n    __importDefault: __importDefault,\r\n    __classPrivateFieldGet: __classPrivateFieldGet,\r\n    __classPrivateFieldSet: __classPrivateFieldSet,\r\n    __classPrivateFieldIn: __classPrivateFieldIn,\r\n    __addDisposableResource: __addDisposableResource,\r\n    __disposeResources: __disposeResources,\r\n    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import React, { useState, useEffect } from 'react';\r\nimport { useNavigate } from 'react-router-dom';\r\nimport './Administer.css';\r\nimport { \r\n  getAllUsers, \r\n  searchUsers, \r\n  updateUserAuthority,\r\n  getAllDiscounts,\r\n  getCurrentDiscount,\r\n  addDiscount,\r\n  deleteDiscount\r\n} from '../api/administer';\r\nimport {postAnnouncement, getAnnouncements} from '../api/announcement'; \r\nimport DatePicker from 'react-datepicker';\r\nimport 'react-datepicker/dist/react-datepicker.css';\r\n\r\n\r\nconst Administer = () => {\r\n  const navigate = useNavigate();\r\n  const [users, setUsers] = useState([]);\r\n  const [discounts, setDiscounts] = useState([]);\r\n  const [currentDiscount, setCurrentDiscount] = useState(null);\r\n  const [searchKey, setSearchKey] = useState('');\r\n  const [loading, setLoading] = useState(false);\r\n  const [error, setError] = useState(null);\r\n  const [announcements, setAnnouncements] = useState([]); // 存储公告列表\r\n  const [newAnnouncement, setNewAnnouncement] = useState({\r\n    title: '',\r\n    content: ''\r\n  });\r\n  const [newDiscount, setNewDiscount] = useState({\r\n    name: '',\r\n    discountType: 'FREE'\r\n  });\r\n  const [startDate, setStartDate] = useState(new Date());\r\n  const [endDate, setEndDate] = useState(new Date());\r\n  const [activeTab, setActiveTab] = useState('users'); // 'users' 或 'discounts','announcements'\r\n\r\nconst fetchAllUsers = async () => {\r\n  setLoading(true);\r\n  setError(null);\r\n  try {\r\n    const users = await getAllUsers();\r\n    console.log(\"API Data:\", users); // 现在应该直接是用户数组\r\n    \r\n    const formattedUsers = users.map(user => ({\r\n      username: user.username || '未知用户',\r\n      authority: user.authority || 'USER',\r\n      registTime: user.registTime || null,\r\n      lastLogin: user.lastLogin || null,\r\n      upload: Number(user.upload) || 0,\r\n      download: Number(user.download) || 0,\r\n      magicPoints: Number(user.magicPoints) || 0,\r\n      shareRate: Number(user.shareRate) || 0\r\n    }));\r\n    \r\n    console.log(\"Formatted Users:\", formattedUsers);\r\n    setUsers(formattedUsers);\r\n  } catch (err) {\r\n    console.error(\"Error details:\", err);\r\n    setError(`获取用户列表失败: ${err.message}`);\r\n  } finally {\r\n    setLoading(false);\r\n  }\r\n};\r\n\r\n\r\n const handleSearch = async () => {\r\n  if (!searchKey.trim()) {\r\n    fetchAllUsers();\r\n    return;\r\n  }\r\n\r\n  setLoading(true);\r\n  setError(null);\r\n  try {\r\n    const users = await searchUsers(searchKey);\r\n    console.log(\"Search Results:\", users); // 打印搜索结果\r\n\r\n    // 格式化数据（确保数值字段正确解析）\r\n    const formattedUsers = users.map(user => ({\r\n      username: user.username || '未知用户',\r\n      authority: user.authority || 'USER',\r\n      registTime: user.registTime || null,\r\n      lastLogin: user.lastLogin || null,\r\n      upload: Number(user.upload) || 0,    // 确保解析为数字\r\n      download: Number(user.download) || 0,\r\n      magicPoints: Number(user.magicPoints) || 0,\r\n      shareRate: Number(user.shareRate) || 0\r\n    }));\r\n\r\n    setUsers(formattedUsers);\r\n  } catch (err) {\r\n    setError('搜索用户失败，请重试');\r\n    console.error(err);\r\n  } finally {\r\n    setLoading(false);\r\n  }\r\n};\r\n\r\n  // 重置搜索\r\n  const handleReset = () => {\r\n    setSearchKey('');\r\n    fetchAllUsers();\r\n  };\r\n\r\n  // 修改用户权限\r\n  const handleChangeAuthority = async (username, newAuthority) => {\r\n    try {\r\n      await updateUserAuthority(username, newAuthority);\r\n      // 更新本地状态\r\n      setUsers(users.map(user => \r\n        user.username === username ? { ...user, authority: newAuthority } : user\r\n      ));\r\n    } catch (err) {\r\n      setError('修改权限失败，请重试');\r\n      console.error(err);\r\n    }\r\n  };\r\n\r\n   // 获取所有折扣\r\n  const fetchAllDiscounts = async () => {\r\n    setLoading(true);\r\n    setError(null);\r\n    try {\r\n      const data = await getAllDiscounts();\r\n      setDiscounts(data);\r\n    } catch (err) {\r\n      setError('获取折扣列表失败: ' + err.message);\r\n      console.error(err);\r\n    } finally {\r\n      setLoading(false);\r\n    }\r\n  };\r\n\r\n  // 获取当前折扣\r\n  const fetchCurrentDiscount = async () => {\r\n    try {\r\n      const data = await getCurrentDiscount();\r\n      setCurrentDiscount(data);\r\n    } catch (err) {\r\n      console.error('获取当前折扣失败:', err);\r\n    }\r\n  };\r\n\r\n    const handleAddDiscount = async () => {\r\n  if (!newDiscount.name || !startDate || !endDate) {\r\n    setError('请填写所有必填字段');\r\n    return;\r\n  }\r\n\r\n  try {\r\n    // 验证时间\r\n    if (startDate >= endDate) {\r\n      setError('结束时间必须晚于开始时间');\r\n      return;\r\n    }\r\n\r\n    const payload = {\r\n      name: newDiscount.name,\r\n      startTime: formatDateToISO(startDate), // 例如: \"2025-06-01T14:30:00\"\r\n      endTime: formatDateToISO(endDate, true), // 例如: \"2025-06-01T18:45:59\"\r\n      discountType: newDiscount.discountType\r\n    };\r\n\r\n    console.log('提交数据:', payload); // 调试用\r\n\r\n    await addDiscount(payload);\r\n    \r\n    // 重置表单\r\n    setNewDiscount({\r\n      name: '',\r\n      discountType: 'FREE'\r\n    });\r\n    setStartDate(new Date());\r\n    setEndDate(new Date());\r\n    \r\n    fetchAllDiscounts();\r\n    setError(null);\r\n  } catch (err) {\r\n    setError('添加折扣失败: ' + err.message);\r\n    console.error(err);\r\n  }\r\n};\r\n\r\nconst formatDateToISO = (date, isEndTime = false) => {\r\n  if (!date) return '';\r\n  \r\n  const pad = (num) => num.toString().padStart(2, '0');\r\n  \r\n  const year = date.getFullYear();\r\n  const month = pad(date.getMonth() + 1);\r\n  const day = pad(date.getDate());\r\n  const hours = pad(date.getHours());\r\n  const minutes = pad(date.getMinutes());\r\n  \r\n  if (isEndTime) {\r\n    // 结束时间精确到用户选择的时间+59秒\r\n    return `${year}-${month}-${day}T${hours}:${minutes}:59`;\r\n  } else {\r\n    // 开始时间精确到用户选择的时间+00秒\r\n    return `${year}-${month}-${day}T${hours}:${minutes}:00`;\r\n  }\r\n};\r\n\r\n  // 删除折扣\r\n  const handleDeleteDiscount = async (id) => {\r\n    try {\r\n      await deleteDiscount(id);\r\n      fetchAllDiscounts();\r\n    } catch (err) {\r\n      setError('删除折扣失败: ' + err.message);\r\n      console.error(err);\r\n    }\r\n  };\r\n\r\n  \r\n\r\n  // 格式化分享率为百分比\r\n  const formatShareRate = (rate) => {\r\n    return (rate * 100).toFixed(2) + '%';\r\n  };\r\n\r\n  // 格式化日期\r\n  const formatDate = (date) => {\r\n    if (!date) return '-';\r\n    return new Date(date).toLocaleDateString();\r\n  };\r\n    // 格式化日期\r\n  const formatDateTime = (dateTime) => {\r\n    if (!dateTime) return '-';\r\n    return new Date(dateTime).toLocaleString();\r\n  };\r\n\r\n    // 折扣类型翻译\r\n  const translateDiscountType = (type) => {\r\n    switch (type) {\r\n      case 'FREE': return '全部免费';\r\n      case 'HALF': return '半价下载';\r\n      case 'DOUBLE': return '双倍上传';\r\n      default: return type;\r\n    }\r\n  };\r\n\r\n  // 获取所有公告\r\n  const fetchAllAnnouncements = async () => {\r\n  setLoading(true);\r\n  setError(null);\r\n  try {\r\n    const announcements = await getAnnouncements();\r\n    // 确保总是设置为数组\r\n    setAnnouncements(Array.isArray(announcements) ? announcements : []);\r\n  } catch (err) {\r\n    setError('获取公告列表失败: ' + err.message);\r\n    console.error(err);\r\n  } finally {\r\n    setLoading(false);\r\n  }\r\n};\r\n\r\n  // 发布新公告\r\n  const handlePostAnnouncement = async () => {\r\n    if (!newAnnouncement.title || !newAnnouncement.content) {\r\n      setError('请填写公告标题和内容');\r\n      return;\r\n    }\r\n\r\n    try {\r\n      await postAnnouncement(newAnnouncement);\r\n      setNewAnnouncement({ title: '', content: '' });\r\n      fetchAllAnnouncements();\r\n      setError(null);\r\n    } catch (err) {\r\n      setError('发布公告失败: ' + err.message);\r\n      console.error(err);\r\n    }\r\n  };\r\n\r\n  // 初始化加载数据\r\n  useEffect(() => {\r\n    if (activeTab === 'users') {\r\n      fetchAllUsers();\r\n    } else if (activeTab === 'discounts') {\r\n      fetchAllDiscounts();\r\n      fetchCurrentDiscount();\r\n    } else if (activeTab === 'announcements') {\r\n      fetchAllAnnouncements();\r\n    }\r\n  }, [activeTab]);\r\n\r\n  \r\n\r\n\r\n  return (\r\n    <div className=\"administer-container\">\r\n      <h1>系统管理</h1>\r\n\r\n      {/* 选项卡切换 */}\r\n      <div className=\"tab-container\">\r\n        <button \r\n          className={`tab-button ${activeTab === 'users' ? 'active' : ''}`}\r\n          onClick={() => setActiveTab('users')}\r\n        >\r\n          用户管理\r\n        </button>\r\n        <button \r\n          className={`tab-button ${activeTab === 'discounts' ? 'active' : ''}`}\r\n          onClick={() => setActiveTab('discounts')}\r\n        >\r\n          折扣管理\r\n        </button>\r\n        <button \r\n          className={`tab-button ${activeTab === 'announcements' ? 'active' : ''}`}\r\n          onClick={() => setActiveTab('announcements')}\r\n        >\r\n          公告管理\r\n        </button>\r\n      </div>\r\n\r\n      {activeTab === 'users' ? (\r\n        <>\r\n            {/* 搜索框 */}\r\n            <div className=\"search-container\">\r\n                <input\r\n                type=\"text\"\r\n                value={searchKey}\r\n                onChange={(e) => setSearchKey(e.target.value)}\r\n                placeholder=\"输入用户名搜索\"\r\n                className=\"search-input\"\r\n                />\r\n                <button onClick={handleSearch} className=\"search-button\">\r\n                搜索\r\n                </button>\r\n                <button onClick={handleReset} className=\"reset-button\">\r\n                重置\r\n                </button>\r\n            </div>\r\n\r\n            {/* 错误提示 */}\r\n            {error && <div className=\"error-message\">{error}</div>}\r\n\r\n            {/* 加载状态 */}\r\n            {loading && <div className=\"loading-message\">加载中...</div>}\r\n\r\n            {/* 用户列表 */}\r\n            <div className=\"user-list-container\">\r\n                <table className=\"user-table\">\r\n                <thead>\r\n                    <tr>\r\n                    <th>用户名</th>\r\n                    <th>注册时间</th>\r\n                    <th>最后登录</th>\r\n                    <th>上传量</th>\r\n                    <th>下载量</th>\r\n                    <th>分享率</th>\r\n                    <th>魔力值</th>\r\n                    <th>权限</th>\r\n                    <th>操作</th>\r\n                    </tr>\r\n                </thead>\r\n                <tbody>\r\n                    {Array.isArray(users) && users.map((user) => (\r\n                    <tr key={user.username}>\r\n                        <td>{user.username}</td>\r\n                        <td>{formatDate(user.registTime)}</td>\r\n                        <td>{formatDate(user.lastLogin)}</td>\r\n                        <td>{user.upload}</td>\r\n                        <td>{user.download}</td>\r\n                        <td>{formatShareRate(user.shareRate)}</td>\r\n                        <td>{user.magicPoints}</td>\r\n                        <td>{user.authority}</td>\r\n                        <td>\r\n                        <select\r\n                            value={user.authority}\r\n                            onChange={(e) => handleChangeAuthority(user.username, e.target.value)}\r\n                            className=\"authority-select\"\r\n                        >\r\n                            <option value=\"USER\">普通用户</option>\r\n                            <option value=\"ADMIN\">管理员</option>\r\n                            <option value=\"LIMIT\">受限用户</option>\r\n                            <option value=\"BAN\">封禁用户</option>\r\n                        </select>\r\n                        </td>\r\n                    </tr>\r\n                    ))}\r\n                </tbody>\r\n                </table>\r\n            </div>\r\n        </>\r\n      ) : activeTab === 'discounts' ? (\r\n          /* 新增的折扣管理部分 */\r\n          <>\r\n            {/* 当前活动折扣 */}\r\n            <div className=\"current-discount-section\">\r\n              <h3>当前活动折扣</h3>\r\n              {currentDiscount ? (\r\n                <div className=\"current-discount-card\">\r\n                  <p><strong>名称:</strong> {currentDiscount.name}</p>\r\n                  <p><strong>类型:</strong> {translateDiscountType(currentDiscount.discountType)}</p>\r\n                  <p><strong>时间:</strong> {formatDateTime(currentDiscount.startTime)} 至 {formatDateTime(currentDiscount.endTime)}</p>\r\n                  <p><strong>状态:</strong> {currentDiscount.status}</p>\r\n                </div>\r\n              ) : (\r\n                <p>当前没有进行中的折扣</p>\r\n              )}\r\n            </div>\r\n\r\n            {/* 添加新折扣表单 */}\r\n            <div className=\"add-discount-form\">\r\n              <h3>添加新折扣</h3>\r\n              <div className=\"form-group\">\r\n                <label>折扣名称:</label>\r\n                <input\r\n                  type=\"text\"\r\n                  value={newDiscount.name}\r\n                  onChange={(e) => setNewDiscount({...newDiscount, name: e.target.value})}\r\n                />\r\n              </div>\r\n              <div className=\"form-group\">\r\n                  <label>开始时间:</label>\r\n                  <DatePicker\r\n                    selected={startDate}\r\n                    onChange={(date) => setStartDate(date)}\r\n                    showTimeSelect\r\n                    timeFormat=\"HH:mm\"\r\n                    timeIntervals={1} // 1分钟间隔\r\n                    dateFormat=\"yyyy-MM-dd HH:mm\"\r\n                    minDate={new Date()}\r\n                    placeholderText=\"选择开始日期和时间\"\r\n                  />\r\n              </div>\r\n              <div className=\"form-group\">\r\n                    <label>结束时间:</label>\r\n                    <DatePicker\r\n                      selected={endDate}\r\n                      onChange={(date) => setEndDate(date)}\r\n                      showTimeSelect\r\n                      timeFormat=\"HH:mm\"\r\n                      timeIntervals={1} // 1分钟间隔\r\n                      dateFormat=\"yyyy-MM-dd HH:mm\"\r\n                      minDate={startDate}\r\n                      placeholderText=\"选择结束日期和时间\"\r\n                    />\r\n              </div>\r\n              <div className=\"form-group\">\r\n                <label>折扣类型:</label>\r\n                <select\r\n                  value={newDiscount.discountType}\r\n                  onChange={(e) => setNewDiscount({...newDiscount, discountType: e.target.value})}\r\n                >\r\n                  <option value=\"FREE\">全部免费</option>\r\n                  <option value=\"HALF\">半价下载</option>\r\n                  <option value=\"DOUBLE\">双倍上传</option>\r\n                </select>\r\n              </div>\r\n              <button \r\n                  onClick={(e) => {\r\n                      e.preventDefault(); // 确保没有阻止默认行为\r\n                      handleAddDiscount();\r\n                  }}\r\n                  >\r\n                  添加折扣\r\n              </button>\r\n            </div>\r\n\r\n            {/* 所有折扣列表 */}\r\n            <div className=\"discount-list-container\">\r\n              <h3>所有折扣计划</h3>\r\n              <table className=\"discount-table\">\r\n                <thead>\r\n                  <tr>\r\n                    <th>ID</th>\r\n                    <th>名称</th>\r\n                    <th>开始时间</th>\r\n                    <th>结束时间</th>\r\n                    <th>类型</th>\r\n                    <th>创建时间</th>\r\n                    <th>状态</th>\r\n                    <th>操作</th>\r\n                  </tr>\r\n                </thead>\r\n                <tbody>\r\n                  {discounts.map(discount => (\r\n                    <tr key={discount.id}>\r\n                      <td>{discount.id}</td>\r\n                      <td>{discount.name}</td>\r\n                      <td>{formatDateTime(discount.startTime)}</td>\r\n                      <td>{formatDateTime(discount.endTime)}</td>\r\n                      <td>{translateDiscountType(discount.discountType)}</td>\r\n                      <td>{formatDateTime(discount.createTime)}</td>\r\n                      <td>{discount.status || '未知'}</td>\r\n                      <td>\r\n                        <button \r\n                          onClick={() => handleDeleteDiscount(discount.id)}\r\n                          className=\"delete-button\"\r\n                        >\r\n                          删除\r\n                        </button>\r\n                      </td>\r\n                    </tr>\r\n                  ))}\r\n                </tbody>\r\n              </table>\r\n            </div>\r\n          </>\r\n        ) : (\r\n        /* 新增的公告管理部分 */\r\n        <>\r\n          {/* 发布新公告表单 */}\r\n          <div className=\"announcement-form\">\r\n            <h3>发布新公告</h3>\r\n            <div className=\"form-group\">\r\n              <label>公告标题:</label>\r\n              <input\r\n                type=\"text\"\r\n                value={newAnnouncement.title}\r\n                onChange={(e) => setNewAnnouncement({\r\n                  ...newAnnouncement,\r\n                  title: e.target.value\r\n                })}\r\n                placeholder=\"输入公告标题\"\r\n              />\r\n            </div>\r\n            <div className=\"form-group\">\r\n              <label>公告内容:</label>\r\n              <textarea\r\n                value={newAnnouncement.content}\r\n                onChange={(e) => setNewAnnouncement({\r\n                  ...newAnnouncement,\r\n                  content: e.target.value\r\n                })}\r\n                rows=\"5\"\r\n                placeholder=\"输入公告内容\"\r\n              />\r\n            </div>\r\n            <button onClick={handlePostAnnouncement}>\r\n              发布公告\r\n            </button>\r\n          </div>\r\n\r\n          {/* 所有公告列表 */}\r\n          <div className=\"announcement-list-container\">\r\n            <h3>所有公告</h3>\r\n            <table className=\"announcement-table\">\r\n              <thead>\r\n                <tr>\r\n                  <th>标题</th>\r\n                  <th>内容</th>\r\n                  <th>发布时间</th>\r\n                </tr>\r\n              </thead>\r\n              <tbody>\r\n                {announcements.map(announcement => (\r\n                  <tr key={announcement.id}>\r\n                    <td>{announcement.title}</td>\r\n                    <td>{announcement.content}</td>\r\n                    <td>{formatDateTime(announcement.createTime)}</td>\r\n                  </tr>\r\n                ))}\r\n              </tbody>\r\n            </table>\r\n          </div>\r\n        </>\r\n      )}\r\n    </div>\r\n  );\r\n};\r\n\r\nexport default Administer;","// src/App.jsx\r\nimport React from 'react';\r\nimport { \r\n  BrowserRouter as Router,\r\n  Routes,\r\n  Route,\r\n  Navigate\r\n} from 'react-router-dom';\r\nimport Dashboard from './components/Dashboard';\r\nimport Personal from './components/Personal/Personal';\r\nimport AuthForm from './components/AuthForm';\r\nimport AnnouncementDetail from './components/AnnouncementDetail';\r\n\r\nimport TorrentDetail from './components/TorrentDetail'; // 确保路径正确\r\nimport RequestDetail from './components/RequestDetail';\r\nimport HelpDetail from './components/HelpDetail';\r\nimport Exchange from './components/Personal/Exchange';\r\nimport Upload from './components/Personal/Upload';\r\nimport Notice from './components/Personal/Notice';\r\nimport Setting from './components/Personal/Setting';\r\nimport Administer from './components/Administer';\r\n\r\nimport './App.css';\r\n\r\nfunction App() {\r\n  // 每次应用启动时强制清除 token\r\n  React.useEffect(() => {\r\n    localStorage.removeItem('token');\r\n    console.log('Token cleared on app startup');\r\n    localStorage.removeItem('username');\r\n  }, []); // 空依赖数组表示只在组件挂载时执行一次\r\n\r\n  const [isAuthenticated, setIsAuthenticated] = React.useState(\r\n    false\r\n  );\r\n\r\n  const handleLoginSuccess = (token) => {\r\n    setIsAuthenticated(true);\r\n  };\r\n\r\n  const handleLogout = () => {\r\n    localStorage.removeItem('token');\r\n    setIsAuthenticated(false);\r\n  };\r\n\r\n  return (\r\n    <Router>\r\n      <Routes>\r\n        {/* 修改点1：根路径强制跳转到登录页 */}\r\n        <Route path=\"/\" element={<Navigate to=\"/login\" replace />} />\r\n\r\n        {/* 登录页 */}\r\n        <Route path=\"/login\" element={\r\n          isAuthenticated ? (\r\n            <Navigate to=\"/dashboard\" replace />\r\n          ) : (\r\n            <AuthForm onLoginSuccess={handleLoginSuccess} />\r\n          )\r\n        } />\r\n\r\n        {/* 主面板 */}\r\n        <Route path=\"/dashboard/:tab?\" element={\r\n          isAuthenticated ? (\r\n            <Dashboard onLogout={handleLogout} />\r\n          ) : (\r\n            <Navigate to=\"/login\" replace />\r\n          )\r\n        } />\r\n\r\n        {/* 公告详情 */}\r\n        <Route path=\"/announcement/:id\" element={\r\n          isAuthenticated ? (\r\n            <AnnouncementDetail onLogout={handleLogout} />\r\n          ) : (\r\n            <Navigate to=\"/login\" replace />\r\n          )\r\n        } />\r\n\r\n        {/* 个人中心及子功能页面 */}\r\n        <Route path=\"/personal\" element={\r\n          isAuthenticated ? <Personal onLogout={handleLogout} /> : <Navigate to=\"/login\" replace />\r\n        } />\r\n        <Route path=\"/personal/exchange\" element={\r\n          isAuthenticated ? <Exchange onLogout={handleLogout} /> : <Navigate to=\"/login\" replace />\r\n        } />\r\n        <Route path=\"/personal/upload\" element={\r\n          isAuthenticated ? <Upload onLogout={handleLogout} /> : <Navigate to=\"/login\" replace />\r\n        } />\r\n        <Route path=\"/personal/notice\" element={\r\n          isAuthenticated ? <Notice onLogout={handleLogout} /> : <Navigate to=\"/login\" replace />\r\n        } />\r\n        <Route path=\"/personal/setting\" element={\r\n          isAuthenticated ? <Setting onLogout={handleLogout} /> : <Navigate to=\"/login\" replace />\r\n        } />\r\n\r\n        \r\n        {/* 404 重定向 */}\r\n        <Route path=\"*\" element={\r\n          isAuthenticated ? (\r\n            <Navigate to=\"/dashboard\" replace />\r\n          ) : (\r\n            <Navigate to=\"/login\" replace />\r\n          )\r\n        } />\r\n\r\n        {/* 新增管理员中心路由 */}\r\n        <Route path=\"/administer\" element={\r\n          isAuthenticated ? (\r\n            <Administer onLogout={handleLogout} />\r\n          ) : (\r\n            <Navigate to=\"/login\" replace />\r\n          )\r\n        } />\r\n\r\n        {/* 求种区 */}\r\n        <Route path=\"/request/:id\" element={\r\n          isAuthenticated ? (\r\n            <RequestDetail onLogout={handleLogout} />\r\n          ) : (\r\n            <Navigate to=\"/login\" replace />\r\n          )\r\n        } />\r\n\r\n        {/* 求助区 */}\r\n        <Route path=\"/help/:id\" element={\r\n          isAuthenticated ? (\r\n            <HelpDetail onLogout={handleLogout} />\r\n          ) : (\r\n            <Navigate to=\"/login\" replace />\r\n          )\r\n        } />\r\n\r\n        <Route path=\"/torrent/:id\" element={\r\n          isAuthenticated ? (\r\n            <TorrentDetail onLogout={handleLogout} />\r\n          ) : (\r\n            <Navigate to=\"/login\" replace />\r\n          )\r\n        } />\r\n\r\n\r\n\r\n      </Routes>\r\n\r\n      \r\n    </Router>\r\n  );\r\n}\r\n\r\nexport default App;","const reportWebVitals = onPerfEntry => {\r\n  if (onPerfEntry && onPerfEntry instanceof Function) {\r\n    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n      getCLS(onPerfEntry);\r\n      getFID(onPerfEntry);\r\n      getFCP(onPerfEntry);\r\n      getLCP(onPerfEntry);\r\n      getTTFB(onPerfEntry);\r\n    });\r\n  }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","// 1. 首先放所有 import 语句\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom/client';\r\nimport './index.css';\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport process from 'process/browser';  // 新增\r\nimport { Buffer } from 'buffer';        // 新增\r\n\r\n// 2. 然后放 polyfill 代码\r\nif (typeof window.process === 'undefined') {\r\n  window.process = process;\r\n}\r\nif (typeof window.Buffer === 'undefined') {\r\n  window.Buffer = Buffer;\r\n}\r\n\r\n// 3. 最后放应用逻辑\r\nconst root = ReactDOM.createRoot(document.getElementById('root'));\r\nroot.render(\r\n  <React.StrictMode>\r\n    <App />\r\n  </React.StrictMode>\r\n);\r\n\r\nreportWebVitals();"],"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","appendClass","parseValue","Array","isArray","apply","toString","Object","prototype","includes","key","call","value","newClass","module","exports","default","u","b","Symbol","for","c","d","e","f","g","h","k","l","m","n","p","q","t","v","a","r","$$typeof","type","ForwardRef","isMemo","byteLength","b64","lens","getLens","validLen","placeHoldersLen","toByteArray","tmp","arr","Arr","_byteLength","curByte","len","revLookup","charCodeAt","fromByteArray","uint8","extraBytes","parts","maxChunkLength","len2","push","encodeChunk","lookup","join","Uint8Array","code","Error","indexOf","start","end","num","output","cachedSetTimeout","cachedClearTimeout","process","defaultSetTimout","defaultClearTimeout","runTimeout","fun","setTimeout","this","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","run","marker","runClearTimeout","Item","array","noop","nextTick","args","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","base64","require","ieee754","customInspectSymbol","Buffer","K_MAX_LENGTH","createBuffer","RangeError","buf","setPrototypeOf","encodingOrOffset","TypeError","allocUnsafe","from","string","encoding","isEncoding","actual","write","slice","fromString","ArrayBuffer","isView","arrayView","isInstance","copy","fromArrayBuffer","buffer","byteOffset","fromArrayLike","fromArrayView","SharedArrayBuffer","valueOf","obj","isBuffer","checked","undefined","numberIsNaN","data","fromObject","toPrimitive","assertSize","size","mustMatch","loweredCase","utf8ToBytes","base64ToBytes","toLowerCase","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","bidirectionalIndexOf","val","arrayIndexOf","lastIndexOf","indexSize","arrLength","valLength","String","read","readUInt16BE","foundIndex","found","j","hexWrite","offset","Number","remaining","strLen","parsed","parseInt","substr","utf8Write","blitBuffer","asciiWrite","str","byteArray","asciiToBytes","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","Math","min","res","firstByte","codePoint","bytesPerSequence","secondByte","thirdByte","fourthByte","tempCodePoint","codePoints","MAX_ARGUMENTS_LENGTH","fromCharCode","decodeCodePointsArray","TYPED_ARRAY_SUPPORT","proto","foo","typedArraySupport","console","error","defineProperty","enumerable","get","poolSize","alloc","fill","allocUnsafeSlow","_isBuffer","compare","x","y","list","pos","set","swap16","swap32","swap64","toLocaleString","equals","inspect","max","replace","trim","target","thisStart","thisEnd","thisCopy","targetCopy","isFinite","toJSON","_arr","ret","out","hexSliceLookupTable","bytes","checkOffset","ext","checkInt","wrtBigUInt64LE","checkIntBI","BigInt","wrtBigUInt64BE","checkIEEE754","writeFloat","littleEndian","noAssert","writeDouble","newBuf","subarray","readUintLE","readUIntLE","mul","readUintBE","readUIntBE","readUint8","readUInt8","readUint16LE","readUInt16LE","readUint16BE","readUint32LE","readUInt32LE","readUint32BE","readUInt32BE","readBigUInt64LE","defineBigIntMethod","validateNumber","first","last","boundsError","readBigUInt64BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readBigInt64LE","readBigInt64BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUintLE","writeUIntLE","writeUintBE","writeUIntBE","writeUint8","writeUInt8","writeUint16LE","writeUInt16LE","writeUint16BE","writeUInt16BE","writeUint32LE","writeUInt32LE","writeUint32BE","writeUInt32BE","writeBigUInt64LE","writeBigUInt64BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeBigInt64LE","writeBigInt64BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","copyWithin","errors","E","sym","getMessage","Base","constructor","super","writable","configurable","stack","message","addNumericalSeparator","range","ERR_OUT_OF_RANGE","checkBounds","ERR_INVALID_ARG_TYPE","floor","ERR_BUFFER_OUT_OF_BOUNDS","input","msg","received","isInteger","abs","INVALID_BASE64_RE","Infinity","leadSurrogate","split","base64clean","src","dst","alphabet","table","i16","fn","BufferBigIntNotDefined","Scheduler","React","ReactDOM","formatProdErrorMessage","url","encodeURIComponent","isValidContainer","node","nodeType","getNearestMountedFiber","fiber","nearestMounted","alternate","return","flags","tag","getSuspenseInstanceFromFiber","suspenseState","memoizedState","dehydrated","assertIsMounted","findCurrentHostFiberImpl","child","sibling","assign","REACT_LEGACY_ELEMENT_TYPE","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONSUMER_TYPE","REACT_CONTEXT_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_ACTIVITY_TYPE","REACT_MEMO_CACHE_SENTINEL","MAYBE_ITERATOR_SYMBOL","iterator","getIteratorFn","maybeIterable","REACT_CLIENT_REFERENCE","getComponentNameFromType","displayName","_context","innerType","render","_payload","_init","isArrayImpl","ReactSharedInternals","__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE","ReactDOMSharedInternals","__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE","sharedNotPendingObject","pending","method","action","valueStack","index","createCursor","defaultValue","current","pop","cursor","contextStackCursor","contextFiberStackCursor","rootInstanceStackCursor","hostTransitionProviderCursor","pushHostContainer","nextRootInstance","documentElement","namespaceURI","getOwnHostContext","tagName","getChildHostContextProd","popHostContainer","pushHostContext","context","JSCompiler_inline_result","popHostContext","HostTransitionContext","_currentValue","scheduleCallback$3","unstable_scheduleCallback","cancelCallback$1","unstable_cancelCallback","shouldYield","unstable_shouldYield","requestPaint","unstable_requestPaint","now","unstable_now","getCurrentPriorityLevel","unstable_getCurrentPriorityLevel","ImmediatePriority","unstable_ImmediatePriority","UserBlockingPriority","unstable_UserBlockingPriority","NormalPriority$1","unstable_NormalPriority","LowPriority","unstable_LowPriority","IdlePriority","unstable_IdlePriority","log$1","log","unstable_setDisableYieldValue","rendererID","injectedHook","setIsStrictModeForDevtools","newIsStrictMode","setStrictMode","err","clz32","LN2","nextTransitionLane","nextRetryLane","getHighestPriorityLanes","lanes","pendingSyncLanes","getNextLanes","root","wipLanes","rootHasPendingCommit","pendingLanes","nextLanes","suspendedLanes","pingedLanes","warmLanes","nonIdlePendingLanes","checkIfRootIsPrerendering","renderLanes","computeExpirationTime","lane","currentTime","claimNextTransitionLane","claimNextRetryLane","createLaneMap","initial","laneMap","markRootUpdated$1","updateLane","markSpawnedDeferredLane","spawnedLane","entangledLanes","spawnedLaneIndex","entanglements","markRootEntangled","rootEntangledLanes","index$6","getBumpedLaneForHydrationByLane","lanesToEventPriority","resolveUpdatePriority","updatePriority","window","event","getEventPriority","randomKey","random","internalInstanceKey","internalPropsKey","internalContainerInstanceKey","internalEventHandlersKey","internalEventHandlerListenersKey","internalEventHandlesSetKey","internalRootNodeResourcesKey","internalHoistableMarker","detachDeletedInstance","getClosestInstanceFromNode","targetNode","targetInst","parentNode","getParentSuspenseInstance","getInstanceFromNode","getNodeFromInstance","inst","stateNode","getResourcesFromRoot","resources","hoistableStyles","Map","hoistableScripts","markNodeAsHoistable","allNativeEvents","Set","registrationNameDependencies","registerTwoPhaseEvent","registrationName","dependencies","registerDirectEvent","add","prefix","suffix","VALID_ATTRIBUTE_NAME_REGEX","RegExp","illegalAttributeNameCache","validatedAttributeNameCache","setValueForAttribute","attributeName","test","removeAttribute","prefix$8","setAttribute","setValueForKnownAttribute","setValueForNamespacedAttribute","namespace","setAttributeNS","describeBuiltInComponentFrame","match","reentry","describeNativeComponentFrame","construct","previousPrepareStackTrace","prepareStackTrace","RunInRootFrame","DetermineComponentFrameRoot","Fake","Reflect","control","x$9","x$10","catch","sample","namePropDescriptor","getOwnPropertyDescriptor","_RunInRootFrame$Deter","sampleStack","controlStack","sampleLines","controlLines","frame","describeFiber","getStackByFiberInDevAndProd","workInProgress","info","getToStringValue","isCheckable","elem","nodeName","track","_valueTracker","valueField","descriptor","currentValue","getValue","setValue","stopTracking","trackValueOnNode","updateValueIfChanged","tracker","lastValue","getActiveElement","doc","document","activeElement","body","escapeSelectorAttributeValueInsideDoubleQuotesRegex","escapeSelectorAttributeValueInsideDoubleQuotes","ch","updateInput","element","lastDefaultValue","defaultChecked","setDefaultValue","initInput","isHydrating","ownerDocument","updateOptions","multiple","propValue","setDefaultSelected","options","selected","defaultSelected","disabled","updateTextarea","initTextarea","children","textContent","setTextContent","text","firstChild","lastChild","nodeValue","unitlessNumbers","setValueForStyle","style","styleName","isCustomProperty","setProperty","cssFloat","has","setValueForStyles","styles","prevStyles","styleName$16","styleName$17","isCustomElement","aliases","isJavaScriptProtocol","sanitizeURL","currentReplayingEvent","getEventTarget","nativeEvent","srcElement","correspondingUseElement","restoreTarget","restoreQueue","restoreStateOfTarget","internalInstance","props","querySelectorAll","otherNode","form","otherProps","isInsideEventHandler","batchedUpdates$1","flushSyncWork$1","getListener","canUseDOM","createElement","passiveBrowserEventsSupported","addEventListener","removeEventListener","startText","fallbackText","getData","startValue","startLength","endValue","endLength","minEnd","getEventCharCode","keyCode","charCode","functionThatReturnsTrue","functionThatReturnsFalse","createSyntheticEvent","Interface","SyntheticBaseEvent","reactName","reactEventType","nativeEventTarget","propName","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","preventDefault","stopPropagation","cancelBubble","persist","isPersistent","lastMovementX","lastMovementY","lastMouseEvent","EventInterface","eventPhase","bubbles","cancelable","timeStamp","Date","isTrusted","SyntheticEvent","UIEventInterface","view","detail","SyntheticUIEvent","MouseEventInterface","screenX","screenY","clientX","clientY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","getEventModifierState","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","SyntheticMouseEvent","SyntheticDragEvent","dataTransfer","SyntheticFocusEvent","SyntheticAnimationEvent","animationName","elapsedTime","pseudoElement","SyntheticClipboardEvent","clipboardData","SyntheticCompositionEvent","normalizeKey","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","translateToKey","modifierKeyToProp","Alt","Control","Meta","Shift","modifierStateGetter","keyArg","SyntheticKeyboardEvent","location","repeat","locale","which","SyntheticPointerEvent","pointerId","width","height","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","SyntheticTouchEvent","touches","targetTouches","changedTouches","SyntheticTransitionEvent","propertyName","SyntheticWheelEvent","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","SyntheticToggleEvent","newState","oldState","END_KEYCODES","canUseCompositionEvent","documentMode","canUseTextInputEvent","useFallbackCompositionData","SPACEBAR_CHAR","hasSpaceKeypress","isFallbackCompositionEnd","domEventName","getDataFromCustomEvent","isComposing","supportedInputTypes","color","date","datetime","email","month","number","password","search","tel","time","week","isTextInputElement","createAndAccumulateChangeEvent","dispatchQueue","accumulateTwoPhaseListeners","activeElement$1","activeElementInst$1","runEventInBatch","processDispatchQueue","getInstIfValueChanged","getTargetInstForChangeEvent","isInputEventSupported","JSCompiler_inline_result$jscomp$282","isSupported$jscomp$inline_417","element$jscomp$inline_418","oninput","stopWatchingForValueChange","detachEvent","handlePropertyChange","handleEventsForInputEventPolyfill","attachEvent","getTargetInstForInputEventPolyfill","getTargetInstForClickEvent","getTargetInstForInputOrChangeEvent","objectIs","is","shallowEqual","objA","objB","keysA","keys","keysB","currentKey","getLeafNode","getNodeForCharacterOffset","nodeEnd","nextSibling","containsNode","outerNode","innerNode","contains","compareDocumentPosition","getActiveElementDeep","containerInfo","defaultView","HTMLIFrameElement","contentWindow","href","hasSelectionCapabilities","contentEditable","skipSelectionChangeEvent","activeElementInst","lastSelection","mouseDown","constructSelectEvent","selectionStart","selectionEnd","anchorNode","getSelection","anchorOffset","focusNode","focusOffset","makePrefixMap","styleProp","eventName","prefixes","vendorPrefixes","animationend","animationiteration","animationstart","transitionrun","transitionstart","transitioncancel","transitionend","prefixedEventNames","getVendorPrefixedEventName","prefixMap","animation","transition","ANIMATION_END","ANIMATION_ITERATION","ANIMATION_START","TRANSITION_RUN","TRANSITION_START","TRANSITION_CANCEL","TRANSITION_END","topLevelEventsToReactNames","simpleEventPluginEvents","registerSimpleEvent","CapturedStacks","WeakMap","createCapturedValueAtFiber","source","existing","concurrentQueues","concurrentQueuesIndex","concurrentlyUpdatedLanes","finishQueueingConcurrentUpdates","endIndex","update","next","markUpdateLaneFromFiberToRoot","enqueueUpdate$1","enqueueConcurrentHookUpdate","getRootForUpdatedFiber","enqueueConcurrentRenderForLane","sourceFiber","isHidden","parent","childLanes","_visibility","hiddenUpdates","nestedUpdateCount","rootWithNestedUpdates","emptyContextObject","FiberNode","pendingProps","mode","elementType","refCleanup","ref","updateQueue","memoizedProps","subtreeFlags","deletions","createFiberImplClass","shouldConstruct","Component","isReactComponent","createWorkInProgress","firstContext","resetWorkInProgress","createFiberFromTypeAndProps","owner","fiberTag","hostContext","itemProp","precedence","rel","onLoad","onError","async","isHostHoistableType","createFiberFromFragment","elements","createFiberFromText","content","createFiberFromPortal","portal","pendingChildren","implementation","forkStack","forkStackIndex","treeForkProvider","treeForkCount","idStack","idStackIndex","treeContextProvider","treeContextId","treeContextOverflow","pushTreeFork","totalChildren","pushTreeId","baseIdWithLeadingBit","baseLength","numberOfOverflowBits","pushMaterializedTreeId","popTreeContext","hydrationParentFiber","nextHydratableInstance","hydrationErrors","rootOrSingletonContext","HydrationMismatchException","throwOnHydrationMismatch","queueHydrationError","prepareToHydrateHostInstance","instance","listenToNonDelegatedEvent","mediaEventTypes","suppressHydrationWarning","checkForUnmatchedText","popover","onScroll","onScrollEnd","onClick","onclick","noop$1","popToNextHostParent","popHydrationState","JSCompiler_temp","shouldSetTextContent","getNextHydratable","isSingletonScope","previousHydratableOnEnteringScopedSingleton","resetHydrationState","upgradeHydrationErrorsToRecoverable","queuedErrors","workInProgressRootRecoverableErrors","valueCursor","currentlyRenderingFiber$1","lastContextDependency","pushProvider","providerFiber","nextValue","popProvider","scheduleContextWorkOnParentPath","propagationRoot","propagateContextChanges","contexts","forcePropagateEntireTree","nextFiber","dependency","propagateParentContextChanges","isInsidePropagationBailout","currentParent","checkIfContextChanged","currentDependencies","memoizedValue","prepareToReadContext","readContext","readContextForConsumer","readContextDuringReconciliation","consumer","AbortControllerLocal","AbortController","signal","aborted","listener","abort","forEach","scheduleCallback$2","NormalPriority","CacheContext","Consumer","Provider","_currentValue2","_threadCount","createCache","controller","refCount","releaseCache","cache","currentEntangledListeners","currentEntangledPendingCount","currentEntangledLane","currentEntangledActionThenable","pingEngtangledActionScope","status","prevOnStartTransitionFinish","S","then","thenable","entangledListeners","requestTransitionLane","resolve","entangleAsyncAction","resumedCache","peekCacheFromPool","cacheResumedFromPreviousRender","workInProgressRoot","pooledCache","pushTransition","offscreenWorkInProgress","prevCachePool","pool","getSuspendedCache","cacheFromPool","SuspenseException","SuspenseyCommitException","SuspenseActionException","noopSuspenseyCommitThenable","isThenableResolved","noop$3","trackUsedThenable","thenableState","checkIfUseWrappedInAsyncCatch","reason","shellSuspendCounter","fulfilledValue","fulfilledThenable","rejectedThenable","suspendedThenable","getSuspendedThenable","rejectedReason","hasForceUpdate","initializeUpdateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","hiddenCallbacks","callbacks","cloneUpdateQueue","createUpdate","payload","callback","enqueueUpdate","executionContext","entangleTransitions","queueLanes","enqueueCapturedUpdate","capturedUpdate","newFirst","newLast","clone","didReadFromEntangledAsyncAction","suspendIfUpdateReadFromEntangledAsyncAction","processUpdateQueue","workInProgress$jscomp$0","instance$jscomp$0","pendingQueue","lastPendingUpdate","firstPendingUpdate","isHiddenUpdate","workInProgressRootRenderLanes","workInProgressRootSkippedLanes","callCallback","commitCallbacks","currentTreeHiddenStackCursor","prevEntangledRenderLanesCursor","pushHiddenContext","entangledRenderLanes","baseLanes","reuseHiddenContextOnStack","popHiddenContext","currentlyRenderingFiber","currentHook","workInProgressHook","didScheduleRenderPhaseUpdate","didScheduleRenderPhaseUpdateDuringThisPass","shouldDoubleInvokeUserFnsInHooksDEV","localIdCounter","thenableIndexCounter$1","thenableState$1","globalClientIdCounter","throwInvalidHookError","areHookInputsEqual","nextDeps","prevDeps","renderWithHooks","secondArg","nextRenderLanes","H","HooksDispatcherOnMount","HooksDispatcherOnUpdate","renderWithHooksAgain","finishRenderingHooks","ContextOnlyDispatcher","didRenderTooFewHooks","didReceiveUpdate","numberOfReRenders","lastEffect","events","stores","memoCache","HooksDispatcherOnRerender","TransitionAwareHostComponent","dispatcher","maybeThenable","useState","useThenable","checkDidRenderIdHook","didRenderIdHook","bailoutHooks","resetHooksOnUnwind","mountWorkInProgressHook","hook","baseQueue","updateWorkInProgressHook","nextCurrentHook","nextWorkInProgressHook","use","usable","useMemoCache","map","basicStateReducer","state","updateReducer","reducer","updateReducerImpl","lastRenderedReducer","baseFirst","newBaseQueueFirst","newBaseQueueLast","didReadFromEntangledAsyncAction$32","revertLane","hasEagerState","eagerState","lastRenderedState","dispatch","rerenderReducer","lastRenderPhaseUpdate","updateSyncExternalStore","subscribe","getSnapshot","getServerSnapshot","isHydrating$jscomp$0","snapshotChanged","updateEffectImpl","subscribeToStore","bind","pushSimpleEffect","destroy","resource","updateStoreInstance","pushStoreConsistencyCheck","renderedSnapshot","nextSnapshot","checkIfSnapshotChanged","forceStoreRerender","latestGetSnapshot","scheduleUpdateOnFiber","mountStateImpl","initialState","initialStateInitializer","updateOptimisticImpl","passthrough","dispatchActionState","actionQueue","setPendingState","setState","isRenderPhaseUpdate","actionNode","isTransition","T","runActionStateAction","prevState","prevTransition","currentTransition","onStartTransitionFinish","handleActionReturnValue","onActionError","error$38","nextState","onActionSuccess","notifyActionListeners","actionStateReducer","mountActionState","initialStateProp","ssrFormState","formState","JSCompiler_inline_result$jscomp$0","inRootOrSingleton","dispatchSetState","dispatchOptimisticSetState","updateActionState","updateActionStateImpl","stateHook","currentStateHook","actionStateActionEffect","rerenderActionState","create","createDeps","deps","updateRef","mountEffectImpl","fiberFlags","hookFlags","mountEffect","updateEffect","updateInsertionEffect","updateLayoutEffect","imperativeHandleEffect","updateImperativeHandle","mountDebugValue","updateCallback","updateMemo","nextCreate","mountDeferredValueImpl","initialValue","requestDeferredLane","updateDeferredValueImpl","prevValue","startTransition","pendingState","finishedState","previousPriority","dispatchSetStateInternal","result","thenableWithOverride","chainThenableValue","requestUpdateLane","noop$2","startHostTransition","formFiber","formData","ensureFormComponentIsStateful","requestFormReset$1","existingStateHook","initialResetState","useHostTransitionStatus","updateId","updateRefresh","refreshCache","provider","root$41","dispatchReducerAction","enqueueRenderPhaseUpdate","entangleTransitionUpdate","currentState","throwIfDuringRender","useCallback","useContext","useEffect","useImperativeHandle","useLayoutEffect","useInsertionEffect","useMemo","useReducer","useRef","useDebugValue","useDeferredValue","useTransition","useSyncExternalStore","useId","useFormState","useActionState","useOptimistic","useCacheRefresh","initialArg","init","identifierPrefix","booleanOrThenable","thenableIndexCounter","unwrapThenable","coerceRef","throwOnInvalidObjectType","returnFiber","newChild","resolveLazy","lazyType","createChildReconciler","shouldTrackSideEffects","deleteChild","childToDelete","deleteRemainingChildren","currentFirstChild","mapRemainingChildren","existingChildren","useFiber","placeChild","newFiber","lastPlacedIndex","newIndex","placeSingleChild","updateTextNode","updateElement","updateFragment","updatePortal","fragment","createChild","updateSlot","oldFiber","updateFromMap","newIdx","reconcileChildFibersImpl","newChildren","resultingFirstChild","previousNewFiber","nextOldFiber","delete","reconcileChildrenArray","step","done","reconcileChildrenIterator","firstChildFiber","reconcileChildFibers","mountChildFibers","suspenseHandlerStackCursor","shellBoundary","pushPrimaryTreeSuspenseHandler","handler","suspenseStackCursor","pushOffscreenSuspenseHandler","reuseSuspenseHandlerOnStack","popSuspenseHandler","findFirstSuspended","row","isSuspenseInstanceFallback","revealOrder","applyDerivedStateFromProps","ctor","getDerivedStateFromProps","nextProps","classComponentUpdater","enqueueSetState","_reactInternals","enqueueReplaceState","enqueueForceUpdate","checkShouldComponentUpdate","oldProps","newProps","nextContext","shouldComponentUpdate","isPureReactComponent","callComponentWillReceiveProps","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","resolveClassComponentProps","baseProps","defaultProps","propName$73","reportGlobalError","reportError","ErrorEvent","dispatchEvent","defaultOnUncaughtError","defaultOnCaughtError","defaultOnRecoverableError","logUncaughtError","errorInfo","onUncaughtError","componentStack","e$74","logCaughtError","boundary","onCaughtError","errorBoundary","e$75","createRootErrorUpdate","createClassErrorUpdate","initializeClassErrorUpdate","getDerivedStateFromError","componentDidCatch","legacyErrorBoundariesThatAlreadyFailed","SelectiveHydrationException","reconcileChildren","nextChildren","updateForwardRef","propsWithoutRef","bailoutOnAlreadyFinishedWork","updateMemoComponent","updateSimpleMemoComponent","checkScheduledUpdateOrContext","prevProps","updateFunctionComponent","updateOffscreenComponent","deferHiddenOffscreenComponent","cachePool","nextBaseLanes","markRef","replayFunctionComponent","updateClassComponent","contextType","updater","refs","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","unresolvedOldProps","oldContext","contextType$jscomp$0","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","mountHostRootWithoutHydrating","SUSPENDED_MARKER","treeContext","retryLane","mountSuspenseOffscreenState","getRemainingWorkInPrimaryTree","primaryTreeDidDefer","workInProgressDeferredLane","updateSuspenseComponent","showFallback","didSuspend","JSCompiler_temp$jscomp$0","nextInstance","id","overflow","fallback","mountWorkInProgressOffscreenFiber","mountSuspensePrimaryChildren","retrySuspenseComponentWithoutHydrating","dataset","digest","dgst","renderDidSuspendDelayIfPossible","primaryChildren","offscreenProps","_pendingMarkers","_retryCache","_transitions","scheduleSuspenseWorkOnFiber","initSuspenseListRenderState","isBackwards","tail","lastContentRow","tailMode","renderState","rendering","renderingStartTime","updateSuspenseListComponent","beginWork","didSuspendBefore","attemptEarlyBailoutIfNoScheduledUpdate","lazyComponent","isDehydrated","getResource","getOwnerDocumentFromRootContainer","setInitialProperties","resolveSingletonInstance","anyProps","hasAttribute","getAttribute","crossOrigin","canHydrateInstance","canHydrateTextInstance","pooledCacheLanes","markUpdate","preloadResourceAndSuspendIfNeeded","loading","preloadResource","scheduleRetryEffect","retryQueue","workInProgressSuspendedRetryLanes","cutOffTailIfNeeded","hasRenderedATailFallback","lastTailNode","lastTailNode$113","bubbleProperties","completedWork","didBailout","newChildLanes","child$114","completeWork","pendingContext","createElementNS","innerHTML","removeChild","appendChild","autoFocus","createTextNode","cache$127","listenToAllSupportedEvents","workInProgressRootExitStatus","workInProgressRootRenderTargetTime","unwindWork","unwindInterruptedWork","interruptedWork","commitHookEffectListMount","finishedWork","firstEffect","captureCommitPhaseError","commitHookEffectListUnmount","nearestMountedAncestor$jscomp$0","nearestMountedAncestor","destroy_","commitClassCallbacks","safelyCallComponentWillUnmount","componentWillUnmount","safelyAttachRef","instanceToUse","safelyDetachRef","error$143","commitHostMount","focus","srcSet","srcset","commitHostUpdate","domElement","lastProps","propKey","lastProp","setProp","propKey$205","propKey$221","propKey$226","propKey$231","setPropOnCustomElement","propKey$236","updateProperties","isHostParent","getHostSibling","insertOrAppendPlacementNodeIntoContainer","before","insertBefore","_reactRootContainer","insertOrAppendPlacementNode","commitHostSingletonAcquisition","singleton","attributes","removeAttributeNode","offscreenSubtreeIsHidden","offscreenSubtreeWasHidden","needsFormReset","PossiblyWeakSet","WeakSet","nextEffect","commitLayoutEffectOnFiber","finishedRoot","recursivelyTraverseLayoutEffects","__reactInternalSnapshotBeforeUpdate","error$142","commitSuspenseHydrationCallbacks","readyState","_reactRetry","registerSuspenseInstanceRetry","retryDehydratedSuspenseBoundary","prevOffscreenSubtreeWasHidden","recursivelyTraverseReappearLayoutEffects","detachFiberAfterEffects","hostParent","hostParentIsContainer","recursivelyTraverseDeletionEffects","commitDeletionEffectsOnFiber","deletedFiber","onCommitFiberUnmount","count","prevHostParent","prevHostParentIsContainer","releaseSingletonInstance","clearSuspenseBoundary","retryIfBlockedOn","attachSuspenseRetryListeners","wakeables","retryCache","getRetryCache","wakeable","retry","resolveRetryWakeable","recursivelyTraverseMutationEffects","root$jscomp$0","parentFiber","commitMutationEffectsOnFiber","currentHoistableRoot","commitReconciliationEffects","hoistableRoot","currentResource","getElementsByTagName","head","querySelector","maybeNodes","getHydratableHoistableCache","splice","property","httpEquiv","charSet","mountHoistable","acquireResource","tagCaches","getHoistableRoot","recursivelyResetForms","globalMostRecentFallbackTime","wasHidden","prevOffscreenSubtreeIsHidden","recursivelyTraverseDisappearLayoutEffects","display","hostParentFiber","parent$144","parent$146","reset","finishedRoot$jscomp$0","includeWorkInProgressEffects","commitOffscreenPassiveMountEffects","previousCache","commitCachePassiveMountEffect","recursivelyTraversePassiveMountEffects","committedLanes","committedTransitions","commitPassiveMountOnFiber","_finishedWork$memoize2","onPostCommit","passiveEffectDuration","recursivelyTraverseAtomicPassiveEffects","recursivelyTraverseReconnectPassiveEffects","committedLanes$jscomp$0","committedTransitions$jscomp$0","suspenseyCommitFlag","recursivelyAccumulateSuspenseyCommit","accumulateSuspenseyCommitOnFiber","suspendedState","media","matchMedia","matches","getStyleKey","getStylesheetSelectorFromKey","_p","onUnsuspend","stylesheetPropsFromRawProps","preloadPropsMap","adoptPreloadPropsForStylesheet","linkInstance","Promise","reject","onload","onerror","stylesheets","preload","suspendResource","previousHoistableRoot","detachAlternateSiblings","previousFiber","recursivelyTraversePassiveUnmountEffects","commitPassiveUnmountEffectsInsideOfDeletedTree_begin","commitPassiveUnmountOnFiber","recursivelyTraverseDisconnectPassiveEffects","deletedSubtreeRoot","DefaultAsyncDispatcher","getCacheForType","resourceType","cacheForType","PossiblyWeakMap","workInProgressSuspendedReason","workInProgressThrownValue","workInProgressRootDidSkipSuspendedSiblings","workInProgressRootIsPrerendering","workInProgressRootDidAttachPingListener","workInProgressRootInterleavedUpdatedLanes","workInProgressRootPingedLanes","workInProgressRootConcurrentErrors","workInProgressRootDidIncludeRecursiveRenderUpdate","workInProgressTransitions","pendingEffectsStatus","pendingEffectsRoot","pendingFinishedWork","pendingEffectsLanes","pendingEffectsRemainingLanes","pendingPassiveTransitions","pendingRecoverableErrors","suspenseHandler","cancelPendingCommit","prepareFreshStack","markRootSuspended","ensureRootIsScheduled","performWorkOnRoot","forceSync","shouldTimeSlice","expiredLanes","exitStatus","prevExecutionContext","prevDispatcher","pushDispatcher","prevAsyncDispatcher","pushAsyncDispatcher","thrownValue","throwAndUnwindWorkLoop","replaySuspendedUnitOfWork","hostFiber","completeUnitOfWork","resetWorkInProgressStack","workLoopConcurrentByScheduler","thrownValue$169","handleThrow","A","renderRootConcurrent","renderRootSync","renderWasConcurrent","isRenderConsistentWithExternalStores","errorRecoveryDisabledLanes","wasRootDehydrated","timeoutHandle","scheduleTimeout","commitRootWhenReady","recoverableErrors","transitions","didIncludeRenderPhaseUpdate","updatedLanes","suspendedRetryLanes","didSkipSuspendedSiblings","suspendedCommitReason","completedRenderStartTime","completedRenderEndTime","unsuspend","insertSuspendedStylesheets","commit","stylesheetTimer","waitForCommitToBeReady","commitRoot","check","didAttemptEntireTree","expirationTimes","index$4","flushSyncWorkAcrossRoots_impl","cancelTimeout","allEntangledLanes","index$2","shouldYieldForPrerendering","unitOfWork","workLoopSync","thrownValue$167","performUnitOfWork","suspendedReason","rootRenderLanes","attachPingListener","markerInstances","cause","wrapperError","throwException","unwindUnitOfWork","skipSiblings","flushPendingEffects","finishedLanes","remainingLanes","previouslyPendingLanes","index$5","hiddenUpdatesForLane","markRootFinished","callbackNode","callbackPriority","flushPassiveEffects","eventsEnabled","_enabled","selection","rangeCount","e$20","indexWithinAnchor","indexWithinFocus","selectionInformation","focusedElem","selectionRange","resolvedPrevProps","clearContainerSparingly","commitBeforeMutationEffects","flushMutationEffects","flushLayoutEffects","flushSpawnedWork","rootMutationHasEffect","priorSelectionInformation","curFocusedElem","priorFocusedElem","priorSelectionRange","win","start$jscomp$0","end$jscomp$0","extend","startMarker","endMarker","createRange","setStart","removeAllRanges","addRange","setEnd","left","scrollLeft","top","scrollTop","rootHasLayoutEffect","releaseRootPooledCache","onCommitFiberRoot","onRecoverableError","recoverableError","wasDelayedCommit","renderPriority","onPostCommitFiberRoot","captureCommitPhaseErrorOnRoot","rootFiber","pingCache","threadIDs","pingSuspendedRoot","retryTimedOutBoundary","boundaryFiber","firstScheduledRoot","lastScheduledRoot","didScheduleMicrotask","mightHavePendingSyncWork","isFlushingWork","currentEventTransitionLane","scheduleMicrotask","processRootScheduleInImmediateTask","processRootScheduleInMicrotask","syncTransitionLanes","onlyLegacy","didPerformSomeWork","root$174","performSyncWorkOnRoot","currentPopstateTransitionEvent","shouldAttemptEagerTransition","prev","scheduleTaskForRootDuringMicrotask","index$3","expirationTime","performWorkOnRootViaSchedulerTask","didTimeout","originalCallbackNode","workInProgressRootRenderLanes$jscomp$0","coerceFormActionProp","actionProp","createFormDataWithSubmitter","submitter","temp","FormData","i$jscomp$inline_1528","eventName$jscomp$inline_1529","toUpperCase","nonDelegatedEvents","eventSystemFlags","_dispatchQueue$i","previousInstance","i$jscomp$0","_dispatchListeners$i","targetElement","listenerSetKey","addTrappedEventListener","listenToNativeEvent","isCapturePhaseListener","listeningMarker","rootContainerElement","targetContainer","listenerWrapper","dispatchDiscreteEvent","dispatchContinuousEvent","capture","passive","dispatchEventForPluginEventSystem","targetInst$jscomp$0","ancestorInst","nodeTag","container","grandTag","SyntheticEventCtor","inCapturePhase","accumulateTargetOnly","reactEventName","lastHostComponent","_instance","createDispatchListener","parentWindow","getParent","accumulateEnterLeaveListenersForEvent","getTargetInstFunc","handleEventFunc","fallbackData","eventType","getNativeBeforeInputChars","char","getFallbackBeforeInputChars","maybeTargetInst","formAction","extractEvents$1","targetFiber","captureName","_instance2","unshift","common","_instance3","NORMALIZE_NEWLINES_REGEX","NORMALIZE_NULL_AND_REPLACEMENT_REGEX","normalizeMarkupForTextOrAttribute","markup","serverText","clientText","formEncType","formMethod","formTarget","encType","__html","muted","isNaN","endsWith","hasSrc","hasSrcSet","propValue$188","parentNamespace","dangerouslySetInnerHTML","localPromise","queueMicrotask","handleErrorInNextTick","parentInstance","suspenseInstance","possiblePreambleContribution","depth","nextNode","nextNode$jscomp$0","targetInstance","previousSibling","rootContainerInstance","preconnectsSet","getRootNode","previousDispatcher","previousWasRendering","wasRendering","formInst","D","preconnectAs","C","L","as","globalDocument","preloadSelector","imageSrcSet","imageSizes","getScriptKey","getScriptSelectorFromKey","X","scripts","adoptPreloadPropsForScript","link","insertStylesheet","M","limitedEscapedHref","currentProps","preloadProps","styles$244","resource$245","integrity","hrefLang","referrerPolicy","rawProps","styleProps","instance$250","nodes","prior","stylesheetProps","scriptProps","keyAttribute","caches","nodeKey","precedencesByRoot","insertStylesheetIntoRoot","precedences","FiberRootNode","hydrate","incompleteTransitions","createFiberRoot","initialChildren","hydrationCallbacks","isStrictMode","transitionCallbacks","getContextForSubtree","parentComponent","updateContainerImpl","markRetryLaneImpl","markRetryLaneIfNotHydrated","attemptContinuousHydration","blockedOn","findInstanceBlockingEvent","return_targetInst","clearIfContinuousEvent","queuedFocus","accumulateOrCreateContinuousQueuedReplayableEvent","queuedDrag","queuedMouse","queuedPointers","queuedPointerCaptures","queueIfContinuousEvent","discreteReplayableEvents","findInstanceBlockingTarget","hasScheduledReplayAttempt","queuedExplicitHydrationTargets","existingQueuedEvent","targetContainers","attemptExplicitHydrationTarget","queuedTarget","priority","runWithPriority","attemptReplayContinuousQueuedEvent","queuedEvent","nextBlockedOn","nativeEventClone","shift","attemptReplayContinuousQueuedEventInMap","replayUnblockedEvents","scheduleCallbackIfUnblocked","unblocked","lastScheduledReplayQueue","scheduleReplayQueueIfNeeded","formReplayingQueue","submitterOrAction","unblock","$$reactFormReplay","formProps","ReactDOMRoot","internalRoot","_internalRoot","ReactDOMHydrationRoot","unmount","unstable_scheduleHydration","isomorphicReactPackageVersion$jscomp$inline_1785","findDOMNode","componentOrElement","parentA","parentB","didFindChild","child$0","findCurrentFiberUsingSlowPath","internals$jscomp$inline_2256","bundleType","rendererPackageName","currentDispatcherRef","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","hook$jscomp$inline_2257","isDisabled","supportsFiber","inject","createRoot","unstable_strictMode","unstable_transitionCallbacks","hydrateRoot","ReactNoopUpdateQueue","isMounted","emptyObject","ComponentDummy","PureComponent","partialState","forceUpdate","pureComponentPrototype","V","ReactElement","self","isValidElement","object","userProvidedKeyEscapeRegex","getElementKey","escaperLookup","escape","mapIntoArray","escapedPrefix","nameSoFar","oldElement","newKey","invokeCallback","nextNamePrefix","resolveThenable","mapChildren","func","lazyInitializer","_status","_result","moduleObject","Children","forEachFunc","forEachContext","toArray","only","Fragment","Profiler","StrictMode","Suspense","__COMPILER_RUNTIME","__proto__","cloneElement","config","childArray","createContext","childrenLength","createRef","forwardRef","lazy","memo","scope","unstable_useCacheRefresh","permalink","Context","heap","parentIndex","peek","halfLength","leftIndex","rightIndex","right","diff","sortIndex","performance","localPerformance","localDate","initialTime","taskQueue","timerQueue","taskIdCounter","currentTask","currentPriorityLevel","isPerformingWork","isHostCallbackScheduled","isHostTimeoutScheduled","needsPaint","localSetTimeout","localClearTimeout","localSetImmediate","setImmediate","advanceTimers","timer","startTime","handleTimeout","isMessageLoopRunning","schedulePerformWorkUntilDeadline","firstTimer","requestHostTimeout","taskTimeoutID","frameInterval","shouldYieldToHost","performWorkUntilDeadline","hasMoreWork","previousPriorityLevel","priorityLevel","continuationCallback","MessageChannel","channel","port","port2","port1","onmessage","postMessage","ms","unstable_Profiling","task","unstable_forceFrameRate","fps","unstable_next","eventHandler","unstable_runWithPriority","delay","unstable_wrapCallback","parentPriorityLevel","jsxProd","maybeKey","jsx","jsxs","checkDCE","Internals","getCrossOriginStringAs","createPortal","createPortal$1","flushSync","previousTransition","previousUpdatePriority","preconnect","prefetchDNS","preinit","fetchPriority","nonce","preinitModule","preloadModule","requestFormReset","unstable_batchedUpdates","useFormStatus","isLE","mLen","nBytes","eLen","eMax","eBias","nBits","s","NaN","rt","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","leafPrototypes","getProto","getPrototypeOf","ns","def","getOwnPropertyNames","definition","o","chunkId","all","reduce","promises","miniCssF","prop","inProgress","dataWebpackPrefix","script","needAttach","charset","nc","onScriptComplete","doneFns","toStringTag","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","Action","PopStateEventType","invariant","warning","cond","warn","getHistoryState","usr","idx","createLocation","to","_extends","pathname","hash","parsePath","createPath","_ref","charAt","path","parsedPath","hashIndex","searchIndex","getUrlBasedHistory","getLocation","createHref","validateLocation","v5Compat","globalHistory","history","Pop","getIndex","handlePop","nextIndex","delta","createURL","base","origin","URL","replaceState","listen","encodeLocation","Push","historyState","pushState","DOMException","Replace","go","ResultType","matchRoutes","routes","locationArg","basename","matchRoutesImpl","allowPartial","stripBasename","branches","flattenRoutes","sort","score","siblings","every","compareIndexes","routesMeta","meta","childrenIndex","rankRouteBranches","decoded","decodePath","matchRouteBranch","parentsMeta","parentPath","flattenRoute","route","relativePath","caseSensitive","startsWith","joinPaths","computeScore","_route$path","exploded","explodeOptionalSegments","segments","rest","isOptional","required","restExploded","subpath","paramRe","dynamicSegmentValue","indexRouteValue","emptySegmentValue","staticSegmentValue","splatPenalty","isSplat","initialScore","filter","segment","branch","matchedParams","matchedPathname","remainingPathname","matchPath","params","pathnameBase","normalizePathname","pattern","matcher","compiledParams","regexpSource","_","paramName","compilePath","captureGroups","splatValue","decodeURIComponent","startIndex","nextChar","getInvalidPathError","field","dest","JSON","stringify","getPathContributingMatches","getResolveToMatches","v7_relativeSplatPath","pathMatches","resolveTo","toArg","routePathnames","locationPathname","isPathRelative","isEmptyPath","toPathname","routePathnameIndex","toSegments","fromPathname","resolvePathname","normalizeSearch","normalizeHash","resolvePath","hasExplicitTrailingSlash","hasCurrentTrailingSlash","paths","isRouteErrorResponse","statusText","internal","validMutationMethodsArr","validRequestMethodsArr","DataRouterContext","DataRouterStateContext","NavigationContext","LocationContext","RouteContext","outlet","isDataRoute","RouteErrorContext","useInRouterContext","useLocation","UNSAFE_invariant","useIsomorphicLayoutEffect","cb","static","useNavigate","router","useDataRouterContext","DataRouterHook","UseNavigateStable","useCurrentRouteId","DataRouterStateHook","activeRef","navigate","fromRouteId","useNavigateStable","dataRouterContext","future","navigator","routePathnamesJson","UNSAFE_getResolveToMatches","parse","relative","useNavigateUnstable","OutletContext","useParams","routeMatch","useRoutesImpl","dataRouterState","isStatic","parentMatches","parentParams","parentPathnameBase","locationFromContext","_parsedLocationArg$pa","parsedLocationArg","parentSegments","renderedMatches","_renderMatches","navigationType","DefaultErrorComponent","_state$errors","useDataRouterState","UseRouteError","routeId","useRouteError","lightgrey","preStyles","padding","backgroundColor","fontStyle","defaultErrorElement","RenderErrorBoundary","revalidation","routeContext","component","RenderedRoute","staticContext","errorElement","ErrorBoundary","_deepestRenderedBoundaryId","_dataRouterState","_future","v7_partialHydration","initialized","errorIndex","findIndex","renderFallback","fallbackIndex","HydrateFallback","hydrateFallbackElement","loaderData","needsToRunLoader","loader","reduceRight","shouldRenderHydrateFallback","alreadyWarned$1","getChildren","hookName","ctx","useRouteContext","thisRoute","logV6DeprecationWarnings","renderFuture","routerFuture","v7_startTransition","v7_fetcherPersist","v7_normalizeFormMethod","v7_skipActionErrorRevalidation","Navigate","_ref4","jsonPath","Outlet","useOutlet","Route","_props","Router","_ref5","basenameProp","locationProp","staticProp","navigationContext","locationContext","trailingPathname","Routes","_ref6","createRoutesFromChildren","treePath","hasErrorBoundary","shouldRevalidate","handle","__reactRouterVersion","startTransitionImpl","BrowserRouter","historyRef","setStateImpl","UNSAFE_logV6DeprecationWarnings","toPropertyKey","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptors","defineProperties","thisArg","kindOf","thing","kindOfTest","typeOfTest","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","isDate","isFile","isBlob","isFileList","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","allOwnKeys","findKey","_key","_global","globalThis","global","isContextDefined","isTypedArray","TypedArray","isHTMLForm","isRegExp","reduceDescriptors","descriptors","reducedDescriptors","isAsyncFn","_setImmediate","setImmediateSupported","postMessageSupported","token","_ref2","asap","isFormData","kind","append","isArrayBufferView","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","stripBOM","inherits","superConstructor","toFlatObject","sourceObj","destObj","propFilter","merged","searchString","position","lastIndex","forEachEntry","_iterator","pair","matchAll","regExp","exec","hasOwnProp","freezeMethods","toObjectSet","arrayOrString","delimiter","define","toCamelCase","p1","p2","toFiniteNumber","isSpecCompliantForm","toJSONObject","visit","reducedValue","isThenable","isIterable","AxiosError","response","captureStackTrace","utils","description","fileName","lineNumber","columnNumber","customProps","axiosError","isVisitable","removeBrackets","renderKey","dots","predicates","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","isFlatArray","el","exposedHelpers","build","encode","charMap","AxiosURLSearchParams","_pairs","toFormData","encoder","_encode","buildURL","serialize","serializeFn","serializedParams","hashmarkIndex","handlers","fulfilled","rejected","synchronous","runWhen","eject","clear","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","isBrowser","URLSearchParams","protocols","hasBrowserEnv","_navigator","hasStandardBrowserEnv","product","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","_objectSpread","platform","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","transitionalDefaults","adapter","transformRequest","headers","contentType","getContentType","hasJSONContentType","isObjectPayload","formDataToJSON","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","rawValue","parser","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","setHeaders","rawHeaders","line","substring","parseHeaders","entry","tokens","tokensRE","parseTokens","deleted","deleteHeader","normalize","format","normalized","w","formatHeader","_len","targets","asStrings","getSetCookie","computed","_len2","_key2","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","buildAccessors","mapped","headerValue","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","ERR_BAD_REQUEST","samplesCount","timestamps","firstSampleTS","chunkLength","startedAt","bytesCount","passed","round","freq","lastArgs","timestamp","threshold","invoke","flush","progressEventReducer","isDownloadStream","bytesNotified","_speedometer","speedometer","throttle","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","progressEventDecorator","throttled","asyncDecorator","isMSIE","protocol","host","userAgent","expires","domain","secure","cookie","toGMTString","remove","buildFullPath","baseURL","requestedURL","allowAbsoluteUrls","isRelativeUrl","relativeURL","combineURLs","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","paramsSerializer","timeoutMessage","withCredentials","withXSRFToken","onUploadProgress","onDownloadProgress","decompress","beforeRedirect","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding","configValue","newConfig","auth","btoa","username","unescape","Boolean","isURLSameOrigin","xsrfValue","cookies","XMLHttpRequest","_config","resolveConfig","requestData","requestHeaders","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","unsubscribe","onloadend","responseHeaders","getAllResponseHeaders","responseText","open","onreadystatechange","responseURL","onabort","ECONNABORTED","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","setRequestHeader","upload","cancel","parseProtocol","send","composeSignals","signals","_OverloadYield","_wrapAsyncGenerator","AsyncGenerator","resume","_invoke","_awaitAsyncGenerator","_asyncGeneratorDelegate","pump","_asyncIterator","asyncIterator","AsyncFromSyncIterator","AsyncFromSyncIteratorContinuation","streamChunk","chunk","chunkSize","readBytes","iterable","_iteratorError","_iteratorAbruptCompletion","_didIteratorError","_step","readStream","_x","_x2","stream","reader","getReader","_x3","trackStream","onProgress","onFinish","_onFinish","ReadableStream","pull","close","loadedBytes","enqueue","highWaterMark","isFetchSupported","fetch","Request","Response","isReadableStreamSupported","encodeText","TextEncoder","arrayBuffer","supportsRequestStream","duplexAccessed","hasContentType","duplex","supportsResponseStream","resolvers","ERR_NOT_SUPPORT","resolveBodyLength","getContentLength","_request","getBodyLength","fetchOptions","composedSignal","toAbortSignal","requestContentLength","contentTypeHeader","isCredentialsSupported","credentials","isStreamResponse","responseContentLength","responseData","knownAdapters","http","xhr","xhrAdapter","fetchAdapter","renderReason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","throwIfCancellationRequested","throwIfRequested","dispatchRequest","VERSION","validators","deprecatedWarnings","validator","formatMessage","opt","desc","opts","ERR_DEPRECATED","spelling","correctSpelling","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","InterceptorManager","configOrUrl","dummy","boolean","function","baseUrl","withXsrfToken","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","chain","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","axios","createInstance","defaultConfig","Cancel","spread","isAxiosError","formToJSON","getAdapter","api","localStorage","getItem","Authorization","getUserInfo","searchTorrents","keyword","page","getHelpPostDetail","postId","getRequestPostDetail","_arrayLikeToArray","_iterableToArray","_unsupportedIterableToArray","_toConsumableArray","AppConfigContext","defaultPrefixCls","defaultIconPrefixCls","ConfigContext","getPrefixCls","defaultGetPrefixCls","suffixCls","customizePrefixCls","iconPrefixCls","ConfigConsumer","_arrayWithHoles","_nonIterableRest","canUseDom","APPEND_ORDER","APPEND_PRIORITY","containerCache","getMark","mark","getContainer","attachTo","findStyles","injectCSS","css","csp","prepend","_option$priority","mergedOrder","getOrder","isPrependQueue","styleNode","existStyle","nodePriority","findExistNode","find","removeCSS","existNode","updateCSS","originOption","cachedRealContainer","placeholderStyle","syncRealContainer","_option$csp","_option$csp2","_option$csp3","newNode","condition","shouldUpdate","cacheRef","warned","preWarningFns","valid","note","warningOnce","preMessage","resetWarned","noteOnce","obj1","obj2","shallow","refSet","deepEqual","level","circular","newLevel","_typeof","_defineProperties","pathKey","Entity","instanceId","_classCallCheck","_defineProperty","_createClass","opGet","keyPathStr","valueFn","opUpdate","ATTR_TOKEN","ATTR_MARK","CSS_IN_JS_INSTANCE","cssinjsInstanceId","styleHash","_style$parentNode","CacheEntity","StyleContext","hashPriority","defaultCache","CALC_UNIT","ThemeCache","cacheCallTimes","derivativeOption","_cache2","_cache3","updateCallTimes","derivative","_cache","_this$internalGet","internalGet","_this","MAX_CACHE_SIZE","MAX_CACHE_OFFSET","_this$keys$reduce","callTimes","_slicedToArray","cacheValue","currentCache","derivatives","_cache$value","deleteByPath","item","sameDerivativeOption","uuid","Theme","cacheThemes","createTheme","derivativeArr","resultCache","RESULT_VALUE","flattenTokenCache","flattenToken","token2key","salt","isClientSide","unit","toStyleStr","tokenKey","styleId","_objectSpread2","attrs","attrStr","attr","token2CSSVar","serializeCSSVar","cssVars","hashId","transformToken","themeKey","_ref3","_config$preserve","_config$ignore","preserve","ignore","_config$unitless","cssVar","unitless","useInternalLayoutEffect","firstMountRef","renderEffect","effect","effectCleanups","cleanupFlag","useGlobalCache","keyPath","cacheFn","onCacheRemove","onCacheEffect","globalCache","fullPathStr","register","useEffectCleanupRegister","buildCache","useHMR","prevCache","_ref2$","cacheContent","useCompatibleInsertionEffect","polyfill","times","_ref6$","EMPTY_OVERRIDE","tokenKeys","cleanTokenStyle","tokenKeyList","cleanableKeyList","removeStyleTags","TOKEN_PREFIX","useCacheToken","theme","_useContext","_option$salt","_option$override","override","formatToken","compute","getComputedToken","mergedToken","dep","memoResult","tokenStr","overrideTokenStr","cssVarStr","cachedToken","_cssVar$key","mergedDerivativeToken","originToken","overrideToken","getDerivativeToken","actualToken","cssVarsStr","_transformToken2","_tokenKey","_themeKey","recordCleanToken","_hashId","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","msGridRow","msGridRowSpan","msGridColumn","msGridColumnSpan","fontWeight","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","WebkitLineClamp","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","COMMENT","RULESET","DECLARATION","replacement","indexof","charat","begin","strlen","column","character","characters","caret","dealloc","delimit","whitespace","escaping","commenter","identifier","compile","rule","rules","rulesets","pseudo","points","declarations","atrule","previous","variable","scanning","ampersand","reference","comment","declaration","ruleset","post","sizeof","z","cachePathMap","ATTR_CACHE_MAP","CSS_FILE_STYLE","fromCSSFile","existPath","div","className","visibility","getComputedStyle","_item$split2","_inlineMapStyle$paren","inlineMapStyle","prepare","MULTI_VALUE","normalizeStyle","styleStr","injectSelectorHash","hashClassName","hashSelector","_firstPath$match","fullPath","firstPath","htmlElement","parseStyle","interpolation","parentSelectors","injectHash","layer","_config$transformers","transformers","linters","effectStyle","parseKeyframes","keyframes","getName","_parsedStr","flattenStyleList","flattenList","fullList","originStyle","_keyframe","mergedStyle","trans","_trans$visit","isCompoundCSSProperty","appendStyle","cssKey","cssValue","formatValue","actualValue","subInjectHash","mergedKey","nextRoot","_parseStyle4","_parsedStr2","childEffectStyle","uniqueHash","Empty","STYLE_PREFIX","useStyleRegister","styleFn","clientOnly","_info$order","_React$useContext","autoClear","mock","ssrInline","enableLayer","isMergedClientSide","_useGlobalCache","cachePath","_getStyleAndHash","_style","getStyleAndHash","_getStyleAndHash2","inlineCacheStyleStr","styleObj","_parseStyle6","parsedStyle","fromHMR","mergedCSSConfig","nonceStr","effectLayerKeys","effectRestKeys","effectKey","_useGlobalCache2","cachedStyleStr","cachedTokenKey","cachedStyleId","CSS_VAR_PREFIX","_config$scope","stylePath","_ExtractStyleFns","effectStyles","plain","keyStyleText","sharedAttrs","effectStyleHTML","realToken","cssVarKey","Keyframe","noSplit","notSplit","entity","internalSet","removeIfUndefined","_paths","_toArray","restPath","createEmpty","sources","internalMerge","parentLoopSet","loopSet","isArr","originValue","WarningContext","devUseWarning","noopWarning","deprecated","items_per_page","jump_to","jump_to_confirm","prev_page","next_page","prev_5","next_5","prev_3","next_3","page_size","yearFormat","dayFormat","cellMeridiemFormat","monthBeforeYear","today","backToToday","ok","year","timeSelect","dateSelect","weekSelect","monthSelect","yearSelect","decadeSelect","dateFormat","dateTimeFormat","previousMonth","nextMonth","previousYear","nextYear","previousDecade","nextDecade","previousCentury","nextCentury","placeholder","rangePlaceholder","lang","yearPlaceholder","quarterPlaceholder","monthPlaceholder","weekPlaceholder","rangeYearPlaceholder","rangeQuarterPlaceholder","rangeMonthPlaceholder","rangeWeekPlaceholder","CalendarLocale","timePickerLocale","TimePickerLocale","typeTemplate","Pagination","DatePicker","TimePicker","Calendar","Table","filterTitle","filterConfirm","filterReset","filterEmptyText","filterCheckAll","filterSearchPlaceholder","emptyText","selectAll","selectInvert","selectNone","selectionAll","sortTitle","expand","collapse","triggerDesc","triggerAsc","cancelSort","Tour","Next","Previous","Finish","Modal","okText","cancelText","justOkText","Popconfirm","Transfer","titles","searchPlaceholder","itemUnit","itemsUnit","selectCurrent","removeCurrent","deselectAll","removeAll","Upload","uploading","removeFile","uploadError","previewFile","downloadFile","Icon","icon","Text","edit","copied","Form","optional","defaultValidateMessages","enum","invalid","types","integer","float","regexp","hex","mismatch","Image","preview","QRCode","expired","refresh","scanned","ColorPicker","presetEmpty","transparent","singleColor","gradientColor","runtimeLocale","defaultLocale","localeList","generateLocale","_ANT_MARK__","clearLocale","newLocale","cloneLocale","changeConfirmLocale","getMemoizedContextValue","exist","LocaleContext","splitColorStr","parseNum","numList","parseFloat","parseHSVorHSL","limitRange","mergedMax","FastColor","matchFormat","trimStr","matchPrefix","fromHexString","fromRgbString","fromHslString","fromHsvString","_h","_s","_l","_v","fromHsl","fromHsv","setR","_sc","setG","setB","setA","setHue","hsv","toHsv","_c","getLuminance","adjustGamma","raw","getHue","getMax","getMin","getSaturation","getLightness","getBrightness","_brightness","darken","amount","lighten","mix","calc","rgba","tint","shade","onBackground","background","bg","alpha","isDark","isLight","other","toHexString","rHex","gHex","bHex","aHex","toHsl","toHslString","toRgb","toRgbString","rgb","_max","_min","withoutPrefix","connectNum","index1","index2","huePrime","chroma","secondComponent","lightnessModification","vv","hh","ff","cells","txt","darkColorMap","light","hue","saturation","generate","patterns","pColor","_i","presetPrimaryColors","red","primary","volcano","orange","gold","yellow","lime","green","cyan","blue","geekblue","purple","magenta","grey","presetPalettes","redDark","volcanoDark","orangeDark","goldDark","yellowDark","limeDark","greenDark","cyanDark","blueDark","geekblueDark","purpleDark","magentaDark","greyDark","defaultPresetColors","pink","colorPrimary","colorSuccess","colorWarning","colorError","colorInfo","colorLink","colorTextBase","colorBgBase","fontFamily","fontFamilyCode","fontSize","lineWidth","lineType","motionUnit","motionBase","motionEaseOutCirc","motionEaseInOutCirc","motionEaseOut","motionEaseInOut","motionEaseOutBack","motionEaseInBack","motionEaseInQuint","motionEaseOutQuint","borderRadius","sizeUnit","sizeStep","sizePopupArrow","controlHeight","zIndexBase","zIndexPopupBase","opacityImage","wireframe","motion","radiusBase","radiusLG","radiusSM","radiusXS","radiusOuter","borderRadiusXS","borderRadiusSM","borderRadiusLG","borderRadiusOuter","controlHeightSM","controlHeightXS","controlHeightLG","fontSizePairs","fontSizes","baseSize","intSize","ceil","genFontSizes","lineHeights","fontSizeMD","fontSizeSM","fontSizeLG","lineHeightSM","lineHeightLG","fontSizeXL","fontSizeHeading1","fontSizeHeading2","fontSizeHeading3","fontSizeHeading4","fontSizeHeading5","fontHeight","fontHeightLG","fontHeightSM","lineHeightHeading1","lineHeightHeading2","lineHeightHeading3","lineHeightHeading4","lineHeightHeading5","getAlphaColor","baseColor","getSolidColor","brightness","generateColorPalettes","colors","generateNeutralColorPalettes","bgBaseColor","textBaseColor","colorText","colorTextSecondary","colorTextTertiary","colorTextQuaternary","colorFill","colorFillSecondary","colorFillTertiary","colorFillQuaternary","colorBgSolid","colorBgSolidHover","colorBgSolidActive","colorBgLayout","colorBgContainer","colorBgElevated","colorBgSpotlight","colorBgBlur","colorBorder","colorBorderSecondary","defaultTheme","colorPalettes","colorKey","cur","seed","colorSuccessBase","colorWarningBase","colorErrorBase","colorInfoBase","colorPrimaryBase","primaryColors","successColors","warningColors","errorColors","infoColors","neutralColors","linkColors","colorErrorBgFilledHover","colorPrimaryBg","colorPrimaryBgHover","colorPrimaryBorder","colorPrimaryBorderHover","colorPrimaryHover","colorPrimaryActive","colorPrimaryTextHover","colorPrimaryText","colorPrimaryTextActive","colorSuccessBg","colorSuccessBgHover","colorSuccessBorder","colorSuccessBorderHover","colorSuccessHover","colorSuccessActive","colorSuccessTextHover","colorSuccessText","colorSuccessTextActive","colorErrorBg","colorErrorBgHover","colorErrorBgActive","colorErrorBorder","colorErrorBorderHover","colorErrorHover","colorErrorActive","colorErrorTextHover","colorErrorText","colorErrorTextActive","colorWarningBg","colorWarningBgHover","colorWarningBorder","colorWarningBorderHover","colorWarningHover","colorWarningActive","colorWarningTextHover","colorWarningText","colorWarningTextActive","colorInfoBg","colorInfoBgHover","colorInfoBorder","colorInfoBorderHover","colorInfoHover","colorInfoActive","colorInfoTextHover","colorInfoText","colorInfoTextActive","colorLinkHover","colorLinkActive","colorBgMask","colorWhite","genColorMapToken","genFontMapToken","sizeXXL","sizeXL","sizeLG","sizeMD","sizeMS","sizeSM","sizeXS","sizeXXS","genSizeMapToken","genControlHeight","motionDurationFast","toFixed","motionDurationMid","motionDurationSlow","lineWidthBold","genRadius","genCommonMapToken","defaultSeedToken","hashed","DesignTokenContext","dynamicStyleMark","registerTheme","globalPrefixCls","variables","formatColor","fillColor","colorVal","primaryColor","primaryActiveColor","successColor","warningColor","errorColor","infoColor","cssList","getStyle","DisabledContext","DisabledContextProvider","originDisabled","SizeContext","SizeContextProvider","originSize","componentDisabled","componentSize","fullClone","useEmptyId","isDOM","HTMLElement","SVGElement","_ReactDOM$findDOMNode","domNode","nativeElement","getDOM","REACT_ELEMENT_TYPE_18","REACT_ELEMENT_TYPE_19","ReactMajorVersion","fillRef","supportRef","nodeOrComponent","_type$prototype","_nodeOrComponent$prot","isReactElement","propertyIsEnumerable","_excluded","MotionProvider","_objectWithoutProperties","_setPrototypeOf","_getPrototypeOf","_isNativeReflectConstruct","ReferenceError","_React$Component","_inherits","DomWrapper","_super","_createSuper","useEvent","fnRef","memoFn","_fnRef$current","useSafeState","destroyRef","_React$useState2","ignoreDestroy","STATUS_NONE","STATUS_APPEAR","STATUS_ENTER","STATUS_LEAVE","STEP_NONE","STEP_PREPARE","STEP_START","STEP_ACTIVE","STEP_ACTIVATED","STEP_PREPARED","domSupport","getVendorPrefixes","_document$createEleme","stylePropList","internalAnimationEndName","internalTransitionEndName","supportTransition","animationEndName","transitionEndName","getTransitionName","transitionName","transitionType","raf","caf","requestAnimationFrame","cancelAnimationFrame","rafUUID","rafIds","cleanup","wrapperRaf","callRef","leftTimes","realId","FULL_STEP_QUEUE","SIMPLE_STEP_QUEUE","SkipStep","isActive","prepareOnly","_useState2","setStep","_useNextFrame","nextFrameRef","cancelNextFrame","nextFrame","nextFrameId","isCanceled","useNextFrame","_useNextFrame2","STEP_QUEUE","nextStep","doNext","useStatus","supportMotion","visible","getElement","_ref$motionEnter","motionEnter","_ref$motionAppear","motionAppear","_ref$motionLeave","motionLeave","motionDeadline","motionLeaveImmediately","onAppearPrepare","onEnterPrepare","onLeavePrepare","onAppearStart","onEnterStart","onLeaveStart","onAppearActive","onEnterActive","onLeaveActive","onAppearEnd","onEnterEnd","onLeaveEnd","onVisibleChanged","asyncVisible","setAsyncVisible","_useSyncState","currentValueRef","useSyncState","_useSyncState2","getStatus","setStatus","_useState4","setStyle","currentStatus","mountedRef","deadlineRef","getDomElement","updateMotionEndStatus","onInternalMotionEnd","deadline","canEnd","currentActive","_useDomMotionEvents","cacheElementRef","removeMotionEvents","useDomMotionEvents","patchMotionEvents","getEventHandlers","targetStatus","eventHandlers","_useStepQueue2","useStepQueue","newStep","onPrepare","_eventHandlers$step","startStep","active","visibleRef","nextStatus","nextEventHandlers","firstMountChangeRef","transitionSupport","CSSMotion","_props$visible","_props$removeOnLeave","removeOnLeave","forceRender","motionName","leavedClassName","eventProps","contextMotion","isSupportTransition","nodeRef","wrapperNodeRef","_useStatus2","statusStep","statusStyle","mergedVisible","renderedRef","motionChildren","setNodeRef","mergedProps","statusSuffix","motionCls","originNodeRef","ele","getNodeRef","STATUS_ADD","STATUS_KEEP","STATUS_REMOVE","STATUS_REMOVED","wrapKeyToObject","keyObj","parseKeys","_excluded2","MOTION_PROP_NAMES","OriginCSSMotion","CSSMotionList","_assertThisInitialized","keyEntities","removeKey","onAllRemoved","_this2","_this$props","_onVisibleChanged","restProps","motionProps","changedVisible","parsedKeyObjects","mixedKeyEntities","prevKeys","currentKeys","currentIndex","currentLen","prevKeyObjects","currentKeyObjects","hit","currentKeyObj","matchKey","diffKeys","prevEntity","isStableColor","frontColor","fR","fG","fB","originAlpha","bR","bG","bB","fA","__rest","derivativeToken","restToken","overrideTokens","seedToken","screenXL","screenXXL","fastDuration","colorFillContent","colorFillContentHover","colorFillAlter","colorBgContainerDisabled","colorBorderBg","colorSplit","colorTextPlaceholder","colorTextDisabled","colorTextHeading","colorTextLabel","colorTextDescription","colorTextLightSolid","colorHighlight","colorBgTextHover","colorBgTextActive","colorIcon","colorIconHover","colorErrorOutline","colorWarningOutline","fontSizeIcon","lineWidthFocus","controlOutlineWidth","controlInteractiveSize","controlItemBgHover","controlItemBgActive","controlItemBgActiveHover","controlItemBgActiveDisabled","controlTmpOutline","controlOutline","fontWeightStrong","opacityLoading","linkDecoration","linkHoverDecoration","linkFocusDecoration","controlPaddingHorizontal","controlPaddingHorizontalSM","paddingXXS","paddingXS","paddingSM","paddingMD","paddingLG","paddingXL","paddingContentHorizontalLG","paddingContentVerticalLG","paddingContentHorizontal","paddingContentVertical","paddingContentHorizontalSM","paddingContentVerticalSM","marginXXS","marginXS","marginSM","margin","marginMD","marginLG","marginXL","marginXXL","boxShadow","boxShadowSecondary","boxShadowTertiary","screenXS","screenXSMin","screenXSMax","screenSM","screenSMMin","screenSMMax","screenMD","screenMDMin","screenMDMax","screenLG","screenLGMin","screenLGMax","screenXLMin","screenXLMax","screenXXLMin","boxShadowPopoverArrow","boxShadowCard","boxShadowDrawerRight","boxShadowDrawerLeft","boxShadowDrawerUp","boxShadowDrawerDown","boxShadowTabsOverflowLeft","boxShadowTabsOverflowRight","boxShadowTabsOverflowTop","boxShadowTabsOverflowBottom","components","componentTheme","componentTokens","mergedComponentToken","useToken","rootDesignToken","mergedTheme","MotionWrapper","needWrapMotionProviderRef","resetComponent","needInheritFontFamily","boxSizing","listStyle","genIconStyle","alignItems","textAlign","textTransform","verticalAlign","textRendering","svg","useResetIconStyle","PASSED_PROPS","globalIconPrefixCls","globalTheme","globalHolderRender","getGlobalPrefixCls","getGlobalIconPrefixCls","globalConfig","getIconPrefixCls","getRootPrefixCls","getTheme","holderRender","ProviderChildren","customCsp","autoInsertSpaceInButton","alert","anchor","direction","space","splitter","virtual","dropdownMatchSelectWidth","popupMatchSelectWidth","popupOverflow","legacyLocale","parentContext","customIconPrefixCls","segmented","statistic","spin","calendar","carousel","cascader","typography","checkbox","descriptions","divider","drawer","skeleton","steps","image","layout","mentions","modal","slider","breadcrumb","menu","pagination","textArea","empty","badge","radio","switch","SWITCH","transfer","avatar","card","tabs","timeline","timePicker","notification","tree","colorPicker","datePicker","rangePicker","wave","dropdown","warningConfig","tour","tooltip","popconfirm","floatButtonGroup","variant","inputNumber","treeSelect","prefixCls","mergedPrefixCls","useStyle","parentTheme","_a","themeConfig","parentThemeConfig","inherit","useThemeKey","_b","mergedComponents","componentName","mergedCssVar","prevTheme","nextTheme","isEqual","useTheme","baseConfig","autoInsertSpace","memoedConfig","prevConfig","currentConfig","CssInJsStyleContext","memoIconContextValue","childNode","PropWarning","validateMessages","_d","ValidateMessagesContext","LocaleProvider","IconContext","memoTheme","algorithm","themeObj","parsedComponents","componentToken","parsedToken","ConfigProvider","antLocale","isLegacyTheme","useConfig","_regeneratorRuntime","Generator","delegate","sent","_sent","dispatchException","abrupt","wrap","GeneratorFunction","GeneratorFunctionPrototype","AsyncIterator","__await","tryEntries","isGeneratorFunction","awrap","values","stop","rval","complete","finish","delegateYield","asyncGeneratorStep","_asyncToGenerator","_next","_throw","reactRender","unmountComponentAtNode","toggleWarning","skip","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","usingClientEntryPoint","MARK","modernRender","legacyRender","modernUnmount","_modernUnmount","_callee","_container$MARK","legacyUnmount","_unmount","_callee2","_context2","unstableRender","defaultReactRender","getRoot","_ele$getRootNode","getShadowRoot","ShadowRoot","inShadow","isIconDefinition","normalizeAttrs","acc","class","rootProps","getSecondaryColor","generateColor","normalizeTwoToneColors","twoToneColor","twoToneColorPalette","secondaryColor","calculated","IconBase","svgRef","eleRef","mergedStyleStr","shadowRoot","useInsertStyles","getTwoToneColors","setTwoToneColors","setTwoToneColor","_normalizeTwoToneColo2","ReactIcon","rotate","tabIndex","_React$useContext$pre","rootClassName","classString","iconTabIndex","svgStyle","msTransform","transform","role","getTwoToneColor","CheckCircleFilled","AntdIcon","CheckCircleFilledSvg","CloseCircleFilled","CloseCircleFilledSvg","ExclamationCircleFilled","ExclamationCircleFilledSvg","InfoCircleFilled","InfoCircleFilledSvg","LoadingOutlined","LoadingOutlinedSvg","KeyCode","MAC_ENTER","BACKSPACE","TAB","NUM_CENTER","ENTER","SHIFT","CTRL","ALT","PAUSE","CAPS_LOCK","ESC","SPACE","PAGE_UP","PAGE_DOWN","END","HOME","LEFT","UP","RIGHT","DOWN","PRINT_SCREEN","INSERT","DELETE","ZERO","ONE","TWO","THREE","FOUR","FIVE","SIX","SEVEN","EIGHT","NINE","QUESTION_MARK","B","F","G","I","J","K","N","O","P","Q","R","U","W","Y","Z","META","WIN_KEY_RIGHT","CONTEXT_MENU","NUM_ZERO","NUM_ONE","NUM_TWO","NUM_THREE","NUM_FOUR","NUM_FIVE","NUM_SIX","NUM_SEVEN","NUM_EIGHT","NUM_NINE","NUM_MULTIPLY","NUM_PLUS","NUM_MINUS","NUM_PERIOD","NUM_DIVISION","F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12","NUMLOCK","SEMICOLON","DASH","EQUALS","COMMA","PERIOD","SLASH","APOSTROPHE","SINGLE_QUOTE","OPEN_SQUARE_BRACKET","BACKSLASH","CLOSE_SQUARE_BRACKET","WIN_KEY","MAC_FF_META","WIN_IME","isTextModifyingKeyEvent","isCharacterKey","propList","Notify","_props$duration","duration","showProgress","_props$pauseOnHover","pauseOnHover","eventKey","closable","_props$closeIcon","closeIcon","divProps","onNoticeClose","forcedHovering","hovering","setHovering","_React$useState4","percent","setPercent","_React$useState6","spentTime","setSpentTime","mergedHovering","mergedShowProgress","onInternalClose","animationFrame","calculate","closableObj","ariaProps","mergedConfig","ariaOnly","aria","pickAttrs","validPercent","noticePrefixCls","onMouseEnter","_divProps$onMouseEnte","onMouseLeave","_divProps$onMouseLeav","onKeyDown","NotificationContext","_config$offset","_config$threshold","_config$gap","gap","configList","placement","onAllNoticeRemoved","stackConfig","ctxCls","dictRef","latestNotice","setLatestNotice","hoverKeys","setHoverKeys","_useStack2","useStack","_useStack2$","expanded","placementMotion","dataKey","_keys","_keys2","clsx","motionClassName","motionStyle","motionIndex","strKey","configClassName","configStyle","configClassNames","configStyles","restConfig","dataIndex","stackStyle","transformX","_dictRef$current$strK","_dictRef$current$strK2","_dictRef$current$strK3","offsetHeight","verticalOffset","_dictRef$current$keys","transformY","scaleX","offsetWidth","wrapper","Notice","notice","Notifications","_props$prefixCls","maxCount","renderNotifications","setConfigList","_config$onClose","onClose","_list$index","innerConfig","placements","setPlacements","nextPlacements","_config$placement","originPlacements","emptyRef","placementList","placementConfigList","NoticeList","defaultGetContainer","uniqueKey","useNotification","rootConfig","_rootConfig$getContai","shareConfig","setContainer","notificationsRef","contextHolder","setTaskQueue","objList","oriTaskQueue","tgtTaskQueue","oriQueue","AbstractCalculator","CSSCalculator","_AbstractCalculator","unitlessCssVar","numType","getResult","lowPriority","force","cssUnit","mergedUnit","NumCalculator","Calculator","defaultToken","customToken","deprecatedTokens","_customToken$newToken","oldTokenKey","newTokenKey","enableStatistic","CSSINJS_STATISTIC","recording","objs","proxy","Proxy","_tokenKeys","_statistic$componentN","getDefaultToken","_token$component","mergeToken","ArrayKeyMap","compositeKey","getCompositeKey","lastAccessBeat","accessBeat","getObjectID","objectIDMap","nextID","beat","uniqueMap","cachedValue","newValue","_config$useCSP","useCSP","useDefaultCSP","usePrefix","getResetStyles","getCommonStyle","getCompUnitless","genComponentStyleHook","concatComponent","mergedLayer","rootCls","_useToken3","_usePrefix","rootPrefixCls","useUniqueMemo","getCompVarPrefix","genCalc","_genMaxMin","genMaxMin","sharedConfig","injectStyle","_statisticToken","statisticToken","proxyToken","defaultComponentToken","getDefaultComponentToken","componentCls","getComponentToken","iconCls","antCls","styleInterpolation","commonStyle","resetFont","resetStyle","genStyleHooks","prefixToken","originUnitless","compUnitless","mergedOptions","useCSSVar","_options$injectStyle","CSSVarRegister","_ref$cssVar","useCSSVarRegister","genCSSVarRegister","_useCSSVar2","genSubStyleComponent","_ref2$rootCls","genStyleUtils","useLocalToken","linkStyle","textDecoration","outline","genLinkStyle","genCommonStyle","componentPrefixCls","prefixSelector","rootPrefixSelector","resetFontStyle","genMessageStyle","zIndexPopup","contentPadding","contentBg","noticeCls","messageMoveIn","Keyframes","messageMoveOut","maxHeight","noticeStyle","marginInlineEnd","pointerEvents","animationFillMode","animationDuration","animationPlayState","animationTimingFunction","span","combinedToken","CONTAINER_OFFSET","TypeIcon","success","PureContent","staticPrefixCls","useCSSVarCls","wrapCSSVar","cssVarCls","CloseOutlined","CloseOutlinedSvg","wrapPromiseFn","openFn","closeFn","closePromise","filled","DEFAULT_DURATION","Wrapper","NotificationProvider","Holder","staticGetContainer","rtl","getPopupContainer","mergedCloseIcon","holder","useRcNotification","getClassName","getNotificationMotion","getMotion","keyIndex","useInternalMessage","messageConfig","holderRef","wrapAPI","fakeResult","originOpen","typeOpen","jointContent","mergedDuration","mergedOnClose","act","defaultGlobalConfig","getGlobalContext","mergedContainer","GlobalHolder","sync","appConfig","GlobalHolderWrapper","setMessageConfig","rootIconPrefixCls","dom","flushNotice","holderFragment","createDocumentFragment","newMessage","unstableSetRender","skipped","setCloseFn","_message$instance","baseStaticMethods","useMessage","_InternalPanelDoNotUseOrYouWillBeFired","PurePanel","staticMethods","API_BASE_URL","getAllDiscounts","_response$data$data","_response$data4","_location$state","onLogout","userInfo","setUserInfo","setLoading","setError","currentSlide","setCurrentSlide","tab","showUploadModal","setShowUploadModal","isUploading","setIsUploading","uploadData","setUploadData","region","subtitle","resolution","file","showPostModal","setShowPostModal","postTitle","setPostTitle","postContent","setPostContent","selectedImage","setSelectedImage","helpPosts","setHelpPosts","helpLoading","setHelpLoading","helpError","setHelpError","currentPage","setCurrentPage","totalPages","setTotalPages","likedPosts","setLikedPosts","announcements","setAnnouncements","carouselDiscounts","setCarouselDiscounts","requestLoading","setRequestLoading","requestError","setRequestError","requestPosts","setRequestPosts","torrentPosts","setTorrentPosts","torrentLoading","setTorrentLoading","torrentError","setTorrentError","filteredResources","setFilteredResources","isAdmin","setIsAdmin","showDownloadModal","setShowDownloadModal","selectedTorrent","setSelectedTorrent","downloadProgress","setDownloadProgress","isDownloading","setIsDownloading","downloadPath","setDownloadPath","announcementSearch","setAnnouncementSearch","shareSearch","setShareSearch","requestSearch","setRequestSearch","helpSearch","setHelpSearch","activeTab","handleTabChange","tabName","savedFilters","selectedFilters","fetchAnnouncements","fetchDiscountsForCarousel","ongoing","getTime","endTime","upcoming","handleSearchAnnouncement","handleSearchShare","records","handleResetShareSearch","setSelectedFilters","filterCategories","category","fetchTorrentPosts","handleSearchRequest","searchRequestPosts","postsWithCounts","detailResponse","replyCount","isLiked","handleResetRequestSearch","fetchRequestPosts","handleSearchHelp","searchHelpPosts","handleResetHelpSearch","fetchHelpPosts","handleFileChange","files","handleUploadSubmit","torrentData","torrentName","bodyObj","createTorrent","_error$response","_error$response$data","checkFileExists","handleDeleteTorrent","torrentId","confirm","deleteTorrent","_error$response2","_error$response2$data","handleRequestPostSubmit","createRequestPost","authorId","handleHelpPostSubmit","createHelpPost","isReset","getRequestPosts","handleImageUpload","getHelpPosts","label","applyFilters","_location$state2","scrollPosition","scrollTo","backendData","authority","fetchUserInfo","setInterval","clearInterval","_jsx","_jsxs","alt","renderContent","onChange","onKeyPress","discount","toLocaleDateString","announcement","handleAnnouncementClick","closest","returnPath","scrollY","marginLeft","handleFilterSelect","onSubmit","accept","torrent","handleDownloadClick","isSolved","authorAvatar","createTime","likeCount","htmlFor","cleanPath","finalPath","downloadTorrent","interval","getDownloadProgress","progresses","filePath","foundProgress","normalizedKey","newProgress","userData","registTime","formatDate","magicPoints","download","shareRate","getDownloadQuota","used","dateString","getFullYear","getMonth","padStart","day","getDate","getUserInviteCodes","inviteCode","Personal","setUserData","downloadQuota","joinDate","ratio","fetchData","fetchDownloadProgress","progressData","intervalId","formatSize","kb","mb","handleBack","fromSubpage","dashboardTab","percentage","taskId","feature","handleCardClick","onLoginSuccess","isLogin","setIsLogin","setFormData","isLoading","setIsLoading","handleChange","handleSubmit","setItem","login","AnnouncementDetail","setAnnouncement","fromTab","getAnnouncementDetail","fetchAnnouncement","paragraph","setTorrent","comments","setComments","newComment","setNewComment","setReplyingTo","replyContent","setReplyContent","activeReplyId","setActiveReplyId","replyModal","setReplyModal","replyingTo","replyingToUsername","isReply","openReplyModal","commentId","closeReplyModal","Comment","onLike","onReply","replyTo","renderComment","handleLikeComment","replies","reply","fetchTorrentDetail","_err$response","_err$response$data","likeTorrentComment","updateComments","_err$response4","_err$response4$data","_err$response2","_err$response2$data","addTorrentComment","commentData","_err$response3","_err$response3$data","rows","addCommentReply","replyData","_err$response5","_err$response5$data","RequestDetail","setPost","replyImage","setReplyImage","commentImage","setCommentImage","expandedReplies","setExpandedReplies","loadingReplies","setLoadingReplies","onDelete","imageUrl","handleDeleteComment","fetchPostDetail","handleDeletePost","deleteRequestPost","likeRequestPostComment","deleteRequestComment","_err$response6","_err$response6$data","ClassName","classname","para","likeRequestPost","handleMarkSolved","addRequestPostComment","addRequestCommentReply","_err$response7","_err$response7$data","HelpDetail","deleteHelpPost","likeHelpPostComment","deleteHelpComment","likeHelpPost","addHelpPostComment","addHelpCommentReply","Exchange","inviteCodes","setInviteCodes","setMagicPoints","codes","newCode","generateInviteCode","updatedUser","magicPoint","exchangeUpload","isUsed","torrents","setTorrents","setPagination","fetchTorrents","downloadCount","formattedSize","getUserTorrents","handleDelete","getPageNumbers","pages","startPage","maxVisiblePages","endPage","jumpToPage","notices","setSuccess","passwordForm","setPasswordForm","oldPassword","newPassword","confirmPassword","handlePasswordChange","put","updatePassword","minLength","millisecondsInWeek","millisecondsInMinute","millisecondsInHour","constructFromSymbol","constructFrom","toDate","argument","parseISO","_options$additionalDi","invalidDate","in","additionalDigits","dateStrings","dateTimeDelimiter","timeString","timeZoneDelimiter","timezone","splitDateString","parseYearResult","regex","captures","restDateString","century","parseYear","dateRegex","isWeekDate","dayOfYear","parseDateUnit","dayOfWeek","_year","validateWeekDate","isoWeekYear","setUTCFullYear","fourthOfJanuaryDay","getUTCDay","setUTCDate","getUTCDate","dayOfISOWeekYear","daysInMonths","isLeapYearIndex","validateDate","validateDayOfYearDate","parseDate","timeRegex","hours","parseTimeUnit","minutes","seconds","validateTime","parseTime","tmpDate","setFullYear","getUTCFullYear","getUTCMonth","setHours","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","timezoneString","timezoneRegex","sign","_hours","validateTimezone","parseTimezone","formatDistanceLocale","lessThanXSeconds","one","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","buildFormatLongFn","defaultWidth","formats","formatLong","full","long","medium","short","dateTime","formatRelativeLocale","lastWeek","yesterday","tomorrow","nextWeek","buildLocalizeFn","valuesArray","formattingValues","defaultFormattingWidth","argumentCallback","localize","ordinalNumber","dirtyNumber","_options","rem100","era","narrow","abbreviated","wide","quarter","dayPeriod","am","pm","midnight","noon","morning","afternoon","evening","night","buildMatchFn","matchPattern","matchPatterns","defaultMatchWidth","matchResult","matchedString","parsePatterns","defaultParseWidth","predicate","valueCallback","parsePattern","parseResult","any","enUS","formatDistance","tokenValue","addSuffix","comparison","formatRelative","_date","_baseDate","weekStartsOn","firstWeekContainsDate","dateLongFormatter","timeLongFormatter","longFormatters","dateTimeLongFormatter","datePattern","timePattern","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","_message","subject","defaultOptions","getDefaultOptions","getInternalDefaultOptions","transpose","date_","_constructor$prototyp","isConstructor","getHours","getMinutes","getSeconds","getMilliseconds","Setter","validate","_utcDate","ValueSetter","validateValue","subPriority","DateTimezoneSetter","timestampIsSet","Parser","setter","numericPatterns","timezonePatterns","mapValue","parseFnResult","mapFn","parseNumericPattern","parseTimezonePattern","parseAnyDigitsSigned","parseNDigits","parseNDigitsSigned","dayPeriodEnumToHours","normalizeTwoDigitYear","twoDigitYear","currentYear","isCommonEra","absCurrentYear","rangeEnd","trunc","startOfWeek","_options$weekStartsOn","_options$locale","_defaultOptions$local","getDay","setDate","getWeekYear","_options$firstWeekCon","firstWeekOfNextYear","startOfNextYear","firstWeekOfThisYear","startOfThisYear","startOfISOWeek","startOfWeekYear","firstWeek","getWeek","setWeek","getISOWeekYear","fourthOfJanuaryOfNextYear","fourthOfJanuaryOfThisYear","startOfISOWeekYear","fourthOfJanuary","getISOWeek","setISOWeek","DAYS_IN_MONTH","DAYS_IN_MONTH_LEAP_YEAR","addDays","setDay","currentDay","getISODay","setISODay","getTimezoneOffsetInMilliseconds","utcDate","UTC","parsers","isTwoDigitYear","normalizedTwoDigitYear","_flags","firstWeekOfYear","setMonth","isLeapYear","wholeWeekDays","isPM","setMinutes","setSeconds","setMilliseconds","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","notWhitespaceRegExp","unescapedLatinCharacterRegExp","dateStr","formatStr","referenceDate","_options$locale2","_ref7","_options$locale3","_defaultOptions$local2","subFnOptions","setters","firstCharacter","longFormatter","usedTokens","useAdditionalWeekYearTokens","useAdditionalDayOfYearTokens","incompatibleTokens","incompatibleToken","usedToken","fullToken","uniquePrioritySetters","setterArray","isValid","isBefore","dateToCompare","normalizeDates","dates","startOfDay","differenceInCalendarDays","laterDate","earlierDate","laterDate_","earlierDate_","laterStartOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","startOfYear","getDayOfYear","addLeadingZeros","targetLength","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","dayPeriodEnum","formatters","signedWeekYear","weekYear","isoWeek","localDayOfWeek","isoDayOfWeek","_localize","timezoneOffset","getTimezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","absOffset","originalDate","isToken","cleanEscapedString","preprocessor","formatterOptions","part","formatter","matched","startOfMonth","startOfQuarter","currentMonth","endOfDay","endOfWeek","endOfMonth","isSameYear","isSameMonth","isSameQuarter","dateLeft_","dateRight_","isSameDay","leftDate","rightDate","isWithinInterval","getDaysInMonth","monthIndex","lastDayOfMonth","midMonth","daysInMonth","setQuarter","getYear","endOfYear","getQuarter","addMonths","dayOfMonth","endOfDesiredMonth","subMonths","differenceInCalendarMonths","addQuarters","subQuarters","differenceInCalendarQuarters","addYears","subYears","differenceInCalendarYears","addMilliseconds","addHours","addMinutes","setTime","addSeconds","isAfter","addWeeks","setYear","differenceInDays","compareLocalAsc","difference","subWeeks","subDays","useSafeInsertionEffect","hasWindow","getNodeName","getWindow","_node$ownerDocument","getDocumentElement","Node","isElement","Element","isHTMLElement","isShadowRoot","isOverflowElement","overflowX","overflowY","isTableElement","isTopLayer","selector","isContainingBlock","elementOrCss","webkit","isWebKit","containerType","backdropFilter","willChange","contain","CSS","supports","isLastTraversableNode","getNodeScroll","scrollX","getParentNode","assignedSlot","getNearestOverflowAncestor","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","frameElement","getFrameElement","visualViewport","createCoords","oppositeSideMap","bottom","oppositeAlignmentMap","evaluate","param","getSide","getAlignment","getAxisLength","axis","getSideAxis","getAlignmentAxis","getOppositeAlignmentPlacement","alignment","getOppositePlacement","side","getPaddingObject","expandPaddingObject","rectToClientRect","rect","computeCoordsFromPlacement","floating","sideAxis","alignmentAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","detectOverflow","_await$platform$isEle","rects","strategy","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","getClippingRect","contextElement","offsetParent","getOffsetParent","offsetScale","getScale","elementClientRect","convertOffsetParentRelativeRectToViewportRelativeRect","getCssDimensions","hasOffset","shouldFallback","$","unwrapElement","getBoundingClientRect","noOffsets","getVisualOffsets","offsetLeft","offsetTop","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","isFixed","floatingOffsetParent","shouldAddVisualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","clientLeft","paddingLeft","clientTop","paddingTop","getWindowScrollBarX","leftScroll","getHTMLOffset","scroll","ignoreScrollbarX","htmlRect","getClientRectFromClippingAncestor","clippingAncestor","html","clientWidth","clientHeight","visualViewportBased","getViewportRect","scrollWidth","scrollHeight","getDocumentRect","getInnerBoundingClientRect","hasFixedPositionAncestor","stopNode","getRectRelativeToOffsetParent","isOffsetParentAnElement","offsets","setLeftRTLScrollbarOffset","offsetRect","htmlOffset","isStaticPositioned","getTrueOffsetParent","rawOffsetParent","svgOffsetParent","currentNode","getContainingBlock","topLayer","elementClippingAncestors","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingElementAncestors","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getElementRects","getOffsetParentFn","getDimensionsFn","getDimensions","floatingDimensions","getClientRects","isRTL","rectsAreEqual","autoUpdate","ancestorScroll","ancestorResize","elementResize","ResizeObserver","layoutShift","IntersectionObserver","referenceEl","ancestors","cleanupIo","onMove","timeoutId","io","_io","disconnect","elementRectForRootMargin","rootMargin","isFirstUpdate","handleObserve","intersectionRatio","_e","observe","observeMove","frameId","reobserveFrame","resizeObserver","firstEntry","unobserve","_resizeObserver","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","_middlewareData$offse","_middlewareData$arrow","middlewareData","diffCoords","mainAxisMulti","crossAxisMulti","mainAxis","crossAxis","convertValueToCoords","arrow","alignmentOffset","flip","_middlewareData$flip","initialPlacement","_evaluate2","checkMainAxis","checkCrossAxis","fallbackPlacements","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","flipAlignment","detectOverflowOptions","initialSideAxis","isBasePlacement","oppositePlacement","getExpandedPlacements","hasFallbackAxisSideDirection","isStart","lr","rl","tb","bt","getSideList","getOppositeAxisPlacements","overflows","overflowsData","sides","mainAlignmentSide","getAlignmentSides","_middlewareData$flip2","_overflowsData$filter","nextPlacement","_overflowsData$","ignoreCrossAxisOverflow","hasInitialMainAxisOverflow","resetPlacement","_overflowsData$filter2","currentSideAxis","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","centerOffset","computePosition","platformWithCache","middleware","validMiddleware","statefulPlacement","resetCount","nextX","nextY","computePosition$1","getDPR","devicePixelRatio","roundByDPR","dpr","useLatestRef","offset$1","arrow$2","arrow$1","ARROW_LEFT","ARROW_RIGHT","ARROW_UP","ARROW_DOWN","horizontalKeys","verticalKeys","SafeReact","serverHandoffComplete","genId","setId","useModernLayoutEffect","FloatingArrow","tipRadius","staticOffset","stroke","restStyle","_excluded3","_excluded4","clipPathId","setIsRTL","isVerticalSide","computedStaticOffset","computedStrokeWidth","halfStrokeWidth","svgX","svgY","isCustomShape","yOffsetProp","xOffsetProp","arrowX","arrowY","dValue","rotation","viewBox","clipPath","createEventEmitter","_map$get","_map$get2","FloatingNodeContext","FloatingTreeContext","useFloatingParentNodeId","useFloatingTree","useFloatingRootContext","onOpenChange","onOpenChangeProp","elementsProp","floatingId","dataRef","nested","positionReference","setPositionReference","useEffectEvent","openEvent","domReference","useFloating","nodeId","internalRootContext","rootContext","computedElements","_domReference","setDomReference","_setPositionReference","domReferenceRef","externalReference","externalFloating","whileElementsMounted","setData","isPositioned","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","referenceRef","setFloating","floatingRef","floatingEl","hasWhileElementsMounted","whileElementsMountedRef","platformRef","openRef","fullData","isMountedRef","floatingStyles","initialStyles","useFloating$1","computedPositionReference","floatingContext","nodesRef","_extendStatics","__extends","__","_assign","__spreadArray","pack","ar","SuppressedError","KeyType","CalendarContainer","showTimeSelectOnly","showTime","ariaLabel","ClickOutsideWrapper","onClickOutside","containerRef","detectRef","ignoreClass","onClickOutsideRef","handleClickOutside","composed","composedPath","eventTarget","classList","useDetectClickOutside","getLocaleScope","newDate","strictParsing","refDate","localeObject","getLocaleObject","getDefaultLocale","formats_1","format_1","parsedDate","minDate","isValid$1","localeObj","safeDateFormat","hour","minute","second","getStartOfDay","getStartOfWeek","calendarStartDay","getStartOfMonth","getStartOfYear","getStartOfQuarter","getStartOfToday","getEndOfDay","getEndOfMonth","date1","date2","isSameYear$1","isSameMonth$1","isSameQuarter$1","isSameDay$1","isEqual$1","isDayInRange","startDate","endDate","__localeId__","localeSpec","__localeData__","getMonthInLocale","getMonthShortInLocale","isDayDisabled","maxDate","excludeDates","excludeDateIntervals","includeDates","includeDateIntervals","filterDate","isOutOfBounds","excludeDate","includeDate","isDayExcluded","isMonthDisabled","isMonthInRange","startDateYear","startDateMonth","endDateYear","endDateMonth","dayYear","isMonthYearDisabled","excludedDate","includedDate","isQuarterDisabled","isYearInRange","startYear","endYear","isYearDisabled","isQuarterInRange","startDateQuarter","endDateQuarter","isTimeInList","listTime","isTimeDisabled","excludeTimes","includeTimes","filterTime","isTimeInDisabledRange","minTime","maxTime","baseTime","monthDisabledBefore","monthDisabledAfter","yearDisabledBefore","yearDisabledAfter","getEffectiveMinDate","getEffectiveMaxDate","getHighLightDaysMap","highlightDates","defaultClassName","dateClasses","classNamesArr","arrOfDates","len_1","dateK","getHolidaysMap","holidayDates","holiday","dateObj","holidayName","classNamesObj","holidayNames","array1","array2","holidayNameArr","timesToInjectAfter","currentMultiplier","intervals","injectedTimes","injectedTime","injectedTimeValue","nextTime","addZero","getYearsPeriod","yearItemNumber","endPeriod","startPeriod","startOfMinute","getMidnightDate","dateWithoutTime","isDateBefore","isSpaceKeyDown","Space","InputTime","inputRef","onTimeChange","propDate","renderTimeInput","customTimeInput","timeInputLabel","Day","dayEl","handleClick","handleMouseEnter","handleOnKeyDown","Enter","isKeyboardSelected","disabledKeyboardNavigation","isSelectedDate","selectsMultiple","selectedDates","isSameDayOrWeek","preSelection","isExcluded","isStartOfWeek","isSameWeek","showWeekPicker","getHighLightedClass","dayStr","getHolidaysClass","holidays","isInRange","isInSelectingRange","selectsStart","selectsEnd","selectsRange","selectsDisabledDaysInRange","selectingDate","isSelectingRangeStart","isSelectingRangeEnd","isRangeStart","isRangeEnd","isWeekend","weekday","isAfterMonth","isBeforeMonth","isCurrentDay","isSelected","getClassNames","dayClassName","getDayOfWeekCode","getAriaLabel","ariaLabelPrefixWhenEnabled","ariaLabelPrefixWhenDisabled","getTitle","compareDt","getTabIndex","selectedDay","preSelectionDay","showWeekNumber","handleFocusDay","shouldFocusDay","preventScroll","renderDayContents","monthShowsDuplicateDaysEnd","monthShowsDuplicateDaysStart","usePointerEvent","onPointerEnter","inline","shouldFocusDayInline","isDayActiveElement","isDuplicateDay","WeekNumber","weekNumberEl","handleFocusWeekNumber","shouldFocusWeekNumber","isInputFocused","ariaLabelPrefix","weekNumber","isWeekDisabled","weekNumberClasses","Week","handleDayClick","onDayClick","handleDayMouseEnter","onDayMouseEnter","handleWeekClick","enabledWeekDay","processingDay","onWeekSelect","shouldCloseOnSelect","setOpen","formatWeekNumber","processingDate","renderDays","days","onClickAction","chooseDayAriaLabelPrefix","disabledDayAriaLabelPrefix","MONTH_COLUMNS_LAYOUT","MONTH_COLUMNS","grid","verticalNavigationOffset","getMonthColumnsLayout","showFourColumnMonthYearPicker","showTwoColumnMonthYearPicker","Month","MONTH_REFS","QUARTER_REFS","orderInDisplay","handleMouseLeave","isRangeStartMonth","isRangeStartQuarter","isRangeEndMonth","isRangeEndQuarter","isInSelectingRangeMonth","isSelectingMonthRangeStart","_month","isSelectingMonthRangeEnd","isInSelectingRangeQuarter","isWeekInMonth","isCurrentMonth","isCurrentQuarter","isSelectedMonth","isSelectMonthInList","selectedDate","isSelectedQuarter","renderWeeks","weeks","isFixedHeight","fixedHeight","breakAfterNextPush","currentWeekStart","isPreSelected","weekAriaLabelPrefix","showWeekNumbers","isFixedAndFinalWeek","isNonFixedAndOutOfMonth","peekNextMonth","onMonthClick","isMonthDisabledForLabelDate","labelDate","onMonthMouseEnter","handleMonthNavigation","newMonth","setPreSelection","handleKeyboardNavigation","monthColumnsLayout","getVerticalOffset","monthsGrid","calculateNewDateAndMonth","newCalculatedDate","newCalculatedMonth","ArrowRight","ArrowLeft","ArrowUp","ArrowDown","eventKeyCopy","validDateFound","iterations","getNewDateAndMonth","onMonthKeyDown","handleOnMonthKeyDown","Tab","onQuarterClick","onQuarterMouseEnter","handleQuarterNavigation","newQuarter","onQuarterKeyDown","getMonthClassNames","monthClassName","_monthClassName","preSelectedMonth","isPreSelectedMonthDisabled","getQuarterTabIndex","preSelectedQuarter","isCurrentQuarterDisabled","getQuarterClassNames","getMonthContent","showFullMonthYearPicker","renderMonthContent","shortMonthText","fullMonthText","getQuarterContent","renderQuarterContent","shortQuarter","getQuarterShortInLocale","renderMonths","monthColumns","renderQuarters","showMonthYearPicker","showQuarterYearPicker","formattedAriaLabelPrefix","onPointerLeave","MonthDropdownOptions","renderOptions","monthNames","onCancel","MonthDropdown","dropdownVisible","renderSelectOptions","renderSelectMode","renderReadView","toggleDropdown","renderDropdown","renderScrollMode","renderedDropdown","useShortMonthInDropdown","dropdownMode","generateMonthYears","currDate","lastDate","MonthYearDropdownOptions","monthYearsList","monthYear","monthYearPoint","isSameMonthYear","dropdownClass","scrollableMonthYearDropdown","MonthYearDropdown","timePoint","onSelectChange","yearMonth","changedDate","Time","scrollToTheSelectedTime","centerLi","calcCenterPosition","monthRef","isSelectedTime","d1","d2","isDisabledTime","liClasses","timeClassName","injectTimes","renderTimes","activeDate","openToDate","sortedInjectTimes","minutesInDay","startOfTheNextDay","getHoursInDay","multiplier","timesToInject","timeToFocus","li","renderTimeCaption","showTimeCaption","timeCaption","todayButton","observeDatePickerHeightChanges","updateContainerHeight","listHeight","centerLiRef","Year","YEAR_REFS","updateFocusOnPaginate","refIndex","handleYearClick","handleYearNavigation","newYear","isCurrentYear","isSelectedYear","onYearClick","onYearKeyDown","leftOverOffset","getYearClassNames","yearClassName","getYearTabIndex","preSelected","isPreSelectedYearDisabled","getYearContent","renderYearContent","yearsList","onYearMouseEnter","onYearMouseLeave","this_1","clearSelectingDate","generateYears","noOfYear","YearDropdownOptions","selectedYear","minYear","maxYear","incrementYears","decrementYears","shiftYears","years","yearDropdownItemNumber","scrollableYearDropdown","dropdownRef","dropdownCurrent","dropdownCurrentChildren","selectedYearOptionEl","childEl","ariaSelected","YearDropdown","adjustDateOnChange","handleYearChange","onSelect","DROPDOWN_FOCUS_CLASSNAMES","monthContainer","setClickOutsideRef","handleDropdownFocus","testClassname","isDropdownSelect","onDropdownFocus","getDateInView","initialDate","increaseMonth","handleMonthChange","decreaseMonth","monthSelectedIn","handleMonthMouseLeave","onMonthMouseLeave","handleYearMouseEnter","handleYearMouseLeave","onYearChange","isRenderAriaLiveMessage","getEnabledPreSelectionDateForMonth","totalDays","preSelectedDate","dayIdx","enabledPreSelectionDate","handleCustomMonthChange","onMonthChange","handleMonthYearChange","changeYear","changeMonth","changeMonthYear","dayNames","weekLabel","weekDayName","formatWeekday","weekDayClassName","formatWeekDay","formatFunc","getFormattedWeekdayInLocale","useWeekdaysShort","getWeekdayShortInLocale","getWeekdayMinInLocale","decreaseYear","showYearPicker","renderPreviousButton","renderCustomHeader","allPrevDaysDisabled","monthsShown","monthsToSubtract","showPreviousMonths","fromMonthDate","minDateYear","yearsDisabledBefore","previousQuarter","quarterDisabledBefore","forceShowMonthNavigation","showDisabledMonthNavigation","clickHandler","isForYear","previousMonthButtonLabel","_f","previousYearButtonLabel","_g","previousMonthAriaLabel","_j","previousYearAriaLabel","increaseYear","renderNextButton","allNextDaysDisabled","maxDateYear","yearsDisabledAfter","nextQuarter","quarterDisabledAfter","showTimeSelect","nextMonthButtonLabel","nextYearButtonLabel","nextMonthAriaLabel","nextYearAriaLabel","renderCurrentMonth","showYearDropdown","showMonthDropdown","showMonthYearDropdown","renderYearDropdown","overrideHide","renderMonthDropdown","renderMonthYearDropdown","handleTodayButtonClick","renderTodayButton","renderDefaultHeader","monthDate","onFocus","headerArgs","prevMonthButtonDisabled","nextMonthButtonDisabled","prevYearButtonDisabled","nextYearButtonDisabled","showDayNames","customHeaderCount","renderYearHeader","renderHeader","monthList","monthsToAdd","monthKey","monthAriaLabelPrefix","handleOnDayKeyDown","renderYears","renderTimeSection","timeFormat","timeIntervals","renderInputTimeSection","showTimeInput","renderAriaLiveRegion","ariaLiveMessage","renderChildren","assignMonthContainer","hasMonthChanged_1","Container","outsideClickIgnoreClass","CalendarIcon","defaultClass","iconElement_1","xmlns","Portal","portalRoot","portalHost","getElementById","portalId","focusableFilter","HTMLAnchorElement","TabLoop","getTabChildren","tabLoopRef","handleFocusStart","tabChildren","handleFocusEnd","enableTabLoop","PopperComponent","hidePopper","wrapperClassName","popperComponent","targetComponent","popperOnKeyDown","popperProps","showArrow","popper","arrowRef","popperContainer","wrapperClasses","PopperComponent$1","floatingProps","popperPlacement","flip$1","popperModifiers","componentProps","INPUT_ERR_1","getPreSelection","modifyHolidays","accumulator","calcInitialState","defaultPreSelection","boundedPreSelection","startOpen","preventFocus","inputValue","focused","resetHiddenStatus","setHiddenStatus","setHiddenStateOnVisibilityHidden","visibilityState","clearPreventFocusTimeout","preventFocusTimeout","setFocus","setBlur","blur","cancelFocusInput","deferBlur","skipSetBlur","lastPreSelectChange","PRESELECT_CHANGE_VIA_NAVIGATE","inputOk","isCalendarOpen","readOnly","handleFocus","isAutoReFocus","isOpenAllowed","preventOpenOnFocus","sendFocusBackToInput","inputFocusTimeout","deferFocusInput","handleBlur","withPortal","onBlur","handleCalendarClickOutside","allArgs","onChangeRaw","HTMLInputElement","PRESELECT_CHANGE_VIA_INPUT","valueStart","valueEnd","startDateNew","endDateNew","startChanged","endChanged","setSelected","handleSelect","showDateSelect","swapRange","keepInput","allowSameDay","focusSelectedMonth","hasStartRange","isRangeFilled","nextDates","hasMinDate","hasMaxDate","isValidDateSelection","dateStartOfDay","minDateStartOfDay","maxDateEndOfDay","toggleCalendar","handleTimeChange","onInputClick","onInputKeyDown","selectorString","selectedItem","Escape","onInputError","onPortalKeyDown","onDayKeyDown","isShiftKeyActive","calculateNewDate","PageUp","PageDown","Home","End","getEndOfWeek","newSelection","getNewDate","prevMonth","prevYear","onPopperKeyDown","onClearClick","closeOnScroll","renderCalendar","dateFormatCalendar","calendarClassName","calendarContainer","longDateFormat","renderDateInput","customInput","customInputRef","formattedStartDate","formattedEndDate","safeDateRangeFormat","formattedFirstDate","formattedSecondDate","extraDatesCount","safeMultipleDatesFormat","placeholderText","autoComplete","ariaDescribedBy","ariaInvalid","ariaLabelledBy","ariaRequired","renderClearButton","isClearable","clearButtonTitle","clearButtonClassName","ariaLabelClose","showPopperArrow","excludeScrollbar","toggleCalendarOnIconClick","onCalendarOpen","onCalendarClose","renderInputContainer","showIcon","calendarIconClassname","calendarIconClassName","portalContainer","popperClassName","Administer","users","setUsers","discounts","setDiscounts","currentDiscount","setCurrentDiscount","searchKey","setSearchKey","newAnnouncement","setNewAnnouncement","newDiscount","setNewDiscount","discountType","setStartDate","setEndDate","setActiveTab","fetchAllUsers","_response$data","getAllUsers","formattedUsers","user","lastLogin","handleChangeAuthority","newAuthority","changeUsername","updateUserAuthority","fetchAllDiscounts","fetchCurrentDiscount","_response$data5","_response$data$data2","_response$data6","getCurrentDiscount","handleAddDiscount","formatDateToISO","discountData","_response$data7","addDiscount","isEndTime","pad","handleDeleteDiscount","_response$data8","deleteDiscount","formatDateTime","translateDiscountType","fetchAllAnnouncements","_Fragment","_response$data2","_response$data3","searchUsers","handleReset","postAnnouncement","removeItem","isAuthenticated","setIsAuthenticated","handleLogout","AuthForm","Dashboard","Setting","TorrentDetail","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","App","reportWebVitals"],"sourceRoot":""}
\ No newline at end of file
