diff --git a/.gitignore b/.gitignore index 87542c65..f7154ae4 100644 --- a/.gitignore +++ b/.gitignore @@ -47,5 +47,5 @@ __MACOSX/ /composer.json # Ignore node_modules files and folder -/node_modules/ +**/node_modules/ package-lock.json \ No newline at end of file diff --git a/.htaccess b/.htaccess index 97bb5519..3c699150 100644 --- a/.htaccess +++ b/.htaccess @@ -56,6 +56,12 @@ Require all denied +# Deny access to docker files + + Order allow,deny + Deny from all + + #Cache images / scripts ExpiresActive on diff --git a/Admin/Resources/Assets/Css/style.css b/Admin/Resources/Assets/Css/style.css index 5caee7d5..15b87887 100644 --- a/Admin/Resources/Assets/Css/style.css +++ b/Admin/Resources/Assets/Css/style.css @@ -1 +1 @@ -*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(63,131,248,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(63,131,248,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.tooltip-arrow,.tooltip-arrow:before{position:absolute;width:8px;height:8px;background:inherit}.tooltip-arrow{visibility:hidden}.tooltip-arrow:before{content:"";visibility:visible;transform:rotate(45deg)}[data-tooltip-style^=light]+.\!tooltip>.tooltip-arrow:before{border-style:solid!important;border-color:#e5e7eb!important}[data-tooltip-style^=light]+.tooltip>.tooltip-arrow:before{border-style:solid;border-color:#e5e7eb}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px!important;border-right-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px;border-right-width:1px}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px!important;border-left-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px!important;border-left-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px!important;border-right-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px;border-right-width:1px}.\!tooltip[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px!important}.tooltip[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px}.\!tooltip[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px!important}.tooltip[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px}.\!tooltip[data-popper-placement^=left]>.tooltip-arrow{right:-4px!important}.tooltip[data-popper-placement^=left]>.tooltip-arrow{right:-4px}.\!tooltip[data-popper-placement^=right]>.tooltip-arrow{left:-4px!important}.tooltip[data-popper-placement^=right]>.tooltip-arrow{left:-4px}.\!tooltip.invisible>.tooltip-arrow:before{visibility:hidden!important}.tooltip.invisible>.tooltip-arrow:before{visibility:hidden}[data-popper-arrow],[data-popper-arrow]:before{position:absolute;width:8px;height:8px;background:inherit}[data-popper-arrow]{visibility:hidden}[data-popper-arrow]:after,[data-popper-arrow]:before{content:"";visibility:visible;transform:rotate(45deg)}[data-popper-arrow]:after{position:absolute;width:9px;height:9px;background:inherit}[role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:#e5e7eb}.dark [role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:#4b5563}[role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:#e5e7eb}.dark [role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:#4b5563}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:before{border-bottom-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:before{border-bottom-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:before{border-top-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:before{border-top-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]{bottom:-5px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]{top:-5px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]{right:-5px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]{left:-5px}[role=tooltip].invisible>[data-popper-arrow]:after,[role=tooltip].invisible>[data-popper-arrow]:before{visibility:hidden}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#1c64f2}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}select:not([size]){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' aria-hidden='true' viewBox='0 0 10 6'%3E%3Cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3E%3C/svg%3E");background-position:right .75rem center;background-repeat:no-repeat;background-size:.75em .75em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#1c64f2;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark [type=checkbox]:checked,.dark [type=radio]:checked,[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:.55em .55em;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' aria-hidden='true' viewBox='0 0 16 12'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:.55em .55em;-webkit-print-color-adjust:exact;print-color-adjust:exact}.dark [type=radio]:checked,[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-size:1em 1em}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' aria-hidden='true' viewBox='0 0 16 12'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3E%3C/svg%3E");background-color:currentColor;border-color:transparent;background-position:50%;background-repeat:no-repeat;background-size:.55em .55em;-webkit-print-color-adjust:exact;print-color-adjust:exact}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px auto inherit}input[type=file]::file-selector-button{color:#fff;background:#1f2937;border:0;font-weight:500;font-size:.875rem;cursor:pointer;padding:.625rem 1rem .625rem 2rem;margin-inline-start:-1rem;margin-inline-end:1rem}input[type=file]::file-selector-button:hover{background:#374151}.dark input[type=file]::file-selector-button{color:#fff;background:#4b5563}.dark input[type=file]::file-selector-button:hover{background:#6b7280}input[type=range]::-webkit-slider-thumb{height:1.25rem;width:1.25rem;background:#1c64f2;border-radius:9999px;border:0;appearance:none;-moz-appearance:none;-webkit-appearance:none;cursor:pointer}input[type=range]:disabled::-webkit-slider-thumb{background:#9ca3af}.dark input[type=range]:disabled::-webkit-slider-thumb{background:#6b7280}input[type=range]:focus::-webkit-slider-thumb{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1px;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity))}input[type=range]::-moz-range-thumb{height:1.25rem;width:1.25rem;background:#1c64f2;border-radius:9999px;border:0;appearance:none;-moz-appearance:none;-webkit-appearance:none;cursor:pointer}input[type=range]:disabled::-moz-range-thumb{background:#9ca3af}.dark input[type=range]:disabled::-moz-range-thumb{background:#6b7280}input[type=range]::-moz-range-progress{background:#3f83f8}input[type=range]::-ms-fill-lower{background:#3f83f8}.toggle-bg:after{content:"";position:absolute;top:.125rem;left:.125rem;background:#fff;border-color:#d1d5db;border-width:1px;border-radius:9999px;height:1.25rem;width:1.25rem;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.15s;box-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}input:checked+.toggle-bg:after{transform:translateX(100%);;border-color:#fff}input:checked+.toggle-bg{background:#1c64f2;border-color:#1c64f2}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.\!relative{position:relative!important}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.bottom-\[60px\]{bottom:60px}.end-1{inset-inline-end:.25rem}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.right-2{right:.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.float-right{float:right}.-m-0{margin:0}.-m-0\.5{margin:-.125rem}.-m-1{margin:-.25rem}.-m-1\.5{margin:-.375rem}.-m-10{margin:-2.5rem}.-m-11{margin:-2.75rem}.-m-12{margin:-3rem}.-m-14{margin:-3.5rem}.-m-16{margin:-4rem}.-m-2{margin:-.5rem}.-m-2\.5{margin:-.625rem}.-m-20{margin:-5rem}.-m-24{margin:-6rem}.-m-28{margin:-7rem}.-m-3{margin:-.75rem}.-m-3\.5{margin:-.875rem}.-m-32{margin:-8rem}.-m-36{margin:-9rem}.-m-4{margin:-1rem}.-m-40{margin:-10rem}.-m-44{margin:-11rem}.-m-48{margin:-12rem}.-m-5{margin:-1.25rem}.-m-52{margin:-13rem}.-m-56{margin:-14rem}.-m-6{margin:-1.5rem}.-m-60{margin:-15rem}.-m-64{margin:-16rem}.-m-7{margin:-1.75rem}.-m-72{margin:-18rem}.-m-8{margin:-2rem}.-m-80{margin:-20rem}.-m-9{margin:-2.25rem}.-m-96{margin:-24rem}.m-0{margin:0}.m-0\.5{margin:.125rem}.m-1{margin:.25rem}.m-1\.5{margin:.375rem}.m-10{margin:2.5rem}.m-11{margin:2.75rem}.m-12{margin:3rem}.m-14{margin:3.5rem}.m-16{margin:4rem}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.m-20{margin:5rem}.m-24{margin:6rem}.m-28{margin:7rem}.m-3{margin:.75rem}.m-3\.5{margin:.875rem}.m-32{margin:8rem}.m-36{margin:9rem}.m-4{margin:1rem}.m-40{margin:10rem}.m-44{margin:11rem}.m-48{margin:12rem}.m-5{margin:1.25rem}.m-52{margin:13rem}.m-56{margin:14rem}.m-6{margin:1.5rem}.m-60{margin:15rem}.m-64{margin:16rem}.m-7{margin:1.75rem}.m-72{margin:18rem}.m-8{margin:2rem}.m-80{margin:20rem}.m-9{margin:2.25rem}.m-96{margin:24rem}.-mx-0{margin-left:0;margin-right:0}.-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.-mx-12{margin-left:-3rem;margin-right:-3rem}.-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.-mx-16{margin-left:-4rem;margin-right:-4rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.-mx-20{margin-left:-5rem;margin-right:-5rem}.-mx-24{margin-left:-6rem;margin-right:-6rem}.-mx-28{margin-left:-7rem;margin-right:-7rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.-mx-32{margin-left:-8rem;margin-right:-8rem}.-mx-36{margin-left:-9rem;margin-right:-9rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-mx-40{margin-left:-10rem;margin-right:-10rem}.-mx-44{margin-left:-11rem;margin-right:-11rem}.-mx-48{margin-left:-12rem;margin-right:-12rem}.-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.-mx-52{margin-left:-13rem;margin-right:-13rem}.-mx-56{margin-left:-14rem;margin-right:-14rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-mx-60{margin-left:-15rem;margin-right:-15rem}.-mx-64{margin-left:-16rem;margin-right:-16rem}.-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.-mx-72{margin-left:-18rem;margin-right:-18rem}.-mx-8{margin-left:-2rem;margin-right:-2rem}.-mx-80{margin-left:-20rem;margin-right:-20rem}.-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.-mx-96{margin-left:-24rem;margin-right:-24rem}.-my-0{margin-top:0;margin-bottom:0}.-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.-my-12{margin-top:-3rem;margin-bottom:-3rem}.-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.-my-16{margin-top:-4rem;margin-bottom:-4rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.-my-20{margin-top:-5rem;margin-bottom:-5rem}.-my-24{margin-top:-6rem;margin-bottom:-6rem}.-my-28{margin-top:-7rem;margin-bottom:-7rem}.-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.-my-32{margin-top:-8rem;margin-bottom:-8rem}.-my-36{margin-top:-9rem;margin-bottom:-9rem}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.-my-40{margin-top:-10rem;margin-bottom:-10rem}.-my-44{margin-top:-11rem;margin-bottom:-11rem}.-my-48{margin-top:-12rem;margin-bottom:-12rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.-my-52{margin-top:-13rem;margin-bottom:-13rem}.-my-56{margin-top:-14rem;margin-bottom:-14rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.-my-60{margin-top:-15rem;margin-bottom:-15rem}.-my-64{margin-top:-16rem;margin-bottom:-16rem}.-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.-my-72{margin-top:-18rem;margin-bottom:-18rem}.-my-8{margin-top:-2rem;margin-bottom:-2rem}.-my-80{margin-top:-20rem;margin-bottom:-20rem}.-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.-my-96{margin-top:-24rem;margin-bottom:-24rem}.mx-0{margin-left:0;margin-right:0}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.mx-11{margin-left:2.75rem;margin-right:2.75rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-14{margin-left:3.5rem;margin-right:3.5rem}.mx-16{margin-left:4rem;margin-right:4rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.mx-20{margin-left:5rem;margin-right:5rem}.mx-24{margin-left:6rem;margin-right:6rem}.mx-28{margin-left:7rem;margin-right:7rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.mx-32{margin-left:8rem;margin-right:8rem}.mx-36{margin-left:9rem;margin-right:9rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-40{margin-left:10rem;margin-right:10rem}.mx-44{margin-left:11rem;margin-right:11rem}.mx-48{margin-left:12rem;margin-right:12rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-52{margin-left:13rem;margin-right:13rem}.mx-56{margin-left:14rem;margin-right:14rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-60{margin-left:15rem;margin-right:15rem}.mx-64{margin-left:16rem;margin-right:16rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.mx-72{margin-left:18rem;margin-right:18rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-80{margin-left:20rem;margin-right:20rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.mx-96{margin-left:24rem;margin-right:24rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0;margin-bottom:0}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-11{margin-top:2.75rem;margin-bottom:2.75rem}.my-12{margin-top:3rem;margin-bottom:3rem}.my-14{margin-top:3.5rem;margin-bottom:3.5rem}.my-16{margin-top:4rem;margin-bottom:4rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.my-20{margin-top:5rem;margin-bottom:5rem}.my-24{margin-top:6rem;margin-bottom:6rem}.my-28{margin-top:7rem;margin-bottom:7rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.my-32{margin-top:8rem;margin-bottom:8rem}.my-36{margin-top:9rem;margin-bottom:9rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-40{margin-top:10rem;margin-bottom:10rem}.my-44{margin-top:11rem;margin-bottom:11rem}.my-48{margin-top:12rem;margin-bottom:12rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-52{margin-top:13rem;margin-bottom:13rem}.my-56{margin-top:14rem;margin-bottom:14rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-60{margin-top:15rem;margin-bottom:15rem}.my-64{margin-top:16rem;margin-bottom:16rem}.my-7{margin-top:1.75rem;margin-bottom:1.75rem}.my-72{margin-top:18rem;margin-bottom:18rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-80{margin-top:20rem;margin-bottom:20rem}.my-9{margin-top:2.25rem;margin-bottom:2.25rem}.my-96{margin-top:24rem;margin-bottom:24rem}.-mb-0{margin-bottom:0}.-mb-0\.5{margin-bottom:-.125rem}.-mb-1{margin-bottom:-.25rem}.-mb-1\.5{margin-bottom:-.375rem}.-mb-10{margin-bottom:-2.5rem}.-mb-11{margin-bottom:-2.75rem}.-mb-12{margin-bottom:-3rem}.-mb-14{margin-bottom:-3.5rem}.-mb-16{margin-bottom:-4rem}.-mb-2{margin-bottom:-.5rem}.-mb-2\.5{margin-bottom:-.625rem}.-mb-20{margin-bottom:-5rem}.-mb-24{margin-bottom:-6rem}.-mb-28{margin-bottom:-7rem}.-mb-3{margin-bottom:-.75rem}.-mb-3\.5{margin-bottom:-.875rem}.-mb-32{margin-bottom:-8rem}.-mb-36{margin-bottom:-9rem}.-mb-4{margin-bottom:-1rem}.-mb-40{margin-bottom:-10rem}.-mb-44{margin-bottom:-11rem}.-mb-48{margin-bottom:-12rem}.-mb-5{margin-bottom:-1.25rem}.-mb-52{margin-bottom:-13rem}.-mb-56{margin-bottom:-14rem}.-mb-6{margin-bottom:-1.5rem}.-mb-60{margin-bottom:-15rem}.-mb-64{margin-bottom:-16rem}.-mb-7{margin-bottom:-1.75rem}.-mb-72{margin-bottom:-18rem}.-mb-8{margin-bottom:-2rem}.-mb-80{margin-bottom:-20rem}.-mb-9{margin-bottom:-2.25rem}.-mb-96{margin-bottom:-24rem}.-ml-0{margin-left:0}.-ml-0\.5{margin-left:-.125rem}.-ml-1{margin-left:-.25rem}.-ml-1\.5{margin-left:-.375rem}.-ml-10{margin-left:-2.5rem}.-ml-11{margin-left:-2.75rem}.-ml-12{margin-left:-3rem}.-ml-14{margin-left:-3.5rem}.-ml-16{margin-left:-4rem}.-ml-2{margin-left:-.5rem}.-ml-2\.5{margin-left:-.625rem}.-ml-20{margin-left:-5rem}.-ml-24{margin-left:-6rem}.-ml-28{margin-left:-7rem}.-ml-3{margin-left:-.75rem}.-ml-3\.5{margin-left:-.875rem}.-ml-32{margin-left:-8rem}.-ml-36{margin-left:-9rem}.-ml-4{margin-left:-1rem}.-ml-40{margin-left:-10rem}.-ml-44{margin-left:-11rem}.-ml-48{margin-left:-12rem}.-ml-5{margin-left:-1.25rem}.-ml-52{margin-left:-13rem}.-ml-56{margin-left:-14rem}.-ml-6{margin-left:-1.5rem}.-ml-60{margin-left:-15rem}.-ml-64{margin-left:-16rem}.-ml-7{margin-left:-1.75rem}.-ml-72{margin-left:-18rem}.-ml-8{margin-left:-2rem}.-ml-80{margin-left:-20rem}.-ml-9{margin-left:-2.25rem}.-ml-96{margin-left:-24rem}.-mr-0{margin-right:0}.-mr-0\.5{margin-right:-.125rem}.-mr-1{margin-right:-.25rem}.-mr-1\.5{margin-right:-.375rem}.-mr-10{margin-right:-2.5rem}.-mr-11{margin-right:-2.75rem}.-mr-12{margin-right:-3rem}.-mr-14{margin-right:-3.5rem}.-mr-16{margin-right:-4rem}.-mr-2{margin-right:-.5rem}.-mr-2\.5{margin-right:-.625rem}.-mr-20{margin-right:-5rem}.-mr-24{margin-right:-6rem}.-mr-28{margin-right:-7rem}.-mr-3{margin-right:-.75rem}.-mr-3\.5{margin-right:-.875rem}.-mr-32{margin-right:-8rem}.-mr-36{margin-right:-9rem}.-mr-4{margin-right:-1rem}.-mr-40{margin-right:-10rem}.-mr-44{margin-right:-11rem}.-mr-48{margin-right:-12rem}.-mr-5{margin-right:-1.25rem}.-mr-52{margin-right:-13rem}.-mr-56{margin-right:-14rem}.-mr-6{margin-right:-1.5rem}.-mr-60{margin-right:-15rem}.-mr-64{margin-right:-16rem}.-mr-7{margin-right:-1.75rem}.-mr-72{margin-right:-18rem}.-mr-8{margin-right:-2rem}.-mr-80{margin-right:-20rem}.-mr-9{margin-right:-2.25rem}.-mr-96{margin-right:-24rem}.-mt-0{margin-top:0}.-mt-0\.5{margin-top:-.125rem}.-mt-1{margin-top:-.25rem}.-mt-1\.5{margin-top:-.375rem}.-mt-10{margin-top:-2.5rem}.-mt-11{margin-top:-2.75rem}.-mt-12{margin-top:-3rem}.-mt-14{margin-top:-3.5rem}.-mt-16{margin-top:-4rem}.-mt-2{margin-top:-.5rem}.-mt-2\.5{margin-top:-.625rem}.-mt-20{margin-top:-5rem}.-mt-24{margin-top:-6rem}.-mt-28{margin-top:-7rem}.-mt-3{margin-top:-.75rem}.-mt-3\.5{margin-top:-.875rem}.-mt-32{margin-top:-8rem}.-mt-36{margin-top:-9rem}.-mt-4{margin-top:-1rem}.-mt-40{margin-top:-10rem}.-mt-44{margin-top:-11rem}.-mt-48{margin-top:-12rem}.-mt-5{margin-top:-1.25rem}.-mt-52{margin-top:-13rem}.-mt-56{margin-top:-14rem}.-mt-6{margin-top:-1.5rem}.-mt-60{margin-top:-15rem}.-mt-64{margin-top:-16rem}.-mt-7{margin-top:-1.75rem}.-mt-72{margin-top:-18rem}.-mt-8{margin-top:-2rem}.-mt-80{margin-top:-20rem}.-mt-9{margin-top:-2.25rem}.-mt-96{margin-top:-24rem}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-11{margin-bottom:2.75rem}.mb-12{margin-bottom:3rem}.mb-14{margin-bottom:3.5rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-20{margin-bottom:5rem}.mb-24{margin-bottom:6rem}.mb-28{margin-bottom:7rem}.mb-3{margin-bottom:.75rem}.mb-3\.5{margin-bottom:.875rem}.mb-32{margin-bottom:8rem}.mb-36{margin-bottom:9rem}.mb-4{margin-bottom:1rem}.mb-40{margin-bottom:10rem}.mb-44{margin-bottom:11rem}.mb-48{margin-bottom:12rem}.mb-5{margin-bottom:1.25rem}.mb-52{margin-bottom:13rem}.mb-56{margin-bottom:14rem}.mb-6{margin-bottom:1.5rem}.mb-60{margin-bottom:15rem}.mb-64{margin-bottom:16rem}.mb-7{margin-bottom:1.75rem}.mb-72{margin-bottom:18rem}.mb-8{margin-bottom:2rem}.mb-80{margin-bottom:20rem}.mb-9{margin-bottom:2.25rem}.mb-96{margin-bottom:24rem}.me-2{margin-inline-end:.5rem}.me-3{margin-inline-end:.75rem}.ml-0{margin-left:0}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-10{margin-left:2.5rem}.ml-11{margin-left:2.75rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.ml-16{margin-left:4rem}.ml-2{margin-left:.5rem}.ml-2\.5{margin-left:.625rem}.ml-20{margin-left:5rem}.ml-24{margin-left:6rem}.ml-28{margin-left:7rem}.ml-3{margin-left:.75rem}.ml-3\.5{margin-left:.875rem}.ml-32{margin-left:8rem}.ml-36{margin-left:9rem}.ml-4{margin-left:1rem}.ml-40{margin-left:10rem}.ml-44{margin-left:11rem}.ml-48{margin-left:12rem}.ml-5{margin-left:1.25rem}.ml-52{margin-left:13rem}.ml-56{margin-left:14rem}.ml-6{margin-left:1.5rem}.ml-60{margin-left:15rem}.ml-64{margin-left:16rem}.ml-7{margin-left:1.75rem}.ml-72{margin-left:18rem}.ml-8{margin-left:2rem}.ml-80{margin-left:20rem}.ml-9{margin-left:2.25rem}.ml-96{margin-left:24rem}.mr-0{margin-right:0}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-10{margin-right:2.5rem}.mr-11{margin-right:2.75rem}.mr-12{margin-right:3rem}.mr-14{margin-right:3.5rem}.mr-16{margin-right:4rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-20{margin-right:5rem}.mr-24{margin-right:6rem}.mr-28{margin-right:7rem}.mr-3{margin-right:.75rem}.mr-3\.5{margin-right:.875rem}.mr-32{margin-right:8rem}.mr-36{margin-right:9rem}.mr-4{margin-right:1rem}.mr-40{margin-right:10rem}.mr-44{margin-right:11rem}.mr-48{margin-right:12rem}.mr-5{margin-right:1.25rem}.mr-52{margin-right:13rem}.mr-56{margin-right:14rem}.mr-6{margin-right:1.5rem}.mr-60{margin-right:15rem}.mr-64{margin-right:16rem}.mr-7{margin-right:1.75rem}.mr-72{margin-right:18rem}.mr-8{margin-right:2rem}.mr-80{margin-right:20rem}.mr-9{margin-right:2.25rem}.mr-96{margin-right:24rem}.ms-auto{margin-inline-start:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-11{margin-top:2.75rem}.mt-12{margin-top:3rem}.mt-14{margin-top:3.5rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-20{margin-top:5rem}.mt-24{margin-top:6rem}.mt-28{margin-top:7rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-32{margin-top:8rem}.mt-36{margin-top:9rem}.mt-4{margin-top:1rem}.mt-40{margin-top:10rem}.mt-44{margin-top:11rem}.mt-48{margin-top:12rem}.mt-5{margin-top:1.25rem}.mt-52{margin-top:13rem}.mt-56{margin-top:14rem}.mt-6{margin-top:1.5rem}.mt-60{margin-top:15rem}.mt-64{margin-top:16rem}.mt-7{margin-top:1.75rem}.mt-72{margin-top:18rem}.mt-8{margin-top:2rem}.mt-80{margin-top:20rem}.mt-9{margin-top:2.25rem}.mt-96{margin-top:24rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.grid{display:grid}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}.h-0{height:0}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-1\/4{height:25%}.h-1\/5{height:20%}.h-1\/6{height:16.666667%}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-2\/3{height:66.666667%}.h-2\/4{height:50%}.h-2\/5{height:40%}.h-2\/6{height:33.333333%}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-3\/4{height:75%}.h-3\/5{height:60%}.h-3\/6{height:50%}.h-32{height:8rem}.h-36{height:9rem}.h-4{height:1rem}.h-4\/5{height:80%}.h-4\/6{height:66.666667%}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-5\/6{height:83.333333%}.h-52{height:13rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-max{height:-moz-max-content;height:max-content}.h-min{height:-moz-min-content;height:min-content}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:0}.max-h-0\.5{max-height:.125rem}.max-h-1{max-height:.25rem}.max-h-1\.5{max-height:.375rem}.max-h-10{max-height:2.5rem}.max-h-11{max-height:2.75rem}.max-h-12{max-height:3rem}.max-h-14{max-height:3.5rem}.max-h-16{max-height:4rem}.max-h-2{max-height:.5rem}.max-h-2\.5{max-height:.625rem}.max-h-20{max-height:5rem}.max-h-24{max-height:6rem}.max-h-28{max-height:7rem}.max-h-3{max-height:.75rem}.max-h-3\.5{max-height:.875rem}.max-h-32{max-height:8rem}.max-h-36{max-height:9rem}.max-h-4{max-height:1rem}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-5{max-height:1.25rem}.max-h-52{max-height:13rem}.max-h-56{max-height:14rem}.max-h-6{max-height:1.5rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-7{max-height:1.75rem}.max-h-72{max-height:18rem}.max-h-8{max-height:2rem}.max-h-80{max-height:20rem}.max-h-9{max-height:2.25rem}.max-h-96{max-height:24rem}.max-h-fit{max-height:-moz-fit-content;max-height:fit-content}.max-h-full{max-height:100%}.max-h-max{max-height:-moz-max-content;max-height:max-content}.max-h-min{max-height:-moz-min-content;max-height:min-content}.max-h-screen{max-height:100vh}.min-h-0{min-height:0}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.min-h-full{min-height:100%}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-min{min-height:-moz-min-content;min-height:min-content}.min-h-screen{min-height:100vh}.w-0{width:0}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/12{width:8.333333%}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-1\/5{width:20%}.w-1\/6{width:16.666667%}.w-10{width:2.5rem}.w-10\/12{width:83.333333%}.w-11{width:2.75rem}.w-11\/12{width:91.666667%}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/12{width:16.666667%}.w-2\/3{width:66.666667%}.w-2\/4{width:50%}.w-2\/5{width:40%}.w-2\/6{width:33.333333%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/12{width:25%}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-3\/6{width:50%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-4\/12{width:33.333333%}.w-4\/5{width:80%}.w-4\/6{width:66.666667%}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-5\/12{width:41.666667%}.w-5\/6{width:83.333333%}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-6\/12{width:50%}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-7\/12{width:58.333333%}.w-72{width:18rem}.w-8{width:2rem}.w-8\/12{width:66.666667%}.w-80{width:20rem}.w-9{width:2.25rem}.w-9\/12{width:75%}.w-96{width:24rem}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-min{width:-moz-min-content;width:min-content}.w-px{width:1px}.w-screen{width:100vw}.min-w-0{min-width:0}.min-w-\[10rem\]{min-width:10rem}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.min-w-full{min-width:100%}.min-w-max{min-width:-moz-max-content;min-width:max-content}.min-w-min{min-width:-moz-min-content;min-width:min-content}.max-w-0{max-width:0}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-md{max-width:28rem}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-screen-2xl{max-width:1536px}.max-w-screen-lg{max-width:1024px}.max-w-screen-md{max-width:768px}.max-w-screen-sm{max-width:640px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x:-100%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y:-100%}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.translate-y-full{--tw-translate-y:100%}.rotate-180,.translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-none{transform:none}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-items-start{justify-items:start}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.justify-items-stretch{justify-items:stretch}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-11{gap:2.75rem}.gap-12{gap:3rem}.gap-14{gap:3.5rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-20{gap:5rem}.gap-24{gap:6rem}.gap-28{gap:7rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-32{gap:8rem}.gap-36{gap:9rem}.gap-4{gap:1rem}.gap-40{gap:10rem}.gap-44{gap:11rem}.gap-48{gap:12rem}.gap-5{gap:1.25rem}.gap-52{gap:13rem}.gap-56{gap:14rem}.gap-6{gap:1.5rem}.gap-60{gap:15rem}.gap-64{gap:16rem}.gap-7{gap:1.75rem}.gap-72{gap:18rem}.gap-8{gap:2rem}.gap-80{gap:20rem}.gap-9{gap:2.25rem}.gap-96{gap:24rem}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.gap-y-0{row-gap:0}.gap-y-0\.5{row-gap:.125rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-10{row-gap:2.5rem}.gap-y-11{row-gap:2.75rem}.gap-y-12{row-gap:3rem}.gap-y-14{row-gap:3.5rem}.gap-y-16{row-gap:4rem}.gap-y-2{row-gap:.5rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-20{row-gap:5rem}.gap-y-24{row-gap:6rem}.gap-y-28{row-gap:7rem}.gap-y-3{row-gap:.75rem}.gap-y-3\.5{row-gap:.875rem}.gap-y-32{row-gap:8rem}.gap-y-36{row-gap:9rem}.gap-y-4{row-gap:1rem}.gap-y-40{row-gap:10rem}.gap-y-44{row-gap:11rem}.gap-y-48{row-gap:12rem}.gap-y-5{row-gap:1.25rem}.gap-y-52{row-gap:13rem}.gap-y-56{row-gap:14rem}.gap-y-6{row-gap:1.5rem}.gap-y-60{row-gap:15rem}.gap-y-64{row-gap:16rem}.gap-y-7{row-gap:1.75rem}.gap-y-72{row-gap:18rem}.gap-y-8{row-gap:2rem}.gap-y-80{row-gap:20rem}.gap-y-9{row-gap:2.25rem}.gap-y-96{row-gap:24rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-lg{border-bottom-right-radius:.5rem}.rounded-r-lg,.rounded-t-lg{border-top-right-radius:.5rem}.rounded-t-lg{border-top-left-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-blue-500{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(28 100 242/var(--tw-border-opacity,1))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/50{background-color:hsla(0,0%,100%,.5)}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-auto{background-size:auto}.bg-contain{background-size:contain}.bg-cover{background-size:cover}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-11{padding:2.75rem}.p-12{padding:3rem}.p-14{padding:3.5rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-20{padding:5rem}.p-24{padding:6rem}.p-28{padding:7rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-32{padding:8rem}.p-36{padding:9rem}.p-4{padding:1rem}.p-40{padding:10rem}.p-44{padding:11rem}.p-48{padding:12rem}.p-5{padding:1.25rem}.p-52{padding:13rem}.p-56{padding:14rem}.p-6{padding:1.5rem}.p-60{padding:15rem}.p-64{padding:16rem}.p-7{padding:1.75rem}.p-72{padding:18rem}.p-8{padding:2rem}.p-80{padding:20rem}.p-9{padding:2.25rem}.p-96{padding:24rem}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-11{padding-left:2.75rem;padding-right:2.75rem}.px-12{padding-left:3rem;padding-right:3rem}.px-14{padding-left:3.5rem;padding-right:3.5rem}.px-16{padding-left:4rem;padding-right:4rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-20{padding-left:5rem;padding-right:5rem}.px-24{padding-left:6rem;padding-right:6rem}.px-28{padding-left:7rem;padding-right:7rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-32{padding-left:8rem;padding-right:8rem}.px-36{padding-left:9rem;padding-right:9rem}.px-4{padding-left:1rem;padding-right:1rem}.px-40{padding-left:10rem;padding-right:10rem}.px-44{padding-left:11rem;padding-right:11rem}.px-48{padding-left:12rem;padding-right:12rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-52{padding-left:13rem;padding-right:13rem}.px-56{padding-left:14rem;padding-right:14rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-60{padding-left:15rem;padding-right:15rem}.px-64{padding-left:16rem;padding-right:16rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-72{padding-left:18rem;padding-right:18rem}.px-8{padding-left:2rem;padding-right:2rem}.px-80{padding-left:20rem;padding-right:20rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.px-96{padding-left:24rem;padding-right:24rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-11{padding-top:2.75rem;padding-bottom:2.75rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-28{padding-top:7rem;padding-bottom:7rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-32{padding-top:8rem;padding-bottom:8rem}.py-36{padding-top:9rem;padding-bottom:9rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-40{padding-top:10rem;padding-bottom:10rem}.py-44{padding-top:11rem;padding-bottom:11rem}.py-48{padding-top:12rem;padding-bottom:12rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-52{padding-top:13rem;padding-bottom:13rem}.py-56{padding-top:14rem;padding-bottom:14rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-60{padding-top:15rem;padding-bottom:15rem}.py-64{padding-top:16rem;padding-bottom:16rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.py-72{padding-top:18rem;padding-bottom:18rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-80{padding-top:20rem;padding-bottom:20rem}.py-9{padding-top:2.25rem;padding-bottom:2.25rem}.py-96{padding-top:24rem;padding-bottom:24rem}.py-\[\.1rem\]{padding-top:.1rem;padding-bottom:.1rem}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-11{padding-bottom:2.75rem}.pb-12{padding-bottom:3rem}.pb-14{padding-bottom:3.5rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-20{padding-bottom:5rem}.pb-24{padding-bottom:6rem}.pb-28{padding-bottom:7rem}.pb-3{padding-bottom:.75rem}.pb-3\.5{padding-bottom:.875rem}.pb-32{padding-bottom:8rem}.pb-36{padding-bottom:9rem}.pb-4{padding-bottom:1rem}.pb-40{padding-bottom:10rem}.pb-44{padding-bottom:11rem}.pb-48{padding-bottom:12rem}.pb-5{padding-bottom:1.25rem}.pb-52{padding-bottom:13rem}.pb-56{padding-bottom:14rem}.pb-6{padding-bottom:1.5rem}.pb-60{padding-bottom:15rem}.pb-64{padding-bottom:16rem}.pb-7{padding-bottom:1.75rem}.pb-72{padding-bottom:18rem}.pb-8{padding-bottom:2rem}.pb-80{padding-bottom:20rem}.pb-9{padding-bottom:2.25rem}.pb-96{padding-bottom:24rem}.pl-0{padding-left:0}.pl-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-12{padding-left:3rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-20{padding-left:5rem}.pl-24{padding-left:6rem}.pl-28{padding-left:7rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-32{padding-left:8rem}.pl-36{padding-left:9rem}.pl-4{padding-left:1rem}.pl-40{padding-left:10rem}.pl-44{padding-left:11rem}.pl-48{padding-left:12rem}.pl-5{padding-left:1.25rem}.pl-52{padding-left:13rem}.pl-56{padding-left:14rem}.pl-6{padding-left:1.5rem}.pl-60{padding-left:15rem}.pl-64{padding-left:16rem}.pl-7{padding-left:1.75rem}.pl-72{padding-left:18rem}.pl-8{padding-left:2rem}.pl-80{padding-left:20rem}.pl-9{padding-left:2.25rem}.pl-96{padding-left:24rem}.pr-0{padding-right:0}.pr-0\.5{padding-right:.125rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-11{padding-right:2.75rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-16{padding-right:4rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-20{padding-right:5rem}.pr-24{padding-right:6rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-3\.5{padding-right:.875rem}.pr-32{padding-right:8rem}.pr-36{padding-right:9rem}.pr-4{padding-right:1rem}.pr-40{padding-right:10rem}.pr-44{padding-right:11rem}.pr-48{padding-right:12rem}.pr-5{padding-right:1.25rem}.pr-52{padding-right:13rem}.pr-56{padding-right:14rem}.pr-6{padding-right:1.5rem}.pr-60{padding-right:15rem}.pr-64{padding-right:16rem}.pr-7{padding-right:1.75rem}.pr-72{padding-right:18rem}.pr-8{padding-right:2rem}.pr-80{padding-right:20rem}.pr-9{padding-right:2.25rem}.pr-96{padding-right:24rem}.ps-4{padding-inline-start:1rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-11{padding-top:2.75rem}.pt-12{padding-top:3rem}.pt-14{padding-top:3.5rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-20{padding-top:5rem}.pt-24{padding-top:6rem}.pt-28{padding-top:7rem}.pt-3{padding-top:.75rem}.pt-3\.5{padding-top:.875rem}.pt-32{padding-top:8rem}.pt-36{padding-top:9rem}.pt-4{padding-top:1rem}.pt-40{padding-top:10rem}.pt-44{padding-top:11rem}.pt-48{padding-top:12rem}.pt-5{padding-top:1.25rem}.pt-52{padding-top:13rem}.pt-56{padding-top:14rem}.pt-6{padding-top:1.5rem}.pt-60{padding-top:15rem}.pt-64{padding-top:16rem}.pt-7{padding-top:1.75rem}.pt-72{padding-top:18rem}.pt-8{padding-top:2rem}.pt-80{padding-top:20rem}.pt-9{padding-top:2.25rem}.pt-96{padding-top:24rem}.text-left{text-align:left}.text-center{text-align:center}.text-justify{text-align:justify}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-7xl{font-size:4.5rem;line-height:1}.text-8xl{font-size:6rem;line-height:1}.text-9xl{font-size:8rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-6{line-height:1.5rem}.leading-9{line-height:2.25rem}.leading-relaxed{line-height:1.625}.text-blue-600{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(224 36 36/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-500{--tw-text-opacity:1;color:rgb(194 120 3/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.blur{--tw-blur:blur(8px)}.blur,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[-\:\=\]{-:=}.\[-_\:\.a-zA-Z0-9\\xc0-\\uffff\]{-_:.a-zA-Z0-9\xc0-\uffff}.\[-_a-zA-Z0-9\:\.\]{-_a-z-a--z0-9:.}.\[_\:a-zA-Z\\xc0-\\uffff\]{_:a-zA-Z\xc0-\uffff}:disabled{cursor:not-allowed!important}.main-content{margin-top:4rem;margin-left:0;min-height:calc(100vh - 9rem);flex-direction:column;padding-left:1rem;padding-right:1rem;display:flex}@media (min-width:640px){.main-content{margin-left:14rem}}@media (min-width:1024px){.main-content{padding-left:2.5rem;padding-right:2.5rem}}.main-content{transition:margin-left .5s ease}#toggleIcon{transition:transform .4s;display:inline-block}.flip{transform:rotateY(90deg)}.apexcharts-tooltip.apexcharts-theme-light{border:1px solid #e3e3e3;background:hsla(0,0%,100%,.96)}.apexcharts-yaxistooltip,.dark .apexcharts-tooltip.apexcharts-theme-light,.dark .apexcharts-xaxistooltip{border:1px solid #1e293b;background:#0d1220}.dark .apexcharts-xaxistooltip-text{color:#e3e3e3!important}body{overflow-x:hidden;background-color:var(--light-secondary);font-family:rubik;color:var(--light-text-primary)}body:is(.dark *){background-color:var(--dark-primary);color:var(--dark-text-primary)}hr{margin-top:1rem;margin-bottom:1rem}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-thumb{background-color:var(--light-scrollbar)}:is(.dark *)::-webkit-scrollbar-thumb{background-color:var(--dark-scrollbar)}::-webkit-scrollbar-thumb{border-radius:10px}::-webkit-scrollbar-thumb:hover{background-color:var(--light-scrollbar-hover)}:is(.dark *)::-webkit-scrollbar-thumb:hover{background-color:var(--dark-scrollbar-hover)}::-webkit-scrollbar-track{background-color:var(--light-scrollbar-bg)}:is(.dark *)::-webkit-scrollbar-track{background-color:var(--dark-scrollbar-bg)}::-webkit-scrollbar-track{border-radius:10px}.link{color:rgb(28 100 242/var(--tw-text-opacity,1))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgb(26 86 219/var(--tw-text-opacity,1))}.link:is(.dark *){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity,1))}.link:hover:is(.dark *){--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.loading-icon{display:inline-block;margin-left:5px;border-radius:50%;border:2px solid #f3f3f3;border-top-color:#3498db;width:12px;height:12px;animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.loading-btn.loading{cursor:not-allowed}.nav{position:fixed;top:0;z-index:50;width:100%;border-bottom-width:1px;border-color:var(--light-fourth);background-color:var(--light-primary)}.nav:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-secondary)}.aside-nav{position:fixed;top:0;left:0;z-index:40;height:100vh;width:15rem;--tw-translate-x:-100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-right-width:1px;border-color:var(--light-fourth);background-color:var(--light-primary);padding-top:2.75rem;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.aside-nav:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-secondary)}@media (min-width:640px){.aside-nav{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}.a-side-nav{margin:auto;width:90%;border-radius:.6rem;padding:.25rem .75rem;display:flex;align-items:center}.a-side-nav:hover{background-color:var(--light-secondary)}.a-side-nav:hover:is(.dark *){background-color:var(--dark-third)}.a-side-nav i{width:1.25rem;flex-shrink:0;text-align:start;color:var(--light-text-secondary)}.side-nav-active{color:var(--light-primary)}.side-nav-active,.side-nav-active:hover{background-color:var(--nav-sky)}.side-nav-active:hover:is(.dark *){background-color:var(--nav-sky)}.side-nav-active i{color:var(--light-primary)}.side-nav-active i,.side-nav-active i:hover{background-color:var(--nav-sky)}.side-nav-drop-active{margin-left:.5rem;font-weight:500;color:var(--nav-sky)}.side-nav-drop-active:is(.dark *){color:var(--nav-sky-text-dark)}.a-side-nav-dropdown{background-color:var(--nav-sky-light);width:90%;max-height:0;opacity:0;overflow:hidden;border-radius:.6rem;margin-right:auto;margin-left:auto;transition:max-height .4s ease,opacity .4s ease,margin .4s ease,padding .4s ease;will-change:max-height,opacity,margin,padding}.a-side-nav-dropdown.active{max-height:9000px!important;opacity:1;margin:5px auto;padding-top:.4rem;padding-bottom:.4rem}.a-side-nav-dropdown:is(.dark *){background-color:var(--nav-sky-dark)}.a-side-nav-drop{transition:margin-left .2s;width:100%;padding-left:1rem;padding-right:.25rem;padding-top:.25rem;font-size:.875rem;line-height:1.25rem;display:flex;align-items:center}.a-side-nav-drop:hover{margin-left:.5rem;color:var(--nav-sky)}.a-side-nav-drop-sub{transition:none;width:100%;display:block;align-items:center;padding-left:1rem;padding-right:.25rem;padding-top:.25rem;font-size:.9rem;line-height:1.25rem}.a-side-nav-drop-sub-title{transition:margin-left .2s,color .2s;margin-left:0}.a-side-nav-drop-sub:hover .a-side-nav-drop-sub-title{margin-left:.5rem;color:var(--nav-sky)}.a-side-nav-drop-sub-link{transition:margin-left .2s,color .2s;margin-left:0}.a-side-nav-drop-sub-link:hover{margin-left:.5rem;color:var(--nav-sky)}.a-side-nav-drop-sub-link-active{margin-left:.5rem}.a-side-nav-dropdown ul{max-height:0;overflow:hidden;opacity:0;transition:max-height .4s ease,opacity .4s ease;will-change:max-height,opacity}.a-side-nav-dropdown ul.open{opacity:1;max-height:9000px!important}.span-side-nav{margin-left:.75rem;flex:1 1 0%;white-space:nowrap;text-align:left}.span-side-nav:where([dir=rtl],[dir=rtl] *){text-align:right}.sidebar-collapsed .aside-nav{width:0;overflow:hidden}.sidebar-collapsed .main-content,.sidebar-collapsed footer{margin-left:0;width:100%}.aside-nav{transition:width .5s ease!important}footer{margin-top:auto;padding-left:1rem;padding-right:1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-text-secondary)}footer:is(.dark *){color:var(--dark-text-secondary)}@media (min-width:640px){footer{margin-left:15rem;transition:margin-left .5s ease;width:calc(100% - 15rem)}}h1{font-size:2.8em}h1,h2{font-weight:700}h2{font-size:2.5em}h3{font-size:2.1em}h3,h4{font-weight:700}h4{font-size:1.9em}h5{font-size:1.6em}h5,h6{font-weight:700}h6{font-size:1.3em}p{font-size:1em}.btn-primary-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-primary-sm:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.btn-primary-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(195 221 253/var(--tw-ring-opacity,1))}.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.btn-primary:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(195 221 253/var(--tw-ring-opacity,1))}.btn-primary-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-primary-xl:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.btn-primary-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(195 221 253/var(--tw-ring-opacity,1))}.btn-info-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-info-sm:hover{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.btn-info-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(225 239 254/var(--tw-ring-opacity,1))}.btn-info{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-info:hover{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.btn-info:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(225 239 254/var(--tw-ring-opacity,1))}.btn-info-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-info-xl:hover{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.btn-info-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(225 239 254/var(--tw-ring-opacity,1))}.btn-success-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-success-sm:hover{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1))}.btn-success-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(188 240 218/var(--tw-ring-opacity,1))}.btn-success{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-success:hover{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1))}.btn-success:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(188 240 218/var(--tw-ring-opacity,1))}.btn-success-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-success-xl:hover{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1))}.btn-success-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(188 240 218/var(--tw-ring-opacity,1))}.btn-warning-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-warning-sm:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.btn-warning-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity,1))}.btn-warning{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-warning:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.btn-warning:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity,1))}.btn-warning-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-warning-xl:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.btn-warning-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity,1))}.btn-danger-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-danger-sm:hover{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.btn-danger-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 213 213/var(--tw-ring-opacity,1))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.btn-danger:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 213 213/var(--tw-ring-opacity,1))}.btn-danger-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-danger-xl:hover{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.btn-danger-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 213 213/var(--tw-ring-opacity,1))}.btn-center{margin-right:auto}.btn-center,.btn-right{margin-left:auto;display:block}.page-title{display:block}@media (min-width:768px){.page-title{display:inline-flex;align-items:center;justify-content:space-between}}.card{height:-moz-fit-content;height:fit-content;width:100%}.card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.card{border-radius:.25rem;background-color:var(--light-primary);padding:.75rem}.card:is(.dark *){background-color:var(--dark-secondary)}.card-title{margin-bottom:.5rem;justify-content:space-between;display:flex}.grid-2{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-2{display:grid}}.grid-3{grid-template-columns:repeat(3,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-3{display:grid}}.grid-4{grid-template-columns:repeat(4,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-4{display:grid}}.grid-5{grid-template-columns:repeat(5,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-5{display:grid}}.grid-6{grid-template-columns:repeat(6,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-6{display:grid}}.grid-7{grid-template-columns:repeat(7,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-7{display:grid}}.grid-8{grid-template-columns:repeat(8,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-8{display:grid}}.grid-9{grid-template-columns:repeat(9,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-9{display:grid}}.grid-10{grid-template-columns:repeat(10,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-10{display:grid}}.grid-11{grid-template-columns:repeat(11,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-11{display:grid}}.grid-12{grid-template-columns:repeat(12,minmax(0,1fr));gap:3rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-12{display:grid}}.center-flex{justify-content:center}@media (min-width:1024px){.center-flex{display:flex}}.between-flex{justify-content:space-between}@media (min-width:1024px){.between-flex{display:flex}}.around-flex{justify-content:space-around}@media (min-width:1024px){.around-flex{display:flex}.flex-content-2xl{width:80%}.flex-content-xl{width:66.666667%}.flex-content-lg{width:50%}.flex-content{width:33.333333%}.flex-content-sm{width:25%}}label{display:block;font-weight:500}.input-xl{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.75rem .5rem}.input-xl:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-xl:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-xl:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-xl:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-xl:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.5rem}.input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-sm{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem .5rem}.input-sm:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-sm:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-sm:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-sm:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-sm:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-xl{margin-bottom:.5rem;display:flex;align-items:center}.input-group-xl i{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:1rem;color:var(--light-text-secondary)}.input-group-xl i:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-xl input{display:block;width:100%;min-width:0;flex:1 1 0%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.75rem}.input-group-xl input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-xl input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-xl input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-xl input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-xl input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group{margin-bottom:.5rem;display:flex;align-items:center}.input-group i{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-text-secondary)}.input-group i:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group input{display:block;width:100%;min-width:0;flex:1 1 0%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.5rem}.input-group input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-sm{margin-bottom:.5rem;display:flex;align-items:center}.input-group-sm i{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.375rem;font-size:.875rem;line-height:1.25rem;color:var(--light-text-secondary)}.input-group-sm i:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-sm input{display:block;width:100%;min-width:0;flex:1 1 0%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem}.input-group-sm input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-sm input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-sm input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-sm input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-sm input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.helper-input{margin-top:-.5rem;font-size:.75rem;line-height:1rem;font-style:italic}.input-btn-xl{position:relative;width:100%}.input-btn-xl input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.75rem .5rem}.input-btn-xl input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-xl input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-btn-xl input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-xl input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-xl input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-xl button{position:absolute;top:0;right:0;height:100%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1));padding:.625rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary)}.input-btn-xl button:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.input-btn-xl button:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.input-btn-xl button:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.input-btn-xl button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.input-btn-xl button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity,1))}.input-btn{position:relative;width:100%}.input-btn input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.5rem}.input-btn input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-btn input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn button{position:absolute;top:0;right:0;height:100%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1));padding:.625rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary)}.input-btn button:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.input-btn button:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.input-btn button:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.input-btn button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.input-btn button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity,1))}.input-btn-sm{position:relative;width:100%}.input-btn-sm input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem .5rem}.input-btn-sm input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-sm input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-btn-sm input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-sm input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-sm input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-sm button{position:absolute;top:0;right:0;height:100%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1));padding-left:.625rem;padding-right:.625rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary)}.input-btn-sm button:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.input-btn-sm button:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.input-btn-sm button:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.input-btn-sm button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.input-btn-sm button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity,1))}input[type=file]{width:100%;cursor:pointer;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg)}input[type=file]:focus{outline:2px solid transparent;outline-offset:2px}input[type=file]:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}input[type=file]:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}input[type=file]:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}select{display:block;width:100%;cursor:pointer;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg)}select:focus{outline:2px solid transparent;outline-offset:2px}select:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}select:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}select:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.choices__inner{display:block;min-height:42px;width:100%;overflow:hidden;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.375rem .5rem;vertical-align:top;font-size:.875rem;line-height:1.25rem}.choices__inner:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.tooltip.choices__list--dropdown>.tooltip-arrow:before,[role=tooltip].choices__list--dropdown>[data-popper-arrow]:after,[role=tooltip].choices__list--dropdown>[data-popper-arrow]:before{visibility:hidden}.choices__list--dropdown{position:absolute;top:100%;z-index:50;margin-top:-.25rem;width:100%;overflow:hidden;border-radius:.5rem;border-width:1px;border-color:var(--dark-fourth);background-color:var(--light-input-bg);visibility:hidden}.choices__list--dropdown:is(.dark *){background-color:var(--dark-input-bg)}.choices__list--dropdown .choices__item--selectable.is-highlighted{background-color:var(--light-secondary)}.choices__list--dropdown .choices__item--selectable.is-highlighted:is(.dark *){background-color:var(--dark-secondary)}.toggle{display:inline-flex;cursor:pointer;align-items:center}.toggle .toggle-input{position:absolute;margin:-.25rem;height:.25rem;width:.25rem;overflow:hidden;white-space:nowrap;border-width:0;padding:0;clip:rect(0,0,0,0)}.toggle .toggle-slider{position:relative;margin-right:.5rem;height:1rem;width:1.75rem;border-radius:9999px;background-color:var(--light-third)}.toggle .toggle-slider:is(.dark *){background-color:var(--dark-third)}.toggle .toggle-slider{transition:background-color .2s ease-in-out}.toggle .toggle-slider:after{position:absolute;top:2px;left:2px;height:.75rem;width:.75rem;border-radius:9999px;border-width:1px;border-color:var(--light-third);background-color:var(--light-primary)}.toggle .toggle-slider:is(.dark *):after{border-color:var(--dark-fourth);background-color:var(--dark-secondary)}.toggle .toggle-slider:after{content:"";transition:transform .2s ease-in-out}.toggle .toggle-label{margin-right:.5rem;font-weight:500}.toggle input:checked+.toggle-slider{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.toggle input:checked+.toggle-slider:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.toggle input:checked+.toggle-slider:after{transform:translateX(100%)}.checkbox{margin-bottom:.25rem;display:flex;align-items:center}.checkbox input{margin-right:.5rem;height:1rem;width:1rem;border-radius:.25rem;border-color:var(--light-third);background-color:var(--light-secondary);--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.checkbox input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.checkbox input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-third);--tw-ring-offset-color:#1f2937}.checkbox input:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(28 100 242/var(--tw-ring-opacity,1))}.checkbox label{margin-right:.5rem}.textarea{display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.625rem;--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.textarea:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.textarea:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-third);color:var(--light-primary)}.textarea:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.textarea:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.textarea:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.icon-picker{position:relative;z-index:30}.icon-picker i{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.icon-picker i:is(.dark *){color:var(--light-primary)}.icon-list{position:static;top:100%;left:1.75rem;z-index:5100;display:none;max-height:18rem;width:20rem;overflow-y:scroll;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);font-size:1.25rem;line-height:1.75rem}.icon-list:is(.dark *){background-color:var(--dark-input-bg)}.icon-list i{height:1.75rem;width:1.75rem;cursor:pointer;border-radius:.5rem;padding:.25rem;text-align:center}.icon-list i:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.page-loader{position:relative;height:80vh}.loader{width:48px;height:48px;margin:auto;top:50%;position:relative}.loader:before{width:48px;height:5px;background:#9b9b9b;opacity:.25;top:60px;border-radius:50%;animation:shadow .5s linear infinite}.loader:after,.loader:before{content:"";position:absolute;left:0}.loader:after{width:100%;height:100%;background:#a90a59;animation:bxSpin .5s linear infinite;top:0;border-radius:4px}@keyframes bxSpin{17%{border-bottom-right-radius:3px}25%{transform:translateY(9px) rotate(22.5deg)}50%{transform:translateY(18px) scaleY(.9) rotate(45deg);border-bottom-right-radius:40px}75%{transform:translateY(9px) rotate(67.5deg)}to{transform:translateY(0) rotate(90deg)}}@keyframes shadow{0%,to{transform:scale(1)}50%{transform:scaleX(1.2)}}.content-loader{display:none}.table-container{position:relative;height:-moz-fit-content;height:fit-content;overflow-x:auto;border-radius:.5rem;border-width:1px}.table-container:is(.dark *){border-color:var(--dark-input-bg)}.table-container table{width:100%;text-align:left;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.table-container table:is(.dark *){color:var(--light-fourth)}.table-container table:where([dir=rtl],[dir=rtl] *){text-align:right}.table-container thead{border-bottom-width:1px;background-color:var(--light-secondary);text-transform:uppercase;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.table-container thead:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.table-container thead th{padding:.75rem .5rem}.table-container tbody tr{border-bottom-width:1px;background-color:var(--light-primary)}.table-container tbody tr:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth)}.table-container tbody td{padding:.75rem .5rem}.table-container-striped tbody tr:nth-child(odd){background-color:var(--light-primary)}.table-container-striped tbody tr:nth-child(odd):is(.dark *){background-color:var(--dark-secondary)}.table-container-striped tbody tr:nth-child(2n){background-color:var(--light-secondary)}.table-container-striped tbody tr:nth-child(2n):is(.dark *){background-color:var(--dark-third)}.dataTable-top{justify-content:space-between;border-bottom-width:1px;padding:.5rem 1rem}.dataTable-top:is(.dark *){border-color:var(--dark-input-bg)}@media (min-width:1024px){.dataTable-top{display:flex}}.dataTable-input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem .5rem}.dataTable-input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.dataTable-input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.dataTable-input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dataTable-input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dataTable-input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.dataTable-selector{text-align:right}.dataTable-bottom{justify-content:space-between;padding:.75rem .5rem;align-items:center}@media (min-width:1024px){.dataTable-bottom{display:flex}}.dataTable-pagination-list{display:flex;height:2rem;align-items:center}.dataTable-pagination-list>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.dataTable-pagination-list{font-size:.875rem;line-height:1.25rem;display:flex;align-items:center}.dataTable-pagination-list li{border-width:1px;border-color:var(--light-third);background-color:var(--light-primary);line-height:1.25;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));display:flex;justify-content:center;align-items:center}.dataTable-pagination-list li:hover{background-color:var(--light-secondary);--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.dataTable-pagination-list li:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dataTable-pagination-list li:hover:is(.dark *){background-color:var(--dark-third);color:var(--light-primary)}.dataTable-pagination-list a{padding:.5rem .75rem}.dataTable-pagination-list .active{border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(235 245 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.dataTable-pagination-list .active:hover{--tw-bg-opacity:1;background-color:rgb(225 239 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity,1))}.dataTable-pagination-list .active:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-third);color:var(--light-primary)}.dataTable-sorter{position:relative;padding-right:20px}.dataTable-sorter:after,.dataTable-sorter:before{content:"";position:absolute;right:5px;border:solid transparent;width:0;height:0}.dataTable-sorter:before{border-width:0 4px 4px;border-bottom-color:#000;top:35%;transform:translateY(-100%)}.dataTable-sorter:after{border-width:4px 4px 0;border-top-color:#000;top:65%;transform:translateY(0)}.alert{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-secondary);padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.alert:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.alert-info{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(235 245 255/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(30 66 159/var(--tw-text-opacity,1))}.alert-info:is(.dark *){--tw-border-opacity:1;border-color:rgb(30 66 159/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(118 169 250/var(--tw-text-opacity,1))}.alert-success{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(132 225 188/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(243 250 247/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(3 84 63/var(--tw-text-opacity,1))}.alert-success:is(.dark *){--tw-border-opacity:1;border-color:rgb(3 84 63/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(49 196 141/var(--tw-text-opacity,1))}.alert-warning{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(250 202 21/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 253 234/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(114 59 19/var(--tw-text-opacity,1))}.alert-warning:is(.dark *){--tw-border-opacity:1;border-color:rgb(114 59 19/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(250 202 21/var(--tw-text-opacity,1))}.alert-danger{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(248 180 180/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 242 242/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(155 28 28/var(--tw-text-opacity,1))}.alert-danger:is(.dark *){--tw-border-opacity:1;border-color:rgb(155 28 28/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.badge{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1));background-color:var(--light-secondary);padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.badge:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.badge-info{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(222 247 236/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(30 66 159/var(--tw-text-opacity,1))}.badge-info:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(118 169 250/var(--tw-text-opacity,1))}.badge-success{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(49 196 141/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(222 247 236/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(3 84 63/var(--tw-text-opacity,1))}.badge-success:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(49 196 141/var(--tw-text-opacity,1))}.badge-warning{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(250 202 21/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 246 178/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(114 59 19/var(--tw-text-opacity,1))}.badge-warning:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(250 202 21/var(--tw-text-opacity,1))}.badge-danger{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(249 128 128/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 232 232/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(155 28 28/var(--tw-text-opacity,1))}.badge-danger:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.avatar-rounded{border-radius:9999px}.avatar-rounded,.avatar-square{height:2.5rem;width:2.5rem;background-size:contain}.avatar-square{border-radius:.5rem}.avatar-rounded-ring{height:2.5rem;width:2.5rem;border-radius:9999px;background-size:contain;padding:.25rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.avatar-rounded-ring:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.avatar-square-ring{height:2.5rem;width:2.5rem;border-radius:.5rem;background-size:contain;padding:.25rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.avatar-square-ring:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.avatar-text{gap:1rem;display:flex;align-items:center}.dropdown,.dropdown-hover{position:relative;display:inline-block}.dropdown-opener{cursor:pointer}.dropdown-content{position:absolute;margin-top:.25rem;display:none;border-radius:.25rem;background-color:var(--light-primary);padding:.5rem;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dropdown-content:is(.dark *){background-color:var(--dark-third)}kbd{border-radius:.5rem;border-width:1px;border-color:var(--light-fourth);background-color:var(--light-secondary);padding:.375rem .5rem;font-size:.75rem;line-height:1rem;font-weight:600;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}kbd:is(.dark *){--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1));background-color:var(--dark-secondary);--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.modal-container{position:fixed;top:8%;right:0;left:0;z-index:600000;display:none;height:calc(100% - 1rem);max-height:80vh;width:100%;overflow-y:auto;overflow-x:hidden;justify-content:center;align-items:center}@media (min-width:768px){.modal-container{inset:0}}.modal-sm{position:relative;top:8%;max-height:100%;width:100%;max-width:28rem;overflow:hidden;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-sm:is(.dark *){background-color:var(--dark-third)}.modal{position:relative;top:8%;max-height:100%;width:100%;max-width:42rem;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal:is(.dark *){background-color:var(--dark-third)}.modal-lg{position:relative;top:8%;max-height:100%;width:100%;max-width:56rem;overflow:hidden;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-lg:is(.dark *){background-color:var(--dark-third)}.modal-xl{position:relative;top:8%;max-height:100%;width:100%;max-width:80rem;overflow:hidden;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-xl:is(.dark *){background-color:var(--dark-third)}.modal-header{justify-content:space-between;border-bottom-width:1px;padding:1rem;display:flex;align-items:center}.modal-header:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header{padding:1.25rem}}.modal-header-warning{justify-content:space-between;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-bottom-width:1px;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:1rem;color:var(--light-primary);display:flex;align-items:center}.modal-header-warning:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header-warning{padding:1.25rem}}.modal-header-success{justify-content:space-between;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-bottom-width:1px;--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1));padding:1rem;color:var(--light-primary);display:flex;align-items:center}.modal-header-success:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header-success{padding:1.25rem}}.modal-header-danger{justify-content:space-between;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-bottom-width:1px;--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1));padding:1rem;color:var(--light-primary);display:flex;align-items:center}.modal-header-danger:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header-danger{padding:1.25rem}}.modal-footer{display:flex;justify-content:flex-end}.modal-footer>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.modal-footer{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem;border-top-width:1px;border-color:var(--light-fourth);padding:1rem;display:flex}.modal-footer:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-footer{padding:1.25rem}}.modal-body{max-height:60vh}.modal-body>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.modal-body{overflow-y:auto;padding:1rem}@media (min-width:768px){.modal-body{max-height:60vh;overflow-y:auto;padding:1.25rem}}.pagination{display:flex;height:2rem;align-items:center}.pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.pagination{font-size:.875rem;line-height:1.25rem}.pagination,.pagination-link{display:flex;align-items:center}.pagination-link{height:2rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-primary);padding-left:.75rem;padding-right:.75rem;line-height:1.25;color:rgb(107 114 128/var(--tw-text-opacity,1));justify-content:center}.pagination-link,.pagination-link:hover{--tw-text-opacity:1}.pagination-link:hover{background-color:var(--light-secondary);color:rgb(55 65 81/var(--tw-text-opacity,1))}.pagination-link:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.pagination-link:hover:is(.dark *){background-color:var(--dark-third);color:var(--light-primary)}.pagination-link-active{z-index:10;height:2rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));background-color:rgb(235 245 255/var(--tw-bg-opacity,1));padding-left:.75rem;padding-right:.75rem;line-height:1.25;color:rgb(28 100 242/var(--tw-text-opacity,1));display:flex;justify-content:center;align-items:center}.pagination-link-active,.pagination-link-active:hover{--tw-bg-opacity:1;--tw-text-opacity:1}.pagination-link-active:hover{background-color:rgb(225 239 254/var(--tw-bg-opacity,1));color:rgb(26 86 219/var(--tw-text-opacity,1))}.pagination-link-active:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-third);color:var(--light-primary)}.tab-menu{margin-bottom:1rem;border-bottom-width:1px;border-color:var(--light-fourth)}.tab-menu:is(.dark *){border-color:var(--dark-input-bg)}.tab-horizontal{margin-bottom:-1px;flex-wrap:wrap;text-align:center;font-size:.875rem;line-height:1.25rem;font-weight:500;display:flex}.tab-horizontal button{display:inline-block;border-bottom-width:2px;padding:1rem}.tab-vertical{margin-bottom:1rem;display:flex;flex-direction:column}.tab-vertical>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.tab-vertical{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));display:flex}.tab-vertical:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}@media (min-width:768px){.tab-vertical{margin-right:1rem;margin-bottom:0}}.tab-vertical button{display:inline-flex;width:100%;min-width:10rem;align-items:center;border-radius:.5rem;background-color:var(--light-primary);padding:.75rem 1rem}.a-side-nav-dropdown.tab-vertical button{max-height:9000px;opacity:1;margin:5px auto;padding-top:.4rem;padding-bottom:.4rem}.dataTable-pagination-list .tab-vertical button{border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(235 245 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.dataTable-pagination-list .tab-vertical button:hover{--tw-bg-opacity:1;background-color:rgb(225 239 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity,1))}.dataTable-pagination-list .tab-vertical button:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-third);color:var(--light-primary)}.tab-vertical button{align-items:center}.tab-vertical button:is(.dark *){background-color:var(--dark-fourth)}@media (min-width:768px){.tab-vertical-container{display:flex}}.tab-container{width:100%}.tab-content{display:none}.tab-button{width:100%;cursor:pointer;justify-content:space-between;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-width:1px;padding:.25rem;display:flex;align-items:center}[data-tooltip-style^=light]+.tooltip-content>.tooltip-arrow:before{border-style:solid;border-color:#e5e7eb}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px;border-right-width:1px}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px;border-right-width:1px}.tooltip-content[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px}.tooltip-content[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px}.tooltip-content[data-popper-placement^=left]>.tooltip-arrow{right:-4px}.tooltip-content[data-popper-placement^=right]>.tooltip-arrow{left:-4px}.tooltip-content,.tooltip-content.invisible>.tooltip-arrow:before,.tooltip.tooltip-content>.tooltip-arrow:before,[role=tooltip].tooltip-content>[data-popper-arrow]:after,[role=tooltip].tooltip-content>[data-popper-arrow]:before{visibility:hidden}.tooltip-content{position:absolute;z-index:9000;display:inline-block;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary);--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);opacity:0}.tooltip-content:is(.dark *){background-color:var(--dark-third);color:var(--dark-text-primary)}.flex{display:flex!important}.justify-center{justify-content:center!important}.items-center{align-items:center!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.opacity-0{opacity:0!important}.opacity-100{opacity:1!important}.transform-none{transform:none!important}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus,.focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity,1))}.focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.dark\:divide-gray-600:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(75 85 99/var(--tw-divide-opacity,1))}.dark\:border-blue-500:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:border-gray-900:is(.dark *){--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.dark\:border-transparent:is(.dark *){border-color:transparent}.dark\:bg-blue-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.dark\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:bg-gray-800\/50:is(.dark *){background-color:rgba(31,41,55,.5)}.dark\:bg-opacity-80:is(.dark *){--tw-bg-opacity:0.8}.dark\:text-blue-500:is(.dark *){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:hover\:bg-blue-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:hover\:text-blue-500:hover:is(.dark *){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity,1))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:ml-11{margin-left:2.75rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}}@media (min-width:768px){.md\:flex{display:flex}}@media (min-width:1024px){.lg\:mt-0{margin-top:0}.lg\:mt-4{margin-top:1rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-1\/2{width:50%}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:pb-0{padding-bottom:0}.lg\:pl-3{padding-left:.75rem}}.rtl\:justify-end:where([dir=rtl],[dir=rtl] *){justify-content:flex-end} \ No newline at end of file +*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(63,131,248,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(63,131,248,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.17 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.tooltip-arrow,.tooltip-arrow:before{position:absolute;width:8px;height:8px;background:inherit}.tooltip-arrow{visibility:hidden}.tooltip-arrow:before{content:"";visibility:visible;transform:rotate(45deg)}[data-tooltip-style^=light]+.\!tooltip>.tooltip-arrow:before{border-style:solid!important;border-color:#e5e7eb!important}[data-tooltip-style^=light]+.tooltip>.tooltip-arrow:before{border-style:solid;border-color:#e5e7eb}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px!important;border-right-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px;border-right-width:1px}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px!important;border-left-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px!important;border-left-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.\!tooltip[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px!important;border-right-width:1px!important}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px;border-right-width:1px}.\!tooltip[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px!important}.tooltip[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px}.\!tooltip[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px!important}.tooltip[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px}.\!tooltip[data-popper-placement^=left]>.tooltip-arrow{right:-4px!important}.tooltip[data-popper-placement^=left]>.tooltip-arrow{right:-4px}.\!tooltip[data-popper-placement^=right]>.tooltip-arrow{left:-4px!important}.tooltip[data-popper-placement^=right]>.tooltip-arrow{left:-4px}.\!tooltip.invisible>.tooltip-arrow:before{visibility:hidden!important}.tooltip.invisible>.tooltip-arrow:before{visibility:hidden}[data-popper-arrow],[data-popper-arrow]:before{position:absolute;width:8px;height:8px;background:inherit}[data-popper-arrow]{visibility:hidden}[data-popper-arrow]:after,[data-popper-arrow]:before{content:"";visibility:visible;transform:rotate(45deg)}[data-popper-arrow]:after{position:absolute;width:9px;height:9px;background:inherit}[role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:#e5e7eb}.dark [role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:#4b5563}[role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:#e5e7eb}.dark [role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:#4b5563}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:before{border-bottom-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:before{border-bottom-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:before{border-top-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:after,[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:before{border-top-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]{bottom:-5px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]{top:-5px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]{right:-5px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]{left:-5px}[role=tooltip].invisible>[data-popper-arrow]:after,[role=tooltip].invisible>[data-popper-arrow]:before{visibility:hidden}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#1c64f2}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}select:not([size]){background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' aria-hidden='true' viewBox='0 0 10 6'%3E%3Cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3E%3C/svg%3E");background-position:right .75rem center;background-repeat:no-repeat;background-size:.75em .75em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple]{background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#1c64f2;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark [type=checkbox]:checked,.dark [type=radio]:checked,[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:.55em .55em;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' aria-hidden='true' viewBox='0 0 16 12'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3E%3C/svg%3E");background-repeat:no-repeat;background-size:.55em .55em;-webkit-print-color-adjust:exact;print-color-adjust:exact}.dark [type=radio]:checked,[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");background-size:1em 1em}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' aria-hidden='true' viewBox='0 0 16 12'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3E%3C/svg%3E");background-color:currentColor;border-color:transparent;background-position:50%;background-repeat:no-repeat;background-size:.55em .55em;-webkit-print-color-adjust:exact;print-color-adjust:exact}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px auto inherit}input[type=file]::file-selector-button{color:#fff;background:#1f2937;border:0;font-weight:500;font-size:.875rem;cursor:pointer;padding:.625rem 1rem .625rem 2rem;margin-inline-start:-1rem;margin-inline-end:1rem}input[type=file]::file-selector-button:hover{background:#374151}.dark input[type=file]::file-selector-button{color:#fff;background:#4b5563}.dark input[type=file]::file-selector-button:hover{background:#6b7280}input[type=range]::-webkit-slider-thumb{height:1.25rem;width:1.25rem;background:#1c64f2;border-radius:9999px;border:0;appearance:none;-moz-appearance:none;-webkit-appearance:none;cursor:pointer}input[type=range]:disabled::-webkit-slider-thumb{background:#9ca3af}.dark input[type=range]:disabled::-webkit-slider-thumb{background:#6b7280}input[type=range]:focus::-webkit-slider-thumb{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1px;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity))}input[type=range]::-moz-range-thumb{height:1.25rem;width:1.25rem;background:#1c64f2;border-radius:9999px;border:0;appearance:none;-moz-appearance:none;-webkit-appearance:none;cursor:pointer}input[type=range]:disabled::-moz-range-thumb{background:#9ca3af}.dark input[type=range]:disabled::-moz-range-thumb{background:#6b7280}input[type=range]::-moz-range-progress{background:#3f83f8}input[type=range]::-ms-fill-lower{background:#3f83f8}.toggle-bg:after{content:"";position:absolute;top:.125rem;left:.125rem;background:#fff;border-color:#d1d5db;border-width:1px;border-radius:9999px;height:1.25rem;width:1.25rem;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.15s;box-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}input:checked+.toggle-bg:after{transform:translateX(100%);;border-color:#fff}input:checked+.toggle-bg{background:#1c64f2;border-color:#1c64f2}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.\!relative{position:relative!important}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.bottom-4{bottom:1rem}.bottom-\[60px\]{bottom:60px}.end-1{inset-inline-end:.25rem}.left-0{left:0}.left-1\/2{left:50%}.right-0{right:0}.right-2{right:.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.float-right{float:right}.-m-0{margin:0}.-m-0\.5{margin:-.125rem}.-m-1{margin:-.25rem}.-m-1\.5{margin:-.375rem}.-m-10{margin:-2.5rem}.-m-11{margin:-2.75rem}.-m-12{margin:-3rem}.-m-14{margin:-3.5rem}.-m-16{margin:-4rem}.-m-2{margin:-.5rem}.-m-2\.5{margin:-.625rem}.-m-20{margin:-5rem}.-m-24{margin:-6rem}.-m-28{margin:-7rem}.-m-3{margin:-.75rem}.-m-3\.5{margin:-.875rem}.-m-32{margin:-8rem}.-m-36{margin:-9rem}.-m-4{margin:-1rem}.-m-40{margin:-10rem}.-m-44{margin:-11rem}.-m-48{margin:-12rem}.-m-5{margin:-1.25rem}.-m-52{margin:-13rem}.-m-56{margin:-14rem}.-m-6{margin:-1.5rem}.-m-60{margin:-15rem}.-m-64{margin:-16rem}.-m-7{margin:-1.75rem}.-m-72{margin:-18rem}.-m-8{margin:-2rem}.-m-80{margin:-20rem}.-m-9{margin:-2.25rem}.-m-96{margin:-24rem}.m-0{margin:0}.m-0\.5{margin:.125rem}.m-1{margin:.25rem}.m-1\.5{margin:.375rem}.m-10{margin:2.5rem}.m-11{margin:2.75rem}.m-12{margin:3rem}.m-14{margin:3.5rem}.m-16{margin:4rem}.m-2{margin:.5rem}.m-2\.5{margin:.625rem}.m-20{margin:5rem}.m-24{margin:6rem}.m-28{margin:7rem}.m-3{margin:.75rem}.m-3\.5{margin:.875rem}.m-32{margin:8rem}.m-36{margin:9rem}.m-4{margin:1rem}.m-40{margin:10rem}.m-44{margin:11rem}.m-48{margin:12rem}.m-5{margin:1.25rem}.m-52{margin:13rem}.m-56{margin:14rem}.m-6{margin:1.5rem}.m-60{margin:15rem}.m-64{margin:16rem}.m-7{margin:1.75rem}.m-72{margin:18rem}.m-8{margin:2rem}.m-80{margin:20rem}.m-9{margin:2.25rem}.m-96{margin:24rem}.-mx-0{margin-left:0;margin-right:0}.-mx-0\.5{margin-left:-.125rem;margin-right:-.125rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-1\.5{margin-left:-.375rem;margin-right:-.375rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-mx-11{margin-left:-2.75rem;margin-right:-2.75rem}.-mx-12{margin-left:-3rem;margin-right:-3rem}.-mx-14{margin-left:-3.5rem;margin-right:-3.5rem}.-mx-16{margin-left:-4rem;margin-right:-4rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-mx-2\.5{margin-left:-.625rem;margin-right:-.625rem}.-mx-20{margin-left:-5rem;margin-right:-5rem}.-mx-24{margin-left:-6rem;margin-right:-6rem}.-mx-28{margin-left:-7rem;margin-right:-7rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-mx-3\.5{margin-left:-.875rem;margin-right:-.875rem}.-mx-32{margin-left:-8rem;margin-right:-8rem}.-mx-36{margin-left:-9rem;margin-right:-9rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-mx-40{margin-left:-10rem;margin-right:-10rem}.-mx-44{margin-left:-11rem;margin-right:-11rem}.-mx-48{margin-left:-12rem;margin-right:-12rem}.-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.-mx-52{margin-left:-13rem;margin-right:-13rem}.-mx-56{margin-left:-14rem;margin-right:-14rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-mx-60{margin-left:-15rem;margin-right:-15rem}.-mx-64{margin-left:-16rem;margin-right:-16rem}.-mx-7{margin-left:-1.75rem;margin-right:-1.75rem}.-mx-72{margin-left:-18rem;margin-right:-18rem}.-mx-8{margin-left:-2rem;margin-right:-2rem}.-mx-80{margin-left:-20rem;margin-right:-20rem}.-mx-9{margin-left:-2.25rem;margin-right:-2.25rem}.-mx-96{margin-left:-24rem;margin-right:-24rem}.-my-0{margin-top:0;margin-bottom:0}.-my-0\.5{margin-top:-.125rem;margin-bottom:-.125rem}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.-my-1\.5{margin-top:-.375rem;margin-bottom:-.375rem}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-my-11{margin-top:-2.75rem;margin-bottom:-2.75rem}.-my-12{margin-top:-3rem;margin-bottom:-3rem}.-my-14{margin-top:-3.5rem;margin-bottom:-3.5rem}.-my-16{margin-top:-4rem;margin-bottom:-4rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-my-2\.5{margin-top:-.625rem;margin-bottom:-.625rem}.-my-20{margin-top:-5rem;margin-bottom:-5rem}.-my-24{margin-top:-6rem;margin-bottom:-6rem}.-my-28{margin-top:-7rem;margin-bottom:-7rem}.-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.-my-3\.5{margin-top:-.875rem;margin-bottom:-.875rem}.-my-32{margin-top:-8rem;margin-bottom:-8rem}.-my-36{margin-top:-9rem;margin-bottom:-9rem}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.-my-40{margin-top:-10rem;margin-bottom:-10rem}.-my-44{margin-top:-11rem;margin-bottom:-11rem}.-my-48{margin-top:-12rem;margin-bottom:-12rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.-my-52{margin-top:-13rem;margin-bottom:-13rem}.-my-56{margin-top:-14rem;margin-bottom:-14rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.-my-60{margin-top:-15rem;margin-bottom:-15rem}.-my-64{margin-top:-16rem;margin-bottom:-16rem}.-my-7{margin-top:-1.75rem;margin-bottom:-1.75rem}.-my-72{margin-top:-18rem;margin-bottom:-18rem}.-my-8{margin-top:-2rem;margin-bottom:-2rem}.-my-80{margin-top:-20rem;margin-bottom:-20rem}.-my-9{margin-top:-2.25rem;margin-bottom:-2.25rem}.-my-96{margin-top:-24rem;margin-bottom:-24rem}.mx-0{margin-left:0;margin-right:0}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.mx-11{margin-left:2.75rem;margin-right:2.75rem}.mx-12{margin-left:3rem;margin-right:3rem}.mx-14{margin-left:3.5rem;margin-right:3.5rem}.mx-16{margin-left:4rem;margin-right:4rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-2\.5{margin-left:.625rem;margin-right:.625rem}.mx-20{margin-left:5rem;margin-right:5rem}.mx-24{margin-left:6rem;margin-right:6rem}.mx-28{margin-left:7rem;margin-right:7rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-3\.5{margin-left:.875rem;margin-right:.875rem}.mx-32{margin-left:8rem;margin-right:8rem}.mx-36{margin-left:9rem;margin-right:9rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-40{margin-left:10rem;margin-right:10rem}.mx-44{margin-left:11rem;margin-right:11rem}.mx-48{margin-left:12rem;margin-right:12rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-52{margin-left:13rem;margin-right:13rem}.mx-56{margin-left:14rem;margin-right:14rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-60{margin-left:15rem;margin-right:15rem}.mx-64{margin-left:16rem;margin-right:16rem}.mx-7{margin-left:1.75rem;margin-right:1.75rem}.mx-72{margin-left:18rem;margin-right:18rem}.mx-8{margin-left:2rem;margin-right:2rem}.mx-80{margin-left:20rem;margin-right:20rem}.mx-9{margin-left:2.25rem;margin-right:2.25rem}.mx-96{margin-left:24rem;margin-right:24rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0;margin-bottom:0}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-11{margin-top:2.75rem;margin-bottom:2.75rem}.my-12{margin-top:3rem;margin-bottom:3rem}.my-14{margin-top:3.5rem;margin-bottom:3.5rem}.my-16{margin-top:4rem;margin-bottom:4rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-2\.5{margin-top:.625rem;margin-bottom:.625rem}.my-20{margin-top:5rem;margin-bottom:5rem}.my-24{margin-top:6rem;margin-bottom:6rem}.my-28{margin-top:7rem;margin-bottom:7rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-3\.5{margin-top:.875rem;margin-bottom:.875rem}.my-32{margin-top:8rem;margin-bottom:8rem}.my-36{margin-top:9rem;margin-bottom:9rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-40{margin-top:10rem;margin-bottom:10rem}.my-44{margin-top:11rem;margin-bottom:11rem}.my-48{margin-top:12rem;margin-bottom:12rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-52{margin-top:13rem;margin-bottom:13rem}.my-56{margin-top:14rem;margin-bottom:14rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-60{margin-top:15rem;margin-bottom:15rem}.my-64{margin-top:16rem;margin-bottom:16rem}.my-7{margin-top:1.75rem;margin-bottom:1.75rem}.my-72{margin-top:18rem;margin-bottom:18rem}.my-8{margin-top:2rem;margin-bottom:2rem}.my-80{margin-top:20rem;margin-bottom:20rem}.my-9{margin-top:2.25rem;margin-bottom:2.25rem}.my-96{margin-top:24rem;margin-bottom:24rem}.-mb-0{margin-bottom:0}.-mb-0\.5{margin-bottom:-.125rem}.-mb-1{margin-bottom:-.25rem}.-mb-1\.5{margin-bottom:-.375rem}.-mb-10{margin-bottom:-2.5rem}.-mb-11{margin-bottom:-2.75rem}.-mb-12{margin-bottom:-3rem}.-mb-14{margin-bottom:-3.5rem}.-mb-16{margin-bottom:-4rem}.-mb-2{margin-bottom:-.5rem}.-mb-2\.5{margin-bottom:-.625rem}.-mb-20{margin-bottom:-5rem}.-mb-24{margin-bottom:-6rem}.-mb-28{margin-bottom:-7rem}.-mb-3{margin-bottom:-.75rem}.-mb-3\.5{margin-bottom:-.875rem}.-mb-32{margin-bottom:-8rem}.-mb-36{margin-bottom:-9rem}.-mb-4{margin-bottom:-1rem}.-mb-40{margin-bottom:-10rem}.-mb-44{margin-bottom:-11rem}.-mb-48{margin-bottom:-12rem}.-mb-5{margin-bottom:-1.25rem}.-mb-52{margin-bottom:-13rem}.-mb-56{margin-bottom:-14rem}.-mb-6{margin-bottom:-1.5rem}.-mb-60{margin-bottom:-15rem}.-mb-64{margin-bottom:-16rem}.-mb-7{margin-bottom:-1.75rem}.-mb-72{margin-bottom:-18rem}.-mb-8{margin-bottom:-2rem}.-mb-80{margin-bottom:-20rem}.-mb-9{margin-bottom:-2.25rem}.-mb-96{margin-bottom:-24rem}.-ml-0{margin-left:0}.-ml-0\.5{margin-left:-.125rem}.-ml-1{margin-left:-.25rem}.-ml-1\.5{margin-left:-.375rem}.-ml-10{margin-left:-2.5rem}.-ml-11{margin-left:-2.75rem}.-ml-12{margin-left:-3rem}.-ml-14{margin-left:-3.5rem}.-ml-16{margin-left:-4rem}.-ml-2{margin-left:-.5rem}.-ml-2\.5{margin-left:-.625rem}.-ml-20{margin-left:-5rem}.-ml-24{margin-left:-6rem}.-ml-28{margin-left:-7rem}.-ml-3{margin-left:-.75rem}.-ml-3\.5{margin-left:-.875rem}.-ml-32{margin-left:-8rem}.-ml-36{margin-left:-9rem}.-ml-4{margin-left:-1rem}.-ml-40{margin-left:-10rem}.-ml-44{margin-left:-11rem}.-ml-48{margin-left:-12rem}.-ml-5{margin-left:-1.25rem}.-ml-52{margin-left:-13rem}.-ml-56{margin-left:-14rem}.-ml-6{margin-left:-1.5rem}.-ml-60{margin-left:-15rem}.-ml-64{margin-left:-16rem}.-ml-7{margin-left:-1.75rem}.-ml-72{margin-left:-18rem}.-ml-8{margin-left:-2rem}.-ml-80{margin-left:-20rem}.-ml-9{margin-left:-2.25rem}.-ml-96{margin-left:-24rem}.-mr-0{margin-right:0}.-mr-0\.5{margin-right:-.125rem}.-mr-1{margin-right:-.25rem}.-mr-1\.5{margin-right:-.375rem}.-mr-10{margin-right:-2.5rem}.-mr-11{margin-right:-2.75rem}.-mr-12{margin-right:-3rem}.-mr-14{margin-right:-3.5rem}.-mr-16{margin-right:-4rem}.-mr-2{margin-right:-.5rem}.-mr-2\.5{margin-right:-.625rem}.-mr-20{margin-right:-5rem}.-mr-24{margin-right:-6rem}.-mr-28{margin-right:-7rem}.-mr-3{margin-right:-.75rem}.-mr-3\.5{margin-right:-.875rem}.-mr-32{margin-right:-8rem}.-mr-36{margin-right:-9rem}.-mr-4{margin-right:-1rem}.-mr-40{margin-right:-10rem}.-mr-44{margin-right:-11rem}.-mr-48{margin-right:-12rem}.-mr-5{margin-right:-1.25rem}.-mr-52{margin-right:-13rem}.-mr-56{margin-right:-14rem}.-mr-6{margin-right:-1.5rem}.-mr-60{margin-right:-15rem}.-mr-64{margin-right:-16rem}.-mr-7{margin-right:-1.75rem}.-mr-72{margin-right:-18rem}.-mr-8{margin-right:-2rem}.-mr-80{margin-right:-20rem}.-mr-9{margin-right:-2.25rem}.-mr-96{margin-right:-24rem}.-mt-0{margin-top:0}.-mt-0\.5{margin-top:-.125rem}.-mt-1{margin-top:-.25rem}.-mt-1\.5{margin-top:-.375rem}.-mt-10{margin-top:-2.5rem}.-mt-11{margin-top:-2.75rem}.-mt-12{margin-top:-3rem}.-mt-14{margin-top:-3.5rem}.-mt-16{margin-top:-4rem}.-mt-2{margin-top:-.5rem}.-mt-2\.5{margin-top:-.625rem}.-mt-20{margin-top:-5rem}.-mt-24{margin-top:-6rem}.-mt-28{margin-top:-7rem}.-mt-3{margin-top:-.75rem}.-mt-3\.5{margin-top:-.875rem}.-mt-32{margin-top:-8rem}.-mt-36{margin-top:-9rem}.-mt-4{margin-top:-1rem}.-mt-40{margin-top:-10rem}.-mt-44{margin-top:-11rem}.-mt-48{margin-top:-12rem}.-mt-5{margin-top:-1.25rem}.-mt-52{margin-top:-13rem}.-mt-56{margin-top:-14rem}.-mt-6{margin-top:-1.5rem}.-mt-60{margin-top:-15rem}.-mt-64{margin-top:-16rem}.-mt-7{margin-top:-1.75rem}.-mt-72{margin-top:-18rem}.-mt-8{margin-top:-2rem}.-mt-80{margin-top:-20rem}.-mt-9{margin-top:-2.25rem}.-mt-96{margin-top:-24rem}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-11{margin-bottom:2.75rem}.mb-12{margin-bottom:3rem}.mb-14{margin-bottom:3.5rem}.mb-16{margin-bottom:4rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-20{margin-bottom:5rem}.mb-24{margin-bottom:6rem}.mb-28{margin-bottom:7rem}.mb-3{margin-bottom:.75rem}.mb-3\.5{margin-bottom:.875rem}.mb-32{margin-bottom:8rem}.mb-36{margin-bottom:9rem}.mb-4{margin-bottom:1rem}.mb-40{margin-bottom:10rem}.mb-44{margin-bottom:11rem}.mb-48{margin-bottom:12rem}.mb-5{margin-bottom:1.25rem}.mb-52{margin-bottom:13rem}.mb-56{margin-bottom:14rem}.mb-6{margin-bottom:1.5rem}.mb-60{margin-bottom:15rem}.mb-64{margin-bottom:16rem}.mb-7{margin-bottom:1.75rem}.mb-72{margin-bottom:18rem}.mb-8{margin-bottom:2rem}.mb-80{margin-bottom:20rem}.mb-9{margin-bottom:2.25rem}.mb-96{margin-bottom:24rem}.me-2{margin-inline-end:.5rem}.me-3{margin-inline-end:.75rem}.ml-0{margin-left:0}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-10{margin-left:2.5rem}.ml-11{margin-left:2.75rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.ml-16{margin-left:4rem}.ml-2{margin-left:.5rem}.ml-2\.5{margin-left:.625rem}.ml-20{margin-left:5rem}.ml-24{margin-left:6rem}.ml-28{margin-left:7rem}.ml-3{margin-left:.75rem}.ml-3\.5{margin-left:.875rem}.ml-32{margin-left:8rem}.ml-36{margin-left:9rem}.ml-4{margin-left:1rem}.ml-40{margin-left:10rem}.ml-44{margin-left:11rem}.ml-48{margin-left:12rem}.ml-5{margin-left:1.25rem}.ml-52{margin-left:13rem}.ml-56{margin-left:14rem}.ml-6{margin-left:1.5rem}.ml-60{margin-left:15rem}.ml-64{margin-left:16rem}.ml-7{margin-left:1.75rem}.ml-72{margin-left:18rem}.ml-8{margin-left:2rem}.ml-80{margin-left:20rem}.ml-9{margin-left:2.25rem}.ml-96{margin-left:24rem}.mr-0{margin-right:0}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-10{margin-right:2.5rem}.mr-11{margin-right:2.75rem}.mr-12{margin-right:3rem}.mr-14{margin-right:3.5rem}.mr-16{margin-right:4rem}.mr-2{margin-right:.5rem}.mr-2\.5{margin-right:.625rem}.mr-20{margin-right:5rem}.mr-24{margin-right:6rem}.mr-28{margin-right:7rem}.mr-3{margin-right:.75rem}.mr-3\.5{margin-right:.875rem}.mr-32{margin-right:8rem}.mr-36{margin-right:9rem}.mr-4{margin-right:1rem}.mr-40{margin-right:10rem}.mr-44{margin-right:11rem}.mr-48{margin-right:12rem}.mr-5{margin-right:1.25rem}.mr-52{margin-right:13rem}.mr-56{margin-right:14rem}.mr-6{margin-right:1.5rem}.mr-60{margin-right:15rem}.mr-64{margin-right:16rem}.mr-7{margin-right:1.75rem}.mr-72{margin-right:18rem}.mr-8{margin-right:2rem}.mr-80{margin-right:20rem}.mr-9{margin-right:2.25rem}.mr-96{margin-right:24rem}.ms-auto{margin-inline-start:auto}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-11{margin-top:2.75rem}.mt-12{margin-top:3rem}.mt-14{margin-top:3.5rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-20{margin-top:5rem}.mt-24{margin-top:6rem}.mt-28{margin-top:7rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-32{margin-top:8rem}.mt-36{margin-top:9rem}.mt-4{margin-top:1rem}.mt-40{margin-top:10rem}.mt-44{margin-top:11rem}.mt-48{margin-top:12rem}.mt-5{margin-top:1.25rem}.mt-52{margin-top:13rem}.mt-56{margin-top:14rem}.mt-6{margin-top:1.5rem}.mt-60{margin-top:15rem}.mt-64{margin-top:16rem}.mt-7{margin-top:1.75rem}.mt-72{margin-top:18rem}.mt-8{margin-top:2rem}.mt-80{margin-top:20rem}.mt-9{margin-top:2.25rem}.mt-96{margin-top:24rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.grid{display:grid}.contents{display:contents}.list-item{display:list-item}.hidden{display:none}.h-0{height:0}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-1\/2{height:50%}.h-1\/3{height:33.333333%}.h-1\/4{height:25%}.h-1\/5{height:20%}.h-1\/6{height:16.666667%}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-2\/3{height:66.666667%}.h-2\/4{height:50%}.h-2\/5{height:40%}.h-2\/6{height:33.333333%}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-3\/4{height:75%}.h-3\/5{height:60%}.h-3\/6{height:50%}.h-32{height:8rem}.h-36{height:9rem}.h-4{height:1rem}.h-4\/5{height:80%}.h-4\/6{height:66.666667%}.h-40{height:10rem}.h-44{height:11rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-5\/6{height:83.333333%}.h-52{height:13rem}.h-56{height:14rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-72{height:18rem}.h-8{height:2rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-96{height:24rem}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-max{height:-moz-max-content;height:max-content}.h-min{height:-moz-min-content;height:min-content}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:0}.max-h-0\.5{max-height:.125rem}.max-h-1{max-height:.25rem}.max-h-1\.5{max-height:.375rem}.max-h-10{max-height:2.5rem}.max-h-11{max-height:2.75rem}.max-h-12{max-height:3rem}.max-h-14{max-height:3.5rem}.max-h-16{max-height:4rem}.max-h-2{max-height:.5rem}.max-h-2\.5{max-height:.625rem}.max-h-20{max-height:5rem}.max-h-24{max-height:6rem}.max-h-28{max-height:7rem}.max-h-3{max-height:.75rem}.max-h-3\.5{max-height:.875rem}.max-h-32{max-height:8rem}.max-h-36{max-height:9rem}.max-h-4{max-height:1rem}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-5{max-height:1.25rem}.max-h-52{max-height:13rem}.max-h-56{max-height:14rem}.max-h-6{max-height:1.5rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-7{max-height:1.75rem}.max-h-72{max-height:18rem}.max-h-8{max-height:2rem}.max-h-80{max-height:20rem}.max-h-9{max-height:2.25rem}.max-h-96{max-height:24rem}.max-h-fit{max-height:-moz-fit-content;max-height:fit-content}.max-h-full{max-height:100%}.max-h-max{max-height:-moz-max-content;max-height:max-content}.max-h-min{max-height:-moz-min-content;max-height:min-content}.max-h-screen{max-height:100vh}.min-h-0{min-height:0}.min-h-fit{min-height:-moz-fit-content;min-height:fit-content}.min-h-full{min-height:100%}.min-h-max{min-height:-moz-max-content;min-height:max-content}.min-h-min{min-height:-moz-min-content;min-height:min-content}.min-h-screen{min-height:100vh}.w-0{width:0}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/12{width:8.333333%}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-1\/5{width:20%}.w-1\/6{width:16.666667%}.w-10{width:2.5rem}.w-10\/12{width:83.333333%}.w-11{width:2.75rem}.w-11\/12{width:91.666667%}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/12{width:16.666667%}.w-2\/3{width:66.666667%}.w-2\/4{width:50%}.w-2\/5{width:40%}.w-2\/6{width:33.333333%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/12{width:25%}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-3\/6{width:50%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-4\/12{width:33.333333%}.w-4\/5{width:80%}.w-4\/6{width:66.666667%}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-5\/12{width:41.666667%}.w-5\/6{width:83.333333%}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-6\/12{width:50%}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-7\/12{width:58.333333%}.w-72{width:18rem}.w-8{width:2rem}.w-8\/12{width:66.666667%}.w-80{width:20rem}.w-9{width:2.25rem}.w-9\/12{width:75%}.w-96{width:24rem}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-min{width:-moz-min-content;width:min-content}.w-px{width:1px}.w-screen{width:100vw}.min-w-0{min-width:0}.min-w-\[10rem\]{min-width:10rem}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.min-w-full{min-width:100%}.min-w-max{min-width:-moz-max-content;min-width:max-content}.min-w-min{min-width:-moz-min-content;min-width:min-content}.max-w-0{max-width:0}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-fit{max-width:-moz-fit-content;max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-max{max-width:-moz-max-content;max-width:max-content}.max-w-md{max-width:28rem}.max-w-min{max-width:-moz-min-content;max-width:min-content}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-screen-2xl{max-width:1536px}.max-w-screen-lg{max-width:1024px}.max-w-screen-md{max-width:768px}.max-w-screen-sm{max-width:640px}.max-w-screen-xl{max-width:1280px}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.flex-grow,.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x:-50%}.-translate-x-1\/2,.-translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x:-100%}.-translate-y-1\/2{--tw-translate-y:-50%}.-translate-y-1\/2,.-translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-full{--tw-translate-y:-100%}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.translate-y-full{--tw-translate-y:100%}.rotate-180,.translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform-none{transform:none}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-items-start{justify-items:start}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.justify-items-stretch{justify-items:stretch}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-10{gap:2.5rem}.gap-11{gap:2.75rem}.gap-12{gap:3rem}.gap-14{gap:3.5rem}.gap-16{gap:4rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-20{gap:5rem}.gap-24{gap:6rem}.gap-28{gap:7rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-32{gap:8rem}.gap-36{gap:9rem}.gap-4{gap:1rem}.gap-40{gap:10rem}.gap-44{gap:11rem}.gap-48{gap:12rem}.gap-5{gap:1.25rem}.gap-52{gap:13rem}.gap-56{gap:14rem}.gap-6{gap:1.5rem}.gap-60{gap:15rem}.gap-64{gap:16rem}.gap-7{gap:1.75rem}.gap-72{gap:18rem}.gap-8{gap:2rem}.gap-80{gap:20rem}.gap-9{gap:2.25rem}.gap-96{gap:24rem}.gap-x-0{-moz-column-gap:0;column-gap:0}.gap-x-0\.5{-moz-column-gap:.125rem;column-gap:.125rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-x-11{-moz-column-gap:2.75rem;column-gap:2.75rem}.gap-x-12{-moz-column-gap:3rem;column-gap:3rem}.gap-x-14{-moz-column-gap:3.5rem;column-gap:3.5rem}.gap-x-16{-moz-column-gap:4rem;column-gap:4rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-20{-moz-column-gap:5rem;column-gap:5rem}.gap-x-24{-moz-column-gap:6rem;column-gap:6rem}.gap-x-28{-moz-column-gap:7rem;column-gap:7rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-3\.5{-moz-column-gap:.875rem;column-gap:.875rem}.gap-x-32{-moz-column-gap:8rem;column-gap:8rem}.gap-x-36{-moz-column-gap:9rem;column-gap:9rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-40{-moz-column-gap:10rem;column-gap:10rem}.gap-x-44{-moz-column-gap:11rem;column-gap:11rem}.gap-x-48{-moz-column-gap:12rem;column-gap:12rem}.gap-x-5{-moz-column-gap:1.25rem;column-gap:1.25rem}.gap-x-52{-moz-column-gap:13rem;column-gap:13rem}.gap-x-56{-moz-column-gap:14rem;column-gap:14rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-x-60{-moz-column-gap:15rem;column-gap:15rem}.gap-x-64{-moz-column-gap:16rem;column-gap:16rem}.gap-x-7{-moz-column-gap:1.75rem;column-gap:1.75rem}.gap-x-72{-moz-column-gap:18rem;column-gap:18rem}.gap-x-8{-moz-column-gap:2rem;column-gap:2rem}.gap-x-80{-moz-column-gap:20rem;column-gap:20rem}.gap-x-9{-moz-column-gap:2.25rem;column-gap:2.25rem}.gap-x-96{-moz-column-gap:24rem;column-gap:24rem}.gap-y-0{row-gap:0}.gap-y-0\.5{row-gap:.125rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.gap-y-10{row-gap:2.5rem}.gap-y-11{row-gap:2.75rem}.gap-y-12{row-gap:3rem}.gap-y-14{row-gap:3.5rem}.gap-y-16{row-gap:4rem}.gap-y-2{row-gap:.5rem}.gap-y-2\.5{row-gap:.625rem}.gap-y-20{row-gap:5rem}.gap-y-24{row-gap:6rem}.gap-y-28{row-gap:7rem}.gap-y-3{row-gap:.75rem}.gap-y-3\.5{row-gap:.875rem}.gap-y-32{row-gap:8rem}.gap-y-36{row-gap:9rem}.gap-y-4{row-gap:1rem}.gap-y-40{row-gap:10rem}.gap-y-44{row-gap:11rem}.gap-y-48{row-gap:12rem}.gap-y-5{row-gap:1.25rem}.gap-y-52{row-gap:13rem}.gap-y-56{row-gap:14rem}.gap-y-6{row-gap:1.5rem}.gap-y-60{row-gap:15rem}.gap-y-64{row-gap:16rem}.gap-y-7{row-gap:1.75rem}.gap-y-72{row-gap:18rem}.gap-y-8{row-gap:2rem}.gap-y-80{row-gap:20rem}.gap-y-9{row-gap:2.25rem}.gap-y-96{row-gap:24rem}.space-x-0>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0px*var(--tw-space-x-reverse));margin-left:calc(0px*(1 - var(--tw-space-x-reverse)))}.space-x-0\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem*var(--tw-space-x-reverse));margin-left:calc(.125rem*(1 - var(--tw-space-x-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.25rem*var(--tw-space-x-reverse));margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.375rem*var(--tw-space-x-reverse));margin-left:calc(.375rem*(1 - var(--tw-space-x-reverse)))}.space-x-10>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.5rem*var(--tw-space-x-reverse));margin-left:calc(2.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-11>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.75rem*var(--tw-space-x-reverse));margin-left:calc(2.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-12>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3rem*var(--tw-space-x-reverse));margin-left:calc(3rem*(1 - var(--tw-space-x-reverse)))}.space-x-14>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(3.5rem*var(--tw-space-x-reverse));margin-left:calc(3.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-16>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(4rem*var(--tw-space-x-reverse));margin-left:calc(4rem*(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-2\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.625rem*var(--tw-space-x-reverse));margin-left:calc(.625rem*(1 - var(--tw-space-x-reverse)))}.space-x-20>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(5rem*var(--tw-space-x-reverse));margin-left:calc(5rem*(1 - var(--tw-space-x-reverse)))}.space-x-24>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(6rem*var(--tw-space-x-reverse));margin-left:calc(6rem*(1 - var(--tw-space-x-reverse)))}.space-x-28>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(7rem*var(--tw-space-x-reverse));margin-left:calc(7rem*(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-3\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.875rem*var(--tw-space-x-reverse));margin-left:calc(.875rem*(1 - var(--tw-space-x-reverse)))}.space-x-32>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(8rem*var(--tw-space-x-reverse));margin-left:calc(8rem*(1 - var(--tw-space-x-reverse)))}.space-x-36>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(9rem*var(--tw-space-x-reverse));margin-left:calc(9rem*(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1rem*var(--tw-space-x-reverse));margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)))}.space-x-40>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(10rem*var(--tw-space-x-reverse));margin-left:calc(10rem*(1 - var(--tw-space-x-reverse)))}.space-x-44>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(11rem*var(--tw-space-x-reverse));margin-left:calc(11rem*(1 - var(--tw-space-x-reverse)))}.space-x-48>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(12rem*var(--tw-space-x-reverse));margin-left:calc(12rem*(1 - var(--tw-space-x-reverse)))}.space-x-5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.25rem*var(--tw-space-x-reverse));margin-left:calc(1.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-52>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(13rem*var(--tw-space-x-reverse));margin-left:calc(13rem*(1 - var(--tw-space-x-reverse)))}.space-x-56>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(14rem*var(--tw-space-x-reverse));margin-left:calc(14rem*(1 - var(--tw-space-x-reverse)))}.space-x-6>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.5rem*var(--tw-space-x-reverse));margin-left:calc(1.5rem*(1 - var(--tw-space-x-reverse)))}.space-x-60>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(15rem*var(--tw-space-x-reverse));margin-left:calc(15rem*(1 - var(--tw-space-x-reverse)))}.space-x-64>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(16rem*var(--tw-space-x-reverse));margin-left:calc(16rem*(1 - var(--tw-space-x-reverse)))}.space-x-7>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(1.75rem*var(--tw-space-x-reverse));margin-left:calc(1.75rem*(1 - var(--tw-space-x-reverse)))}.space-x-72>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(18rem*var(--tw-space-x-reverse));margin-left:calc(18rem*(1 - var(--tw-space-x-reverse)))}.space-x-8>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2rem*var(--tw-space-x-reverse));margin-left:calc(2rem*(1 - var(--tw-space-x-reverse)))}.space-x-80>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(20rem*var(--tw-space-x-reverse));margin-left:calc(20rem*(1 - var(--tw-space-x-reverse)))}.space-x-9>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(2.25rem*var(--tw-space-x-reverse));margin-left:calc(2.25rem*(1 - var(--tw-space-x-reverse)))}.space-x-96>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(24rem*var(--tw-space-x-reverse));margin-left:calc(24rem*(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem*var(--tw-space-y-reverse))}.space-y-11>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.75rem*var(--tw-space-y-reverse))}.space-y-12>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3rem*var(--tw-space-y-reverse))}.space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem*var(--tw-space-y-reverse))}.space-y-16>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(4rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-20>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(5rem*var(--tw-space-y-reverse))}.space-y-24>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(6rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(6rem*var(--tw-space-y-reverse))}.space-y-28>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(7rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(7rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.875rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem*var(--tw-space-y-reverse))}.space-y-32>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(8rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8rem*var(--tw-space-y-reverse))}.space-y-36>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(9rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(9rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-40>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(10rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(10rem*var(--tw-space-y-reverse))}.space-y-44>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(11rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(11rem*var(--tw-space-y-reverse))}.space-y-48>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(12rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(12rem*var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem*var(--tw-space-y-reverse))}.space-y-52>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(13rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(13rem*var(--tw-space-y-reverse))}.space-y-56>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(14rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(14rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-60>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(15rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(15rem*var(--tw-space-y-reverse))}.space-y-64>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(16rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16rem*var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem*var(--tw-space-y-reverse))}.space-y-72>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(18rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(18rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.space-y-80>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(20rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(20rem*var(--tw-space-y-reverse))}.space-y-9>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.25rem*var(--tw-space-y-reverse))}.space-y-96>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(24rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(24rem*var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px*var(--tw-divide-y-reverse))}.divide-gray-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(243 244 246/var(--tw-divide-opacity,1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-lg{border-bottom-right-radius:.5rem}.rounded-r-lg,.rounded-t-lg{border-top-right-radius:.5rem}.rounded-t-lg{border-top-left-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-blue-500{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1))}.border-blue-600{--tw-border-opacity:1;border-color:rgb(28 100 242/var(--tw-border-opacity,1))}.border-blue-700{--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1))}.border-gray-100{--tw-border-opacity:1;border-color:rgb(243 244 246/var(--tw-border-opacity,1))}.border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.bg-blue-700{--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1))}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/50{background-color:hsla(0,0%,100%,.5)}.bg-opacity-50{--tw-bg-opacity:0.5}.bg-auto{background-size:auto}.bg-contain{background-size:contain}.bg-cover{background-size:cover}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-11{padding:2.75rem}.p-12{padding:3rem}.p-14{padding:3.5rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-20{padding:5rem}.p-24{padding:6rem}.p-28{padding:7rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-32{padding:8rem}.p-36{padding:9rem}.p-4{padding:1rem}.p-40{padding:10rem}.p-44{padding:11rem}.p-48{padding:12rem}.p-5{padding:1.25rem}.p-52{padding:13rem}.p-56{padding:14rem}.p-6{padding:1.5rem}.p-60{padding:15rem}.p-64{padding:16rem}.p-7{padding:1.75rem}.p-72{padding:18rem}.p-8{padding:2rem}.p-80{padding:20rem}.p-9{padding:2.25rem}.p-96{padding:24rem}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-11{padding-left:2.75rem;padding-right:2.75rem}.px-12{padding-left:3rem;padding-right:3rem}.px-14{padding-left:3.5rem;padding-right:3.5rem}.px-16{padding-left:4rem;padding-right:4rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-20{padding-left:5rem;padding-right:5rem}.px-24{padding-left:6rem;padding-right:6rem}.px-28{padding-left:7rem;padding-right:7rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-32{padding-left:8rem;padding-right:8rem}.px-36{padding-left:9rem;padding-right:9rem}.px-4{padding-left:1rem;padding-right:1rem}.px-40{padding-left:10rem;padding-right:10rem}.px-44{padding-left:11rem;padding-right:11rem}.px-48{padding-left:12rem;padding-right:12rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-52{padding-left:13rem;padding-right:13rem}.px-56{padding-left:14rem;padding-right:14rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-60{padding-left:15rem;padding-right:15rem}.px-64{padding-left:16rem;padding-right:16rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-72{padding-left:18rem;padding-right:18rem}.px-8{padding-left:2rem;padding-right:2rem}.px-80{padding-left:20rem;padding-right:20rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.px-96{padding-left:24rem;padding-right:24rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-11{padding-top:2.75rem;padding-bottom:2.75rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-14{padding-top:3.5rem;padding-bottom:3.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.py-28{padding-top:7rem;padding-bottom:7rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-32{padding-top:8rem;padding-bottom:8rem}.py-36{padding-top:9rem;padding-bottom:9rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-40{padding-top:10rem;padding-bottom:10rem}.py-44{padding-top:11rem;padding-bottom:11rem}.py-48{padding-top:12rem;padding-bottom:12rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-52{padding-top:13rem;padding-bottom:13rem}.py-56{padding-top:14rem;padding-bottom:14rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-60{padding-top:15rem;padding-bottom:15rem}.py-64{padding-top:16rem;padding-bottom:16rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.py-72{padding-top:18rem;padding-bottom:18rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-80{padding-top:20rem;padding-bottom:20rem}.py-9{padding-top:2.25rem;padding-bottom:2.25rem}.py-96{padding-top:24rem;padding-bottom:24rem}.py-\[\.1rem\]{padding-top:.1rem;padding-bottom:.1rem}.pb-0{padding-bottom:0}.pb-0\.5{padding-bottom:.125rem}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-11{padding-bottom:2.75rem}.pb-12{padding-bottom:3rem}.pb-14{padding-bottom:3.5rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-20{padding-bottom:5rem}.pb-24{padding-bottom:6rem}.pb-28{padding-bottom:7rem}.pb-3{padding-bottom:.75rem}.pb-3\.5{padding-bottom:.875rem}.pb-32{padding-bottom:8rem}.pb-36{padding-bottom:9rem}.pb-4{padding-bottom:1rem}.pb-40{padding-bottom:10rem}.pb-44{padding-bottom:11rem}.pb-48{padding-bottom:12rem}.pb-5{padding-bottom:1.25rem}.pb-52{padding-bottom:13rem}.pb-56{padding-bottom:14rem}.pb-6{padding-bottom:1.5rem}.pb-60{padding-bottom:15rem}.pb-64{padding-bottom:16rem}.pb-7{padding-bottom:1.75rem}.pb-72{padding-bottom:18rem}.pb-8{padding-bottom:2rem}.pb-80{padding-bottom:20rem}.pb-9{padding-bottom:2.25rem}.pb-96{padding-bottom:24rem}.pl-0{padding-left:0}.pl-0\.5{padding-left:.125rem}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-11{padding-left:2.75rem}.pl-12{padding-left:3rem}.pl-14{padding-left:3.5rem}.pl-16{padding-left:4rem}.pl-2{padding-left:.5rem}.pl-2\.5{padding-left:.625rem}.pl-20{padding-left:5rem}.pl-24{padding-left:6rem}.pl-28{padding-left:7rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-32{padding-left:8rem}.pl-36{padding-left:9rem}.pl-4{padding-left:1rem}.pl-40{padding-left:10rem}.pl-44{padding-left:11rem}.pl-48{padding-left:12rem}.pl-5{padding-left:1.25rem}.pl-52{padding-left:13rem}.pl-56{padding-left:14rem}.pl-6{padding-left:1.5rem}.pl-60{padding-left:15rem}.pl-64{padding-left:16rem}.pl-7{padding-left:1.75rem}.pl-72{padding-left:18rem}.pl-8{padding-left:2rem}.pl-80{padding-left:20rem}.pl-9{padding-left:2.25rem}.pl-96{padding-left:24rem}.pr-0{padding-right:0}.pr-0\.5{padding-right:.125rem}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-10{padding-right:2.5rem}.pr-11{padding-right:2.75rem}.pr-12{padding-right:3rem}.pr-14{padding-right:3.5rem}.pr-16{padding-right:4rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-20{padding-right:5rem}.pr-24{padding-right:6rem}.pr-28{padding-right:7rem}.pr-3{padding-right:.75rem}.pr-3\.5{padding-right:.875rem}.pr-32{padding-right:8rem}.pr-36{padding-right:9rem}.pr-4{padding-right:1rem}.pr-40{padding-right:10rem}.pr-44{padding-right:11rem}.pr-48{padding-right:12rem}.pr-5{padding-right:1.25rem}.pr-52{padding-right:13rem}.pr-56{padding-right:14rem}.pr-6{padding-right:1.5rem}.pr-60{padding-right:15rem}.pr-64{padding-right:16rem}.pr-7{padding-right:1.75rem}.pr-72{padding-right:18rem}.pr-8{padding-right:2rem}.pr-80{padding-right:20rem}.pr-9{padding-right:2.25rem}.pr-96{padding-right:24rem}.ps-4{padding-inline-start:1rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-10{padding-top:2.5rem}.pt-11{padding-top:2.75rem}.pt-12{padding-top:3rem}.pt-14{padding-top:3.5rem}.pt-16{padding-top:4rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-20{padding-top:5rem}.pt-24{padding-top:6rem}.pt-28{padding-top:7rem}.pt-3{padding-top:.75rem}.pt-3\.5{padding-top:.875rem}.pt-32{padding-top:8rem}.pt-36{padding-top:9rem}.pt-4{padding-top:1rem}.pt-40{padding-top:10rem}.pt-44{padding-top:11rem}.pt-48{padding-top:12rem}.pt-5{padding-top:1.25rem}.pt-52{padding-top:13rem}.pt-56{padding-top:14rem}.pt-6{padding-top:1.5rem}.pt-60{padding-top:15rem}.pt-64{padding-top:16rem}.pt-7{padding-top:1.75rem}.pt-72{padding-top:18rem}.pt-8{padding-top:2rem}.pt-80{padding-top:20rem}.pt-9{padding-top:2.25rem}.pt-96{padding-top:24rem}.text-center{text-align:center}.text-justify{text-align:justify}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-7xl{font-size:4.5rem;line-height:1}.text-8xl{font-size:6rem;line-height:1}.text-9xl{font-size:8rem;line-height:1}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-light{font-weight:300}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-6{line-height:1.5rem}.leading-9{line-height:2.25rem}.leading-relaxed{line-height:1.625}.text-blue-600{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(224 36 36/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-500{--tw-text-opacity:1;color:rgb(194 120 3/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.overline{text-decoration-line:overline}.line-through{text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.blur{--tw-blur:blur(8px)}.blur,.invert{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert:invert(100%)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[-\:\=\]{-:=}.\[-_\:\.a-zA-Z0-9\\xc0-\\uffff\]{-_:.a-zA-Z0-9\xc0-\uffff}.\[-_a-zA-Z0-9\:\.\]{-_a-z-a--z0-9:.}.\[_\:a-zA-Z\\xc0-\\uffff\]{_:a-zA-Z\xc0-\uffff}:disabled{cursor:not-allowed!important}.main-content{margin-top:4rem;margin-left:0;min-height:calc(100vh - 9rem);flex-direction:column;padding-left:1rem;padding-right:1rem;display:flex}@media (min-width:640px){.main-content{margin-left:14rem}}@media (min-width:1024px){.main-content{padding-left:2.5rem;padding-right:2.5rem}}.main-content{transition:margin-left .5s ease}#toggleIcon{transition:transform .4s;display:inline-block}.flip{transform:rotateY(90deg)}.apexcharts-tooltip.apexcharts-theme-light{border:1px solid #e3e3e3;background:hsla(0,0%,100%,.96)}.apexcharts-yaxistooltip,.dark .apexcharts-tooltip.apexcharts-theme-light,.dark .apexcharts-xaxistooltip{border:1px solid #1e293b;background:#0d1220}.dark .apexcharts-xaxistooltip-text{color:#e3e3e3!important}body{overflow-x:hidden;background-color:var(--light-secondary);font-family:rubik;color:var(--light-text-primary)}body:is(.dark *){background-color:var(--dark-primary);color:var(--dark-text-primary)}hr{margin-top:1rem;margin-bottom:1rem}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-thumb{background-color:var(--light-scrollbar)}:is(.dark *)::-webkit-scrollbar-thumb{background-color:var(--dark-scrollbar)}::-webkit-scrollbar-thumb{border-radius:10px}::-webkit-scrollbar-thumb:hover{background-color:var(--light-scrollbar-hover)}:is(.dark *)::-webkit-scrollbar-thumb:hover{background-color:var(--dark-scrollbar-hover)}::-webkit-scrollbar-track{background-color:var(--light-scrollbar-bg)}:is(.dark *)::-webkit-scrollbar-track{background-color:var(--dark-scrollbar-bg)}::-webkit-scrollbar-track{border-radius:10px}.link{color:rgb(28 100 242/var(--tw-text-opacity,1))}.link,.link:hover{--tw-text-opacity:1}.link:hover{color:rgb(26 86 219/var(--tw-text-opacity,1))}.link:is(.dark *){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity,1))}.link:hover:is(.dark *){--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.loading-icon{display:inline-block;margin-left:5px;border-radius:50%;border:2px solid #f3f3f3;border-top-color:#3498db;width:12px;height:12px;animation:spin 2s linear infinite}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.loading-btn.loading{cursor:not-allowed}.nav{position:fixed;top:0;z-index:50;width:100%;border-bottom-width:1px;border-color:var(--light-fourth);background-color:var(--light-primary)}.nav:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-secondary)}.aside-nav{position:fixed;top:0;left:0;z-index:40;height:100vh;width:15rem;--tw-translate-x:-100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-right-width:1px;border-color:var(--light-fourth);background-color:var(--light-primary);padding-top:2.75rem;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.aside-nav:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-secondary)}@media (min-width:640px){.aside-nav{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}}.a-side-nav{margin:auto;width:90%;border-radius:.6rem;padding:.25rem .75rem;display:flex;align-items:center}.a-side-nav:hover{background-color:var(--light-secondary)}.a-side-nav:hover:is(.dark *){background-color:var(--dark-third)}.a-side-nav i{width:1.25rem;flex-shrink:0;text-align:start;color:var(--light-text-secondary)}.side-nav-active{color:var(--light-primary)}.side-nav-active,.side-nav-active:hover{background-color:var(--nav-sky)}.side-nav-active:hover:is(.dark *){background-color:var(--nav-sky)}.side-nav-active i{color:var(--light-primary)}.side-nav-active i,.side-nav-active i:hover{background-color:var(--nav-sky)}.side-nav-drop-active{margin-left:.5rem;font-weight:500;color:var(--nav-sky)}.side-nav-drop-active:is(.dark *){color:var(--nav-sky-text-dark)}.a-side-nav-dropdown{background-color:var(--nav-sky-light);width:90%;max-height:0;opacity:0;overflow:hidden;border-radius:.6rem;margin-right:auto;margin-left:auto;transition:max-height .4s ease,opacity .4s ease,margin .4s ease,padding .4s ease;will-change:max-height,opacity,margin,padding}.a-side-nav-dropdown.active{max-height:9000px!important;opacity:1;margin:5px auto;padding-top:.4rem;padding-bottom:.4rem}.a-side-nav-dropdown:is(.dark *){background-color:var(--nav-sky-dark)}.a-side-nav-drop{transition:margin-left .2s;width:100%;padding-left:1rem;padding-right:.25rem;padding-top:.25rem;font-size:.875rem;line-height:1.25rem;display:flex;align-items:center}.a-side-nav-drop:hover{margin-left:.5rem;color:var(--nav-sky)}.a-side-nav-drop-sub{transition:none;width:100%;display:block;align-items:center;padding-left:1rem;padding-right:.25rem;padding-top:.25rem;font-size:.9rem;line-height:1.25rem}.a-side-nav-drop-sub-title{transition:margin-left .2s,color .2s;margin-left:0}.a-side-nav-drop-sub:hover .a-side-nav-drop-sub-title{margin-left:.5rem;color:var(--nav-sky)}.a-side-nav-drop-sub-link{transition:margin-left .2s,color .2s;margin-left:0}.a-side-nav-drop-sub-link:hover{margin-left:.5rem;color:var(--nav-sky)}.a-side-nav-drop-sub-link-active{margin-left:.5rem}.a-side-nav-dropdown ul{max-height:0;overflow:hidden;opacity:0;transition:max-height .4s ease,opacity .4s ease;will-change:max-height,opacity}.a-side-nav-dropdown ul.open{opacity:1;max-height:9000px!important}.span-side-nav{margin-left:.75rem;flex:1 1 0%;white-space:nowrap;text-align:left}.span-side-nav:where([dir=rtl],[dir=rtl] *){text-align:right}.sidebar-collapsed .aside-nav{width:0;overflow:hidden}.sidebar-collapsed .main-content,.sidebar-collapsed footer{margin-left:0;width:100%}.aside-nav{transition:width .5s ease!important}footer{margin-top:auto;padding-left:1rem;padding-right:1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-text-secondary)}footer:is(.dark *){color:var(--dark-text-secondary)}@media (min-width:640px){footer{margin-left:15rem;transition:margin-left .5s ease;width:calc(100% - 15rem)}}h1{font-size:2.8em}h1,h2{font-weight:700}h2{font-size:2.5em}h3{font-size:2.1em}h3,h4{font-weight:700}h4{font-size:1.9em}h5{font-size:1.6em}h5,h6{font-weight:700}h6{font-size:1.3em}p{font-size:1em}.btn-primary-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-primary-sm:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.btn-primary-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(195 221 253/var(--tw-ring-opacity,1))}.btn-primary{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-primary:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.btn-primary:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(195 221 253/var(--tw-ring-opacity,1))}.btn-primary-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-primary-xl:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.btn-primary-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(195 221 253/var(--tw-ring-opacity,1))}.btn-info-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-info-sm:hover{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.btn-info-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(225 239 254/var(--tw-ring-opacity,1))}.btn-info{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-info:hover{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.btn-info:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(225 239 254/var(--tw-ring-opacity,1))}.btn-info-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(118 169 250/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-info-xl:hover{--tw-bg-opacity:1;background-color:rgb(63 131 248/var(--tw-bg-opacity,1))}.btn-info-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(225 239 254/var(--tw-ring-opacity,1))}.btn-success-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-success-sm:hover{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1))}.btn-success-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(188 240 218/var(--tw-ring-opacity,1))}.btn-success{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-success:hover{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1))}.btn-success:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(188 240 218/var(--tw-ring-opacity,1))}.btn-success-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(14 159 110/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-success-xl:hover{--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1))}.btn-success-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(188 240 218/var(--tw-ring-opacity,1))}.btn-warning-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-warning-sm:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.btn-warning-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity,1))}.btn-warning{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-warning:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.btn-warning:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity,1))}.btn-warning-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-warning-xl:hover{--tw-bg-opacity:1;background-color:rgb(217 119 6/var(--tw-bg-opacity,1))}.btn-warning-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(253 230 138/var(--tw-ring-opacity,1))}.btn-danger-sm{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-danger-sm:hover{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.btn-danger-sm:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 213 213/var(--tw-ring-opacity,1))}.btn-danger{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1));padding:.375rem .875rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-danger:hover{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.btn-danger:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 213 213/var(--tw-ring-opacity,1))}.btn-danger-xl{border-radius:.25rem;--tw-bg-opacity:1;background-color:rgb(240 82 82/var(--tw-bg-opacity,1));padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;color:var(--light-primary)}.btn-danger-xl:hover{--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1))}.btn-danger-xl:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(251 213 213/var(--tw-ring-opacity,1))}.btn-center{margin-right:auto}.btn-center,.btn-right{margin-left:auto;display:block}.page-title{display:block}@media (min-width:768px){.page-title{display:inline-flex;align-items:center;justify-content:space-between}}.card{height:-moz-fit-content;height:fit-content;width:100%}.card>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem*var(--tw-space-y-reverse))}.card{border-radius:.25rem;background-color:var(--light-primary);padding:.75rem}.card:is(.dark *){background-color:var(--dark-secondary)}.card-title{margin-bottom:.5rem;justify-content:space-between;display:flex}.grid-2{grid-template-columns:repeat(2,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-2{display:grid}}.grid-3{grid-template-columns:repeat(3,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-3{display:grid}}.grid-4{grid-template-columns:repeat(4,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-4{display:grid}}.grid-5{grid-template-columns:repeat(5,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-5{display:grid}}.grid-6{grid-template-columns:repeat(6,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-6{display:grid}}.grid-7{grid-template-columns:repeat(7,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-7{display:grid}}.grid-8{grid-template-columns:repeat(8,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-8{display:grid}}.grid-9{grid-template-columns:repeat(9,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-9{display:grid}}.grid-10{grid-template-columns:repeat(10,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-10{display:grid}}.grid-11{grid-template-columns:repeat(11,minmax(0,1fr));gap:1.5rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-11{display:grid}}.grid-12{grid-template-columns:repeat(12,minmax(0,1fr));gap:3rem;overflow-wrap:break-word}@media (min-width:1024px){.grid-12{display:grid}}.center-flex{justify-content:center}@media (min-width:1024px){.center-flex{display:flex}}.between-flex{justify-content:space-between}@media (min-width:1024px){.between-flex{display:flex}}.around-flex{justify-content:space-around}@media (min-width:1024px){.around-flex{display:flex}.flex-content-2xl{width:80%}.flex-content-xl{width:66.666667%}.flex-content-lg{width:50%}.flex-content{width:33.333333%}.flex-content-sm{width:25%}}label{display:block;font-weight:500}.input-xl{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.75rem .5rem}.input-xl:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-xl:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-xl:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-xl:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-xl:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.5rem}.input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-sm{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem .5rem}.input-sm:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-sm:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-sm:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-sm:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-sm:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-xl{margin-bottom:.5rem;display:flex;align-items:center}.input-group-xl i{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:1rem;color:var(--light-text-secondary)}.input-group-xl i:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-xl input{display:block;width:100%;min-width:0;flex:1 1 0%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.75rem}.input-group-xl input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-xl input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-xl input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-xl input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-xl input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group{margin-bottom:.5rem;display:flex;align-items:center}.input-group i{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.625rem;font-size:.875rem;line-height:1.25rem;color:var(--light-text-secondary)}.input-group i:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group input{display:block;width:100%;min-width:0;flex:1 1 0%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.5rem}.input-group input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-sm{margin-bottom:.5rem;display:flex;align-items:center}.input-group-sm i{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem;border-top-width:1px;border-left-width:1px;border-bottom-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.375rem;font-size:.875rem;line-height:1.25rem;color:var(--light-text-secondary)}.input-group-sm i:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-sm input{display:block;width:100%;min-width:0;flex:1 1 0%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem}.input-group-sm input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-group-sm input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-group-sm input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-sm input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-group-sm input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.helper-input{margin-top:-.5rem;font-size:.75rem;line-height:1rem;font-style:italic}.input-btn-xl{position:relative;width:100%}.input-btn-xl input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.75rem .5rem}.input-btn-xl input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-xl input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-btn-xl input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-xl input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-xl input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-xl button{position:absolute;top:0;right:0;height:100%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1));padding:.625rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary)}.input-btn-xl button:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.input-btn-xl button:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.input-btn-xl button:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.input-btn-xl button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.input-btn-xl button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity,1))}.input-btn{position:relative;width:100%}.input-btn input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.5rem}.input-btn input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-btn input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn button{position:absolute;top:0;right:0;height:100%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1));padding:.625rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary)}.input-btn button:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.input-btn button:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.input-btn button:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.input-btn button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.input-btn button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity,1))}.input-btn-sm{position:relative;width:100%}.input-btn-sm input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem .5rem}.input-btn-sm input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-sm input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.input-btn-sm input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-sm input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.input-btn-sm input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.input-btn-sm button{position:absolute;top:0;right:0;height:100%;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(26 86 219/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1));padding-left:.625rem;padding-right:.625rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary)}.input-btn-sm button:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.input-btn-sm button:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.input-btn-sm button:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.input-btn-sm button:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.input-btn-sm button:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(30 66 159/var(--tw-ring-opacity,1))}input[type=file]{width:100%;cursor:pointer;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg)}input[type=file]:focus{outline:2px solid transparent;outline-offset:2px}input[type=file]:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}input[type=file]:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}input[type=file]:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}select{display:block;width:100%;cursor:pointer;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg)}select:focus{outline:2px solid transparent;outline-offset:2px}select:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}select:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}select:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.choices__inner{display:block;min-height:42px;width:100%;overflow:hidden;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.375rem .5rem;vertical-align:top;font-size:.875rem;line-height:1.25rem}.choices__inner:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.tooltip.choices__list--dropdown>.tooltip-arrow:before,[role=tooltip].choices__list--dropdown>[data-popper-arrow]:after,[role=tooltip].choices__list--dropdown>[data-popper-arrow]:before{visibility:hidden}.choices__list--dropdown{position:absolute;top:100%;z-index:50;margin-top:-.25rem;width:100%;overflow:hidden;border-radius:.5rem;border-width:1px;border-color:var(--dark-fourth);background-color:var(--light-input-bg);visibility:hidden}.choices__list--dropdown:is(.dark *){background-color:var(--dark-input-bg)}.choices__list--dropdown .choices__item--selectable.is-highlighted{background-color:var(--light-secondary)}.choices__list--dropdown .choices__item--selectable.is-highlighted:is(.dark *){background-color:var(--dark-secondary)}.toggle{display:inline-flex;cursor:pointer;align-items:center}.toggle .toggle-input{position:absolute;margin:-.25rem;height:.25rem;width:.25rem;overflow:hidden;white-space:nowrap;border-width:0;padding:0;clip:rect(0,0,0,0)}.toggle .toggle-slider{position:relative;margin-right:.5rem;height:1rem;width:1.75rem;border-radius:9999px;background-color:var(--light-third)}.toggle .toggle-slider:is(.dark *){background-color:var(--dark-third)}.toggle .toggle-slider{transition:background-color .2s ease-in-out}.toggle .toggle-slider:after{position:absolute;top:2px;left:2px;height:.75rem;width:.75rem;border-radius:9999px;border-width:1px;border-color:var(--light-third);background-color:var(--light-primary)}.toggle .toggle-slider:is(.dark *):after{border-color:var(--dark-fourth);background-color:var(--dark-secondary)}.toggle .toggle-slider:after{content:"";transition:transform .2s ease-in-out}.toggle .toggle-label{margin-right:.5rem;font-weight:500}.toggle input:checked+.toggle-slider{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.toggle input:checked+.toggle-slider:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.toggle input:checked+.toggle-slider:after{transform:translateX(100%)}.checkbox{margin-bottom:.25rem;display:flex;align-items:center}.checkbox input{margin-right:.5rem;height:1rem;width:1rem;border-radius:.25rem;border-color:var(--light-third);background-color:var(--light-secondary);--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.checkbox input:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.checkbox input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-third);--tw-ring-offset-color:#1f2937}.checkbox input:focus:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(28 100 242/var(--tw-ring-opacity,1))}.checkbox label{margin-right:.5rem}.textarea{display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.625rem;--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.textarea:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.textarea:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-third);color:var(--light-primary)}.textarea:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.textarea:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.textarea:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.icon-picker{position:relative;z-index:30}.icon-picker i{--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.icon-picker i:is(.dark *){color:var(--light-primary)}.icon-list{position:static;top:100%;left:1.75rem;z-index:5100;display:none;max-height:18rem;width:20rem;overflow-y:scroll;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);font-size:1.25rem;line-height:1.75rem}.icon-list:is(.dark *){background-color:var(--dark-input-bg)}.icon-list i{height:1.75rem;width:1.75rem;cursor:pointer;border-radius:.5rem;padding:.25rem;text-align:center}.icon-list i:hover{--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(0 0 0/var(--tw-text-opacity,1))}.page-loader{position:relative;height:80vh}.loader{width:48px;height:48px;margin:auto;top:50%;position:relative}.loader:before{width:48px;height:5px;background:#9b9b9b;opacity:.25;top:60px;border-radius:50%;animation:shadow .5s linear infinite}.loader:after,.loader:before{content:"";position:absolute;left:0}.loader:after{width:100%;height:100%;background:#a90a59;animation:bxSpin .5s linear infinite;top:0;border-radius:4px}@keyframes bxSpin{17%{border-bottom-right-radius:3px}25%{transform:translateY(9px) rotate(22.5deg)}50%{transform:translateY(18px) scaleY(.9) rotate(45deg);border-bottom-right-radius:40px}75%{transform:translateY(9px) rotate(67.5deg)}to{transform:translateY(0) rotate(90deg)}}@keyframes shadow{0%,to{transform:scale(1)}50%{transform:scaleX(1.2)}}.content-loader{display:none}.table-container{position:relative;height:-moz-fit-content;height:fit-content;overflow-x:auto;border-radius:.5rem;border-width:1px}.table-container:is(.dark *){border-color:var(--dark-input-bg)}.table-container table{width:100%;text-align:left;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.table-container table:is(.dark *){color:var(--light-fourth)}.table-container table:where([dir=rtl],[dir=rtl] *){text-align:right}.table-container thead{border-bottom-width:1px;background-color:var(--light-secondary);text-transform:uppercase;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.table-container thead:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.table-container thead th{padding:.75rem .5rem}.table-container tbody tr{border-bottom-width:1px;background-color:var(--light-primary)}.table-container tbody tr:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth)}.table-container tbody td{padding:.75rem .5rem}.table-container-striped tbody tr:nth-child(odd){background-color:var(--light-primary)}.table-container-striped tbody tr:nth-child(odd):is(.dark *){background-color:var(--dark-secondary)}.table-container-striped tbody tr:nth-child(2n){background-color:var(--light-secondary)}.table-container-striped tbody tr:nth-child(2n):is(.dark *){background-color:var(--dark-third)}.dataTable-top{justify-content:space-between;border-bottom-width:1px;padding:.5rem 1rem}.dataTable-top:is(.dark *){border-color:var(--dark-input-bg)}@media (min-width:1024px){.dataTable-top{display:flex}}.dataTable-input{margin-bottom:.5rem;display:block;width:100%;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-input-bg);padding:.25rem .5rem}.dataTable-input:focus{--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.dataTable-input:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-input-bg)}.dataTable-input:is(.dark *)::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dataTable-input:is(.dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(156 163 175/var(--tw-placeholder-opacity,1))}.dataTable-input:focus:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1));--tw-ring-opacity:1;--tw-ring-color:rgb(63 131 248/var(--tw-ring-opacity,1))}.dataTable-selector{text-align:right}.dataTable-bottom{justify-content:space-between;padding:.75rem .5rem;align-items:center}@media (min-width:1024px){.dataTable-bottom{display:flex}}.dataTable-pagination-list{display:flex;height:2rem;align-items:center}.dataTable-pagination-list>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.dataTable-pagination-list{font-size:.875rem;line-height:1.25rem;display:flex;align-items:center}.dataTable-pagination-list li{border-width:1px;border-color:var(--light-third);background-color:var(--light-primary);line-height:1.25;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));display:flex;justify-content:center;align-items:center}.dataTable-pagination-list li:hover{background-color:var(--light-secondary);--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.dataTable-pagination-list li:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dataTable-pagination-list li:hover:is(.dark *){background-color:var(--dark-third);color:var(--light-primary)}.dataTable-pagination-list a{padding:.5rem .75rem}.dataTable-pagination-list .active{border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(235 245 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.dataTable-pagination-list .active:hover{--tw-bg-opacity:1;background-color:rgb(225 239 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity,1))}.dataTable-pagination-list .active:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-third);color:var(--light-primary)}.dataTable-sorter{position:relative;padding-right:20px}.dataTable-sorter:after,.dataTable-sorter:before{content:"";position:absolute;right:5px;border:solid transparent;width:0;height:0}.dataTable-sorter:before{border-width:0 4px 4px;border-bottom-color:#000;top:35%;transform:translateY(-100%)}.dataTable-sorter:after{border-width:4px 4px 0;border-top-color:#000;top:65%;transform:translateY(0)}.alert{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-secondary);padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.alert:is(.dark *){border-color:var(--dark-text-secondary);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.alert-info{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(235 245 255/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(30 66 159/var(--tw-text-opacity,1))}.alert-info:is(.dark *){--tw-border-opacity:1;border-color:rgb(30 66 159/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(118 169 250/var(--tw-text-opacity,1))}.alert-success{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(132 225 188/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(243 250 247/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(3 84 63/var(--tw-text-opacity,1))}.alert-success:is(.dark *){--tw-border-opacity:1;border-color:rgb(3 84 63/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(49 196 141/var(--tw-text-opacity,1))}.alert-warning{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(250 202 21/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 253 234/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(114 59 19/var(--tw-text-opacity,1))}.alert-warning:is(.dark *){--tw-border-opacity:1;border-color:rgb(114 59 19/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(250 202 21/var(--tw-text-opacity,1))}.alert-danger{margin-top:0;margin-bottom:0;border-radius:.5rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(248 180 180/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 242 242/var(--tw-bg-opacity,1));padding:1rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity:1;color:rgb(155 28 28/var(--tw-text-opacity,1))}.alert-danger:is(.dark *){--tw-border-opacity:1;border-color:rgb(155 28 28/var(--tw-border-opacity,1));background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.badge{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1));background-color:var(--light-secondary);padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.badge:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.badge-info{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(222 247 236/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(30 66 159/var(--tw-text-opacity,1))}.badge-info:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(118 169 250/var(--tw-text-opacity,1))}.badge-success{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(49 196 141/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(222 247 236/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(3 84 63/var(--tw-text-opacity,1))}.badge-success:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(49 196 141/var(--tw-text-opacity,1))}.badge-warning{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(250 202 21/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 246 178/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(114 59 19/var(--tw-text-opacity,1))}.badge-warning:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(250 202 21/var(--tw-text-opacity,1))}.badge-danger{border-radius:.25rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(249 128 128/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(253 232 232/var(--tw-bg-opacity,1));padding:.125rem .625rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity:1;color:rgb(155 28 28/var(--tw-text-opacity,1))}.badge-danger:is(.dark *){background-color:var(--dark-third);--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.avatar-rounded{border-radius:9999px}.avatar-rounded,.avatar-square{height:2.5rem;width:2.5rem;background-size:contain}.avatar-square{border-radius:.5rem}.avatar-rounded-ring{height:2.5rem;width:2.5rem;border-radius:9999px;background-size:contain;padding:.25rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.avatar-rounded-ring:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.avatar-square-ring{height:2.5rem;width:2.5rem;border-radius:.5rem;background-size:contain;padding:.25rem;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.avatar-square-ring:is(.dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.avatar-text{gap:1rem;display:flex;align-items:center}.dropdown,.dropdown-hover{position:relative;display:inline-block}.dropdown-opener{cursor:pointer}.dropdown-content{position:absolute;margin-top:.25rem;display:none;border-radius:.25rem;background-color:var(--light-primary);padding:.5rem;--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.dropdown-content:is(.dark *){background-color:var(--dark-third)}kbd{border-radius:.5rem;border-width:1px;border-color:var(--light-fourth);background-color:var(--light-secondary);padding:.375rem .5rem;font-size:.75rem;line-height:1rem;font-weight:600;--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}kbd:is(.dark *){--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1));background-color:var(--dark-secondary);--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.modal-container{position:fixed;top:0;right:0;left:0;z-index:600000;display:none;height:calc(100% - 1rem);width:100%;overflow-y:auto;overflow-x:hidden;justify-content:center;align-items:center}@media (min-width:768px){.modal-container{inset:0}}.modal-sm{position:relative;max-height:100%;width:100%;max-width:28rem;overflow:hidden;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-sm:is(.dark *){background-color:var(--dark-third)}.modal{position:relative;max-height:100%;width:100%;max-width:42rem;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal:is(.dark *){background-color:var(--dark-third)}.modal-lg{position:relative;max-height:100%;width:100%;max-width:56rem;overflow:hidden;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-lg:is(.dark *){background-color:var(--dark-third)}.modal-xl{position:relative;max-height:100%;width:100%;max-width:80rem;overflow:hidden;border-radius:.5rem;background-color:var(--light-primary);--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.modal-xl:is(.dark *){background-color:var(--dark-third)}.modal-header{justify-content:space-between;border-bottom-width:1px;padding:1rem;display:flex;align-items:center}.modal-header:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header{padding:1.25rem}}.modal-header-warning{justify-content:space-between;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-bottom-width:1px;--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1));padding:1rem;color:var(--light-primary);display:flex;align-items:center}.modal-header-warning:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header-warning{padding:1.25rem}}.modal-header-success{justify-content:space-between;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-bottom-width:1px;--tw-bg-opacity:1;background-color:rgb(5 122 85/var(--tw-bg-opacity,1));padding:1rem;color:var(--light-primary);display:flex;align-items:center}.modal-header-success:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header-success{padding:1.25rem}}.modal-header-danger{justify-content:space-between;border-top-left-radius:.5rem;border-top-right-radius:.5rem;border-bottom-width:1px;--tw-bg-opacity:1;background-color:rgb(224 36 36/var(--tw-bg-opacity,1));padding:1rem;color:var(--light-primary);display:flex;align-items:center}.modal-header-danger:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-header-danger{padding:1.25rem}}.modal-footer{display:flex;justify-content:flex-end}.modal-footer>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.75rem*var(--tw-space-x-reverse));margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)))}.modal-footer{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem;border-top-width:1px;border-color:var(--light-fourth);padding:1rem;display:flex}.modal-footer:is(.dark *){border-color:var(--dark-text-secondary)}@media (min-width:768px){.modal-footer{padding:1.25rem}}.modal-body{max-height:60vh}.modal-body>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.modal-body{overflow-y:auto;padding:1rem}@media (min-width:768px){.modal-body{max-height:60vh;overflow-y:auto;padding:1.25rem}}.pagination{display:flex;height:2rem;align-items:center}.pagination>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-1px*var(--tw-space-x-reverse));margin-left:calc(-1px*(1 - var(--tw-space-x-reverse)))}.pagination{font-size:.875rem;line-height:1.25rem}.pagination,.pagination-link{display:flex;align-items:center}.pagination-link{height:2rem;border-width:1px;border-color:var(--light-third);background-color:var(--light-primary);padding-left:.75rem;padding-right:.75rem;line-height:1.25;color:rgb(107 114 128/var(--tw-text-opacity,1));justify-content:center}.pagination-link,.pagination-link:hover{--tw-text-opacity:1}.pagination-link:hover{background-color:var(--light-secondary);color:rgb(55 65 81/var(--tw-text-opacity,1))}.pagination-link:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-fourth);--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.pagination-link:hover:is(.dark *){background-color:var(--dark-third);color:var(--light-primary)}.pagination-link-active{z-index:10;height:2rem;border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));background-color:rgb(235 245 255/var(--tw-bg-opacity,1));padding-left:.75rem;padding-right:.75rem;line-height:1.25;color:rgb(28 100 242/var(--tw-text-opacity,1));display:flex;justify-content:center;align-items:center}.pagination-link-active,.pagination-link-active:hover{--tw-bg-opacity:1;--tw-text-opacity:1}.pagination-link-active:hover{background-color:rgb(225 239 254/var(--tw-bg-opacity,1));color:rgb(26 86 219/var(--tw-text-opacity,1))}.pagination-link-active:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-third);color:var(--light-primary)}.tab-menu{margin-bottom:1rem;border-bottom-width:1px;border-color:var(--light-fourth)}.tab-menu:is(.dark *){border-color:var(--dark-input-bg)}.tab-horizontal{margin-bottom:-1px;flex-wrap:wrap;text-align:center;font-size:.875rem;line-height:1.25rem;font-weight:500;display:flex}.tab-horizontal button{display:inline-block;border-bottom-width:2px;padding:1rem}.tab-vertical{margin-bottom:1rem;display:flex;flex-direction:column}.tab-vertical>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.tab-vertical{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1));display:flex}.tab-vertical:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}@media (min-width:768px){.tab-vertical{margin-right:1rem;margin-bottom:0}}.tab-vertical button{display:inline-flex;width:100%;min-width:10rem;align-items:center;border-radius:.5rem;background-color:var(--light-primary);padding:.75rem 1rem}.a-side-nav-dropdown.tab-vertical button{max-height:9000px;opacity:1;margin:5px auto;padding-top:.4rem;padding-bottom:.4rem}.dataTable-pagination-list .tab-vertical button{border-width:1px;--tw-border-opacity:1;border-color:rgb(164 202 254/var(--tw-border-opacity,1));--tw-bg-opacity:1;background-color:rgb(235 245 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.dataTable-pagination-list .tab-vertical button:hover{--tw-bg-opacity:1;background-color:rgb(225 239 254/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(26 86 219/var(--tw-text-opacity,1))}.dataTable-pagination-list .tab-vertical button:is(.dark *){border-color:var(--dark-input-bg);background-color:var(--dark-third);color:var(--light-primary)}.tab-vertical button{align-items:center}.tab-vertical button:is(.dark *){background-color:var(--dark-fourth)}@media (min-width:768px){.tab-vertical-container{display:flex}}.tab-container{width:100%}.tab-content{display:none}.tab-button{width:100%;cursor:pointer;justify-content:space-between;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-width:1px;padding:.25rem;display:flex;align-items:center}[data-tooltip-style^=light]+.tooltip-content>.tooltip-arrow:before{border-style:solid;border-color:#e5e7eb}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px;border-right-width:1px}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip-content[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px;border-right-width:1px}.tooltip-content[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px}.tooltip-content[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px}.tooltip-content[data-popper-placement^=left]>.tooltip-arrow{right:-4px}.tooltip-content[data-popper-placement^=right]>.tooltip-arrow{left:-4px}.tooltip-content,.tooltip-content.invisible>.tooltip-arrow:before,.tooltip.tooltip-content>.tooltip-arrow:before,[role=tooltip].tooltip-content>[data-popper-arrow]:after,[role=tooltip].tooltip-content>[data-popper-arrow]:before{visibility:hidden}.tooltip-content{position:absolute;z-index:9000;display:inline-block;border-radius:.5rem;--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1));padding:.5rem .75rem;font-size:.875rem;line-height:1.25rem;font-weight:500;color:var(--light-primary);--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow);opacity:0}.tooltip-content:is(.dark *){background-color:var(--dark-third);color:var(--dark-text-primary)}.flex{display:flex!important}.justify-center{justify-content:center!important}.items-center{align-items:center!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.opacity-0{opacity:0!important}.opacity-100{opacity:1!important}.transform-none{transform:none!important}.hover\:border-gray-300:hover{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.hover\:bg-blue-800:hover{--tw-bg-opacity:1;background-color:rgb(30 66 159/var(--tw-bg-opacity,1))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:text-blue-600:hover{--tw-text-opacity:1;color:rgb(28 100 242/var(--tw-text-opacity,1))}.hover\:text-gray-600:hover{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.hover\:text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-2:focus,.focus\:ring-4:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-4:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity,1))}.focus\:ring-gray-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(229 231 235/var(--tw-ring-opacity,1))}.focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(209 213 219/var(--tw-ring-opacity,1))}.dark\:block:is(.dark *){display:block}.dark\:hidden:is(.dark *){display:none}.dark\:divide-gray-600:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(75 85 99/var(--tw-divide-opacity,1))}.dark\:border-blue-500:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 131 248/var(--tw-border-opacity,1))}.dark\:border-gray-600:is(.dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\:border-gray-700:is(.dark *){--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.dark\:border-gray-900:is(.dark *){--tw-border-opacity:1;border-color:rgb(17 24 39/var(--tw-border-opacity,1))}.dark\:border-transparent:is(.dark *){border-color:transparent}.dark\:bg-blue-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(28 100 242/var(--tw-bg-opacity,1))}.dark\:bg-gray-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:bg-gray-700:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:bg-gray-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:bg-gray-800\/50:is(.dark *){background-color:rgba(31,41,55,.5)}.dark\:bg-opacity-80:is(.dark *){--tw-bg-opacity:0.8}.dark\:text-blue-500:is(.dark *){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity,1))}.dark\:text-gray-300:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:text-gray-400:is(.dark *){--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.dark\:text-gray-500:is(.dark *){--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(249 128 128/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:hover\:bg-blue-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(26 86 219/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-600:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-700:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:hover\:bg-gray-800:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.dark\:hover\:text-blue-500:hover:is(.dark *){--tw-text-opacity:1;color:rgb(63 131 248/var(--tw-text-opacity,1))}.dark\:hover\:text-gray-300:hover:is(.dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:hover\:text-white:hover:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:ml-11{margin-left:2.75rem}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}}@media (min-width:768px){.md\:flex{display:flex}}@media (min-width:1024px){.lg\:mt-0{margin-top:0}.lg\:mt-4{margin-top:1rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-1\/2{width:50%}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px*var(--tw-space-y-reverse))}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:pb-0{padding-bottom:0}.lg\:pl-3{padding-left:.75rem}}.rtl\:justify-end:where([dir=rtl],[dir=rtl] *){justify-content:flex-end} \ No newline at end of file diff --git a/Admin/Resources/Views/template.php b/Admin/Resources/Views/template.php index 0db434af..4e6fa3fa 100644 --- a/Admin/Resources/Views/template.php +++ b/Admin/Resources/Views/template.php @@ -1,6 +1,7 @@ + + \ No newline at end of file diff --git a/Admin/Tailwind/tailwindInput.css b/Admin/Tailwind/tailwindInput.css index a3777caa..1a8a2449 100644 --- a/Admin/Tailwind/tailwindInput.css +++ b/Admin/Tailwind/tailwindInput.css @@ -880,23 +880,23 @@ kbd { } .modal-container { - @apply hidden overflow-y-auto overflow-x-hidden fixed top-[8%] right-0 left-0 z-[600000] justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] max-h-[80vh]; + @apply hidden overflow-y-auto overflow-x-hidden fixed top-0 right-0 left-0 z-[600000] justify-center items-center w-full md:inset-0 h-[calc(100%-1rem)] ; } .modal-sm { - @apply overflow-hidden relative w-full max-w-md max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third; + @apply overflow-hidden relative w-full max-w-md max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third; } .modal { - @apply relative w-full max-w-2xl max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third; + @apply relative w-full max-w-2xl max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third; } .modal-lg { - @apply overflow-hidden relative w-full max-w-4xl max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third; + @apply overflow-hidden relative w-full max-w-4xl max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third; } .modal-xl { - @apply overflow-hidden relative w-full max-w-7xl max-h-full bg-light-primary rounded-lg shadow top-[8%] dark:bg-dark-third; + @apply overflow-hidden relative w-full max-w-7xl max-h-full bg-light-primary rounded-lg shadow dark:bg-dark-third; } .modal-header { diff --git a/App/Manager/Events/Emitter.php b/App/Manager/Events/Emitter.php index b39a6c83..17205b14 100644 --- a/App/Manager/Events/Emitter.php +++ b/App/Manager/Events/Emitter.php @@ -2,18 +2,15 @@ namespace CMW\Manager\Events; -use CMW\Manager\Collections\Collection; -use CMW\Manager\Collections\CollectionEntity; use CMW\Manager\Loader\Loader; -use CMW\Utils\Log; use JetBrains\PhpStorm\ExpectedValues; -use Closure; use ReflectionClass; use ReflectionMethod; +use function usort; class Emitter { - private static array $listenerCounter = array(); + private static array $listenerCounter = []; private static AbstractEvent $actualEvent; private static function loadAttributeByEvent(array $attributeList, #[ExpectedValues(AbstractEvent::class)] string $eventName, array &$eventAttributes): void @@ -27,7 +24,7 @@ private static function loadAttributeByEvent(array $attributeList, #[ExpectedVal $attributeInstance = $attr->newInstance(); // todo use GlobalObject getInstance - if ($eventName !== $attributeInstance->getEventName()) { + if ($eventName !== $attributeInstance->getEventName() && $attributeInstance->getEventName() !== '*') { continue; } @@ -77,7 +74,7 @@ private static function getCounterByMethod(#[ExpectedValues(AbstractEvent::class private static function invokeEventMethod(#[ExpectedValues(AbstractEvent::class)] string $eventName, ReflectionMethod $method, mixed $data): void { $controller = $method->getDeclaringClass()->getMethod('getInstance')->invoke(null); - $method->invoke($controller, $data); + $method->invoke($controller, $data, self::$actualEvent->getName()); self::increment($eventName, $method); } @@ -113,14 +110,14 @@ private static function invoke(#[ExpectedValues(AbstractEvent::class)] string $e public static function send(#[ExpectedValues(AbstractEvent::class)] string $eventName, mixed $data): void { $attributeList = Loader::getAttributeList()[Listener::class]; - $eventAttributes = array(); + $eventAttributes = []; if (empty($attributeList)) { return; } if (!isset(self::$listenerCounter[$eventName])) { - self::$listenerCounter[$eventName] = array(); + self::$listenerCounter[$eventName] = []; } self::loadAttributeByEvent($attributeList, $eventName, $eventAttributes); diff --git a/App/Manager/Metrics/VisitsMetricsManager.php b/App/Manager/Metrics/VisitsMetricsManager.php index 3beacbb2..af474aa3 100644 --- a/App/Manager/Metrics/VisitsMetricsManager.php +++ b/App/Manager/Metrics/VisitsMetricsManager.php @@ -4,20 +4,35 @@ use CMW\Manager\Database\DatabaseManager; use CMW\Manager\Env\EnvManager; -use CMW\Manager\Lang\LangManager; -use CMW\Manager\Manager\AbstractManager; use CMW\Manager\Permission\PermissionManager; use CMW\Manager\Router\Route; use CMW\Utils\Client; use CMW\Utils\File; -use CMW\Utils\Website; use JetBrains\PhpStorm\ExpectedValues; - -class VisitsMetricsManager extends AbstractManager +use PDO; +use function count; +use function date; +use function explode; +use function file; +use function fopen; +use function http_response_code; +use function mb_substr; +use function str_contains; +use function str_starts_with; +use function stream_resolve_include_path; +use function strtotime; +use const FILE_APPEND; +use const FILE_SKIP_EMPTY_LINES; +use const LOCK_EX; +use const PHP_EOL; + +class VisitsMetricsManager { private int $maxLines = 50; // Variable data ? private string $filePath; private string $dirStorage; + private static ?VisitsMetricsManager $instance = null; + private ?array $cachedVisits = null; public function __construct() { @@ -25,6 +40,14 @@ public function __construct() $this->filePath = "$this->dirStorage/history.log"; } + public static function getInstance(): self + { + if (self::$instance === null) { + self::$instance = new self(); + } + return self::$instance; + } + public function registerVisit(Route $route): void { $package = explode('.', $route->getName())[0] ?? null; @@ -123,54 +146,36 @@ private function getLogData(): array|false public function getVisitsNumber(#[ExpectedValues(['all', 'monthly', 'week', 'day', 'hour'])] $period): ?int { - $rangeStart = null; - $rangeFinish = null; - - if ($period === 'monthly' || $period === 'week' || $period === 'day' || $period === 'hour'): - switch ($period): - case 'monthly': - $rangeStart = date('Y-m-d 00:00:00', strtotime('first day of this month')); - $rangeFinish = date('Y-m-d 00:00:00', strtotime('last day of this month')); - break; - case 'week': - $rangeStart = date('Y-m-d 00:00:00', strtotime('monday this week')); - $rangeFinish = date('Y-m-d 00:00:00', strtotime('sunday this week')); - break; - case 'day': - $rangeStart = date('Y-m-d 00:00:00'); - $rangeFinish = date('Y-m-d 23:59:59'); - break; - case 'hour': - $rangeStart = date('Y-m-d h:00:00'); - $rangeFinish = date('Y-m-d h:00:00', strtotime('+1 hour')); - break; - endswitch; - - $var = [ - 'range_start' => $rangeStart, - 'range_finish' => $rangeFinish, + if ($this->cachedVisits === null) { + $db = DatabaseManager::getInstance(); + + $queries = [ + 'all' => "SELECT COUNT(DISTINCT visits_ip) AS result FROM cmw_visits", + 'day' => "SELECT COUNT(DISTINCT visits_ip) AS result FROM cmw_visits WHERE visits_date >= CURDATE()", + 'monthly' => "SELECT COUNT(DISTINCT visits_ip) AS result FROM cmw_visits WHERE visits_date >= DATE_FORMAT(NOW(), '%Y-%m-01')", ]; - $sql = 'SELECT COUNT(DISTINCT visits_ip) AS `result` FROM cmw_visits WHERE visits_date BETWEEN (:range_start) AND (:range_finish)'; + foreach ($queries as $key => $sql) { + $req = $db->prepare($sql); - $db = DatabaseManager::getInstance(); - $req = $db->prepare($sql); - $res = $req->execute($var); - else: - $sql = 'SELECT COUNT(DISTINCT visits_ip) AS `result` FROM cmw_visits'; + if (!$req->execute()) { + return 0; + } - $db = DatabaseManager::getInstance(); - $req = $db->prepare($sql); - $res = $req->execute(); - endif; + $res = $req->fetch(); + + if (!$res) { + return 0; + } - if ($res) { - return $req->fetch()['result'] + $this->getFileLineNumber(); + $this->cachedVisits[$key] = $res['result'] ?? 0; + } } - return $this->getFileLineNumber(); + return ($this->cachedVisits[$period] ?? 0) + $this->getFileLineNumber(); } + /** * @param string $rangeStart * @param string $rangeFinish @@ -222,78 +227,72 @@ public function getMonthlyBestVisits(): int */ public function getPastMonthsVisits(int $pastMonths): array { - $currentMonth = idate('m'); + $sql = "SELECT DATE_FORMAT(visits_date, '%Y-%m') AS month, COUNT(*) AS visits + FROM cmw_visits + WHERE visits_date >= STR_TO_DATE(:date_limit, '%Y-%m-%d') + GROUP BY month + ORDER BY month;"; - $toReturn = []; - - for ($i = 0; $i < $pastMonths; $i++) { - $targetMonth = idate('m', strtotime("-$i months")); - $targetMonthTranslate = LangManager::translate("core.months.$targetMonth"); - - $rangeStart = date('Y-m-d 00:00:00', strtotime("first day of -$i months")); - $rangeFinish = date('Y-m-d 23:59:59', strtotime("last day of -$i months")); + $db = DatabaseManager::getInstance(); + $req = $db->prepare($sql); - $toReturn[$targetMonthTranslate] = $this->getDataVisits($rangeStart, $rangeFinish); + $dateLimit = date('Y-m-d', strtotime("-$pastMonths months")); // Pré-calcul de la date limite - if ($targetMonth === $currentMonth) { - $toReturn[$targetMonthTranslate] += $this->getFileLineNumber(); - } + if (!$req->execute(['date_limit' => $dateLimit])) { + return []; } - return array_reverse($toReturn); + + return $req->fetchAll(PDO::FETCH_KEY_PAIR) ?: []; } + /** * @param int $pastDays * @return array */ public function getPastDaysVisits(int $pastDays): array { - $currentDay = idate('d'); + $sql = "SELECT DATE(visits_date) AS day, COUNT(*) AS visits + FROM cmw_visits + WHERE visits_date >= STR_TO_DATE(:date_limit, '%Y-%m-%d') + GROUP BY day + ORDER BY day;"; - $toReturn = []; - - for ($i = 0; $i < $pastDays; $i++) { - $targetDay = date('d', strtotime("-$i days")); + $db = DatabaseManager::getInstance(); + $req = $db->prepare($sql); - if ($targetDay === $currentDay) { - $rangeStart = date('Y-m-d 00:00:00', strtotime("-$i days")); - $rangeFinish = date('Y-m-d 23:59:59', strtotime("-$i days")); + $dateLimit = date('Y-m-d', strtotime("-$pastDays days")); - $dataVisits = $this->getDataVisits($rangeStart, $rangeFinish); - $toReturn[] = $dataVisits + $this->getFileLineNumber(); - } else { - $rangeStart = date('Y-m-d 00:00:00', strtotime("-$i days")); - $rangeFinish = date('Y-m-d 23:59:59', strtotime("-$i days")); - $toReturn[] = $this->getDataVisits($rangeStart, $rangeFinish); - } + if (!$req->execute(['date_limit' => $dateLimit])) { + return []; } - return array_reverse($toReturn); + return $req->fetchAll(PDO::FETCH_KEY_PAIR) ?: []; } + /** * @param int $pastWeeks * @return array */ public function getPastWeeksVisits(int $pastWeeks): array { - $currentWeeks = idate('W'); - - $toReturn = []; + $sql = "SELECT WEEK(visits_date, 1) AS week, COUNT(*) AS visits + FROM cmw_visits + WHERE visits_date >= STR_TO_DATE(:date_limit, '%Y-%m-%d') + GROUP BY week + ORDER BY week;"; - for ($i = 0; $i < $pastWeeks; $i++) { - $targetWeek = idate('W', strtotime("-$i weeks")); - - $rangeStart = date('Y-m-d 00:00:00', strtotime("-$i monday this week")); - $rangeFinish = date('Y-m-d 23:59:59', strtotime("-$i sunday this week")); + $db = DatabaseManager::getInstance(); + $req = $db->prepare($sql); - $toReturn[] = $this->getDataVisits($rangeStart, $rangeFinish); + $dateLimit = date('Y-m-d', strtotime("-$pastWeeks weeks")); - if ($targetWeek === $currentWeeks) { - $toReturn[] = $this->getDataVisits($rangeStart, $rangeFinish) + $this->getFileLineNumber(); - } + if (!$req->execute(['date_limit' => $dateLimit])) { + return []; } - return array_reverse($toReturn); + + return $req->fetchAll(PDO::FETCH_KEY_PAIR) ?: []; } /** diff --git a/App/Manager/Package/AbstractEntity.php b/App/Manager/Package/AbstractEntity.php index 7b8754c8..499d9712 100644 --- a/App/Manager/Package/AbstractEntity.php +++ b/App/Manager/Package/AbstractEntity.php @@ -7,13 +7,20 @@ use JsonException; use ReflectionClass; use ReflectionException; +use ReflectionNamedType; use ReflectionProperty; use RuntimeException; +use function array_map; +use function class_exists; +use function is_array; +use function is_object; use function json_decode; use function json_encode; use function json_last_error; use function json_last_error_msg; +use function method_exists; use const JSON_ERROR_NONE; +use const JSON_PRETTY_PRINT; use const JSON_THROW_ON_ERROR; abstract class AbstractEntity @@ -31,17 +38,44 @@ public static function toEntity(array $brutData): static $reflector = new ReflectionClass(static::class); $constructor = $reflector->getConstructor(); - $parameters = $constructor?->getParameters(); + $parameters = $constructor?->getParameters() ?? []; $arguments = []; foreach ($parameters as $parameter) { $name = $parameter->getName(); + $type = $parameter->getType(); + + if (!$type instanceof ReflectionNamedType) { + throw new RuntimeException("The $name parameter must have a type. Entity: " . static::class); + } + + $expectedType = $type->getName(); + if (isset($data[$name])) { - $arguments[] = $data[$name]; - } else if ($parameter->isOptional()) { + $value = $data[$name]; + + if ($expectedType === 'array' && $parameter->getType()?->getName() === 'array') { + $attributes = $parameter->getAttributes(EntityType::class); + if (!empty($attributes)) { + $entityClass = $attributes[0]->getArguments()[0]; + + if (!class_exists($entityClass) || !method_exists($entityClass, 'toEntity')) { + throw new RuntimeException("Unable to convert $name to entity. Entity: " . static::class); + } + + $value = array_map([$entityClass, 'toEntity'], $value); + } + } elseif (class_exists($expectedType) && method_exists($expectedType, 'toEntity')) { + $value = $expectedType::toEntity($value); + } + + $arguments[] = $value; + } elseif ($parameter->isOptional() || $parameter->isDefaultValueAvailable()) { $arguments[] = $parameter->getDefaultValue(); + } elseif ($parameter->allowsNull()) { + $arguments[] = null; } else { - throw new RuntimeException("Parameter $name is required"); + throw new RuntimeException("The $name ($type) parameter is required. Entity: " . static::class); } } @@ -127,7 +161,16 @@ public function toArray(): array $data = []; foreach ($properties as $property) { - $data[$property->getName()] = $property->getValue($this); + $value = $property->getValue($this); + if (is_object($value) && method_exists($value, 'toArray')) { + $data[$property->getName()] = $value->toArray(); + } elseif (is_array($value)) { + $data[$property->getName()] = array_map(static function ($item) { + return is_object($item) && method_exists($item, 'toArray') ? $item->toArray() : $item; + }, $value); + } else { + $data[$property->getName()] = $value; + } } return $data; diff --git a/App/Manager/Package/EntityType.php b/App/Manager/Package/EntityType.php new file mode 100644 index 00000000..b85483a2 --- /dev/null +++ b/App/Manager/Package/EntityType.php @@ -0,0 +1,17 @@ +entityClass)) { + throw new InvalidArgumentException("The Entity class ($this->entityClass) doesn't exist."); + } + } +} diff --git a/App/Manager/Uploads/ImagesManager.php b/App/Manager/Uploads/ImagesManager.php index 7dfe35c7..d370ccd9 100644 --- a/App/Manager/Uploads/ImagesManager.php +++ b/App/Manager/Uploads/ImagesManager.php @@ -11,6 +11,49 @@ use CMW\Manager\Uploads\Format\ImagesFormat; use CMW\Utils\Redirect; use CMW\Utils\Utils; +use function array_key_exists; +use function copy; +use function fclose; +use function file_exists; +use function file_get_contents; +use function file_put_contents; +use function filesize; +use function finfo_buffer; +use function finfo_file; +use function finfo_open; +use function fopen; +use function fread; +use function fseek; +use function fwrite; +use function getimagesize; +use function imagealphablending; +use function imagecreatefromstring; +use function imagedestroy; +use function imagegif; +use function imagejpeg; +use function imagepalettetotruecolor; +use function imagepng; +use function imagesavealpha; +use function imagewebp; +use function ini_get; +use function is_dir; +use function is_numeric; +use function is_uploaded_file; +use function mb_substr; +use function mkdir; +use function ord; +use function pathinfo; +use function preg_match; +use function random_int; +use function strlen; +use function strtolower; +use function substr; +use function unlink; +use const FILEINFO_MIME_TYPE; +use const PATHINFO_EXTENSION; +use const PATHINFO_FILENAME; +use const PREG_OFFSET_CAPTURE; +use const SEEK_CUR; class ImagesManager { @@ -317,6 +360,9 @@ public static function convertAndUpload(array $file, string $dirName = '', Image imagegif($image, $newFilePath); break; case ImagesFormat::WEBP: + imagepalettetotruecolor($image); + imagealphablending($image, true); + imagesavealpha($image, true); imagewebp($image, $newFilePath, $quality); break; case ImagesFormat::ICO: diff --git a/App/Package/Core/Controllers/Api/Internal/Dash/DashApiInternalController.php b/App/Package/Core/Controllers/Api/Internal/Dash/DashApiInternalController.php new file mode 100644 index 00000000..c94aeed9 --- /dev/null +++ b/App/Package/Core/Controllers/Api/Internal/Dash/DashApiInternalController.php @@ -0,0 +1,65 @@ +getPastMonthsVisits(12); + $dailyVisits = VisitsMetricsManager::getInstance()->getPastDaysVisits(17); + $weeklyVisits = VisitsMetricsManager::getInstance()->getPastWeeksVisits(17); + + $data = [ + 'monthly_visits' => $monthlyVisits, + 'daily_visits' => $dailyVisits, + 'weekly_visits' => $weeklyVisits, + ]; + + print json_encode($data, JSON_THROW_ON_ERROR); + } + + #[Link('/dashboard/visits', Link::GET, [], '/cmw-admin/api/internal')] + private function getDashboardPageVisits(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard'); + + $daily = VisitsMetricsManager::getInstance()->getVisitsNumber('day'); + $monthly = VisitsMetricsManager::getInstance()->getVisitsNumber('monthly'); + $all = VisitsMetricsManager::getInstance()->getVisitsNumber('all'); + + $data = [ + 'daily' => $daily, + 'monthly' => $monthly, + 'all' => $all, + ]; + + print json_encode($data, JSON_THROW_ON_ERROR); + } + + #[Link('/dashboard/users/count', Link::GET, [], '/cmw-admin/api/internal')] + private function getDashboardUsersCount(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard'); + + $count = UsersModel::getInstance()->countUsers(); + + print json_encode(['count' => $count], JSON_THROW_ON_ERROR); + } +} diff --git a/App/Package/Core/Controllers/CoreController.php b/App/Package/Core/Controllers/CoreController.php index 8d64967e..d262e2e3 100644 --- a/App/Package/Core/Controllers/CoreController.php +++ b/App/Package/Core/Controllers/CoreController.php @@ -11,16 +11,17 @@ use CMW\Manager\Flash\Flash; use CMW\Manager\Lang\LangManager; use CMW\Manager\Loader\Loader; -use CMW\Manager\Metrics\VisitsMetricsManager; use CMW\Manager\Package\AbstractController; use CMW\Manager\Router\Link; use CMW\Manager\Uploads\ImagesException; use CMW\Manager\Uploads\ImagesManager; use CMW\Manager\Views\View; use CMW\Model\Core\CoreModel; -use CMW\Model\Users\UsersMetricsModel; use CMW\Utils\Redirect; use JetBrains\PhpStorm\NoReturn; +use function date; +use function is_dir; +use function strtotime; /** * Class: @coreController @@ -59,14 +60,8 @@ private function adminDashboard(): void Redirect::redirect(EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . 'cmw-admin/dashboard'); } - $monthlyVisits = VisitsMetricsManager::getInstance()->getPastMonthsVisits(12); - $dailyVisits = VisitsMetricsManager::getInstance()->getPastDaysVisits(17); - $weeklyVisits = VisitsMetricsManager::getInstance()->getPastWeeksVisits(17); - $registers = UsersMetricsModel::getInstance()->getPastMonthsRegisterNumbers(12); - View::createAdminView('Core', 'Dashboard/dashboard') - ->addVariableList(['monthlyVisits' => $monthlyVisits, 'dailyVisits' => $dailyVisits, - 'weeklyVisits' => $weeklyVisits, 'registers' => $registers]) + ->addVariableList([]) ->addScriptBefore('Admin/Resources/Vendors/Apexcharts/Js/apexcharts.js') ->view(); } @@ -149,10 +144,7 @@ private function adminConfigurationPost(): void /* PUBLIC FRONT */ - /** - * @throws \CMW\Manager\Router\RouterException - */ - #[Link('home', Link::GET)] + #[NoReturn] #[Link('home', Link::GET)] private function redirectToHome(): void { Redirect::redirectToHome(); diff --git a/App/Package/Core/Controllers/EditorController.php b/App/Package/Core/Controllers/EditorController.php index 5c75abc4..d5120f9c 100644 --- a/App/Package/Core/Controllers/EditorController.php +++ b/App/Package/Core/Controllers/EditorController.php @@ -27,4 +27,18 @@ private function tinyMceUploadImage(): void echo json_encode(['error' => $e->getMessage()]); } } + + #[Link('/upload/noConvert/image', Link::POST, [], '/editor', secure: false)] + private function tinyMceUploadNoConvertImage(): void + { + try { + $file = $_FILES['file']; + $uploadedFileName = ImagesManager::upload($file, 'Editor'); + $fileUrl = '/Public/Uploads/Editor/' . $uploadedFileName; + echo json_encode(['location' => $fileUrl]); + } catch (Exception $e) { + http_response_code(500); + echo json_encode(['error' => $e->getMessage()]); + } + } } \ No newline at end of file diff --git a/App/Package/Core/Controllers/MailController.php b/App/Package/Core/Controllers/MailController.php index 624217d5..07e63ed7 100644 --- a/App/Package/Core/Controllers/MailController.php +++ b/App/Package/Core/Controllers/MailController.php @@ -38,7 +38,7 @@ private function mailConfiguration(): void View::createAdminView('Core', 'Mail/mailConfig') ->addStyle('Admin/Resources/Vendors/Izitoast/iziToast.min.css') ->addScriptBefore('Admin/Resources/Vendors/Tinymce/tinymce.min.js', - 'Admin/Resources/Vendors/Tinymce/Config/full.js') + 'App/Package/Core/Views/Mail/Resources/tinyMCEConfig.js') ->addScriptAfter('App/Package/Core/Views/Mail/Resources/sendMail.js', 'Admin/Resources/Vendors/Izitoast/iziToast.min.js') ->addVariableList(['config' => $config]) diff --git a/App/Package/Core/Views/Dashboard/dashboard.admin.view.php b/App/Package/Core/Views/Dashboard/dashboard.admin.view.php index 72e6dff8..dcbb712e 100644 --- a/App/Package/Core/Views/Dashboard/dashboard.admin.view.php +++ b/App/Package/Core/Views/Dashboard/dashboard.admin.view.php @@ -1,30 +1,22 @@
- +
@@ -32,7 +24,6 @@
-

@@ -41,28 +32,31 @@
  • - +
  • - +
  • - +
-
-
+
+
-
-
+
+
-
-
+
+
@@ -72,8 +66,12 @@
-

-
countUsers() ?>
+

+ +

+
+
+
@@ -82,8 +80,12 @@
-

-
getVisitsNumber('day') ?>
+

+ +

+
+
+
@@ -92,8 +94,12 @@
-

-
getVisitsNumber('monthly') ?>
+

+ +

+
+
+
@@ -102,8 +108,12 @@
-

-
getVisitsNumber('all') ?>
+

+ +

+
+
+
@@ -115,81 +125,117 @@ - \ No newline at end of file diff --git a/App/Package/Core/Views/Mail/Resources/tinyMCEConfig.js b/App/Package/Core/Views/Mail/Resources/tinyMCEConfig.js new file mode 100644 index 00000000..a354a2f6 --- /dev/null +++ b/App/Package/Core/Views/Mail/Resources/tinyMCEConfig.js @@ -0,0 +1,97 @@ +document.addEventListener("DOMContentLoaded", function () { + let theme = localStorage.getItem("color-theme"); + if (theme === "dark") { + theme = "theme-dark"; + } else { + theme = "theme-light"; + } + + const images_upload_handler = (blobInfo) => new Promise((success, failure) => { + const xhr = new XMLHttpRequest(); + const formData = new FormData(); + + //No convert images + xhr.open('POST', '/editor/upload/noConvert/image'); + const imgElement = tinymce.activeEditor.selection.getNode(); + + xhr.onload = function() { + if (xhr.status === 200) { + let json = JSON.parse(xhr.responseText); + + if (json && typeof json.location === 'string') { + success(json.location); + } else { + failure('Réponse JSON invalide'); + tinymce.activeEditor.dom.remove(imgElement); + } + } else { + failure('Erreur lors de l\'upload : ' + xhr.status); + tinymce.activeEditor.dom.remove(imgElement); + } + }; + + xhr.onerror = function() { + failure('Erreur réseau ou problème d\'accès au serveur'); + tinymce.activeEditor.dom.remove(imgElement); + }; + + formData.append('file', blobInfo.blob(), blobInfo.filename()); + xhr.send(formData); + }); + + function initTinyMCE(skin) { + tinymce.init({ + selector: `.tinymce`, + skin: skin, + content_css: skin, + promotion: false, + toolbar_sticky: true, + toolbar_mode: 'sliding', + plugins: ['emoticons', 'image', 'autoresize', 'wordcount', 'advlist', 'lists', 'charmap', 'codesample', 'code', 'directionality', 'fullscreen', 'link', 'insertdatetime', 'media', 'pagebreak', 'nonbreaking', 'preview', 'quickbars', 'searchreplace', 'table', 'visualblocks', 'visualchars'], + toolbar: + 'undo redo | ' + + 'formatpainter casechange blocks fontsizeselect | ' + + 'alignleft aligncenter alignright alignjustify | ' + + 'bold italic strikethrough | ' + + 'forecolor backcolor removeformat |' + + 'bullist numlist outdent indent | ' + + 'table | ' + + 'visualchars visualblocks ltr rtl | ' + + 'searchreplace nonbreaking pagebreak|' + + 'link media image insertdatetime |' + + 'emoticons charmap |' + + 'wordcount codesample code |' + + 'preview fullscreen help', + menubar: false, + images_file_types: 'jpg,svg,webp', + file_picker_types: 'file image media', + statusbar: false, + //Use full URL + relative_urls: false, + remove_script_host: false, + document_base_url: BASE_URL, //Global constant + images_upload_handler:images_upload_handler, + setup: function(editor) { + editor.on('init', function() { + const textarea = editor.getElement(); + const minHeight = textarea.getAttribute('data-tiny-height') || 350; + editor.editorContainer.style.minHeight = `${minHeight}px`; + }); + } + }); + } + + initTinyMCE(theme); + + // Theme toggle logic + document.getElementById('theme-toggle').addEventListener('click', function () { + let newTheme = localStorage.getItem("color-theme"); + if (newTheme === "dark") { + newTheme = "theme-dark"; + } else { + newTheme = "theme-light"; + } + tinymce.remove('.tinymce'); + initTinyMCE(newTheme); + }); +}); diff --git a/App/Package/Pages/Controllers/PagesController.php b/App/Package/Pages/Controllers/PagesController.php index 156aaa0a..35d365bb 100644 --- a/App/Package/Pages/Controllers/PagesController.php +++ b/App/Package/Pages/Controllers/PagesController.php @@ -4,6 +4,8 @@ use CMW\Controller\Users\UsersController; use CMW\Controller\Users\UsersSessionsController; +use CMW\Manager\Cache\SimpleCacheManager; +use CMW\Manager\Env\EnvManager; use CMW\Manager\Error\ErrorManager; use CMW\Manager\Flash\Alert; use CMW\Manager\Flash\Flash; @@ -12,19 +14,23 @@ use CMW\Manager\Router\Link; use CMW\Manager\Router\LinkStorage; use CMW\Manager\Router\Router; +use CMW\Manager\Router\RouterException; use CMW\Manager\Uploads\ImagesException; use CMW\Manager\Uploads\ImagesManager; use CMW\Manager\Views\View; +use CMW\Manager\Xml\SitemapManager; use CMW\Model\Pages\PagesModel; use CMW\Utils\Redirect; use CMW\Utils\Utils; use JetBrains\PhpStorm\NoReturn; +use function is_null; +use function json_encode; +use const JSON_THROW_ON_ERROR; /** * Class: @pagesController * @package Pages * @author CraftMyWebsite Team - * @version 0.0.1 */ class PagesController extends AbstractController { @@ -46,14 +52,15 @@ private function adminPagesList(): void private function adminPagesAdd(): void { UsersController::redirectIfNotHavePermissions('core.dashboard', 'pages.show.add'); - // Todo "pack script" to avoid that + View::createAdminView('Pages', 'add') ->addScriptBefore('Admin/Resources/Vendors/Tinymce/tinymce.min.js', 'Admin/Resources/Vendors/Tinymce/Config/full.js') + ->addScriptAfter('App/Package/Pages/Views/Assets/Js/slugGenerator.js') ->view(); } - #[Link('/add', Link::POST, [], '/cmw-admin/pages')] + #[NoReturn] #[Link('/add', Link::POST, [], '/cmw-admin/pages')] private function adminPagesAddPost(): void { UsersController::redirectIfNotHavePermissions('core.dashboard', 'pages.show.add'); @@ -62,7 +69,7 @@ private function adminPagesAddPost(): void [$title, $content, $state, $slug] = Utils::filterInput('title', 'content', 'state', 'page_slug'); - if ($slug === "") { + if ($slug === '') { $slug = Utils::normalizeForSlug($title); } else { $slug = Utils::normalizeForSlug($slug); @@ -74,8 +81,12 @@ private function adminPagesAddPost(): void LinkStorage::getInstance()->storeRoute('p/' . $slug, 'page', 'Page | ' . $title, 'GET', 'false', 'false', 1); + SitemapManager::getInstance()->add($slug, 0.75); + Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), LangManager::translate('pages.alert.added')); + $this->clearSingleCachePage(); + Redirect::redirect('cmw-admin/pages'); } @@ -86,20 +97,36 @@ private function adminPagesEdit(string $slug): void $page = PagesModel::getInstance()->getPageBySlug($slug); - // Todo "pack script" to avoid that + if (is_null($page)) { + Redirect::errorPage(404); + } + View::createAdminView('Pages', 'edit') ->addScriptBefore('Admin/Resources/Vendors/Tinymce/tinymce.min.js', 'Admin/Resources/Vendors/Tinymce/Config/full.js') + ->addScriptAfter('App/Package/Pages/Views/Assets/Js/slugGenerator.js') ->addVariableList(['page' => $page]) ->view(); } - #[Link('/edit/:slug', Link::POST, [], '/cmw-admin/pages')] + #[NoReturn] #[Link('/edit/:slug', Link::POST, [], '/cmw-admin/pages')] private function adminPagesEditPost(string $slug): void { UsersController::redirectIfNotHavePermissions('core.dashboard', 'pages.show.edit'); - [$id, $title, $content, $state] = Utils::filterInput('id', 'title', 'content', 'state'); + $page = PagesModel::getInstance()->getPageBySlug($slug); + + if (is_null($page)) { + Redirect::errorPage(404); + } + + [$id, $title, $content, $state, $updatedSlug] = Utils::filterInput('id', 'title', 'content', 'state', 'slug'); + + if ($updatedSlug === '') { + $updatedSlug = Utils::normalizeForSlug($title); + } else { + $updatedSlug = Utils::normalizeForSlug($updatedSlug); + } if (Utils::containsNullValue($id, $title, $content)) { Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), @@ -107,10 +134,30 @@ private function adminPagesEditPost(string $slug): void Redirect::redirectPreviousRoute(); } - PagesModel::getInstance()->updatePage($id, $slug, $title, $content, $state === NULL ? 0 : 1); + $updatedPage = PagesModel::getInstance()->updatePage($id, $updatedSlug, $title, $content, $state === NULL ? 0 : 1); + + if (is_null($updatedPage)) { + Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), + LangManager::translate('pages.toaster.errors.update')); + Redirect::redirectPreviousRoute(); + } + + //Update sitemap + if (($page->getState() === 1 && $updatedPage->getState() === 1) && $updatedPage->getSlug() === $page->getSlug()) { + SitemapManager::getInstance()->update($page->getSlug(), 0.75); + } else if ($updatedPage->getState() === 1 && $page->getState() === 1) { + SitemapManager::getInstance()->delete($page->getSlug()); + SitemapManager::getInstance()->add($updatedPage->getSlug(), 0.75); + } else if ($updatedPage->getState() === 1 && $page->getState() !== 1) { + SitemapManager::getInstance()->add($updatedPage->getSlug(), 0.75); + } else if ($updatedPage->getState() !== 1) { + SitemapManager::getInstance()->delete($page->getSlug()); + } + + $this->clearSingleCachePage($id, $slug); Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), LangManager::translate('pages.alert.edited')); - Redirect::redirectPreviousRoute(); + Redirect::redirectToAdmin('pages/edit/', ['slug' => $updatedSlug]); } #[Link('/delete/:id', Link::GET, ['id' => '[0-9]+'], '/cmw-admin/pages')] @@ -119,11 +166,21 @@ private function adminPagesDelete(int $id): void { UsersController::redirectIfNotHavePermissions('core.dashboard', 'pages.show.delete'); + $page = PagesModel::getInstance()->getPageById($id); + + if (is_null($page)) { + Redirect::errorPage(404); + } + PagesModel::getInstance()->deletePage($id); Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), LangManager::translate('pages.toaster.deleted')); + SitemapManager::getInstance()->delete($page->getSlug()); + + $this->clearSingleCachePage($id, $page->getSlug()); + Redirect::redirectPreviousRoute(); } @@ -147,7 +204,7 @@ private function adminPagesUploadImagePost(string $type): void /* Public section */ /** - * @throws \CMW\Manager\Router\RouterException + * @throws RouterException */ #[Link('/:slug', Link::GET, ['slug' => '.*?'], weight: 0)] private function publicShowPage(string $slug): void @@ -156,9 +213,9 @@ private function publicShowPage(string $slug): void // If page slug exist if (!is_null($pageEntity)) { - if ($pageEntity->getState() == 1 && !UsersController::isAdminLogged()) { - Flash::send(Alert::INFO, 'Pages', 'Cette page n\'est pas encore publique !'); - Redirect::redirectToHome(); + if ($pageEntity->getState() === 1 && !UsersController::isAdminLogged()) { + Flash::send(Alert::INFO, 'Pages', 'Cette page n\'est pas encore publique !'); + Redirect::redirectToHome(); } else { View::createPublicView('Pages', 'main') ->addVariableList(['page' => $pageEntity]) @@ -175,4 +232,34 @@ private function publicShowPage(string $slug): void die(); } } + + /** + *

Clear all pages cache files (App/Storage/Cache/Pages)

+ * @return void + */ + private function clearPagesCache(): void + { + $dir = EnvManager::getInstance()->getValue('DIR') . 'App/Storage/Cache/Pages/'; + SimpleCacheManager::deleteAllFiles($dir); + } + + /** + *

Clear a specific page cache file (App/Storage/Cache/Pages)

+ * @param int|null $id + * @param string|null $slug + * @return void + */ + private function clearSingleCachePage(?int $id = null, ?string $slug = null): void + { + if (!is_null($id)) { + SimpleCacheManager::deleteSpecificCacheFile("page_id_$id", 'Pages'); + } + + if (!is_null($slug)) { + SimpleCacheManager::deleteSpecificCacheFile("page_slug_$slug", 'Pages'); + } + + //Delete list of pages cache file + SimpleCacheManager::deleteSpecificCacheFile('pages', 'Pages'); + } } diff --git a/App/Package/Pages/Lang/en.php b/App/Package/Pages/Lang/en.php index 072c8408..e1b0d89f 100644 --- a/App/Package/Pages/Lang/en.php +++ b/App/Package/Pages/Lang/en.php @@ -2,7 +2,7 @@ return [ 'add' => [ - 'title' => 'Create', + 'title' => 'Create a page', 'desc' => 'Create a new page', 'create' => 'Create to save', ], @@ -28,6 +28,7 @@ 'deleted' => 'The page no longer exists', 'errors' => [ 'emptyFields' => 'Please, fill all fields', + 'update' => 'Unable to edit the page', ], ], 'publish' => 'Publishing the page', @@ -35,6 +36,7 @@ 'title' => 'Title', 'author' => 'Author', 'link' => 'Link', + 'content' => 'Page content', 'creation' => [ 'date' => 'Creation date', 'update' => 'Modification date', diff --git a/App/Package/Pages/Lang/fr.php b/App/Package/Pages/Lang/fr.php index faa2073c..0c5f7c99 100644 --- a/App/Package/Pages/Lang/fr.php +++ b/App/Package/Pages/Lang/fr.php @@ -1,60 +1,60 @@ [ - "title" => "Créer", - "desc" => "Créer une nouvelle page", - "create" => "Créer pour enregistrer", - ], - "edit" => [ - "title" => "Edition", - "desc" => "Modifiez votre page", - ], - "delete" => [ - "message" => "La suppression d'une page est définitive !
Aucun retour possible !", - "button" => "Supprimer", - ], - "editor" => [ - "start" => "Commencez à taper ou cliquez sur le '+' pour choisir un bloc à ajouter...", - ], - "list" => [ - "title" => "Liste des pages", - "sub_title" => "Pages", - "desc" => "Liste des pages du site", - "yes" => "Oui", - "no" => "Non", - ], - "toaster" => [ - "deleted" => "La page n'existe plus", - "errors" => [ - "emptyFields" => "Merci de remplir tous les champs", + 'add' => [ + 'title' => 'Créer une page', + 'desc' => 'Créer une nouvelle page', + 'create' => 'Créer pour enregistrer', + ], + 'edit' => [ + 'title' => 'Edition', + 'desc' => 'Modifiez votre page', + ], + 'delete' => [ + 'message' => "La suppression d'une page est définitive !
Aucun retour possible !", + 'button' => 'Supprimer', + ], + 'editor' => [ + 'start' => "Commencez à taper ou cliquez sur le '+' pour choisir un bloc à ajouter...", + ], + 'list' => [ + 'title' => 'Liste des pages', + 'sub_title' => 'Pages', + 'desc' => 'Liste des pages du site', + 'yes' => 'Oui', + 'no' => 'Non', + ], + 'toaster' => [ + 'deleted' => "La page n'existe plus", + 'errors' => [ + 'emptyFields' => 'Merci de remplir tous les champs', + 'update' => 'Impossible de modifier la page', ], ], - "publish" => "Publication de la page", - "draft" => "Brouillon", + 'publish' => 'Publication de la page', + 'draft' => 'Brouillon', - "title" => "Titre", - "author" => "Auteur", - "link" => "Lien", - - "creation" => [ - "date" => "Date de création", - "update" => "Date de modification", - "add" => "Créer une page", - "content" => "Contenu", - ], - - "alert" => [ - "added" => "Page ajoutée", - "edited" => "Page modifiée", + 'title' => 'Titre', + 'author' => 'Auteur', + 'link' => 'Lien', + 'content' => 'Contenu de la page', + 'creation' => [ + 'date' => 'Date de création', + 'update' => 'Date de modification', + 'add' => 'Créer une page', + 'content' => 'Contenu', ], - "permissions" => [ - "pages" => [ - "show" => "Afficher / Lister", - "edit" => "Éditer", - "add" => "Ajouter", - "delete" => "Supprimer", + 'alert' => [ + 'added' => 'Page ajoutée', + 'edited' => 'Page modifiée', + ], + 'permissions' => [ + 'pages' => [ + 'show' => 'Afficher / Lister', + 'edit' => 'Éditer', + 'add' => 'Ajouter', + 'delete' => 'Supprimer', ], ], ]; diff --git a/App/Package/Pages/Models/PagesModel.php b/App/Package/Pages/Models/PagesModel.php index f09d19c2..368be84e 100644 --- a/App/Package/Pages/Models/PagesModel.php +++ b/App/Package/Pages/Models/PagesModel.php @@ -3,11 +3,16 @@ namespace CMW\Model\Pages; use CMW\Entity\Pages\PageEntity; +use CMW\Manager\Cache\SimpleCacheManager; use CMW\Manager\Database\DatabaseManager; use CMW\Manager\Editor\EditorManager; use CMW\Manager\Package\AbstractModel; use CMW\Model\Users\UsersModel; +use JsonException; use PDOStatement; +use ReflectionException; +use function is_null; +use function mb_strimwidth; /** * Class: @PagesModel @@ -21,6 +26,15 @@ class PagesModel extends AbstractModel public function getPageById(int $id): ?PageEntity { + $cachedData = SimpleCacheManager::getCache("page_id_$id", 'Pages'); + + if (!is_null($cachedData)) { + try { + return PageEntity::toEntity($cachedData); + } catch (ReflectionException) { + } + } + $sql = 'SELECT page_id, page_title, page_slug, user_id, page_content, page_state, page_created, page_updated FROM cmw_pages WHERE page_id = :page_id'; @@ -32,11 +46,26 @@ public function getPageById(int $id): ?PageEntity return null; } - return $this->fetchPageResult($res); + $toReturn = $this->fetchPageResult($res); + + if (!is_null($toReturn)) { + SimpleCacheManager::storeCache($toReturn->toArray(), "page_id_$id", 'Pages'); + } + + return $toReturn; } public function getPageBySlug(string $slug): ?PageEntity { + $cachedData = SimpleCacheManager::getCache("page_slug_$slug", 'Pages'); + + if (!is_null($cachedData)) { + try { + return PageEntity::toEntity($cachedData); + } catch (ReflectionException) { + } + } + $sql = 'SELECT page_id, page_title, page_slug, user_id, page_content, page_state, page_created, page_updated FROM cmw_pages WHERE page_slug = :page_slug'; @@ -47,14 +76,29 @@ public function getPageBySlug(string $slug): ?PageEntity return null; } - return $this->fetchPageResult($res); + $toReturn = $this->fetchPageResult($res); + + if (!is_null($toReturn)) { + SimpleCacheManager::storeCache($toReturn->toArray(), "page_slug_$slug", 'Pages'); + } + + return $toReturn; } /** - * @return \CMW\Entity\Pages\PageEntity[] + * @return PageEntity[] */ public function getPages(): array { + $cachedData = SimpleCacheManager::getCache('pages', 'Pages'); + + if (!is_null($cachedData)) { + try { + return PageEntity::fromJsonList($cachedData); + } catch (JsonException|ReflectionException) { + } + } + $sql = 'SELECT page_id FROM cmw_pages'; $db = DatabaseManager::getInstance(); @@ -70,6 +114,11 @@ public function getPages(): array $toReturn[] = $this->getPageById($page['page_id']); } + try { + SimpleCacheManager::storeCache(PageEntity::toJsonList($toReturn), 'pages', 'Pages'); + } catch (JsonException) { + } + return $toReturn; } @@ -103,7 +152,7 @@ public function createPage(string $title, string $slug, string $content, int $us public function deletePage(int $id): bool { - $pageContent = $this->getPageById($id)->getContent(); + $pageContent = $this->getPageById($id)?->getContent(); EditorManager::getInstance()->deleteEditorImageInContent($pageContent); $var = [ diff --git a/App/Package/Pages/Package.php b/App/Package/Pages/Package.php index 0d604e1e..732afb72 100644 --- a/App/Package/Pages/Package.php +++ b/App/Package/Pages/Package.php @@ -14,7 +14,7 @@ public function name(): string public function version(): string { - return '1.0.0'; + return '1.1.0'; } public function authors(): array diff --git a/App/Package/Pages/Views/Assets/Js/slugGenerator.js b/App/Package/Pages/Views/Assets/Js/slugGenerator.js new file mode 100644 index 00000000..9527bb5c --- /dev/null +++ b/App/Package/Pages/Views/Assets/Js/slugGenerator.js @@ -0,0 +1,8 @@ + +document.addEventListener('DOMContentLoaded', function () { + document.getElementById('title').addEventListener('input', function () { + const title = this.value; + const slug = title.toLowerCase().normalize('NFD').replace(/'/g, '-').replace(/[\u0300-\u036f]/g, '').replace(/ /g, '-').replace(/[^a-z0-9-]/g, '') + document.getElementById('slug').value = slug; + }); +}); \ No newline at end of file diff --git a/App/Package/Pages/Views/add.admin.view.php b/App/Package/Pages/Views/add.admin.view.php index 40bdcb9f..5bb441ff 100644 --- a/App/Package/Pages/Views/add.admin.view.php +++ b/App/Package/Pages/Views/add.admin.view.php @@ -8,36 +8,48 @@ $title = LangManager::translate('pages.add.title'); $description = LangManager::translate('pages.add.desc'); ?> - -

- -
+ insertHiddenToken() ?> -
-
- - -
-
-
- - -
-
- -
- getValue('PATH_SUBFOLDER') ?> - +
+

+ +
+ +
+
+
+
+
+ + +
+
+ +
+ getValue('PATH_SUBFOLDER') ?> + +
+
- - + +
+ +
- \ No newline at end of file + +
+
:
+ + +
+ diff --git a/App/Package/Pages/Views/edit.admin.view.php b/App/Package/Pages/Views/edit.admin.view.php index 88f3d81c..18bf3e82 100644 --- a/App/Package/Pages/Views/edit.admin.view.php +++ b/App/Package/Pages/Views/edit.admin.view.php @@ -1,5 +1,6 @@ -

: getTitle() ?>

- -
+ insertHiddenToken() ?> -
-
- - -
-
-
- - -
-
- -
- getValue('PATH_SUBFOLDER') ?> - + +
+

+ + : getTitle() ?> +

+ +
+ +
+
+
+
+
+ + +
+
+ +
+ getValue('PATH_SUBFOLDER') ?> + +
+
- - + +
+ +
+ +
+
:
+ + +
\ No newline at end of file diff --git a/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsBlacklistController.php b/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsBlacklistController.php new file mode 100644 index 00000000..b850a845 --- /dev/null +++ b/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsBlacklistController.php @@ -0,0 +1,146 @@ +getBlacklistedPseudos(); + + View::createAdminView('Users', 'Settings/blacklist') + ->addStyle('Admin/Resources/Assets/Css/simple-datatables.css') + ->addScriptAfter('Admin/Resources/Vendors/Simple-datatables/simple-datatables.js', + 'Admin/Resources/Vendors/Simple-datatables/config-datatables.js') + ->addVariableList(['pseudos' => $blacklistedPseudo]) + ->view(); + } + + #[NoReturn] + #[Link('/settings/blacklist/pseudo', Link::POST, [], '/cmw-admin/users')] + private function pseudoBlacklistPost(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.add'); + + if (empty($_POST['pseudo'])) { + Redirect::redirectPreviousRoute(); + } + + $pseudo = FilterManager::filterInputStringPost('pseudo'); + + if (UsersSettingsModel::getInstance()->addBlacklistedPseudo($pseudo)) { + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('users.settings.blacklisted.pseudo.toasters.add.success', ['pseudo' => $pseudo]), + ); + } else { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('users.settings.blacklisted.pseudo.toasters.add.error', ['pseudo' => $pseudo]), + ); + } + + Redirect::redirectPreviousRoute(); + } + + #[NoReturn] + #[Link('/settings/blacklist/pseudo/edit/:id', Link::POST, ['id' => '[0-9]+'], '/cmw-admin/users')] + private function editPseudoBlacklistPost(int $id): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.edit'); + + if (empty($_POST['pseudo'])) { + Redirect::redirectPreviousRoute(); + } + + $pseudo = filter_input(INPUT_POST, 'pseudo'); + + if (UsersSettingsModel::getInstance()->editBlacklistedPseudo($id, $pseudo)) { + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('users.settings.blacklisted.pseudo.toasters.edit.success', ['pseudo' => $pseudo]) + ); + } else { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('users.settings.blacklisted.pseudo.toasters.edit.error', ['pseudo' => $pseudo]) + ); + } + + Redirect::redirectPreviousRoute(); + } + + #[NoReturn] + #[Link('/settings/blacklist/pseudo/delete/:id', Link::GET, ['id' => '[0-9]+'], '/cmw-admin/users')] + private function deletePseudoBlacklisted(int $id): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.delete'); + + if (UsersSettingsModel::getInstance()->removeBlacklistedPseudo($id)) { + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('users.settings.blacklisted.pseudo.toasters.delete.success'), + ); + } else { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('users.settings.blacklisted.pseudo.toasters.delete.error'), + ); + } + + Redirect::redirectPreviousRoute(); + } + + #[NoReturn] + #[Link('/settings/blacklist/pseudo/delete/bulk', Link::POST, [], '/cmw-admin/users', secure: false)] + private function adminDeleteSelectedPost(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.delete'); + + $selectedIds = $_POST['selectedIds']; + + if (empty($selectedIds)) { + Flash::send(Alert::ERROR, 'Blacklist', 'Aucun pseudo sélectionné'); + Redirect::redirectPreviousRoute(); + } + + $i = 0; + foreach ($selectedIds as $selectedId) { + $selectedId = FilterManager::filterData($selectedId, 11, FILTER_SANITIZE_NUMBER_INT); + UsersSettingsModel::getInstance()->removeBlacklistedPseudo($selectedId); + $i++; + } + Flash::send(Alert::SUCCESS, 'Blacklist', "$i pseudos supprimé !"); + + Redirect::redirectPreviousRoute(); + } +} diff --git a/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsGeneralController.php b/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsGeneralController.php new file mode 100644 index 00000000..2db13643 --- /dev/null +++ b/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsGeneralController.php @@ -0,0 +1,120 @@ +addVariableList(['settings' => UserSettingsEntity::getInstance()]) + ->view(); + } + + #[NoReturn] #[Link('/settings/general', Link::POST, [], '/cmw-admin/users')] + private function settingsPost(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings'); + + $profilePage = FilterManager::filterInputStringPost('profile_page'); + + $settingsStatus = UsersSettingsModel::getInstance()->bulkUpdateSettings( + new BulkSettingsEntity('profilePage', $profilePage), + ); + + if (!$settingsStatus) { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('core.toaster.config.error'), + ); + } else { + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('core.toaster.config.success'), + ); + } + + Redirect::redirectPreviousRoute(); + } + + #[NoReturn] #[Link('/settings/general/image/reset', Link::GET, [], '/cmw-admin/users')] + private function resetDefaultImg(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings'); + + if (!UsersSettingsModel::getInstance()->updateSetting('defaultImage', 'defaultImage.jpg')) { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('core.toaster.config.error'), + ); + } else { + + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('core.toaster.config.success'), + ); + } + Redirect::redirectPreviousRoute(); + } + + #[NoReturn] #[Link('/settings/general/image', Link::POST, [], '/cmw-admin/users')] + private function settingsImagePost(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings'); + + if (!isset($_FILES['defaultPicture']) || $_FILES['defaultPicture']['error'] !== 0) { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('core.toaster.config.error'), + ); + Redirect::redirectPreviousRoute(); + } + + $defaultPicture = $_FILES['defaultPicture']; + + $newDefaultImage = ImagesManager::convertAndUpload($defaultPicture, 'Users/Default'); + if (!UsersSettingsModel::getInstance()->updateSetting('defaultImage', $newDefaultImage)) { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('core.toaster.config.error'), + ); + } else { + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('core.toaster.config.success'), + ); + } + + Redirect::redirectPreviousRoute(); + } +} diff --git a/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsSecurityController.php b/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsSecurityController.php new file mode 100644 index 00000000..71cc6dad --- /dev/null +++ b/App/Package/Users/Controllers/Admin/Settings/UsersAdminSettingsSecurityController.php @@ -0,0 +1,98 @@ +getRoles(); + $settings = UserSettingsEntity::getInstance(); + + View::createAdminView('Users', 'Settings/security') + ->addVariableList(['settings' => $settings, 'roles' => $roles]) + ->view(); + } + + #[NoReturn] #[Link('/settings/security', Link::POST, [], '/cmw-admin/users')] + private function settingsPost(): void + { + UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings'); + + $resetPasswordMethod = FilterManager::filterInputStringPost('reset_password_method'); + $securityReinforced = FilterManager::filterInputStringPost('security_reinforced'); + + $settingsStatus = UsersSettingsModel::getInstance()->bulkUpdateSettings( + new BulkSettingsEntity('resetPasswordMethod', $resetPasswordMethod), + new BulkSettingsEntity('securityReinforced', $securityReinforced) + ); + + if (!$settingsStatus) { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('core.toaster.config.error'), + ); + Redirect::redirectPreviousRoute(); + } + + $listEnforcedToggle = FilterManager::filterInputStringPost('listEnforcedToggle'); + + if ($listEnforcedToggle === '1') { + if (empty($_POST['enforcedRoles'])) { + $listEnforcedToggle = 0; + if (!UsersSettingsModel::getInstance()->clearEnforcedRoles()) { + Flash::send(Alert::ERROR, 'Erreur', 'Impossible de mettre à jour les rôles imposés en 2fa !'); + Redirect::redirectPreviousRoute(); + } + } else { + if (UsersSettingsModel::getInstance()->clearEnforcedRoles()) { + foreach ($_POST['enforcedRoles'] as $roleId) { + UsersSettingsModel::getInstance()->updateEnforcedRoles($roleId); + } + } else { + Flash::send(Alert::ERROR, 'Erreur', 'Impossible de mettre à jour les rôles imposés en 2fa !'); + Redirect::redirectPreviousRoute(); + } + } + } else { + if (!UsersSettingsModel::getInstance()->clearEnforcedRoles()) { + Flash::send(Alert::ERROR, 'Erreur', 'Impossible de mettre à jour les rôles imposés en 2fa !'); + Redirect::redirectPreviousRoute(); + } + } + + UsersSettingsModel::getInstance()->updateSetting('listEnforcedToggle', $listEnforcedToggle); + + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('core.toaster.config.success'), + ); + + Redirect::redirectPreviousRoute(); + } +} diff --git a/App/Package/Users/Controllers/UsersLoginController.php b/App/Package/Users/Controllers/UsersLoginController.php index 88ee74b3..6dfb6dbb 100644 --- a/App/Package/Users/Controllers/UsersLoginController.php +++ b/App/Package/Users/Controllers/UsersLoginController.php @@ -14,6 +14,7 @@ use CMW\Manager\Mail\MailManager; use CMW\Manager\Package\AbstractController; use CMW\Manager\Router\Link; +use CMW\Manager\Router\RouterException; use CMW\Manager\Security\EncryptManager; use CMW\Manager\Theme\ThemeManager; use CMW\Manager\Twofa\TwoFaManager; @@ -23,6 +24,7 @@ use CMW\Model\Users\UsersModel; use CMW\Model\Users\UsersSettingsModel; use CMW\Type\Users\LoginStatus; +use CMW\Utils\Date; use CMW\Utils\Redirect; use CMW\Utils\Utils; use CMW\Utils\Website; @@ -41,14 +43,13 @@ * Class: @UsersLoginController * @package Users * @author CraftMyWebsite Team - * @version 0.0.1 */ class UsersLoginController extends AbstractController { /** * @param string $mail (Encrypted) * @param string $password - * @return \CMW\Type\Users\LoginStatus + * @return LoginStatus * @desc Complete login user. */ public function checkLogin(string $mail, string $password): LoginStatus @@ -80,7 +81,7 @@ public function checkLogin(string $mail, string $password): LoginStatus } /** - * @param \CMW\Entity\Users\UserEntity $user + * @param UserEntity $user * @param bool $cookie * @return void */ @@ -93,6 +94,16 @@ public function loginUser(UserEntity $user, bool $cookie): void } UsersModel::getInstance()->updateLoggedTime($user->getId()); + + if ((UsersSettingsModel::getInstance()->getSetting('securityReinforced') === '1')) { + if (MailModel::getInstance()->getConfig() !== null && MailModel::getInstance()->getConfig()->isEnable()) { + $ip = $_SERVER['REMOTE_ADDR']; + $date = date('Y-m-d H:i:s'); + $dateFormatted = Date::formatDate($date); + MailManager::getInstance()->sendMail($user->getMail(),Website::getWebsiteName() . LangManager::translate('users.security.connected.object'), LangManager::translate('users.security.connected.body', ['user_name' => $user->getPseudo(), 'website' => Website::getWebsiteName(), 'date' => $dateFormatted, 'ip' => $ip])); + } + } + try { Emitter::send(LoginEvent::class, $user->getId()); } catch (Exception) { @@ -127,10 +138,6 @@ private function loginPost(): void $loginStatus = $this->checkLogin($encryptedMail, $password); switch ($loginStatus) { - case LoginStatus::NOT_FOUND: - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('users.toaster.not_registered_account')); - Redirect::redirectPreviousRoute(); case LoginStatus::NOT_MATCH: Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), LangManager::translate('users.toaster.mail_pass_matching')); @@ -148,7 +155,7 @@ private function loginPost(): void } $this->loginUser($user, $cookie); if ($previousRoute) { - Redirect::redirectPreviousRoute(); + Redirect::external($previousRoute); } Redirect::redirect('profile'); @@ -209,7 +216,7 @@ private function loginPost(): void } /** - * @throws \CMW\Manager\Router\RouterException + * @throws RouterException */ #[Link('/login', Link::GET)] private function loginGet(): void diff --git a/App/Package/Users/Controllers/UsersProfileController.php b/App/Package/Users/Controllers/UsersProfileController.php index ec854bfd..799473ea 100644 --- a/App/Package/Users/Controllers/UsersProfileController.php +++ b/App/Package/Users/Controllers/UsersProfileController.php @@ -4,20 +4,19 @@ use CMW\Entity\Users\UserSettingsEntity; use CMW\Event\Users\DeleteUserAccountEvent; +use CMW\Interface\Users\IUsersProfilePicture; use CMW\Manager\Events\Emitter; use CMW\Manager\Filter\FilterManager; use CMW\Manager\Flash\Alert; use CMW\Manager\Flash\Flash; use CMW\Manager\Lang\LangManager; +use CMW\Manager\Loader\Loader; use CMW\Manager\Package\AbstractController; use CMW\Manager\Router\Link; use CMW\Manager\Router\RouterException; use CMW\Manager\Security\EncryptManager; use CMW\Manager\Twofa\TwoFaManager; -use CMW\Manager\Uploads\ImagesException; -use CMW\Manager\Uploads\ImagesManager; use CMW\Manager\Views\View; -use CMW\Model\Users\UserPictureModel; use CMW\Model\Users\Users2FaModel; use CMW\Model\Users\UsersModel; use CMW\Model\Users\UsersSettingsModel; @@ -86,26 +85,17 @@ private function publicProfilePost(): void Redirect::redirectToHome(); } - if (!empty($_FILES['pictureProfile']['name'])) { - $image = $_FILES['pictureProfile']; - - try { - // Upload image on the server - $imageName = ImagesManager::convertAndUpload($image, 'Users'); - - if (!UserPictureModel::getInstance()->uploadImage($user->getId(), $imageName)) { - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('core.errors.upload.image')); - Redirect::redirectPreviousRoute(); - } - } catch (ImagesException $e) { - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('core.errors.upload.image') . " => $e"); - Redirect::redirectPreviousRoute(); - } + if (!isset($_FILES['pictureProfile']) || empty($_FILES['pictureProfile']['name'])) { + Flash::send( + Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('core.imageManager.error.emptyFile'), + ); + Redirect::redirectPreviousRoute(); } - Redirect::redirect('profile'); + $image = $_FILES['pictureProfile']; + Loader::getHighestImplementation(IUsersProfilePicture::class)->changeMethod($image, $user->getId()); } #[Link('/profile/:pseudo', Link::GET, ['pseudo' => '.*?'])] @@ -140,7 +130,7 @@ private function publicProfileWithPseudo(string $pseudo): void ->view(); } - #[NoReturn] #[Link('/profile/delete/:id', Link::GET, ['id' => '[0-9]+'])] + #[NoReturn] #[Link('/account/delete/:id', Link::GET, ['id' => '[0-9]+'])] private function publicProfileDelete(int $id): void { // Check if this is the current user account @@ -172,14 +162,20 @@ private function publicProfileUpdate(): void $lastname = FilterManager::filterInputStringPost('lastname', orElse: ''); if (!FilterManager::isEmail($mail)) { - Flash::send(Alert::ERROR, LangManager::translate('users.toaster.error'), - LangManager::translate('users.toaster.invalid_mail')); + Flash::send( + Alert::ERROR, + LangManager::translate('users.toaster.error'), + LangManager::translate('users.toaster.invalid_mail'), + ); Redirect::redirectPreviousRoute(); } if (UsersSettingsModel::getInstance()->isPseudoBlacklisted($pseudo)) { - Flash::send(Alert::ERROR, LangManager::translate('users.toaster.error'), - LangManager::translate('users.toaster.blacklisted_pseudo')); + Flash::send( + Alert::ERROR, + LangManager::translate('users.toaster.error'), + LangManager::translate('users.toaster.blacklisted_pseudo'), + ); Redirect::redirectPreviousRoute(); } @@ -194,23 +190,35 @@ private function publicProfileUpdate(): void $encryptedMail = EncryptManager::encrypt($mail); if (UsersModel::getInstance()->update($user?->getId(), $encryptedMail, $pseudo, $firstname, $lastname, $rolesId)) { - Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), LangManager::translate('users.toaster.user_edited_self')); + Flash::send( + Alert::SUCCESS, + LangManager::translate('core.toaster.success'), + LangManager::translate('users.toaster.user_edited_self'), + ); } else { - Flash::send(Alert::ERROR, LangManager::translate('users.toaster.error'), LangManager::translate('users.toaster.user_edited_self_nop')); + Flash::send( + Alert::ERROR, + LangManager::translate('users.toaster.error'), + LangManager::translate('users.toaster.user_edited_self_nop'), + ); } - $password = FilterManager::filterInputStringPost('password'); - $passwordVerif = FilterManager::filterInputStringPost('passwordVerif'); + $password = FilterManager::filterInputStringPost('password', orElse: ''); + $passwordVerif = FilterManager::filterInputStringPost('passwordVerif', orElse: ''); - if (!is_null($password)) { + if (!empty($password)) { if ($password === $passwordVerif) { UsersModel::getInstance()->updatePass($user?->getId(), password_hash($password, PASSWORD_BCRYPT)); } else { - // Todo Try to edit that - Flash::send(Alert::ERROR, LangManager::translate('users.toaster.error'), 'Je sais pas ?'); + Flash::send( + Alert::ERROR, + LangManager::translate('users.toaster.error'), + LangManager::translate('users.toaster.password_not_same'), + ); } } + UsersSessionsController::getInstance()->updateStoredUser($user->getId()); Redirect::redirectPreviousRoute(); } diff --git a/App/Package/Users/Controllers/UsersSettingsController.php b/App/Package/Users/Controllers/UsersSettingsController.php index 8126f21c..c9163a9a 100644 --- a/App/Package/Users/Controllers/UsersSettingsController.php +++ b/App/Package/Users/Controllers/UsersSettingsController.php @@ -2,222 +2,25 @@ namespace CMW\Controller\Users; -use CMW\Entity\Users\Settings\BulkSettingsEntity; -use CMW\Entity\Users\UserSettingsEntity; use CMW\Manager\Env\EnvManager; -use CMW\Manager\Filter\FilterManager; -use CMW\Manager\Flash\Alert; -use CMW\Manager\Flash\Flash; -use CMW\Manager\Lang\LangManager; use CMW\Manager\Package\AbstractController; -use CMW\Manager\Router\Link; -use CMW\Manager\Uploads\ImagesException; -use CMW\Manager\Uploads\ImagesManager; -use CMW\Manager\Views\View; -use CMW\Model\Users\RolesModel; use CMW\Model\Users\UsersSettingsModel; -use CMW\Utils\Redirect; -use CMW\Utils\Utils; -use JetBrains\PhpStorm\NoReturn; /** * Class: @UsersSettingsController * @package Users * @author CraftMyWebsite Team - * @version 0.0.1 + * @deprecated */ class UsersSettingsController extends AbstractController { + /** + * @return string + * @deprecated + */ public static function getDefaultImageLink(): string { $defaultImg = UsersSettingsModel::getInstance()->getSetting('defaultImage'); return EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . 'Public/Uploads/Users/Default/' . $defaultImg; } - - /** - * @throws \CMW\Manager\Router\RouterException - */ - #[Link(path: '/', method: Link::GET, scope: '/cmw-admin/users')] - #[Link('/settings', Link::GET, [], '/cmw-admin/users')] - private function settings(): void - { - UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings'); - - $roles = RolesModel::getInstance()->getRoles(); - $blacklistedPseudo = UsersSettingsModel::getInstance()->getBlacklistedPseudos(); - - View::createAdminView('Users', 'settings') - ->addStyle('Admin/Resources/Assets/Css/simple-datatables.css') - ->addScriptAfter('Admin/Resources/Vendors/Simple-datatables/simple-datatables.js', - 'Admin/Resources/Vendors/Simple-datatables/config-datatables.js', - 'App/Package/Users/Views/Assets/Js/rolesWeights.js') - ->addVariableList(['settings' => new UserSettingsEntity(), 'roles' => $roles, 'pseudos' => $blacklistedPseudo]) - ->view(); - } - - #[NoReturn] #[Link('/settings/resetImg', Link::GET, [], '/cmw-admin/users')] - private function resetDefaultImg(): void - { - UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings'); - - UsersSettingsModel::getInstance()->updateSetting('defaultImage', 'defaultImage.jpg'); - - Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), - LangManager::translate('core.toaster.config.success')); - - Redirect::redirectPreviousRoute(); - } - - #[Link('/settings', Link::POST, [], '/cmw-admin/users')] - private function settingsPost(): void - { - UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings'); - - if ($_FILES['defaultPicture']['name'] !== '') { - $defaultPicture = $_FILES['defaultPicture']; - - try { - $newDefaultImage = ImagesManager::convertAndUpload($defaultPicture, 'Users/Default'); - UsersSettingsModel::getInstance()->updateSetting('defaultImage', $newDefaultImage); - } catch (ImagesException $e) { - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('core.errors.upload.image') . ' => ' . $e->getMessage()); - Redirect::redirectPreviousRoute(); - } - } - - [$resetPasswordMethod, $profilePage, $securityReinforced] = Utils::filterInput('reset_password_method', 'profile_page', 'security_reinforced'); - - $settingsStatus = UsersSettingsModel::getInstance()->bulkUpdateSettings( - new BulkSettingsEntity('resetPasswordMethod', $resetPasswordMethod), - new BulkSettingsEntity('profilePage', $profilePage), - new BulkSettingsEntity('securityReinforced', $securityReinforced) - ); - - if (!$settingsStatus) { - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('core.toaster.config.error')); - Redirect::redirectPreviousRoute(); - } - - [$listEnforcedToggle] = Utils::filterInput('listEnforcedToggle'); - - if ($listEnforcedToggle === '1') { - if (empty($_POST['enforcedRoles'])) { - $listEnforcedToggle = 0; - if (!UsersSettingsModel::getInstance()->clearEnforcedRoles()) { - Flash::send(Alert::ERROR, 'Erreur', 'Impossible de mettre à jour les rôles imposer en 2fa !'); - Redirect::redirectPreviousRoute(); - } - } else { - if (UsersSettingsModel::getInstance()->clearEnforcedRoles()) { - foreach ($_POST['enforcedRoles'] as $roleId) { - UsersSettingsModel::getInstance()->updateEnforcedRoles($roleId); - } - } else { - Flash::send(Alert::ERROR, 'Erreur', 'Impossible de mettre à jour les rôles imposer en 2fa !'); - Redirect::redirectPreviousRoute(); - } - } - } else { - if (!UsersSettingsModel::getInstance()->clearEnforcedRoles()) { - Flash::send(Alert::ERROR, 'Erreur', 'Impossible de mettre à jour les rôles imposer en 2fa !'); - Redirect::redirectPreviousRoute(); - } - } - - UsersSettingsModel::getInstance()->updateSetting('listEnforcedToggle', $listEnforcedToggle); - - Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), - LangManager::translate('core.toaster.config.success')); - - Redirect::redirectPreviousRoute(); - } - - #[NoReturn] - #[Link('/settings/blacklist/pseudo', Link::POST, [], '/cmw-admin/users')] - private function pseudoBlacklistPost(): void - { - UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.add'); - - if (empty($_POST['pseudo'])) { - Redirect::redirectPreviousRoute(); - } - - $pseudo = filter_input(INPUT_POST, 'pseudo'); - - if (UsersSettingsModel::getInstance()->addBlacklistedPseudo($pseudo)) { - Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), - LangManager::translate('users.settings.blacklisted.pseudo.toasters.add.success', ['pseudo' => $pseudo])); - } else { - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('users.settings.blacklisted.pseudo.toasters.add.error', ['pseudo' => $pseudo])); - } - - Redirect::redirectPreviousRoute(); - } - - #[NoReturn] - #[Link('/settings/blacklist/pseudo/edit/:id', Link::POST, ['id' => '[0-9]+'], '/cmw-admin/users')] - private function editPseudoBlacklistPost(int $id): void - { - UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.edit'); - - if (empty($_POST['pseudo'])) { - Redirect::redirectPreviousRoute(); - } - - $pseudo = filter_input(INPUT_POST, 'pseudo'); - - if (UsersSettingsModel::getInstance()->editBlacklistedPseudo($id, $pseudo)) { - Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), - LangManager::translate('users.settings.blacklisted.pseudo.toasters.edit.success', ['pseudo' => $pseudo])); - } else { - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('users.settings.blacklisted.pseudo.toasters.edit.error', ['pseudo' => $pseudo])); - } - - Redirect::redirectPreviousRoute(); - } - - #[NoReturn] - #[Link('/settings/blacklist/pseudo/delete/:id', Link::GET, ['id' => '[0-9]+'], '/cmw-admin/users')] - private function deletePseudoBlacklisted(int $id): void - { - UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.delete'); - - if (UsersSettingsModel::getInstance()->removeBlacklistedPseudo($id)) { - Flash::send(Alert::SUCCESS, LangManager::translate('core.toaster.success'), - LangManager::translate('users.settings.blacklisted.pseudo.toasters.delete.success')); - } else { - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('users.settings.blacklisted.pseudo.toasters.delete.error')); - } - - Redirect::redirectPreviousRoute(); - } - - #[NoReturn] - #[Link('/settings/blacklist/pseudo/deleteSelected', Link::POST, [], '/cmw-admin/users', secure: false)] - private function adminDeleteSelectedPost(): void - { - UsersController::redirectIfNotHavePermissions('core.dashboard', 'users.settings.blacklist.delete'); - - $selectedIds = $_POST['selectedIds']; - - if (empty($selectedIds)) { - Flash::send(Alert::ERROR, 'Blacklist', 'Aucun pseudo sélectionné'); - Redirect::redirectPreviousRoute(); - } - - $i = 0; - foreach ($selectedIds as $selectedId) { - $selectedId = FilterManager::filterData($selectedId, 11, FILTER_SANITIZE_NUMBER_INT); - UsersSettingsModel::getInstance()->removeBlacklistedPseudo($selectedId); - $i++; - } - Flash::send(Alert::SUCCESS, 'Blacklist', "$i pseudos supprimé !"); - - Redirect::redirectPreviousRoute(); - } } diff --git a/App/Package/Users/Implementations/Users/Assets/OAuth/discord.png b/App/Package/Users/Implementations/Users/Assets/OAuth/discord.png deleted file mode 100644 index d0276a27..00000000 Binary files a/App/Package/Users/Implementations/Users/Assets/OAuth/discord.png and /dev/null differ diff --git a/App/Package/Users/Implementations/Users/Assets/OAuth/discord.svg b/App/Package/Users/Implementations/Users/Assets/OAuth/discord.svg new file mode 100644 index 00000000..8d16ba2f --- /dev/null +++ b/App/Package/Users/Implementations/Users/Assets/OAuth/discord.svg @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/App/Package/Users/Implementations/Users/UsersOAuthDiscordImplementation.php b/App/Package/Users/Implementations/Users/UsersOAuthDiscordImplementation.php index 787b3b11..5c6b63b4 100644 --- a/App/Package/Users/Implementations/Users/UsersOAuthDiscordImplementation.php +++ b/App/Package/Users/Implementations/Users/UsersOAuthDiscordImplementation.php @@ -46,7 +46,7 @@ public function methodIdentifier(): string public function methodeIconLink(): string { return EnvManager::getInstance()->getValue('PATH_URL') - . 'App/Package/Users/Implementations/Users/Assets/OAuth/discord.png'; + . 'App/Package/Users/Implementations/Users/Assets/OAuth/discord.svg'; } /** diff --git a/App/Package/Users/Implementations/Users/UsersProfilePictureImplementation.php b/App/Package/Users/Implementations/Users/UsersProfilePictureImplementation.php index c7cca68f..e96f9d1b 100644 --- a/App/Package/Users/Implementations/Users/UsersProfilePictureImplementation.php +++ b/App/Package/Users/Implementations/Users/UsersProfilePictureImplementation.php @@ -3,11 +3,17 @@ namespace CMW\Implementation\Users\Users; use CMW\Controller\Users\UsersSessionsController; -use CMW\Controller\Users\UsersSettingsController; use CMW\Entity\Users\UserPictureEntity; use CMW\Interface\Users\IUsersProfilePicture; use CMW\Manager\Env\EnvManager; +use CMW\Manager\Flash\Alert; +use CMW\Manager\Flash\Flash; +use CMW\Manager\Lang\LangManager; +use CMW\Manager\Uploads\ImagesException; +use CMW\Manager\Uploads\ImagesManager; use CMW\Model\Users\UserPictureModel; +use CMW\Model\Users\UsersModel; +use CMW\Model\Users\UsersSettingsModel; use CMW\Utils\Redirect; use JetBrains\PhpStorm\NoReturn; @@ -21,7 +27,29 @@ public function weight(): int #[NoReturn] public function changeMethod(mixed $picture, int $userId): void { - UserPictureModel::getInstance()->uploadImage($userId, $picture); + $user = UsersModel::getInstance()->getUserById($userId); + + if ($user === null) { + Flash::send(Alert::ERROR, + LangManager::translate('core.toaster.error'), + LangManager::translate('core.errors.user.not.found'), + ); + Redirect::redirectPreviousRoute(); + } + + try { + // Upload image on the server + $imageName = ImagesManager::convertAndUpload($picture, 'Users'); + + if (!UserPictureModel::getInstance()->uploadImage($user->getId(), $imageName)) { + Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), + LangManager::translate('core.errors.upload.image')); + Redirect::redirectPreviousRoute(); + } + } catch (ImagesException $e) { + Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), + LangManager::translate('core.errors.upload.image') . " => $e"); + } UsersSessionsController::getInstance()->updateStoredUser($userId); @@ -63,6 +91,7 @@ public function getUserProfilePicture(int $userId): UserPictureEntity public function getDefaultProfilePicture(): string { - return UsersSettingsController::getDefaultImageLink(); + $defaultImg = UsersSettingsModel::getInstance()->getSetting('defaultImage'); + return EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . 'Public/Uploads/Users/Default/' . $defaultImg; } } diff --git a/App/Package/Users/Lang/en.php b/App/Package/Users/Lang/en.php index 459f0e4a..2bde84ec 100644 --- a/App/Package/Users/Lang/en.php +++ b/App/Package/Users/Lang/en.php @@ -294,13 +294,17 @@ 'captcha' => [ 'invalid' => 'invalid Captcha', ], + 'connected' => [ + 'object' => ' - New login detected on your account', + 'body' => 'Hello %user_name%.
We have detected a new login to your account on %website%.

📍 Login details:
- Date and time: %date%
- IP address: %ip%

If you initiated this login, you can ignore this message.

⚠️ If this login was not made by you, we strongly recommend that you:
- Immediately change your password from your personal account settings.
- Check your recent account activity for any suspicious actions.
- Enable two-factor authentication (2FA) if you haven’t already.', + ], ], 'long_date' => [ 'setting' => [ 'label' => 'Strengthened user account security', 'no' => 'No (not recommended)', 'yes' => 'Yes', - 'small' => 'For users who do not have 2Fa if they have not logged in for more than 90 days they receive an identity confirmation code by email. (the email must be functional)', + 'small' => 'For users without 2FA, a confirmation code is sent by email if they haven\'t logged in for over 90 days (email delivery must be functional).
This setting also triggers an email for each login.', ], 'toaster' => [ 'title' => 'Identity verification', @@ -317,4 +321,17 @@ 'body_3' => 'If you are not the originator of this request, we advise you to change your password!', ], ], + 'pages' => [ + 'settings' => [ + 'general' => [ + 'menu' => 'General', + ], + 'security' => [ + 'menu' => 'Security', + ], + 'blacklist' => [ + 'menu' => 'Blacklist', + ], + ], + ], ]; diff --git a/App/Package/Users/Lang/fr.php b/App/Package/Users/Lang/fr.php index 2bc46256..a87b6676 100644 --- a/App/Package/Users/Lang/fr.php +++ b/App/Package/Users/Lang/fr.php @@ -248,17 +248,17 @@ 'flush' => [ 'modal' => [ 'warning' => 'Ceci va réinitialiser tous vos rôles ! (sauf Administrateur)', - 'text' => "Flusher les permissions est un outil de débogage souvent utilisé par les développeurs qui souhaitent forcer l'ajout manuel des permissions de leurs fichiers Permissions.php se trouvant dans le dossier Init." + 'text' => "Flusher les permissions est un outil de débogage souvent utilisé par les développeurs qui souhaitent forcer l'ajout manuel des permissions de leurs fichiers Permissions.php se trouvant dans le dossier Init.", ], ], 'oauth' => [ - 'manage' => [ - 'title' => 'Gestion des oAuth', - 'desc' => 'Gérez les méthodes de connexion oAuth', - 'subtitle' => 'Configuration des méthodes oAuth', - 'enabled' => 'Méthodes active', - 'disabled' => 'Méthodes inactive', - ], + 'manage' => [ + 'title' => 'Gestion des oAuth', + 'desc' => 'Gérez les méthodes de connexion oAuth', + 'subtitle' => 'Configuration des méthodes oAuth', + 'enabled' => 'Méthodes active', + 'disabled' => 'Méthodes inactive', + ], 'flash' => [ 'saveSettingFailed' => 'Une erreur s\'est produite lors de l\'enregistrement des paramètres.', 'saved' => 'Paramètres enregistrés avec succès.', @@ -295,13 +295,17 @@ 'captcha' => [ 'invalid' => 'Captcha invalide', ], + 'connected' => [ + 'object' => ' - Nouvelle connexion détectée sur votre compte', + 'body' => 'Bonjour %user_name%.
Nous avons détecté une nouvelle connexion à votre compte sur %website%.

📍 Détails de la connexion :
- Date et heure : %date%
- Adresse IP : %ip%

Si vous êtes à l\'origine de cette connexion, vous pouvez ignorer ce message.

⚠️ Si cette connexion ne vient pas de vous, nous vous recommandons fortement de :
- Changer immédiatement votre mot de passe depuis votre espace personnel.
- Vérifier l’activité récente de votre compte pour détecter d’éventuelles actions suspectes.
- Activer l’authentification à deux facteurs (2FA) si ce n’est pas encore fait.', + ], ], 'long_date' => [ 'setting' => [ 'label' => 'Renforcé la sécurité des comptes utilisateur', 'no' => 'Non (non recommandé)', 'yes' => 'Oui', - 'small' => 'Pour les utilisateurs n\'ayant pas de 2Fa s\'ils ne se sont pas connecté depuis + de 90 jours ils reçoivent un code de confirmation d\'identité par mail. (l\'envoie de mail doit être fonctionnel)', + 'small' => 'Pour les utilisateurs sans 2FA, un code de confirmation est envoyé par mail s\'ils ne se sont pas connectés depuis plus de 90 jours (l\'envoi de mail doit être fonctionnel).
Ce paramètre déclenche également un mail à chaque connexion.', ], 'toaster' => [ 'title' => 'Verification d\'identité', @@ -318,4 +322,17 @@ 'body_3' => 'Si vous n\'êtes pas à l\'origine de cette demande, nous vous conseillons de changer votre mot de passe !', ], ], + 'pages' => [ + 'settings' => [ + 'general' => [ + 'menu' => 'Généraux', + ], + 'security' => [ + 'menu' => 'Sécurité', + ], + 'blacklist' => [ + 'menu' => 'Blacklist', + ], + ], + ], ]; diff --git a/App/Package/Users/Models/UsersModel.php b/App/Package/Users/Models/UsersModel.php index 64c16947..46d15853 100644 --- a/App/Package/Users/Models/UsersModel.php +++ b/App/Package/Users/Models/UsersModel.php @@ -245,7 +245,7 @@ public function isCredentialsMatch(string $mail, string $password): LoginStatus| $res = $req->fetch(); if (!$res) { - return LoginStatus::NOT_FOUND; + return LoginStatus::NOT_MATCH; } return password_verify($password, $res['user_password']) ? $res['user_id'] : LoginStatus::NOT_MATCH; diff --git a/App/Package/Users/Models/UsersSettingsModel.php b/App/Package/Users/Models/UsersSettingsModel.php index 4e65c5c5..8e38c880 100644 --- a/App/Package/Users/Models/UsersSettingsModel.php +++ b/App/Package/Users/Models/UsersSettingsModel.php @@ -42,11 +42,16 @@ public function getSettings(): array return ($req->execute()) ? $req->fetchAll() : []; } - public function updateSetting(string $settingName, string $settingValue): void + /** + * @param string $settingName + * @param string $settingValue + * @return bool + */ + public function updateSetting(string $settingName, string $settingValue): bool { $db = DatabaseManager::getInstance(); $req = $db->prepare('UPDATE cmw_users_settings SET users_settings_value=:settingValue, users_settings_updated=now() WHERE users_settings_name=:settingName'); - $req->execute(['settingName' => $settingName, 'settingValue' => $settingValue]); + return $req->execute(['settingName' => $settingName, 'settingValue' => $settingValue]); } /** diff --git a/App/Package/Users/Package.php b/App/Package/Users/Package.php index 01af4d0c..bf3cff3f 100644 --- a/App/Package/Users/Package.php +++ b/App/Package/Users/Package.php @@ -46,8 +46,27 @@ public function menus(): ?array new PackageSubMenuType( title: LangManager::translate('core.menu.user.settings'), permission: 'users.settings', - url: 'users/settings', - subMenus: [] + url: null, + subMenus: [ + new PackageSubMenuType( + title: LangManager::translate('users.pages.settings.general.menu'), + permission: 'users.settings', + url: 'users/settings/general', + subMenus: [] + ), + new PackageSubMenuType( + title: LangManager::translate('users.pages.settings.security.menu'), + permission: 'users.settings', + url: 'users/settings/security', + subMenus: [] + ), + new PackageSubMenuType( + title: LangManager::translate('users.pages.settings.blacklist.menu'), + permission: 'users.settings', + url: 'users/settings/blacklist/pseudo', + subMenus: [] + ), + ] ), new PackageSubMenuType( title: LangManager::translate('core.menu.user.manage'), diff --git a/App/Package/Users/Type/LoginStatus.php b/App/Package/Users/Type/LoginStatus.php index acad2826..7394a8e5 100644 --- a/App/Package/Users/Type/LoginStatus.php +++ b/App/Package/Users/Type/LoginStatus.php @@ -4,7 +4,6 @@ enum LoginStatus { - case NOT_FOUND; case NOT_MATCH; case INTERNAL_ERROR; case OK; diff --git a/App/Package/Users/Views/Settings/blacklist.admin.view.php b/App/Package/Users/Views/Settings/blacklist.admin.view.php new file mode 100644 index 00000000..9eec82fd --- /dev/null +++ b/App/Package/Users/Views/Settings/blacklist.admin.view.php @@ -0,0 +1,121 @@ + + +

+ + - +

+ +
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
+ +
getPseudo() ?>getDateBlacklistedFormatted() ?> + + +
+
+
+ +
+
+
+ insertHiddenToken() ?> +
+ + +
+ +
+
+ +
\ No newline at end of file diff --git a/App/Package/Users/Views/Settings/general.admin.view.php b/App/Package/Users/Views/Settings/general.admin.view.php new file mode 100644 index 00000000..4cdea96d --- /dev/null +++ b/App/Package/Users/Views/Settings/general.admin.view.php @@ -0,0 +1,72 @@ + + +
+

+ + - +

+
+ +
+
+
+ insertHiddenToken() ?> +
+
+ + + +
+
+ <?= LangManager::translate('users.settings.default_picture') ?> +
+
+ +
+ +
+
+
+ +
+
+ insertHiddenToken() ?> + + + + +
+ +
+
+
+
diff --git a/App/Package/Users/Views/Settings/security.admin.view.php b/App/Package/Users/Views/Settings/security.admin.view.php new file mode 100644 index 00000000..ded71fa0 --- /dev/null +++ b/App/Package/Users/Views/Settings/security.admin.view.php @@ -0,0 +1,106 @@ + + +
+

+ + - +

+ + +
+ +
+ insertHiddenToken() ?> + +
+
+ + +
+
+ + + +
+ +
+ +
+ +
+
+
:
+
+ +
+
+
+
+
+ + diff --git a/App/Package/Users/Views/manage.admin.view.php b/App/Package/Users/Views/manage.admin.view.php index 42dae053..f8f8309a 100644 --- a/App/Package/Users/Views/manage.admin.view.php +++ b/App/Package/Users/Views/manage.admin.view.php @@ -50,7 +50,7 @@
diff --git a/App/Package/Users/Views/settings.admin.view.php b/App/Package/Users/Views/settings.admin.view.php deleted file mode 100644 index 90af107e..00000000 --- a/App/Package/Users/Views/settings.admin.view.php +++ /dev/null @@ -1,217 +0,0 @@ - - -
-

- -
- -
- insertHiddenToken() ?> - -
-
-
-
- Reset -
-
- <?= LangManager::translate('users.settings.default_picture') ?> -
-
-
-
-
- - -
- -
- - -
- -
- - - -
- -
- -
- -
-
-
:
-
- -
-
-
-
-
-
- -
-
-
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
getPseudo() ?>getDateBlacklistedFormatted() ?> - - -
-
-
- -
-
-
- insertHiddenToken() ?> -
- - -
- -
-
- -
- - - - - - - diff --git a/App/Utils/Redirect.php b/App/Utils/Redirect.php index 252c019d..ac597b3c 100644 --- a/App/Utils/Redirect.php +++ b/App/Utils/Redirect.php @@ -89,10 +89,13 @@ public static function redirectToAdmin(string $url, array $params = []): void self::redirectToHome(); } - $strParams = implode(', ', $params); - http_response_code(302); - header('Location: ' . EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . $route->getUrl() . '/' . $strParams); + + if ($params !== []){ + header('Location: ' . EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . 'cmw-admin/' . $url . $route->getUrl($params)); + } else { + header('Location: ' . EnvManager::getInstance()->getValue('PATH_SUBFOLDER') . $route->getUrl()); + } } /** diff --git a/Dockerfile b/Dockerfile index 23ef0970..15397ffe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,12 +4,20 @@ FROM php:8.3.12-apache COPY . /var/www/html RUN apt-get update && apt-get install -y \ - libzip-dev \ + libfontconfig1 \ + libxrender1 \ + libxext6 \ + zlib1g-dev \ libpng-dev \ + libwebp-dev \ + libfreetype6-dev \ + libjpeg62-turbo-dev \ + libzip-dev \ zip \ unzip && \ apt-get clean && rm -rf /var/lib/apt/lists/* +RUN docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp RUN docker-php-ext-install -j$(nproc) zip mysqli pdo pdo_mysql gd RUN a2enmod rewrite diff --git a/Installation/Controllers/InstallerController.php b/Installation/Controllers/InstallerController.php index 4cdb081d..d8ab51f4 100644 --- a/Installation/Controllers/InstallerController.php +++ b/Installation/Controllers/InstallerController.php @@ -24,7 +24,6 @@ use CMW\Utils\Utils; use CMW\Utils\Website; use JetBrains\PhpStorm\NoReturn; - use function array_key_exists; use function base64_decode; use function date_default_timezone_get; @@ -40,7 +39,6 @@ use function mb_strtolower; use function ob_start; use function password_hash; - use const FILTER_VALIDATE_EMAIL; use const FILTER_VALIDATE_IP; use const INPUT_POST; @@ -236,8 +234,8 @@ private function welcomeInstallPost(): void EnvManager::getInstance()->setOrEditValue('CMW_KEY', $apiReturn['uuid']); } else { EnvManager::getInstance()->setOrEditValue('CMW_KEY', 'ERROR'); - Flash::send(Alert::ERROR, LangManager::translate('core.toaster.error'), - LangManager::translate('core.toaster.internalError' . ' (CMW_KEY)')); + Flash::send(Alert::WARNING, LangManager::translate('core.toaster.error'), + LangManager::translate('core.toaster.internalError') . ' (CMW_KEY)'); Website::refresh(); } @@ -258,15 +256,15 @@ private function testDbConnection(): void if (!InstallerModel::tryDatabaseConnection($host, $username, $password, $port)) { print (json_encode(['status' => 0, - 'content' => LangManager::translate('core.toaster.db.config.error')], + 'content' => LangManager::translate('core.toaster.db.config.error')], JSON_THROW_ON_ERROR)); } else if (InstallerModel::checkIfDatabaseAlreadyInstalled($host, $username, $password, $db, $port)) { print (json_encode(['status' => 0, 'content' => - LangManager::translate('core.toaster.db.config.alreadyInstalled')], + LangManager::translate('core.toaster.db.config.alreadyInstalled')], JSON_THROW_ON_ERROR)); } else { print (json_encode(['status' => 1, 'content' => - LangManager::translate('core.toaster.db.config.success')], + LangManager::translate('core.toaster.db.config.success')], JSON_THROW_ON_ERROR)); } } diff --git a/Installation/Views/Assets/Js/loader.js b/Installation/Views/Assets/Js/loader.js index cfc4e558..cf92f8ca 100644 --- a/Installation/Views/Assets/Js/loader.js +++ b/Installation/Views/Assets/Js/loader.js @@ -9,7 +9,16 @@ };*/ -const launchLoader = () => { +const launchLoader = (event) => { + const form = document.getElementById('mainForm'); + + // Vérifie si le formulaire est valide + if (!form.checkValidity()) { + event.preventDefault(); // Empêche l'envoi du formulaire si invalide + form.reportValidity(); // Affiche les messages d'erreur natifs + return; + } + let loader = document.getElementById('loader') let body = document.getElementById('body') @@ -20,11 +29,3 @@ const launchLoader = () => { const btn = document.getElementById('formBtn') btn.addEventListener('click', launchLoader) - -const customLaunchLoader = () => { - let loader = document.getElementById('loader') - let body = document.getElementById('body') - - loader.classList.remove('hidden') - body.classList.add("hidden") -} \ No newline at end of file diff --git a/Installation/Views/secondInstall.view.php b/Installation/Views/secondInstall.view.php index bd8d31cc..3aba0dfb 100644 --- a/Installation/Views/secondInstall.view.php +++ b/Installation/Views/secondInstall.view.php @@ -6,7 +6,7 @@ ?>

-
+

: