diff --git a/public/css/app.css b/public/css/app.css index 5df93e8..3107ac2 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -1 +1 @@ -:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13, 110, 253;--bs-secondary-rgb:108, 117, 125;--bs-success-rgb:25, 135, 84;--bs-info-rgb:13, 202, 240;--bs-warning-rgb:255, 193, 7;--bs-danger-rgb:220, 53, 69;--bs-light-rgb:248, 249, 250;--bs-dark-rgb:33, 37, 41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255, 255, 255;--bs-black-rgb:0, 0, 0;--bs-font-sans-serif:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient:linear-gradient(180deg, #ffffff26, #fff0);--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33, 37, 41;--bs-body-bg:#fff;--bs-body-bg-rgb:255, 255, 255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0, 0, 0;--bs-secondary-color:#212529bf;--bs-secondary-color-rgb:33, 37, 41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233, 236, 239;--bs-tertiary-color:#21252980;--bs-tertiary-color-rgb:33, 37, 41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248, 249, 250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13, 110, 253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10, 88, 202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:#0000002d;--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem #00000026;--bs-box-shadow-sm:0 .125rem .25rem #00000013;--bs-box-shadow-lg:0 1rem 3rem #0000002d;--bs-box-shadow-inset:inset 0 1px 2px #00000013;--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:#0d6efd40;--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222, 226, 230;--bs-body-bg:#212529;--bs-body-bg-rgb:33, 37, 41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255, 255, 255;--bs-secondary-color:#dee2e6bf;--bs-secondary-color-rgb:222, 226, 230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52, 58, 64;--bs-tertiary-color:#dee2e680;--bs-tertiary-color-rgb:222, 226, 230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43, 48, 53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110, 168, 254;--bs-link-hover-color-rgb:139, 185, 254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:#ffffff26;--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,:before,:after{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:#0000;margin:0}hr{color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25;margin:1rem 0}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{color:var(--bs-heading-color);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (width>=1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (width>=1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (width>=1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (width>=1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{vertical-align:baseline;font-size:.75em;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{margin-top:0;margin-bottom:1rem;font-size:.875em;display:block;overflow:auto}pre code{font-size:inherit;color:inherit;word-break:normal}code{color:var(--bs-code-color);word-wrap:break-word;font-size:.875em}a>code{color:inherit}kbd{color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem;padding:.1875rem .375rem;font-size:.875em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{color:var(--bs-secondary-color);text-align:left;padding-top:.5rem;padding-bottom:.5rem}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;min-width:0;margin:0;padding:0}legend{float:left;width:100%;line-height:inherit;margin-bottom:.5rem;padding:0;font-size:calc(1.275rem + .3vw)}@media (width>=1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-text{padding:0}::-webkit-datetime-edit-minute{padding:0}::-webkit-datetime-edit-hour-field{padding:0}::-webkit-datetime-edit-day-field{padding:0}::-webkit-datetime-edit-month-field{padding:0}::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale()}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{text-transform:uppercase;font-size:.875em}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{color:#6c757d;margin-top:-1rem;margin-bottom:1rem;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto;padding:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{color:var(--bs-secondary-color);font-size:.875em}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-left:auto;margin-right:auto}@media (width>=576px){.container-sm,.container{max-width:540px}}@media (width>=768px){.container-md,.container-sm,.container{max-width:720px}}@media (width>=992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media (width>=1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media (width>=1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x));flex-wrap:wrap;display:flex}.row>*{width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y);flex-shrink:0}.col{flex:1 0 0}.row-cols-auto>*{flex:none;width:auto}.row-cols-1>*{flex:none;width:100%}.row-cols-2>*{flex:none;width:50%}.row-cols-3>*{flex:none;width:33.3333%}.row-cols-4>*{flex:none;width:25%}.row-cols-5>*{flex:none;width:20%}.row-cols-6>*{flex:none;width:16.6667%}.col-auto{flex:none;width:auto}.col-1{flex:none;width:8.33333%}.col-2{flex:none;width:16.6667%}.col-3{flex:none;width:25%}.col-4{flex:none;width:33.3333%}.col-5{flex:none;width:41.6667%}.col-6{flex:none;width:50%}.col-7{flex:none;width:58.3333%}.col-8{flex:none;width:66.6667%}.col-9{flex:none;width:75%}.col-10{flex:none;width:83.3333%}.col-11{flex:none;width:91.6667%}.col-12{flex:none;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.6667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333%}.offset-5{margin-left:41.6667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333%}.offset-8{margin-left:66.6667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333%}.offset-11{margin-left:91.6667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:.25rem}.g-1,.gy-1{--bs-gutter-y:.25rem}.g-2,.gx-2{--bs-gutter-x:.5rem}.g-2,.gy-2{--bs-gutter-y:.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (width>=576px){.col-sm{flex:1 0 0}.row-cols-sm-auto>*{flex:none;width:auto}.row-cols-sm-1>*{flex:none;width:100%}.row-cols-sm-2>*{flex:none;width:50%}.row-cols-sm-3>*{flex:none;width:33.3333%}.row-cols-sm-4>*{flex:none;width:25%}.row-cols-sm-5>*{flex:none;width:20%}.row-cols-sm-6>*{flex:none;width:16.6667%}.col-sm-auto{flex:none;width:auto}.col-sm-1{flex:none;width:8.33333%}.col-sm-2{flex:none;width:16.6667%}.col-sm-3{flex:none;width:25%}.col-sm-4{flex:none;width:33.3333%}.col-sm-5{flex:none;width:41.6667%}.col-sm-6{flex:none;width:50%}.col-sm-7{flex:none;width:58.3333%}.col-sm-8{flex:none;width:66.6667%}.col-sm-9{flex:none;width:75%}.col-sm-10{flex:none;width:83.3333%}.col-sm-11{flex:none;width:91.6667%}.col-sm-12{flex:none;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.6667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333%}.offset-sm-5{margin-left:41.6667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333%}.offset-sm-8{margin-left:66.6667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333%}.offset-sm-11{margin-left:91.6667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (width>=768px){.col-md{flex:1 0 0}.row-cols-md-auto>*{flex:none;width:auto}.row-cols-md-1>*{flex:none;width:100%}.row-cols-md-2>*{flex:none;width:50%}.row-cols-md-3>*{flex:none;width:33.3333%}.row-cols-md-4>*{flex:none;width:25%}.row-cols-md-5>*{flex:none;width:20%}.row-cols-md-6>*{flex:none;width:16.6667%}.col-md-auto{flex:none;width:auto}.col-md-1{flex:none;width:8.33333%}.col-md-2{flex:none;width:16.6667%}.col-md-3{flex:none;width:25%}.col-md-4{flex:none;width:33.3333%}.col-md-5{flex:none;width:41.6667%}.col-md-6{flex:none;width:50%}.col-md-7{flex:none;width:58.3333%}.col-md-8{flex:none;width:66.6667%}.col-md-9{flex:none;width:75%}.col-md-10{flex:none;width:83.3333%}.col-md-11{flex:none;width:91.6667%}.col-md-12{flex:none;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.6667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333%}.offset-md-5{margin-left:41.6667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333%}.offset-md-8{margin-left:66.6667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333%}.offset-md-11{margin-left:91.6667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (width>=992px){.col-lg{flex:1 0 0}.row-cols-lg-auto>*{flex:none;width:auto}.row-cols-lg-1>*{flex:none;width:100%}.row-cols-lg-2>*{flex:none;width:50%}.row-cols-lg-3>*{flex:none;width:33.3333%}.row-cols-lg-4>*{flex:none;width:25%}.row-cols-lg-5>*{flex:none;width:20%}.row-cols-lg-6>*{flex:none;width:16.6667%}.col-lg-auto{flex:none;width:auto}.col-lg-1{flex:none;width:8.33333%}.col-lg-2{flex:none;width:16.6667%}.col-lg-3{flex:none;width:25%}.col-lg-4{flex:none;width:33.3333%}.col-lg-5{flex:none;width:41.6667%}.col-lg-6{flex:none;width:50%}.col-lg-7{flex:none;width:58.3333%}.col-lg-8{flex:none;width:66.6667%}.col-lg-9{flex:none;width:75%}.col-lg-10{flex:none;width:83.3333%}.col-lg-11{flex:none;width:91.6667%}.col-lg-12{flex:none;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.6667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333%}.offset-lg-5{margin-left:41.6667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333%}.offset-lg-8{margin-left:66.6667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333%}.offset-lg-11{margin-left:91.6667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (width>=1200px){.col-xl{flex:1 0 0}.row-cols-xl-auto>*{flex:none;width:auto}.row-cols-xl-1>*{flex:none;width:100%}.row-cols-xl-2>*{flex:none;width:50%}.row-cols-xl-3>*{flex:none;width:33.3333%}.row-cols-xl-4>*{flex:none;width:25%}.row-cols-xl-5>*{flex:none;width:20%}.row-cols-xl-6>*{flex:none;width:16.6667%}.col-xl-auto{flex:none;width:auto}.col-xl-1{flex:none;width:8.33333%}.col-xl-2{flex:none;width:16.6667%}.col-xl-3{flex:none;width:25%}.col-xl-4{flex:none;width:33.3333%}.col-xl-5{flex:none;width:41.6667%}.col-xl-6{flex:none;width:50%}.col-xl-7{flex:none;width:58.3333%}.col-xl-8{flex:none;width:66.6667%}.col-xl-9{flex:none;width:75%}.col-xl-10{flex:none;width:83.3333%}.col-xl-11{flex:none;width:91.6667%}.col-xl-12{flex:none;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.6667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333%}.offset-xl-5{margin-left:41.6667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333%}.offset-xl-8{margin-left:66.6667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333%}.offset-xl-11{margin-left:91.6667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (width>=1400px){.col-xxl{flex:1 0 0}.row-cols-xxl-auto>*{flex:none;width:auto}.row-cols-xxl-1>*{flex:none;width:100%}.row-cols-xxl-2>*{flex:none;width:50%}.row-cols-xxl-3>*{flex:none;width:33.3333%}.row-cols-xxl-4>*{flex:none;width:25%}.row-cols-xxl-5>*{flex:none;width:20%}.row-cols-xxl-6>*{flex:none;width:16.6667%}.col-xxl-auto{flex:none;width:auto}.col-xxl-1{flex:none;width:8.33333%}.col-xxl-2{flex:none;width:16.6667%}.col-xxl-3{flex:none;width:25%}.col-xxl-4{flex:none;width:33.3333%}.col-xxl-5{flex:none;width:41.6667%}.col-xxl-6{flex:none;width:50%}.col-xxl-7{flex:none;width:58.3333%}.col-xxl-8{flex:none;width:66.6667%}.col-xxl-9{flex:none;width:75%}.col-xxl-10{flex:none;width:83.3333%}.col-xxl-11{flex:none;width:91.6667%}.col-xxl-12{flex:none;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.6667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333%}.offset-xxl-5{margin-left:41.6667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333%}.offset-xxl-8{margin-left:66.6667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333%}.offset-xxl-11{margin-left:91.6667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), .05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), .1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), .075);vertical-align:top;border-color:var(--bs-table-border-color);width:100%;margin-bottom:1rem}.table>:not(caption)>*>*{color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)));padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*,.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a5b5cc;--bs-table-striped-bg:#c4d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe5;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b4b6b7;--bs-table-striped-bg:#d6d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbcdce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a5c4ca;--bs-table-striped-bg:#c4e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e6c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dab9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece0be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc1c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7c9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media (width<=575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=1399.98px){.table-responsive-xxl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));font-size:inherit;margin-bottom:0;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{color:var(--bs-secondary-color);margin-top:.25rem;font-size:.875em}.form-control{width:100%;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-clip:padding-box;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{padding:0;display:block}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{margin:-.375rem -.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;margin-inline-end:.75rem;padding:.375rem .75rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{width:100%;color:var(--bs-body-color);border:solid #0000;border-width:var(--bs-border-width) 0;background-color:#0000;margin-bottom:0;padding:.375rem 0;line-height:1.5;display:block}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-left:0;padding-right:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.form-control-sm::file-selector-button{margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color::-webkit-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");width:100%;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon,none);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:#0000;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{border-radius:var(--bs-border-radius-sm);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{border-radius:var(--bs-border-radius-lg);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{min-height:1.5rem;margin-bottom:.125rem;padding-left:1.5em;display:block}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{text-align:right;padding-left:0;padding-right:1.5em}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;print-color-adjust:exact;background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;width:1em;height:1em;margin-top:.25em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");background-color:#0d6efd;border-color:#0d6efd}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-image:var(--bs-form-switch-bg);background-position:0;border-radius:2em;width:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28134, 182.5, 254%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{margin-right:1rem;display:inline-block}.btn-check{clip:rect(0, 0, 0, 0);pointer-events:none;position:absolute}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{appearance:none;background-color:#0000;width:100%;height:1.5rem;padding:0}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;margin-top:-.25rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range::-moz-range-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{z-index:2;max-width:100%;height:100%;color:rgba(var(--bs-body-color-rgb), .65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;padding:1rem .75rem;transition:opacity .1s ease-in-out,transform .1s ease-in-out;position:absolute;top:0;left:0;overflow:hidden}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:#0000}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),:-webkit-any(.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),:is(.form-floating>.form-control:autofill,.form-floating>.form-control-plaintext:autofill){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem;padding-left:.75rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>textarea:focus~label:after,.form-floating>textarea:not(:placeholder-shown)~label:after{z-index:-1;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius);height:1.5em;position:absolute;inset:1rem .375rem}.form-floating>textarea:disabled~label:after{background-color:var(--bs-secondary-bg)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.input-group{flex-wrap:wrap;align-items:stretch;width:100%;display:flex;position:relative}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{flex:auto;width:1%;min-width:0;position:relative}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{z-index:2;position:relative}.input-group .btn:focus{z-index:5}.input-group-text{color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;display:flex}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(-1 * var(--bs-border-width));border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{width:100%;color:var(--bs-form-valid-color);margin-top:.25rem;font-size:.875em;display:none}.valid-tooltip{z-index:5;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--bs-form-valid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), .25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), .25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(1.5em + 3.75rem)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--bs-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), .25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{width:100%;color:var(--bs-form-invalid-color);margin-top:.25rem;font-size:.875em;display:none}.invalid-tooltip{z-index:5;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--bs-form-invalid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), .25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), .25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(1.5em + 3.75rem)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--bs-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), .25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 #ffffff26, 0 1px 1px #00000013;--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:inline-block}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49, 132, 253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130, 138, 145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60, 153, 110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11, 172, 204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217, 164, 6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225, 83, 97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211, 212, 213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66, 70, 73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13, 110, 253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108, 117, 125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25, 135, 84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13, 202, 240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255, 193, 7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220, 53, 69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248, 249, 250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33, 37, 41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49, 132, 253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y:.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y:.25rem;--bs-btn-padding-x:.5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;transition:height .35s;overflow:hidden}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top-color:currentColor;border-bottom:0;margin-left:.255em;display:inline-block}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:.5rem;--bs-dropdown-spacer:.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:.5rem;z-index:var(--bs-dropdown-zindex);min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;background-color:var(--bs-dropdown-bg);border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);background-clip:padding-box;margin:0;list-style:none;display:none;position:absolute}.dropdown-menu[data-bs-popper]{margin-top:var(--bs-dropdown-spacer);top:100%;left:0}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media (width>=576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media (width>=768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media (width>=992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media (width>=1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}@media (width>=1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:auto;right:0}}.dropup .dropdown-menu[data-bs-popper]{margin-top:0;margin-bottom:var(--bs-dropdown-spacer);top:auto;bottom:100%}.dropup .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top:0;border-bottom-color:currentColor;margin-left:.255em;display:inline-block}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{margin-top:0;margin-left:var(--bs-dropdown-spacer);top:0;left:100%;right:auto}.dropend .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-left-color:currentColor;border-right:0;margin-left:.255em;display:inline-block}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{margin-top:0;margin-right:var(--bs-dropdown-spacer);top:0;left:auto;right:100%}.dropstart .dropdown-toggle:after{vertical-align:.255em;content:"";margin-left:.255em;display:none}.dropstart .dropdown-toggle:before{vertical-align:.255em;content:"";border-top:.3em solid #0000;border-bottom:.3em solid #0000;border-right:.3em solid;margin-right:.255em;display:inline-block}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1;overflow:hidden}.dropdown-item{width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;color:var(--bs-dropdown-link-color);text-align:inherit;white-space:nowrap;border-radius:var(--bs-dropdown-item-border-radius,0);background-color:#0000;border:0;font-weight:400;text-decoration:none;display:block}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);background-color:var(--bs-dropdown-link-active-bg);text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:#0000}.dropdown-menu.show{display:block}.dropdown-header{padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);color:var(--bs-dropdown-header-color);white-space:nowrap;margin-bottom:0;font-size:.875rem;display:block}.dropdown-item-text{padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color);display:block}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:#ffffff26;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{vertical-align:middle;display:inline-flex;position:relative}.btn-group>.btn,.btn-group-vertical>.btn{flex:auto;position:relative}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{flex-wrap:wrap;justify-content:flex-start;display:flex}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(-1 * var(--bs-border-width))}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{flex-direction:column;justify-content:center;align-items:flex-start}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(-1 * var(--bs-border-width))}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);flex-wrap:wrap;margin-bottom:0;padding-left:0;list-style:none;display:flex}.nav-link{padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);background:0 0;border:0;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{border-bottom:var(--bs-nav-underline-border-width) solid transparent;padding-left:0;padding-right:0}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentColor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentColor;font-weight:700}.nav-fill>.nav-link,.nav-fill .nav-item{text-align:center;flex:auto}.nav-justified>.nav-link,.nav-justified .nav-item{text-align:center;flex-grow:1;flex-basis:0}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), .65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), .8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), .3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:.5rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), .15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:.25rem;--bs-navbar-toggler-transition:box-shadow .15s ease-in-out;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);flex-wrap:wrap;justify-content:space-between;align-items:center;display:flex;position:relative}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{flex-wrap:inherit;justify-content:space-between;align-items:center;display:flex}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);white-space:nowrap;text-decoration:none}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);flex-direction:column;margin-bottom:0;padding-left:0;list-style:none;display:flex}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{color:var(--bs-navbar-color);padding-top:.5rem;padding-bottom:.5rem}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);color:var(--bs-navbar-color);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition);background-color:#0000;line-height:1}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width);outline:0;text-decoration:none}.navbar-toggler-icon{vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-position:50%;background-repeat:no-repeat;background-size:100%;width:1.5em;height:1.5em;display:inline-block}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (width>=576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:#ffffff8c;--bs-navbar-hover-color:#ffffffbf;--bs-navbar-disabled-color:#ffffff40;--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:#ffffff1a;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), .03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:.75rem;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);background-clip:border-box;flex-direction:column;display:flex;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius);border-top-width:0}.card>.list-group:last-child{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color);flex:auto}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));color:var(--bs-card-subtitle-color);margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color);margin-bottom:0}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius);position:absolute;inset:0}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (width>=576px){.card-group{flex-flow:wrap;display:flex}.card-group>.card{flex:1 0 0;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)>.card-img-top,.card-group>.card:not(:last-child)>.card-header{border-top-right-radius:0}.card-group>.card:not(:last-child)>.card-img-bottom,.card-group>.card:not(:last-child)>.card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)>.card-img-top,.card-group>.card:not(:first-child)>.card-header{border-top-left-radius:0}.card-group>.card:not(:first-child)>.card-img-bottom,.card-group>.card:not(:first-child)>.card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform .2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%285.2, 44, 101.2%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);overflow-anchor:none;transition:var(--bs-accordion-transition);border:0;border-radius:0;align-items:center;font-size:1rem;display:flex;position:relative}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition);flex-shrink:0;margin-left:auto}@media (prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;box-shadow:var(--bs-accordion-btn-focus-box-shadow);outline:0}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-left:0;border-right:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius);flex-wrap:wrap;list-style:none;display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/") }.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:.75rem;--bs-pagination-padding-y:.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);padding-left:0;list-style:none;display:flex}.page-link{padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block;position:relative}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);box-shadow:var(--bs-pagination-focus-box-shadow);outline:0}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:.5rem;--bs-pagination-padding-y:.25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:.65em;--bs-badge-padding-y:.35em;--bs-badge-font-size:.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius);line-height:1;display:inline-block}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);position:relative}.alert-heading{color:inherit}.alert-link{color:var(--bs-alert-link-color);font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{z-index:2;padding:1.25rem 1rem;position:absolute;top:0;right:0}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width .6s ease;height:var(--bs-progress-height);font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);display:flex;overflow:hidden}.progress-bar{color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition);flex-direction:column;justify-content:center;display:flex;overflow:hidden}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 25% 50%,#ffffff26 50% 75%,#0000 75%,#0000);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;border-radius:var(--bs-list-group-border-radius);flex-direction:column;margin-bottom:0;padding-left:0;display:flex}.list-group-numbered{counter-reset:section;list-style-type:none}.list-group-numbered>.list-group-item:before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);text-decoration:none;display:block;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):hover,.list-group-item-action:not(.active):focus{z-index:1;color:var(--bs-list-group-action-hover-color);background-color:var(--bs-list-group-action-hover-bg);text-decoration:none}.list-group-item-action:not(.active):active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (width>=576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem #0d6efd40;--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;box-sizing:content-box;width:1em;height:1em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;filter:var(--bs-btn-close-filter);opacity:var(--bs-btn-close-opacity);border:0;border-radius:.375rem;padding:.25em}.btn-close:hover{color:var(--bs-btn-close-color);opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.btn-close:disabled,.btn-close.disabled{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}:root,[data-bs-theme=light]{--bs-btn-close-filter: }[data-bs-theme=dark]{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:.75rem;--bs-toast-padding-y:.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius);background-clip:padding-box}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;z-index:var(--bs-toast-zindex);pointer-events:none;width:max-content;max-width:100%;position:absolute}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));background-clip:padding-box;align-items:center;display:flex}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:.5rem;--bs-modal-color:var(--bs-body-color);--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);z-index:var(--bs-modal-zindex);outline:0;width:100%;height:100%;display:none;position:fixed;top:0;left:0;overflow:hidden auto}.modal-dialog{width:auto;margin:var(--bs-modal-margin);pointer-events:none;position:relative}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{min-height:calc(100% - var(--bs-modal-margin) * 2);align-items:center;display:flex}.modal-content{width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:relative}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:.5;z-index:var(--bs-backdrop-zindex);background-color:var(--bs-backdrop-bg);width:100vw;height:100vh;position:fixed;top:0;left:0}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius);flex-shrink:0;align-items:center;display:flex}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--bs-modal-header-padding-y));margin-right:calc(-.5 * var(--bs-modal-header-padding-x));margin-bottom:calc(-.5 * var(--bs-modal-header-padding-y));margin-left:auto}.modal-title{line-height:var(--bs-modal-title-line-height);margin-bottom:0}.modal-body{padding:var(--bs-modal-padding);flex:auto;position:relative}.modal-footer{padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius);flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;display:flex}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (width>=576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-left:auto;margin-right:auto}.modal-sm{--bs-modal-width:300px}}@media (width>=992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (width>=1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (width<=575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (width<=767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (width<=991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (width<=1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (width<=1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:.5rem;--bs-tooltip-padding-y:.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:.9;--bs-tooltip-arrow-width:.8rem;--bs-tooltip-arrow-height:.4rem;z-index:var(--bs-tooltip-zindex);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0;text-decoration:none;display:block}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height);display:block}.tooltip .tooltip-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg);top:-1px}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg);right:-1px}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg);bottom:-1px}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg);left:-1px}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);background-clip:padding-box;text-decoration:none;display:block}.popover .popover-arrow{width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height);display:block}.popover .popover-arrow:before,.popover .popover-arrow:after{content:"";border:0 solid #0000;display:block;position:absolute}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{border-top-color:var(--bs-popover-arrow-border);bottom:0}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{border-right-color:var(--bs-popover-arrow-border);left:0}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{border-bottom-color:var(--bs-popover-arrow-border);top:0}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg);display:block;position:absolute;top:0;left:50%}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{border-left-color:var(--bs-popover-arrow-border);right:0}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius);margin-bottom:0}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{width:100%;position:relative;overflow:hidden}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{float:left;backface-visibility:hidden;width:100%;margin-right:-100%;transition:transform .6s ease-in-out;display:none;position:relative}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{z-index:1;color:#fff;text-align:center;width:15%;filter:var(--bs-carousel-control-icon-filter);opacity:.5;background:0 0;border:0;justify-content:center;align-items:center;padding:0;transition:opacity .15s;display:flex;position:absolute;top:0;bottom:0}@media (prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:2rem;height:2rem;display:inline-block}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.carousel-indicators{z-index:2;justify-content:center;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;display:flex;position:absolute;bottom:0;left:0;right:0}.carousel-indicators [data-bs-target]{box-sizing:content-box;text-indent:-999px;cursor:pointer;background-color:var(--bs-carousel-indicator-active-bg);opacity:.5;background-clip:padding-box;border:10px solid #0000;border-left:0;border-right:0;flex:0 auto;width:30px;height:3px;margin-left:3px;margin-right:3px;padding:0;transition:opacity .6s}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{color:var(--bs-carousel-caption-color);text-align:center;padding-top:1.25rem;padding-bottom:1.25rem;position:absolute;bottom:1.25rem;left:15%;right:15%}.carousel-dark{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}:root,[data-bs-theme=light]{--bs-carousel-indicator-active-bg:#fff;--bs-carousel-caption-color:#fff;--bs-carousel-control-icon-filter: }[data-bs-theme=dark]{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}.spinner-grow,.spinner-border{width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);border-radius:50%;flex-shrink:0;display:inline-block}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-border-width:.25em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:#0000}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-grow;opacity:0;background-color:currentColor}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform .3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (width<=575.98px){.offcanvas-sm{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (width<=575.98px){.offcanvas-sm.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-sm.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-sm.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media (width>=576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=767.98px){.offcanvas-md{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (width<=767.98px){.offcanvas-md.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-md.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-md.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media (width>=768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=991.98px){.offcanvas-lg{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (width<=991.98px){.offcanvas-lg.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-lg.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-lg.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media (width>=992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=1199.98px){.offcanvas-xl{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (width<=1199.98px){.offcanvas-xl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media (width>=1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=1399.98px){.offcanvas-xxl{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (width<=1399.98px){.offcanvas-xxl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xxl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media (width>=1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}.offcanvas{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{z-index:1040;background-color:#000;width:100vw;height:100vh;position:fixed;top:0;left:0}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);align-items:center;display:flex}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:auto}.offcanvas-title{line-height:var(--bs-offcanvas-title-line-height);margin-bottom:0}.offcanvas-body{padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);flex-grow:1;overflow-y:auto}.placeholder{vertical-align:middle;cursor:wait;opacity:.5;background-color:currentColor;min-height:1em;display:inline-block}.placeholder.btn:before{content:"";display:inline-block}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:2s ease-in-out infinite placeholder-glow}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{animation:2s linear infinite placeholder-wave;-webkit-mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.clearfix:after{clear:both;content:"";display:block}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity,1))!important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity,1))!important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity,1))!important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity,1))!important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity,1))!important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity,1))!important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity,1))!important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity,1))!important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,.75))!important}.focus-ring:focus{box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);outline:0}.icon-link{-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity,.5));text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden;align-items:center;gap:.375rem;display:inline-flex}.icon-link>.bi{fill:currentColor;flex-shrink:0;width:1em;height:1em;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em, 0, 0))}.ratio{width:100%;position:relative}.ratio:before{padding-top:var(--bs-aspect-ratio);content:"";display:block}.ratio>*{width:100%;height:100%;position:absolute;top:0;left:0}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571%}.fixed-top{z-index:1030;position:fixed;top:0;left:0;right:0}.fixed-bottom{z-index:1030;position:fixed;bottom:0;left:0;right:0}.sticky-top{z-index:1020;position:sticky;top:0}.sticky-bottom{z-index:1020;position:sticky;bottom:0}@media (width>=576px){.sticky-sm-top{z-index:1020;position:sticky;top:0}.sticky-sm-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=768px){.sticky-md-top{z-index:1020;position:sticky;top:0}.sticky-md-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=992px){.sticky-lg-top{z-index:1020;position:sticky;top:0}.sticky-lg-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=1200px){.sticky-xl-top{z-index:1020;position:sticky;top:0}.sticky-xl-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=1400px){.sticky-xxl-top{z-index:1020;position:sticky;top:0}.sticky-xxl-bottom{z-index:1020;position:sticky;bottom:0}}.hstack{flex-direction:row;align-self:stretch;align-items:center;display:flex}.vstack{flex-direction:column;flex:auto;align-self:stretch;display:flex}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0, 0, 0, 0)!important;white-space:nowrap!important;border:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;overflow:hidden!important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute!important}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!important}.stretched-link:after{z-index:1;content:"";position:absolute;inset:0}.text-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vr{width:var(--bs-border-width);opacity:.25;background-color:currentColor;align-self:stretch;min-height:1em;display:inline-block}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:.1}.border-opacity-25{--bs-border-opacity:.25}.border-opacity-50{--bs-border-opacity:.5}.border-opacity-75{--bs-border-opacity:.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:#00000080!important}.text-white-50{--bs-text-opacity:1;color:#ffffff80!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:.25}.text-opacity-50{--bs-text-opacity:.5}.text-opacity-75{--bs-text-opacity:.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity:.1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity:.25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity:.5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity:.75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:.1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:.25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:.5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:.75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:#0000!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:.1}.bg-opacity-25{--bs-bg-opacity:.25}.bg-opacity-50{--bs-bg-opacity:.5}.bg-opacity-75{--bs-bg-opacity:.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-top-left-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (width>=576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (width>=768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (width>=992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (width>=1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (width>=1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (width>=1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}html[data-theme=light]{--bg:#fbf9f4;--surface:#fff;--surface-2:#f3efe6;--border:#e3ddcf;--border-soft:#ebe6da;--text:#0b0b0b;--text-muted:#5b564d;--text-dim:#8a8478;--brand-red:#c71f38;--amber:#c71f38;--teal:#a33c4b;--periwinkle:#4a463e;--rose:#c97c89;--sage:#8c1729;--amber-dim:#c71f381f;--teal-dim:#a33c4b1f;--nav-bg:#fbf9f4db;--on-accent:#fbf6f0}html[data-theme=dark]{--bg:#0b0b0b;--surface:#161616;--surface-2:#1e1e1e;--border:#2c2c2c;--border-soft:#232323;--text:#f1eee8;--text-muted:#9a948d;--text-dim:#66605a;--brand-red:#c71f38;--amber:#da3550;--teal:#e8637a;--periwinkle:#5c5854;--rose:#f0a9b6;--sage:#8c1729;--amber-dim:#da355029;--teal-dim:#e8637a29;--nav-bg:#0b0b0bdb}html{background:var(--bg);scroll-behavior:smooth;--maxw:1180px;--radius:12px;--mono:"Space Grotesk", sans-serif;--sans:"Barlow", -apple-system, sans-serif;transition:background .2s}body{background:var(--bg);color:var(--text);font-family:var(--sans);-webkit-font-smoothing:antialiased;margin:0;font-size:16px;line-height:1.6;transition:background .2s,color .2s}*{box-sizing:border-box;transition:background-color .2s,border-color .2s,color .2s}a{color:inherit;text-decoration:none}img{max-width:100%;display:block}.wrap{max-width:var(--maxw);margin:0 auto;padding:0}.eyebrow{font-family:var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--teal);align-items:center;gap:8px;font-size:12px;display:inline-flex}.eyebrow:before{content:"";background:var(--teal);width:6px;height:6px;box-shadow:0 0 0 3px var(--teal-dim);border-radius:50%}h1,h2,h3,h4{font-family:var(--mono);color:var(--text);letter-spacing:-.01em;margin:0;font-weight:600}p{color:var(--text-muted);margin:0}section{padding:88px 0}.section-head{max-width:640px;margin-bottom:48px}.section-head h2{margin-top:14px;font-size:30px}.section-head p{margin-top:14px;font-size:16.5px}header{z-index:50;background:var(--nav-bg);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid var(--border-soft);position:sticky;top:0}.logo{align-items:center;display:flex}.logo-full{flex-shrink:0;width:auto;height:26px}.navbar{min-height:72px;padding-top:0;padding-bottom:0}.navbar-nav .nav-link{color:var(--text-muted);white-space:nowrap;font-size:14.5px;transition:color .15s}.navbar-nav .nav-link:hover{color:var(--text)}@media (width>=992px){.navbar-nav{gap:30px}.navbar-nav .nav-link{padding-left:0;padding-right:0}}.nav-cta{font-family:var(--mono);border:1px solid var(--amber);border-radius:999px;font-size:13.5px;font-weight:500;transition:background .15s,color .15s;color:var(--amber)!important;padding:9px 18px!important}.nav-cta:hover{background:var(--amber);color:var(--on-accent)!important}.navbar-toggler{border:none;padding:8px}.navbar-toggler:focus{box-shadow:none}html[data-theme=light] .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(11,11,11,1)' stroke-width='2' stroke-linecap='round' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html[data-theme=dark] .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(241,238,232,1)' stroke-width='2' stroke-linecap='round' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}@media (width<=991.98px){:is(header:has(.navbar-collapse.show),header:has(.navbar-collapse.collapsing)){background:var(--bg);-webkit-backdrop-filter:none;backdrop-filter:none}.navbar-collapse{background:var(--bg);border-top:1px solid var(--border-soft);margin:0 -28px;padding:0 28px}.navbar-nav{padding:10px 0 20px}.navbar-nav .nav-link{border-bottom:1px solid var(--border-soft);padding:14px 0;font-size:16px}.navbar-nav .nav-cta{text-align:center;border:1px solid var(--amber);border-radius:999px;width:100%;margin-top:16px;padding:12px 18px;font-size:14.5px;transition:background .15s,color .15s;display:block;color:var(--amber)!important}}.theme-toggle{border:1px solid var(--border);width:38px;height:38px;color:var(--text-muted);cursor:pointer;background:0 0;border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;transition:border-color .15s,color .15s;display:flex}.theme-toggle:hover{border-color:var(--text-muted);color:var(--text)}.theme-toggle svg{width:18px;height:18px}.theme-toggle .icon-moon,html[data-theme=light] .theme-toggle .icon-sun{display:none}html[data-theme=light] .theme-toggle .icon-moon{display:block}.btn{font-family:var(--mono);border:1px solid var(--border);white-space:nowrap;border-radius:8px;align-items:center;gap:8px;padding:11px 20px;font-size:13.5px;font-weight:500;transition:border-color .15s,background .15s,transform .15s;display:inline-flex}.btn:hover{transform:translateY(-1px)}.btn svg{width:15px;height:15px}.btn-primary{background:var(--amber);color:var(--on-accent);border-color:var(--amber);font-weight:600}.btn-primary:hover{background:var(--amber);box-shadow:0 6px 20px var(--amber-dim)}.btn-ghost{color:var(--text)}.btn-ghost:hover{border-color:var(--text-muted)}.btn-sm{border-radius:7px;padding:8px 14px;font-size:12.5px}.hero{padding:76px 0 40px}.hero h1{letter-spacing:-.02em;margin-top:18px;font-size:44px;line-height:1.15}.hero p.sub{max-width:520px;color:var(--text-muted);margin-top:20px;font-size:18px}.hero-grid{grid-template-columns:1.05fr .95fr;align-items:center;gap:64px;display:grid}.hero-ctas{flex-wrap:wrap;gap:14px;margin-top:32px;display:flex}.hero-stack-note{font-family:var(--mono);color:var(--text-dim);flex-wrap:wrap;gap:18px;margin-top:34px;font-size:12.5px;display:flex}.hero-stack-note span{color:var(--text-muted)}.pipeline{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:26px 26px 30px;position:relative}.pipeline-label{font-family:var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--text-dim);justify-content:space-between;margin-bottom:18px;font-size:11px;display:flex}.pipeline-track{padding-left:28px;position:relative}.pipeline-track:before{content:"";background:linear-gradient(180deg, var(--sage), var(--brand-red));opacity:.5;width:2px;position:absolute;top:10px;bottom:10px;left:9px}.pl-step{background:var(--surface-2);border:1px solid var(--border-soft);border-radius:9px;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px;padding:13px 16px;display:flex;position:relative}.pl-step:last-child{margin-bottom:0}.pl-step:before{content:"";background:var(--bg);border:2px solid var(--teal);border-radius:50%;width:9px;height:9px;position:absolute;top:50%;left:-23px;transform:translateY(-50%)}.pl-step .name{font-family:var(--mono);color:var(--text);font-size:13.5px;font-weight:500}.pl-step .tag{font-family:var(--mono);color:var(--text-dim);font-size:10.5px}.pl-packet{background:var(--brand-red);border-radius:50%;width:14px;height:14px;animation:5s ease-in-out infinite travel;position:absolute;left:2px;box-shadow:0 0 12px 2px #c71f3838}@keyframes travel{0%{opacity:0;top:8px}6%{opacity:1}46%{opacity:1;top:calc(100% - 22px)}50%{opacity:0}50.01%{top:8px}56%{opacity:1}96%{opacity:1;top:calc(100% - 22px)}to{opacity:0;top:calc(100% - 22px)}}@media (prefers-reduced-motion:reduce){.pl-packet{opacity:1;animation:none;top:8px}html{scroll-behavior:auto}}.split{grid-template-columns:1.1fr .9fr;align-items:start;gap:64px;display:grid}.split h2{font-size:28px}.split .lede{color:var(--text-muted);margin-top:16px;font-size:17px;line-height:1.7}.extending{font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim);align-items:center;gap:12px;margin-top:26px;font-size:12px;display:flex}.extending .extending-logo{text-transform:none;align-items:center;display:flex}.extending .extending-logo img{width:auto;height:36px;display:block}.extending .lockup{font-family:var(--mono);color:var(--text);text-transform:none;letter-spacing:0;font-size:15px;font-weight:600}.extending .lockup .x{color:var(--text-dim);margin:0 6px;font-weight:400}.traits{grid-template-columns:1fr 1fr;gap:14px;display:grid}.trait{background:var(--surface);border:1px solid var(--border);text-align:left;border-radius:12px;padding:22px 18px}.trait .icon{margin-bottom:12px}.trait p{font-family:var(--mono);color:var(--text);font-size:13px;font-weight:500;line-height:1.4}.products-grid{grid-template-columns:repeat(3,1fr);gap:18px;display:grid}.card{background:var(--surface);border:1px solid var(--border);border-top:3px solid var(--accent,var(--teal));border-radius:var(--radius);flex-direction:column;height:100%;padding:26px 24px 24px;display:flex}.card .card-top{justify-content:space-between;align-items:flex-start;margin-bottom:14px;display:flex}.card h3{color:var(--text);font-size:20px}.card .kicker{font-family:var(--mono);color:var(--text-dim);letter-spacing:.1em;text-transform:uppercase;margin-bottom:6px;font-size:10.5px;display:block}.card p.desc{flex-grow:1;font-size:14.5px;line-height:1.65}.card .card-btns{flex-wrap:wrap;gap:8px;margin-top:20px;display:flex}.badges{flex-wrap:wrap;gap:5px;margin-bottom:16px;display:flex}.badges img{border-radius:3px;height:19px}.standards-grid{background:var(--border);border:1px solid var(--border);border-radius:var(--radius);grid-template-columns:repeat(3,1fr);gap:1px;display:grid;overflow:hidden}.standard{background:var(--surface);padding:30px 26px}.standard h4{color:var(--text);margin-bottom:10px;font-size:16px}.standard h4 a{color:inherit;border-bottom:1px solid var(--border)}.standard h4 a:hover{color:var(--amber);border-color:var(--amber)}.standard p{font-size:14px;line-height:1.65}.standard .get-started{font-family:var(--mono);color:var(--text-dim);margin-top:14px;font-size:12px}.standard .get-started a{color:var(--teal)}.standard .get-started a:hover{text-decoration:underline}.components-grid{grid-template-columns:1fr 1fr;gap:0 40px;display:grid}details.acc{border-bottom:1px solid var(--border-soft)}details.acc summary{cursor:pointer;font-family:var(--mono);color:var(--text);justify-content:space-between;align-items:center;padding:18px 0;font-size:15px;font-weight:500;list-style:none;display:flex}details.acc summary::-webkit-details-marker{display:none}details.acc summary .chev{color:var(--text-dim);font-size:18px;transition:transform .2s}details.acc[open] summary .chev{color:var(--amber);transform:rotate(45deg)}.acc-body{padding:0 0 20px}.pkg-row{border-top:1px solid var(--border-soft);justify-content:space-between;gap:16px;padding:9px 0;display:flex}.pkg-row:first-child{border-top:none}.pkg-row a{font-family:var(--mono);color:var(--teal);white-space:nowrap;font-size:13.5px}.pkg-row a:hover{text-decoration:underline}.pkg-row .pkg-desc{color:var(--text-muted);text-align:right;font-size:13px}.posts-grid{grid-template-columns:repeat(3,1fr);gap:20px;display:grid}.posts-grid-2-col{grid-template-columns:repeat(2,1fr);gap:20px;display:grid}.post-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;transition:border-color .15s}.post-card:hover{border-color:var(--text-dim)}.post-card h4{color:var(--text);margin-top:10px;font-size:16.5px;line-height:1.4}.post-card p{margin-top:10px;font-size:13.5px;line-height:1.6}.post-card .read-more{font-family:var(--mono);color:var(--amber);margin-top:14px;margin-left:2px;font-size:12px;display:inline-block}.post-date{font-family:var(--mono);color:var(--text-dim);letter-spacing:.06em;text-transform:uppercase;font-size:11.5px}.about-band{background:var(--surface);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft)}.about-inner{grid-template-columns:1fr 1.3fr;align-items:center;gap:56px;display:grid}.about-inner h2{margin-top:14px;font-size:26px;line-height:1.3}.about-inner .about-text{font-size:15px;line-height:1.75}.about-inner .about-cta{margin-top:22px}footer{padding:50px 0 40px}.footer-top{border-bottom:1px solid var(--border-soft);flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:30px;padding-bottom:34px;display:flex}.footer-copy{color:var(--text-dim);max-width:460px;font-size:13px;line-height:1.8}.footer-copy a{color:var(--text-muted);border-bottom:1px solid var(--border)}.footer-social{gap:12px;display:flex}.footer-social a{border:1px solid var(--border);width:38px;height:38px;color:var(--text);border-radius:9px;justify-content:center;align-items:center;transition:border-color .15s,color .15s;display:flex}.footer-social a:hover{border-color:var(--teal);color:var(--teal)}.footer-social svg{width:17px;height:17px}.footer-bottom{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;padding-top:24px;display:flex}.footer-bottom .sponsor{font-family:var(--mono);color:var(--text-dim);font-size:12px}.footer-bottom .sponsor a{color:var(--text-muted);border-bottom:1px solid var(--border)}@media (width<=980px){.hero-grid{grid-template-columns:1fr;gap:44px}.hero{padding-top:44px}.split{grid-template-columns:1fr;gap:40px}.products-grid,.standards-grid{grid-template-columns:repeat(2,1fr)}.posts-grid{grid-template-columns:1fr}.about-inner{grid-template-columns:1fr;gap:26px}}@media (width<=700px){.wrap{padding:0 16px}.hero h1{font-size:32px}.products-grid,.standards-grid,.components-grid{grid-template-columns:1fr}section{padding:56px 0}.pkg-row{flex-direction:column;gap:2px}.pkg-row .pkg-desc{text-align:left}}:focus-visible{outline:2px solid var(--amber);outline-offset:2px}.icon{flex-shrink:0;width:18px;height:18px}.icon-lg{width:50px;height:50px}.icon-jetbrains{min-width:100px}[data-theme=light] .icon{filter:none}[data-theme=dark] .icon{filter:invert()}.contact-grid{grid-template-columns:1fr 1fr;gap:18px;display:grid}@media (width<=700px){.contact-grid{grid-template-columns:1fr}}.contact-card{text-align:center;align-items:center}.contact-card svg{width:40px;height:40px;color:var(--teal);margin-bottom:14px}.contact-card .card-btns{justify-content:center}.approach-card{margin-top:18px}.approach-card h3{margin-bottom:10px}.latest-posts{margin-top:48px}.latest-posts .section-head{margin-bottom:24px}.latest-posts .posts-grid{grid-template-columns:repeat(2,1fr)}@media (width<=700px){.latest-posts .posts-grid{grid-template-columns:1fr}}.sidebar{flex-direction:column;gap:34px;display:flex}@media (width<=900px){.sidebar{order:2}}.widget{border-bottom:1px solid var(--border-soft);padding-bottom:28px}.widget:last-child{border-bottom:none;padding-bottom:0}.widget ul{margin:0;padding:0;list-style:none}.widget-title{font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim);margin-bottom:16px;font-size:11.5px}.search-form{border:1px solid var(--border);border-radius:8px;display:flex;overflow:hidden}.search-form input{min-width:0;color:var(--text);font-family:var(--sans);background:0 0;border:none;flex:1;padding:10px 12px;font-size:14px}.search-form input:focus{outline:none}.search-form button{background:var(--surface-2);color:var(--text-muted);cursor:pointer;font-family:var(--mono);border:none;padding:0 14px;font-size:12px}.search-form button:hover{color:var(--amber)}.widget-recent ul{flex-direction:column;gap:14px;display:flex}.widget-recent li a{color:var(--text);font-size:14px;line-height:1.4;display:block}.widget-recent li a:hover{color:var(--amber)}.widget-recent li .post-date{font-family:var(--mono);color:var(--text-dim);margin-top:4px;font-size:11px;display:block}.widget-categories li{border-bottom:1px solid var(--border-soft)}.widget-categories li:last-child{border-bottom:none}.widget-categories li.current a{color:var(--amber);font-weight:600}.widget-categories li a{color:var(--text-muted);justify-content:space-between;align-items:center;gap:10px;padding:9px 0;font-size:14px;display:flex}.widget-categories li a:hover{color:var(--text)}.widget-categories .cat-count{min-width:28px;font-family:var(--mono);text-align:center;color:var(--text-dim);background:var(--surface-2);border:1px solid var(--border-soft);border-radius:999px;flex-shrink:0;padding:1px 9px;font-size:11px;display:inline-block}.widget-categories li a:hover .cat-count{color:var(--text)}.widget-more{margin-top:14px}.widget-more a{font-family:var(--mono);color:var(--amber);font-size:12px}.widget-more a:hover{text-decoration:underline}.no-articles{color:var(--text-dim);font-size:13.5px}.widget-connect ul{flex-direction:column;gap:12px;display:flex}.widget-connect li a{color:var(--text-muted);align-items:center;gap:10px;font-size:14px;display:flex}.widget-connect li a:hover{color:var(--text)}.widget-connect li a svg{width:17px;height:17px;color:var(--teal);flex-shrink:0}.widget-approach p{color:var(--text-muted);margin-bottom:12px;font-size:13.5px;line-height:1.7}.widget-approach p:last-child{margin-bottom:0}.breadcrumb-back{font-family:var(--mono);color:var(--text-dim);align-items:center;gap:6px;font-size:13px;display:inline-flex}.breadcrumb-back:hover{color:var(--amber)}.breadcrumb-back svg{width:14px;height:14px}.post-hero{border-bottom:1px solid var(--border-soft);padding:40px 0}.post-hero h1{max-width:820px;margin-top:16px;font-size:38px;line-height:1.2}@media (width<=900px){.post-hero h1{font-size:28px}}.post-meta{font-family:var(--mono);color:var(--text-dim);flex-wrap:wrap;align-items:center;gap:6px 14px;margin-top:22px;font-size:13px;display:flex}.post-meta a{color:var(--text-muted)}.post-meta a:hover{color:var(--amber)}.post-meta .featured-tag{color:var(--brand-red);font-weight:600}.post-body-wrap{padding:52px 0 72px}.post-layout{grid-template-columns:270px 1fr;align-items:start;gap:64px;display:grid}@media (width<=900px){.post-layout{grid-template-columns:1fr;gap:44px}.article{order:1}}.entry{max-width:720px}@media (width<=900px){.entry{max-width:100%}}.entry h2{font-family:var(--mono);color:var(--text);margin-top:48px;margin-bottom:16px;font-size:26px}.entry h2:first-child{margin-top:0}.entry h3{font-family:var(--mono);color:var(--text);margin-top:36px;margin-bottom:14px;font-size:20px}.entry h4{font-family:var(--mono);color:var(--text);margin-top:28px;margin-bottom:12px;font-size:17px}.entry p{color:var(--text-muted);margin-bottom:20px;font-size:16.5px;line-height:1.8}.entry strong{color:var(--text);font-weight:600}.entry a{color:var(--teal);text-decoration:underline;-webkit-text-decoration-color:var(--border);text-decoration-color:var(--border);text-underline-offset:3px}.entry a:hover{color:var(--amber);-webkit-text-decoration-color:var(--amber);text-decoration-color:var(--amber)}.entry ul{margin:0 0 20px;padding-left:0;list-style:none}.entry ul li{color:var(--text-muted);margin-bottom:10px;padding-left:22px;font-size:16px;line-height:1.7;position:relative}.entry ul li:before{content:"";background:var(--amber);border-radius:50%;width:6px;height:6px;position:absolute;top:10px;left:0}.entry figure{margin:28px 0}.entry figure img{border:1px solid var(--border);border-radius:10px;width:100%;height:auto;display:block}.entry .img-row{gap:20px;margin:28px 0;display:flex}@media (width<=900px){.entry .img-row{flex-direction:column}}.entry .img-row figure{flex:1;margin:0}.entry .img-row img{width:100%}.entry code{font-family:var(--mono);background:var(--surface-2);border:1px solid var(--border);border-radius:4px;padding:2px 6px;font-size:.9em}.entry pre{font-family:var(--mono);background:var(--surface-2);border:1px solid var(--border);color:var(--text);border-radius:8px;margin:0 0 20px;padding:16px 18px;font-size:14px;line-height:1.6;overflow-x:auto}.entry pre code{font-size:inherit;background:0 0;border:none;padding:0}.obsolete-warning{border-radius:var(--radius);border:1px solid var(--brand-red);border-left:4px solid var(--brand-red);background:#c71f381f;margin:0 0 40px;padding:20px 24px}.obsolete-warning p{color:var(--text);margin:0;font-size:14.5px;line-height:1.7}.obsolete-warning strong{color:var(--brand-red)}.obsolete-warning a{color:var(--brand-red);text-decoration:underline;-webkit-text-decoration-color:var(--brand-red);text-decoration-color:var(--brand-red);text-underline-offset:3px;font-weight:600}.obsolete-warning a:hover{color:var(--teal);-webkit-text-decoration-color:var(--teal);text-decoration-color:var(--teal)}.callout{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--brand-red);border-radius:12px;margin:44px 0;padding:28px 30px}.callout h4{font-family:var(--mono);color:var(--text);margin-bottom:12px;font-size:18px}.callout p{color:var(--text-muted);margin-bottom:14px;font-size:14.5px;line-height:1.7}.callout ul{margin:0 0 20px;padding-left:0;list-style:none}.callout ul li{color:var(--text-muted);margin-bottom:8px;padding-left:20px;font-size:14.5px;position:relative}.callout ul li:before{content:"";background:var(--brand-red);border-radius:50%;width:5px;height:5px;position:absolute;top:9px;left:0}.post-nav{grid-template-columns:1fr 1fr;gap:16px;margin:48px 0;display:grid}@media (width<=900px){.post-nav{grid-template-columns:1fr}}.post-nav a{border:1px solid var(--border);background:var(--surface);border-radius:12px;padding:20px 22px;display:block}.post-nav a:hover{border-color:var(--text-dim)}.post-nav .direction{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim);margin-bottom:8px;font-size:11px;display:block}.post-nav .title{color:var(--text);font-size:14.5px;line-height:1.4}.post-nav .next-post{text-align:right}.comment-section{border-top:1px solid var(--border-soft);margin-top:56px;padding-top:40px}.comment-section h3{font-family:var(--mono);color:var(--text);margin-bottom:24px;font-size:20px}.comment-form-mock{flex-direction:column;gap:16px;max-width:560px;display:flex}.comment-form-mock label{font-family:var(--mono);text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin-bottom:6px;font-size:12px;display:block}.comment-form-mock input,.comment-form-mock textarea{background:var(--surface);border:1px solid var(--border);width:100%;color:var(--text);font-family:var(--sans);border-radius:8px;padding:11px 14px;font-size:14.5px}.comment-form-mock input:focus,.comment-form-mock textarea:focus{border-color:var(--amber);outline:none}.comment-form-mock textarea{resize:vertical;min-height:120px}.post-hero-v2{padding:20px 0 16px;position:relative}.post-hero-v2:after{content:"";background:linear-gradient(90deg, var(--amber), var(--teal), transparent 85%);border-radius:2px;height:2px;position:absolute;bottom:0;left:0;right:0}.post-hero-v2 h1{max-width:none;margin:12px 0 0;font-size:38px;line-height:1.2}@media (width<=900px){.post-hero-v2 h1{font-size:28px}}.hero-top-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px 18px;display:flex}.hero-badge{background:var(--teal-dim);border:1px solid var(--teal);color:var(--teal);font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;border-radius:999px;align-items:center;gap:8px;padding:6px 14px 6px 10px;font-size:12px;display:inline-flex}.hero-badge svg{flex-shrink:0;width:14px;height:14px}.post-meta-v2{font-family:var(--mono);color:var(--text-dim);flex-wrap:wrap;align-items:center;gap:8px 22px;font-size:13px;display:flex}.post-meta-v2 a{color:var(--text-muted)}.post-meta-v2 a:hover{color:var(--amber)}.meta-item{align-items:center;gap:6px;display:inline-flex}.meta-item svg{width:14px;height:14px;color:var(--text-dim);flex-shrink:0} +:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13, 110, 253;--bs-secondary-rgb:108, 117, 125;--bs-success-rgb:25, 135, 84;--bs-info-rgb:13, 202, 240;--bs-warning-rgb:255, 193, 7;--bs-danger-rgb:220, 53, 69;--bs-light-rgb:248, 249, 250;--bs-dark-rgb:33, 37, 41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255, 255, 255;--bs-black-rgb:0, 0, 0;--bs-font-sans-serif:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--bs-font-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--bs-gradient:linear-gradient(180deg, #ffffff26, #fff0);--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33, 37, 41;--bs-body-bg:#fff;--bs-body-bg-rgb:255, 255, 255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0, 0, 0;--bs-secondary-color:#212529bf;--bs-secondary-color-rgb:33, 37, 41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233, 236, 239;--bs-tertiary-color:#21252980;--bs-tertiary-color-rgb:33, 37, 41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248, 249, 250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13, 110, 253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10, 88, 202;--bs-code-color:#d63384;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:#0000002d;--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 .5rem 1rem #00000026;--bs-box-shadow-sm:0 .125rem .25rem #00000013;--bs-box-shadow-lg:0 1rem 3rem #0000002d;--bs-box-shadow-inset:inset 0 1px 2px #00000013;--bs-focus-ring-width:.25rem;--bs-focus-ring-opacity:.25;--bs-focus-ring-color:#0d6efd40;--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222, 226, 230;--bs-body-bg:#212529;--bs-body-bg-rgb:33, 37, 41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255, 255, 255;--bs-secondary-color:#dee2e6bf;--bs-secondary-color-rgb:222, 226, 230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52, 58, 64;--bs-tertiary-color:#dee2e680;--bs-tertiary-color-rgb:222, 226, 230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43, 48, 53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110, 168, 254;--bs-link-hover-color-rgb:139, 185, 254;--bs-code-color:#e685b5;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#495057;--bs-border-color-translucent:#ffffff26;--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,:before,:after{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:#0000;margin:0}hr{color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25;margin:1rem 0}h6,.h6,h5,.h5,h4,.h4,h3,.h3,h2,.h2,h1,.h1{color:var(--bs-heading-color);margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:calc(1.375rem + 1.5vw)}@media (width>=1200px){h1,.h1{font-size:2.5rem}}h2,.h2{font-size:calc(1.325rem + .9vw)}@media (width>=1200px){h2,.h2{font-size:2rem}}h3,.h3{font-size:calc(1.3rem + .6vw)}@media (width>=1200px){h3,.h3{font-size:1.75rem}}h4,.h4{font-size:calc(1.275rem + .3vw)}@media (width>=1200px){h4,.h4{font-size:1.5rem}}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small,.small{font-size:.875em}mark,.mark{color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{vertical-align:baseline;font-size:.75em;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{margin-top:0;margin-bottom:1rem;font-size:.875em;display:block;overflow:auto}pre code{font-size:inherit;color:inherit;word-break:normal}code{color:var(--bs-code-color);word-wrap:break-word;font-size:.875em}a>code{color:inherit}kbd{color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem;padding:.1875rem .375rem;font-size:.875em}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{color:var(--bs-secondary-color);text-align:left;padding-top:.5rem;padding-bottom:.5rem}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button:not(:disabled),[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled){cursor:pointer}::-moz-focus-inner{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;min-width:0;margin:0;padding:0}legend{float:left;width:100%;line-height:inherit;margin-bottom:.5rem;padding:0;font-size:calc(1.275rem + .3vw)}@media (width>=1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit-text{padding:0}::-webkit-datetime-edit-minute{padding:0}::-webkit-datetime-edit-hour-field{padding:0}::-webkit-datetime-edit-day-field{padding:0}::-webkit-datetime-edit-month-field{padding:0}::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button{cursor:pointer;filter:grayscale()}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (width>=1200px){.display-6{font-size:2.5rem}}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{text-transform:uppercase;font-size:.875em}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{color:#6c757d;margin-top:-1rem;margin-bottom:1rem;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto;padding:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{color:var(--bs-secondary-color);font-size:.875em}.container,.container-fluid,.container-xxl,.container-xl,.container-lg,.container-md,.container-sm{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-left:auto;margin-right:auto}@media (width>=576px){.container-sm,.container{max-width:540px}}@media (width>=768px){.container-md,.container-sm,.container{max-width:720px}}@media (width>=992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media (width>=1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}@media (width>=1400px){.container-xxl,.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x));flex-wrap:wrap;display:flex}.row>*{width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y);flex-shrink:0}.col{flex:1 0 0}.row-cols-auto>*{flex:none;width:auto}.row-cols-1>*{flex:none;width:100%}.row-cols-2>*{flex:none;width:50%}.row-cols-3>*{flex:none;width:33.3333%}.row-cols-4>*{flex:none;width:25%}.row-cols-5>*{flex:none;width:20%}.row-cols-6>*{flex:none;width:16.6667%}.col-auto{flex:none;width:auto}.col-1{flex:none;width:8.33333%}.col-2{flex:none;width:16.6667%}.col-3{flex:none;width:25%}.col-4{flex:none;width:33.3333%}.col-5{flex:none;width:41.6667%}.col-6{flex:none;width:50%}.col-7{flex:none;width:58.3333%}.col-8{flex:none;width:66.6667%}.col-9{flex:none;width:75%}.col-10{flex:none;width:83.3333%}.col-11{flex:none;width:91.6667%}.col-12{flex:none;width:100%}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.6667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333%}.offset-5{margin-left:41.6667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333%}.offset-8{margin-left:66.6667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333%}.offset-11{margin-left:91.6667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:.25rem}.g-1,.gy-1{--bs-gutter-y:.25rem}.g-2,.gx-2{--bs-gutter-x:.5rem}.g-2,.gy-2{--bs-gutter-y:.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (width>=576px){.col-sm{flex:1 0 0}.row-cols-sm-auto>*{flex:none;width:auto}.row-cols-sm-1>*{flex:none;width:100%}.row-cols-sm-2>*{flex:none;width:50%}.row-cols-sm-3>*{flex:none;width:33.3333%}.row-cols-sm-4>*{flex:none;width:25%}.row-cols-sm-5>*{flex:none;width:20%}.row-cols-sm-6>*{flex:none;width:16.6667%}.col-sm-auto{flex:none;width:auto}.col-sm-1{flex:none;width:8.33333%}.col-sm-2{flex:none;width:16.6667%}.col-sm-3{flex:none;width:25%}.col-sm-4{flex:none;width:33.3333%}.col-sm-5{flex:none;width:41.6667%}.col-sm-6{flex:none;width:50%}.col-sm-7{flex:none;width:58.3333%}.col-sm-8{flex:none;width:66.6667%}.col-sm-9{flex:none;width:75%}.col-sm-10{flex:none;width:83.3333%}.col-sm-11{flex:none;width:91.6667%}.col-sm-12{flex:none;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.6667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333%}.offset-sm-5{margin-left:41.6667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333%}.offset-sm-8{margin-left:66.6667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333%}.offset-sm-11{margin-left:91.6667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (width>=768px){.col-md{flex:1 0 0}.row-cols-md-auto>*{flex:none;width:auto}.row-cols-md-1>*{flex:none;width:100%}.row-cols-md-2>*{flex:none;width:50%}.row-cols-md-3>*{flex:none;width:33.3333%}.row-cols-md-4>*{flex:none;width:25%}.row-cols-md-5>*{flex:none;width:20%}.row-cols-md-6>*{flex:none;width:16.6667%}.col-md-auto{flex:none;width:auto}.col-md-1{flex:none;width:8.33333%}.col-md-2{flex:none;width:16.6667%}.col-md-3{flex:none;width:25%}.col-md-4{flex:none;width:33.3333%}.col-md-5{flex:none;width:41.6667%}.col-md-6{flex:none;width:50%}.col-md-7{flex:none;width:58.3333%}.col-md-8{flex:none;width:66.6667%}.col-md-9{flex:none;width:75%}.col-md-10{flex:none;width:83.3333%}.col-md-11{flex:none;width:91.6667%}.col-md-12{flex:none;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.6667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333%}.offset-md-5{margin-left:41.6667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333%}.offset-md-8{margin-left:66.6667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333%}.offset-md-11{margin-left:91.6667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (width>=992px){.col-lg{flex:1 0 0}.row-cols-lg-auto>*{flex:none;width:auto}.row-cols-lg-1>*{flex:none;width:100%}.row-cols-lg-2>*{flex:none;width:50%}.row-cols-lg-3>*{flex:none;width:33.3333%}.row-cols-lg-4>*{flex:none;width:25%}.row-cols-lg-5>*{flex:none;width:20%}.row-cols-lg-6>*{flex:none;width:16.6667%}.col-lg-auto{flex:none;width:auto}.col-lg-1{flex:none;width:8.33333%}.col-lg-2{flex:none;width:16.6667%}.col-lg-3{flex:none;width:25%}.col-lg-4{flex:none;width:33.3333%}.col-lg-5{flex:none;width:41.6667%}.col-lg-6{flex:none;width:50%}.col-lg-7{flex:none;width:58.3333%}.col-lg-8{flex:none;width:66.6667%}.col-lg-9{flex:none;width:75%}.col-lg-10{flex:none;width:83.3333%}.col-lg-11{flex:none;width:91.6667%}.col-lg-12{flex:none;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.6667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333%}.offset-lg-5{margin-left:41.6667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333%}.offset-lg-8{margin-left:66.6667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333%}.offset-lg-11{margin-left:91.6667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (width>=1200px){.col-xl{flex:1 0 0}.row-cols-xl-auto>*{flex:none;width:auto}.row-cols-xl-1>*{flex:none;width:100%}.row-cols-xl-2>*{flex:none;width:50%}.row-cols-xl-3>*{flex:none;width:33.3333%}.row-cols-xl-4>*{flex:none;width:25%}.row-cols-xl-5>*{flex:none;width:20%}.row-cols-xl-6>*{flex:none;width:16.6667%}.col-xl-auto{flex:none;width:auto}.col-xl-1{flex:none;width:8.33333%}.col-xl-2{flex:none;width:16.6667%}.col-xl-3{flex:none;width:25%}.col-xl-4{flex:none;width:33.3333%}.col-xl-5{flex:none;width:41.6667%}.col-xl-6{flex:none;width:50%}.col-xl-7{flex:none;width:58.3333%}.col-xl-8{flex:none;width:66.6667%}.col-xl-9{flex:none;width:75%}.col-xl-10{flex:none;width:83.3333%}.col-xl-11{flex:none;width:91.6667%}.col-xl-12{flex:none;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.6667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333%}.offset-xl-5{margin-left:41.6667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333%}.offset-xl-8{margin-left:66.6667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333%}.offset-xl-11{margin-left:91.6667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (width>=1400px){.col-xxl{flex:1 0 0}.row-cols-xxl-auto>*{flex:none;width:auto}.row-cols-xxl-1>*{flex:none;width:100%}.row-cols-xxl-2>*{flex:none;width:50%}.row-cols-xxl-3>*{flex:none;width:33.3333%}.row-cols-xxl-4>*{flex:none;width:25%}.row-cols-xxl-5>*{flex:none;width:20%}.row-cols-xxl-6>*{flex:none;width:16.6667%}.col-xxl-auto{flex:none;width:auto}.col-xxl-1{flex:none;width:8.33333%}.col-xxl-2{flex:none;width:16.6667%}.col-xxl-3{flex:none;width:25%}.col-xxl-4{flex:none;width:33.3333%}.col-xxl-5{flex:none;width:41.6667%}.col-xxl-6{flex:none;width:50%}.col-xxl-7{flex:none;width:58.3333%}.col-xxl-8{flex:none;width:66.6667%}.col-xxl-9{flex:none;width:75%}.col-xxl-10{flex:none;width:83.3333%}.col-xxl-11{flex:none;width:91.6667%}.col-xxl-12{flex:none;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333%}.offset-xxl-2{margin-left:16.6667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333%}.offset-xxl-5{margin-left:41.6667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333%}.offset-xxl-8{margin-left:66.6667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333%}.offset-xxl-11{margin-left:91.6667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), .05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), .1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), .075);vertical-align:top;border-color:var(--bs-table-border-color);width:100%;margin-bottom:1rem}.table>:not(caption)>*>*{color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)));padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*,.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#a5b5cc;--bs-table-striped-bg:#c4d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe5;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#b4b6b7;--bs-table-striped-bg:#d6d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbcdce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#a7b9b1;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#a5c4ca;--bs-table-striped-bg:#c4e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e6c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dab9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece0be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc1c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7c9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#4d5154;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media (width<=575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (width<=1399.98px){.table-responsive-xxl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));font-size:inherit;margin-bottom:0;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{color:var(--bs-secondary-color);margin-top:.25rem;font-size:.875em}.form-control{width:100%;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-clip:padding-box;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{padding:0;display:block}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::file-selector-button{margin:-.375rem -.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;margin-inline-end:.75rem;padding:.375rem .75rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{width:100%;color:var(--bs-body-color);border:solid #0000;border-width:var(--bs-border-width) 0;background-color:#0000;margin-bottom:0;padding:.375rem 0;line-height:1.5;display:block}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-left:0;padding-right:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.form-control-sm::file-selector-button{margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.form-control-lg::file-selector-button{margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color::-webkit-color-swatch{border-radius:var(--bs-border-radius);border:0!important}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");width:100%;color:var(--bs-body-color);appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon,none);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:#0000;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{border-radius:var(--bs-border-radius-sm);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{border-radius:var(--bs-border-radius-lg);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{min-height:1.5rem;margin-bottom:.125rem;padding-left:1.5em;display:block}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{text-align:right;padding-left:0;padding-right:1.5em}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);vertical-align:top;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;print-color-adjust:exact;background-position:50%;background-repeat:no-repeat;background-size:contain;flex-shrink:0;width:1em;height:1em;margin-top:.25em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e");background-color:#0d6efd;border-color:#0d6efd}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-image:var(--bs-form-switch-bg);background-position:0;border-radius:2em;width:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28134, 182.5, 254%29'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{margin-right:1rem;display:inline-block}.btn-check{clip:rect(0, 0, 0, 0);pointer-events:none;position:absolute}.btn-check[disabled]+.btn,.btn-check:disabled+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{appearance:none;background-color:#0000;width:100%;height:1.5rem;padding:0}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem #0d6efd40}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;margin-top:-.25rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range::-moz-range-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;width:1rem;height:1rem;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{color:#0000;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:#0000;border-radius:1rem;width:100%;height:.5rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{z-index:2;max-width:100%;height:100%;color:rgba(var(--bs-body-color-rgb), .65);text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;padding:1rem .75rem;transition:opacity .1s ease-in-out,transform .1s ease-in-out;position:absolute;top:0;left:0;overflow:hidden}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control::placeholder,.form-floating>.form-control-plaintext::placeholder{color:#0000}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),:-webkit-any(.form-floating>.form-control:-webkit-autofill,.form-floating>.form-control-plaintext:-webkit-autofill){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown),.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),:is(.form-floating>.form-control:autofill,.form-floating>.form-control-plaintext:autofill){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem;padding-left:.75rem}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-control-plaintext~label,.form-floating>.form-select~label{transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>.form-control:-webkit-autofill~label{transform:scale(.85)translateY(-.5rem)translate(.15rem)}.form-floating>textarea:focus~label:after,.form-floating>textarea:not(:placeholder-shown)~label:after{z-index:-1;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius);height:1.5em;position:absolute;inset:1rem .375rem}.form-floating>textarea:disabled~label:after{background-color:var(--bs-secondary-bg)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>:disabled~label,.form-floating>.form-control:disabled~label{color:#6c757d}.input-group{flex-wrap:wrap;align-items:stretch;width:100%;display:flex;position:relative}.input-group>.form-control,.input-group>.form-select,.input-group>.form-floating{flex:auto;width:1%;min-width:0;position:relative}.input-group>.form-control:focus,.input-group>.form-select:focus,.input-group>.form-floating:focus-within{z-index:5}.input-group .btn{z-index:2;position:relative}.input-group .btn:focus{z-index:5}.input-group-text{color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;display:flex}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{border-radius:var(--bs-border-radius-lg);padding:.5rem 1rem;font-size:1.25rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{border-radius:var(--bs-border-radius-sm);padding:.25rem .5rem;font-size:.875rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(-1 * var(--bs-border-width));border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{width:100%;color:var(--bs-form-valid-color);margin-top:.25rem;font-size:.875em;display:none}.valid-tooltip{z-index:5;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:var(--bs-form-valid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), .25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-select:valid,.form-select.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), .25)}.was-validated .form-control-color:valid,.form-control-color.is-valid{width:calc(1.5em + 3.75rem)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:var(--bs-form-valid-border-color)}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:var(--bs-form-valid-color)}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb), .25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):valid,.input-group>.form-control:not(:focus).is-valid,.was-validated .input-group>.form-select:not(:focus):valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.input-group>.form-floating:not(:focus-within).is-valid{z-index:3}.invalid-feedback{width:100%;color:var(--bs-form-invalid-color);margin-top:.25rem;font-size:.875em;display:none}.invalid-tooltip{z-index:5;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius);max-width:100%;margin-top:.1rem;padding:.25rem .5rem;font-size:.875rem;display:none;position:absolute;top:100%}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:var(--bs-form-invalid-border-color);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), .25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:right calc(.375em + .1875rem) top calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,right 2.25rem center;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), .25)}.was-validated .form-control-color:invalid,.form-control-color.is-invalid{width:calc(1.5em + 3.75rem)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:var(--bs-form-invalid-border-color)}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:var(--bs-form-invalid-color)}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb), .25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.was-validated .input-group>.form-control:not(:focus):invalid,.input-group>.form-control:not(:focus).is-invalid,.was-validated .input-group>.form-select:not(:focus):invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.input-group>.form-floating:not(:focus-within).is-invalid{z-index:4}.btn{--bs-btn-padding-x:.75rem;--bs-btn-padding-y:.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 #ffffff26, 0 1px 1px #00000013;--bs-btn-disabled-opacity:.65;--bs-btn-focus-box-shadow:0 0 0 .25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:inline-block}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:checked+.btn,:not(.btn-check)+.btn:active,.btn:first-child:active,.btn.active,.btn.show{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,:not(.btn-check)+.btn:active:focus-visible,.btn:first-child:active:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn-check:checked:focus-visible+.btn{box-shadow:var(--bs-btn-focus-box-shadow)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49, 132, 253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130, 138, 145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60, 153, 110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11, 172, 204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217, 164, 6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225, 83, 97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211, 212, 213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66, 70, 73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13, 110, 253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108, 117, 125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25, 135, 84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13, 202, 240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255, 193, 7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220, 53, 69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248, 249, 250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33, 37, 41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px #00000020;--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49, 132, 253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-lg,.btn-group-lg>.btn{--bs-btn-padding-y:.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-sm,.btn-group-sm>.btn{--bs-btn-padding-y:.25rem;--bs-btn-padding-x:.5rem;--bs-btn-font-size:.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;transition:height .35s;overflow:hidden}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropup,.dropend,.dropdown,.dropstart,.dropup-center,.dropdown-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top-color:currentColor;border-bottom:0;margin-left:.255em;display:inline-block}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:.5rem;--bs-dropdown-spacer:.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:.5rem;z-index:var(--bs-dropdown-zindex);min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;background-color:var(--bs-dropdown-bg);border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);background-clip:padding-box;margin:0;list-style:none;display:none;position:absolute}.dropdown-menu[data-bs-popper]{margin-top:var(--bs-dropdown-spacer);top:100%;left:0}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media (width>=576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media (width>=768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media (width>=992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media (width>=1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}@media (width>=1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:auto;right:0}}.dropup .dropdown-menu[data-bs-popper]{margin-top:0;margin-bottom:var(--bs-dropdown-spacer);top:auto;bottom:100%}.dropup .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-top:0;border-bottom-color:currentColor;margin-left:.255em;display:inline-block}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{margin-top:0;margin-left:var(--bs-dropdown-spacer);top:0;left:100%;right:auto}.dropend .dropdown-toggle:after{vertical-align:.255em;content:"";border:.3em solid #0000;border-left-color:currentColor;border-right:0;margin-left:.255em;display:inline-block}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{margin-top:0;margin-right:var(--bs-dropdown-spacer);top:0;left:auto;right:100%}.dropstart .dropdown-toggle:after{vertical-align:.255em;content:"";margin-left:.255em;display:none}.dropstart .dropdown-toggle:before{vertical-align:.255em;content:"";border-top:.3em solid #0000;border-bottom:.3em solid #0000;border-right:.3em solid;margin-right:.255em;display:inline-block}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1;overflow:hidden}.dropdown-item{width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;color:var(--bs-dropdown-link-color);text-align:inherit;white-space:nowrap;border-radius:var(--bs-dropdown-item-border-radius,0);background-color:#0000;border:0;font-weight:400;text-decoration:none;display:block}.dropdown-item:hover,.dropdown-item:focus{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);background-color:var(--bs-dropdown-link-active-bg);text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:#0000}.dropdown-menu.show{display:block}.dropdown-header{padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);color:var(--bs-dropdown-header-color);white-space:nowrap;margin-bottom:0;font-size:.875rem;display:block}.dropdown-item-text{padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color);display:block}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:#ffffff26;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{vertical-align:middle;display:inline-flex;position:relative}.btn-group>.btn,.btn-group-vertical>.btn{flex:auto;position:relative}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{flex-wrap:wrap;justify-content:flex-start;display:flex}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>:not(.btn-check:first-child)+.btn,.btn-group>.btn-group:not(:first-child){margin-left:calc(-1 * var(--bs-border-width))}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after,.dropend .dropdown-toggle-split:after{margin-left:0}.dropstart .dropdown-toggle-split:before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{flex-direction:column;justify-content:center;align-items:flex-start}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:calc(-1 * var(--bs-border-width))}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:nth-child(n+3),.btn-group-vertical>:not(.btn-check)+.btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);flex-wrap:wrap;margin-bottom:0;padding-left:0;list-style:none;display:flex}.nav-link{padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);background:0 0;border:0;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out;display:block}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem #0d6efd40}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{border-bottom:var(--bs-nav-underline-border-width) solid transparent;padding-left:0;padding-right:0}.nav-underline .nav-link:hover,.nav-underline .nav-link:focus{border-bottom-color:currentColor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentColor;font-weight:700}.nav-fill>.nav-link,.nav-fill .nav-item{text-align:center;flex:auto}.nav-justified>.nav-link,.nav-justified .nav-item{text-align:center;flex-grow:1;flex-basis:0}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), .65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), .8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), .3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:.5rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), .15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:.25rem;--bs-navbar-toggler-transition:box-shadow .15s ease-in-out;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);flex-wrap:wrap;justify-content:space-between;align-items:center;display:flex;position:relative}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{flex-wrap:inherit;justify-content:space-between;align-items:center;display:flex}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);white-space:nowrap;text-decoration:none}.navbar-brand:hover,.navbar-brand:focus{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);flex-direction:column;margin-bottom:0;padding-left:0;list-style:none;display:flex}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{color:var(--bs-navbar-color);padding-top:.5rem;padding-bottom:.5rem}.navbar-text a,.navbar-text a:hover,.navbar-text a:focus{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-grow:1;flex-basis:100%;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);color:var(--bs-navbar-color);border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition);background-color:#0000;line-height:1}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width);outline:0;text-decoration:none}.navbar-toggler-icon{vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-position:50%;background-repeat:no-repeat;background-size:100%;width:1.5em;height:1.5em;display:inline-block}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (width>=576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}@media (width>=1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{flex-basis:auto;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{z-index:auto;flex-grow:1;transition:none;position:static;visibility:visible!important;background-color:#0000!important;border:0!important;width:auto!important;height:auto!important;transform:none!important}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:#ffffff8c;--bs-navbar-hover-color:#ffffffbf;--bs-navbar-disabled-color:#ffffff40;--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:#ffffff1a;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), .03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:.75rem;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);background-clip:border-box;flex-direction:column;display:flex;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius);border-top-width:0}.card>.list-group:last-child{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color);flex:auto}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));color:var(--bs-card-subtitle-color);margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color);margin-bottom:0}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius);position:absolute;inset:0}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (width>=576px){.card-group{flex-flow:wrap;display:flex}.card-group>.card{flex:1 0 0;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child)>.card-img-top,.card-group>.card:not(:last-child)>.card-header{border-top-right-radius:0}.card-group>.card:not(:last-child)>.card-img-bottom,.card-group>.card:not(:last-child)>.card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child)>.card-img-top,.card-group>.card:not(:first-child)>.card-header{border-top-left-radius:0}.card-group>.card:not(:first-child)>.card-img-bottom,.card-group>.card:not(:first-child)>.card-footer{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out, border-radius .15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23212529' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform .2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%285.2, 44, 101.2%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e");--bs-accordion-btn-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);overflow-anchor:none;transition:var(--bs-accordion-transition);border:0;border-radius:0;align-items:center;font-size:1rem;display:flex;position:relative}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition);flex-shrink:0;margin-left:auto}@media (prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;box-shadow:var(--bs-accordion-btn-focus-box-shadow);outline:0}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type>.accordion-header .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type>.accordion-header .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type>.accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush>.accordion-item{border-left:0;border-right:0;border-radius:0}.accordion-flush>.accordion-item:first-child{border-top:0}.accordion-flush>.accordion-item:last-child{border-bottom:0}.accordion-flush>.accordion-item>.accordion-collapse,.accordion-flush>.accordion-item>.accordion-header .accordion-button,.accordion-flush>.accordion-item>.accordion-header .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button:after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius);flex-wrap:wrap;list-style:none;display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider,"/") }.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:.75rem;--bs-pagination-padding-y:.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 .25rem #0d6efd40;--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);padding-left:0;list-style:none;display:flex}.page-link{padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;display:block;position:relative}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);box-shadow:var(--bs-pagination-focus-box-shadow);outline:0}.page-link.active,.active>.page-link{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.page-link.disabled,.disabled>.page-link{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(-1 * var(--bs-border-width))}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:.5rem;--bs-pagination-padding-y:.25rem;--bs-pagination-font-size:.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:.65em;--bs-badge-padding-y:.35em;--bs-badge-font-size:.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius);line-height:1;display:inline-block}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);position:relative}.alert-heading{color:inherit}.alert-link{color:var(--bs-alert-link-color);font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{z-index:2;padding:1.25rem 1rem;position:absolute;top:0;right:0}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:var(--bs-progress-height)}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width .6s ease;height:var(--bs-progress-height);font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);display:flex;overflow:hidden}.progress-bar{color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition);flex-direction:column;justify-content:center;display:flex;overflow:hidden}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,#ffffff26 25%,#0000 25% 50%,#ffffff26 50% 75%,#0000 75%,#0000);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;border-radius:var(--bs-list-group-border-radius);flex-direction:column;margin-bottom:0;padding-left:0;display:flex}.list-group-numbered{counter-reset:section;list-style-type:none}.list-group-numbered>.list-group-item:before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item{padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);text-decoration:none;display:block;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:not(.active):hover,.list-group-item-action:not(.active):focus{z-index:1;color:var(--bs-list-group-action-hover-color);background-color:var(--bs-list-group-action-hover-bg);text-decoration:none}.list-group-item-action:not(.active):active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (width>=576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (width>=1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e");--bs-btn-close-opacity:.5;--bs-btn-close-hover-opacity:.75;--bs-btn-close-focus-shadow:0 0 0 .25rem #0d6efd40;--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:.25;box-sizing:content-box;width:1em;height:1em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;filter:var(--bs-btn-close-filter);opacity:var(--bs-btn-close-opacity);border:0;border-radius:.375rem;padding:.25em}.btn-close:hover{color:var(--bs-btn-close-color);opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.btn-close:disabled,.btn-close.disabled{pointer-events:none;-webkit-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}:root,[data-bs-theme=light]{--bs-btn-close-filter: }[data-bs-theme=dark]{--bs-btn-close-filter:invert(1) grayscale(100%) brightness(200%)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:.75rem;--bs-toast-padding-y:.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), .85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius);background-clip:padding-box}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;z-index:var(--bs-toast-zindex);pointer-events:none;width:max-content;max-width:100%;position:absolute}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));background-clip:padding-box;align-items:center;display:flex}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:.5rem;--bs-modal-color:var(--bs-body-color);--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);z-index:var(--bs-modal-zindex);outline:0;width:100%;height:100%;display:none;position:fixed;top:0;left:0;overflow:hidden auto}.modal-dialog{width:auto;margin:var(--bs-modal-margin);pointer-events:none;position:relative}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translateY(-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{min-height:calc(100% - var(--bs-modal-margin) * 2);align-items:center;display:flex}.modal-content{width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:relative}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:.5;z-index:var(--bs-backdrop-zindex);background-color:var(--bs-backdrop-bg);width:100vw;height:100vh;position:fixed;top:0;left:0}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius);flex-shrink:0;align-items:center;display:flex}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin-top:calc(-.5 * var(--bs-modal-header-padding-y));margin-right:calc(-.5 * var(--bs-modal-header-padding-x));margin-bottom:calc(-.5 * var(--bs-modal-header-padding-y));margin-left:auto}.modal-title{line-height:var(--bs-modal-title-line-height);margin-bottom:0}.modal-body{padding:var(--bs-modal-padding);flex:auto;position:relative}.modal-footer{padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius);flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;display:flex}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (width>=576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-left:auto;margin-right:auto}.modal-sm{--bs-modal-width:300px}}@media (width>=992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (width>=1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen .modal-header,.modal-fullscreen .modal-footer{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (width<=575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-sm-down .modal-header,.modal-fullscreen-sm-down .modal-footer{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (width<=767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-md-down .modal-header,.modal-fullscreen-md-down .modal-footer{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (width<=991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-lg-down .modal-header,.modal-fullscreen-lg-down .modal-footer{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (width<=1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xl-down .modal-header,.modal-fullscreen-xl-down .modal-footer{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (width<=1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{border:0;border-radius:0;height:100%}.modal-fullscreen-xxl-down .modal-header,.modal-fullscreen-xxl-down .modal-footer{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:.5rem;--bs-tooltip-padding-y:.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:.9;--bs-tooltip-arrow-width:.8rem;--bs-tooltip-arrow-height:.4rem;z-index:var(--bs-tooltip-zindex);margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0;text-decoration:none;display:block}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height);display:block}.tooltip .tooltip-arrow:before{content:"";border-style:solid;border-color:#0000;position:absolute}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-top .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before{border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg);top:-1px}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-end .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg);right:-1px}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-bottom .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before{border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg);bottom:-1px}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-start .tooltip-arrow:before,.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before{border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg);left:-1px}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);text-align:left;text-align:start;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-style:normal;font-weight:400;line-height:1.5;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);background-clip:padding-box;text-decoration:none;display:block}.popover .popover-arrow{width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height);display:block}.popover .popover-arrow:before,.popover .popover-arrow:after{content:"";border:0 solid #0000;display:block;position:absolute}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before,.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-top>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:before{border-top-color:var(--bs-popover-arrow-border);bottom:0}.bs-popover-top>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before,.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-end>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:before{border-right-color:var(--bs-popover-arrow-border);left:0}.bs-popover-end>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before,.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-bottom>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:before{border-bottom-color:var(--bs-popover-arrow-border);top:0}.bs-popover-bottom>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-bottom .popover-header:before,.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before{width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg);display:block;position:absolute;top:0;left:50%}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before,.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-start>.popover-arrow:before,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:before{border-left-color:var(--bs-popover-arrow-border);right:0}.bs-popover-start>.popover-arrow:after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius);margin-bottom:0}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{width:100%;position:relative;overflow:hidden}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{float:left;backface-visibility:hidden;width:100%;margin-right:-100%;transition:transform .6s ease-in-out;display:none;position:relative}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translate(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translate(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{z-index:1;color:#fff;text-align:center;width:15%;filter:var(--bs-carousel-control-icon-filter);opacity:.5;background:0 0;border:0;justify-content:center;align-items:center;padding:0;transition:opacity .15s;display:flex;position:absolute;top:0;bottom:0}@media (prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;width:2rem;height:2rem;display:inline-block}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")}.carousel-indicators{z-index:2;justify-content:center;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;display:flex;position:absolute;bottom:0;left:0;right:0}.carousel-indicators [data-bs-target]{box-sizing:content-box;text-indent:-999px;cursor:pointer;background-color:var(--bs-carousel-indicator-active-bg);opacity:.5;background-clip:padding-box;border:10px solid #0000;border-left:0;border-right:0;flex:0 auto;width:30px;height:3px;margin-left:3px;margin-right:3px;padding:0;transition:opacity .6s}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{color:var(--bs-carousel-caption-color);text-align:center;padding-top:1.25rem;padding-bottom:1.25rem;position:absolute;bottom:1.25rem;left:15%;right:15%}.carousel-dark{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}:root,[data-bs-theme=light]{--bs-carousel-indicator-active-bg:#fff;--bs-carousel-caption-color:#fff;--bs-carousel-control-icon-filter: }[data-bs-theme=dark]{--bs-carousel-indicator-active-bg:#000;--bs-carousel-caption-color:#000;--bs-carousel-control-icon-filter:invert(1) grayscale(100)}.spinner-grow,.spinner-border{width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);border-radius:50%;flex-shrink:0;display:inline-block}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-border-width:.25em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:#0000}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-.125em;--bs-spinner-animation-speed:.75s;--bs-spinner-animation-name:spinner-grow;opacity:0;background-color:currentColor}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-xxl,.offcanvas-xl,.offcanvas-lg,.offcanvas-md,.offcanvas-sm{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform .3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (width<=575.98px){.offcanvas-sm{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (width<=575.98px){.offcanvas-sm.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-sm.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-sm.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-sm.showing,.offcanvas-sm.show:not(.hiding){transform:none}.offcanvas-sm.showing,.offcanvas-sm.hiding,.offcanvas-sm.show{visibility:visible}}@media (width>=576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=767.98px){.offcanvas-md{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (width<=767.98px){.offcanvas-md.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-md.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-md.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-md.showing,.offcanvas-md.show:not(.hiding){transform:none}.offcanvas-md.showing,.offcanvas-md.hiding,.offcanvas-md.show{visibility:visible}}@media (width>=768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=991.98px){.offcanvas-lg{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (width<=991.98px){.offcanvas-lg.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-lg.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-lg.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-lg.showing,.offcanvas-lg.show:not(.hiding){transform:none}.offcanvas-lg.showing,.offcanvas-lg.hiding,.offcanvas-lg.show{visibility:visible}}@media (width>=992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=1199.98px){.offcanvas-xl{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (width<=1199.98px){.offcanvas-xl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xl.showing,.offcanvas-xl.show:not(.hiding){transform:none}.offcanvas-xl.showing,.offcanvas-xl.hiding,.offcanvas-xl.show{visibility:visible}}@media (width>=1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}@media (width<=1399.98px){.offcanvas-xxl{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}}@media (width<=1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (width<=1399.98px){.offcanvas-xxl.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas-xxl.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas-xxl.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas-xxl.showing,.offcanvas-xxl.show:not(.hiding){transform:none}.offcanvas-xxl.showing,.offcanvas-xxl.hiding,.offcanvas-xxl.show{visibility:visible}}@media (width>=1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:#0000!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{flex-grow:0;padding:0;display:flex;overflow-y:visible;background-color:#0000!important}}.offcanvas{z-index:var(--bs-offcanvas-zindex);max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);transition:var(--bs-offcanvas-transition);background-clip:padding-box;outline:0;flex-direction:column;display:flex;position:fixed;bottom:0}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;left:0;transform:translate(-100%)}.offcanvas.offcanvas-end{width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;right:0;transform:translate(100%)}.offcanvas.offcanvas-top{height:var(--bs-offcanvas-height);border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;top:0;left:0;right:0;transform:translateY(-100%)}.offcanvas.offcanvas-bottom{height:var(--bs-offcanvas-height);border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);max-height:100%;left:0;right:0;transform:translateY(100%)}.offcanvas.showing,.offcanvas.show:not(.hiding){transform:none}.offcanvas.showing,.offcanvas.hiding,.offcanvas.show{visibility:visible}.offcanvas-backdrop{z-index:1040;background-color:#000;width:100vw;height:100vh;position:fixed;top:0;left:0}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);align-items:center;display:flex}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y));margin-left:auto}.offcanvas-title{line-height:var(--bs-offcanvas-title-line-height);margin-bottom:0}.offcanvas-body{padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);flex-grow:1;overflow-y:auto}.placeholder{vertical-align:middle;cursor:wait;opacity:.5;background-color:currentColor;min-height:1em;display:inline-block}.placeholder.btn:before{content:"";display:inline-block}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:2s ease-in-out infinite placeholder-glow}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{animation:2s linear infinite placeholder-wave;-webkit-mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,#000c 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.clearfix:after{clear:both;content:"";display:block}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb), var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(var(--bs-info-rgb), var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb), var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity,1))!important}.link-primary:hover,.link-primary:focus{color:RGBA(10, 88, 202, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10, 88, 202, var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity,1))!important}.link-secondary:hover,.link-secondary:focus{color:RGBA(86, 94, 100, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86, 94, 100, var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity,1))!important}.link-success:hover,.link-success:focus{color:RGBA(20, 108, 67, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20, 108, 67, var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity,1))!important}.link-info:hover,.link-info:focus{color:RGBA(61, 213, 243, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61, 213, 243, var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity,1))!important}.link-warning:hover,.link-warning:focus{color:RGBA(255, 205, 57, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255, 205, 57, var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity,1))!important}.link-danger:hover,.link-danger:focus{color:RGBA(176, 42, 55, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176, 42, 55, var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity,1))!important}.link-light:hover,.link-light:focus{color:RGBA(249, 250, 251, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249, 250, 251, var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity,1))!important}.link-dark:hover,.link-dark:focus{color:RGBA(26, 30, 33, var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26, 30, 33, var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:hover,.link-body-emphasis:focus{color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity,.75))!important}.focus-ring:focus{box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color);outline:0}.icon-link{-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity,.5));text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-opacity,.5));text-underline-offset:.25em;backface-visibility:hidden;align-items:center;gap:.375rem;display:inline-flex}.icon-link>.bi{fill:currentColor;flex-shrink:0;width:1em;height:1em;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:hover>.bi,.icon-link-hover:focus-visible>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em, 0, 0))}.ratio{width:100%;position:relative}.ratio:before{padding-top:var(--bs-aspect-ratio);content:"";display:block}.ratio>*{width:100%;height:100%;position:absolute;top:0;left:0}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571%}.fixed-top{z-index:1030;position:fixed;top:0;left:0;right:0}.fixed-bottom{z-index:1030;position:fixed;bottom:0;left:0;right:0}.sticky-top{z-index:1020;position:sticky;top:0}.sticky-bottom{z-index:1020;position:sticky;bottom:0}@media (width>=576px){.sticky-sm-top{z-index:1020;position:sticky;top:0}.sticky-sm-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=768px){.sticky-md-top{z-index:1020;position:sticky;top:0}.sticky-md-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=992px){.sticky-lg-top{z-index:1020;position:sticky;top:0}.sticky-lg-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=1200px){.sticky-xl-top{z-index:1020;position:sticky;top:0}.sticky-xl-bottom{z-index:1020;position:sticky;bottom:0}}@media (width>=1400px){.sticky-xxl-top{z-index:1020;position:sticky;top:0}.sticky-xxl-bottom{z-index:1020;position:sticky;bottom:0}}.hstack{flex-direction:row;align-self:stretch;align-items:center;display:flex}.vstack{flex-direction:column;flex:auto;align-self:stretch;display:flex}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0, 0, 0, 0)!important;white-space:nowrap!important;border:0!important;width:1px!important;height:1px!important;margin:-1px!important;padding:0!important;overflow:hidden!important}.visually-hidden:not(caption),.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption){position:absolute!important}.visually-hidden *,.visually-hidden-focusable:not(:focus):not(:focus-within) *{overflow:hidden!important}.stretched-link:after{z-index:1;content:"";position:absolute;inset:0}.text-truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.vr{width:var(--bs-border-width);opacity:.25;background-color:currentColor;align-self:stretch;min-height:1em;display:inline-block}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translate(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb), var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb), var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb), var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb), var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb), var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb), var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb), var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb), var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb), var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb), var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:.1}.border-opacity-25{--bs-border-opacity:.25}.border-opacity-50{--bs-border-opacity:.5}.border-opacity-75{--bs-border-opacity:.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{column-gap:0!important}.column-gap-1{column-gap:.25rem!important}.column-gap-2{column-gap:.5rem!important}.column-gap-3{column-gap:1rem!important}.column-gap-4{column-gap:1.5rem!important}.column-gap-5{column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb), var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb), var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb), var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb), var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb), var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb), var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb), var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb), var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb), var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb), var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb), var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:#00000080!important}.text-white-50{--bs-text-opacity:1;color:#ffffff80!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:.25}.text-opacity-50{--bs-text-opacity:.5}.text-opacity-75{--bs-text-opacity:.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity:.1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity:.25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity:.5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity:.75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:.1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:.25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:.5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:.75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb), var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb), var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb), var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb), var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb), var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb), var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb), var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb), var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb), var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:#0000!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:.1}.bg-opacity-25{--bs-bg-opacity:.25}.bg-opacity-50{--bs-bg-opacity:.5}.bg-opacity-75{--bs-bg-opacity:.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-top-left-radius:0!important;border-bottom-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-top-left-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (width>=576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{column-gap:0!important}.column-gap-sm-1{column-gap:.25rem!important}.column-gap-sm-2{column-gap:.5rem!important}.column-gap-sm-3{column-gap:1rem!important}.column-gap-sm-4{column-gap:1.5rem!important}.column-gap-sm-5{column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (width>=768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{column-gap:0!important}.column-gap-md-1{column-gap:.25rem!important}.column-gap-md-2{column-gap:.5rem!important}.column-gap-md-3{column-gap:1rem!important}.column-gap-md-4{column-gap:1.5rem!important}.column-gap-md-5{column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (width>=992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{column-gap:0!important}.column-gap-lg-1{column-gap:.25rem!important}.column-gap-lg-2{column-gap:.5rem!important}.column-gap-lg-3{column-gap:1rem!important}.column-gap-lg-4{column-gap:1.5rem!important}.column-gap-lg-5{column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (width>=1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{column-gap:0!important}.column-gap-xl-1{column-gap:.25rem!important}.column-gap-xl-2{column-gap:.5rem!important}.column-gap-xl-3{column-gap:1rem!important}.column-gap-xl-4{column-gap:1.5rem!important}.column-gap-xl-5{column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (width>=1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{column-gap:0!important}.column-gap-xxl-1{column-gap:.25rem!important}.column-gap-xxl-2{column-gap:.5rem!important}.column-gap-xxl-3{column-gap:1rem!important}.column-gap-xxl-4{column-gap:1.5rem!important}.column-gap-xxl-5{column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (width>=1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}html[data-theme=light]{--bg:#fbf9f4;--surface:#fff;--surface-2:#f3efe6;--border:#e3ddcf;--border-soft:#ebe6da;--text:#0b0b0b;--text-muted:#5b564d;--text-dim:#8a8478;--brand-red:#c71f38;--amber:#c71f38;--teal:#a33c4b;--periwinkle:#4a463e;--rose:#c97c89;--sage:#8c1729;--amber-dim:#c71f381f;--teal-dim:#a33c4b1f;--nav-bg:#fbf9f4db;--on-accent:#fbf6f0}html[data-theme=dark]{--bg:#0b0b0b;--surface:#161616;--surface-2:#1e1e1e;--border:#2c2c2c;--border-soft:#232323;--text:#f1eee8;--text-muted:#9a948d;--text-dim:#66605a;--brand-red:#c71f38;--amber:#da3550;--teal:#e8637a;--periwinkle:#5c5854;--rose:#f0a9b6;--sage:#8c1729;--amber-dim:#da355029;--teal-dim:#e8637a29;--nav-bg:#0b0b0bdb}html{background:var(--bg);scroll-behavior:smooth;--maxw:1180px;--radius:12px;--mono:"Space Grotesk", sans-serif;--sans:"Barlow", -apple-system, sans-serif;transition:background .2s}body{background:var(--bg);color:var(--text);font-family:var(--sans);-webkit-font-smoothing:antialiased;margin:0;font-size:16px;line-height:1.6;transition:background .2s,color .2s}*{box-sizing:border-box;transition:background-color .2s,border-color .2s,color .2s}a{color:inherit;text-decoration:none}img{max-width:100%;display:block}.wrap{max-width:var(--maxw);margin:0 auto;padding:0}.eyebrow{font-family:var(--mono);letter-spacing:.14em;text-transform:uppercase;color:var(--teal);align-items:center;gap:8px;font-size:12px;display:inline-flex}.eyebrow:before{content:"";background:var(--teal);width:6px;height:6px;box-shadow:0 0 0 3px var(--teal-dim);border-radius:50%}h1,h2,h3,h4{font-family:var(--mono);color:var(--text);letter-spacing:-.01em;margin:0;font-weight:600}p{color:var(--text-muted);margin:0}section{padding:88px 0}.section-head{max-width:640px;margin-bottom:48px}.section-head h2{margin-top:14px;font-size:30px}.section-head p{margin-top:14px;font-size:16.5px}header{z-index:50;background:var(--nav-bg);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-bottom:1px solid var(--border-soft);position:sticky;top:0}.logo{align-items:center;display:flex}.logo-full{flex-shrink:0;width:auto;height:26px}.navbar{min-height:72px;padding-top:0;padding-bottom:0}.navbar-nav .nav-link{color:var(--text-muted);white-space:nowrap;font-size:14.5px;transition:color .15s}.navbar-nav .nav-link:hover{color:var(--text)}@media (width>=992px){.navbar-nav{gap:30px}.navbar-nav .nav-link{padding-left:0;padding-right:0}}.nav-cta{font-family:var(--mono);border:1px solid var(--amber);border-radius:999px;font-size:13.5px;font-weight:500;transition:background .15s,color .15s;color:var(--amber)!important;padding:9px 18px!important}.nav-cta:hover{background:var(--amber);color:var(--on-accent)!important}.navbar-toggler{border:none;padding:8px}.navbar-toggler:focus{box-shadow:none}html[data-theme=light] .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(11,11,11,1)' stroke-width='2' stroke-linecap='round' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}html[data-theme=dark] .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(241,238,232,1)' stroke-width='2' stroke-linecap='round' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}@media (width<=991.98px){:is(header:has(.navbar-collapse.show),header:has(.navbar-collapse.collapsing)){background:var(--bg);-webkit-backdrop-filter:none;backdrop-filter:none}.navbar-collapse{background:var(--bg);border-top:1px solid var(--border-soft);margin:0 -28px;padding:0 28px}.navbar-nav{padding:10px 0 20px}.navbar-nav .nav-link{border-bottom:1px solid var(--border-soft);padding:14px 0;font-size:16px}.navbar-nav .nav-cta{text-align:center;border:1px solid var(--amber);border-radius:999px;width:100%;margin-top:16px;padding:12px 18px;font-size:14.5px;transition:background .15s,color .15s;display:block;color:var(--amber)!important}}.theme-toggle{border:1px solid var(--border);width:38px;height:38px;color:var(--text-muted);cursor:pointer;background:0 0;border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;transition:border-color .15s,color .15s;display:flex}.theme-toggle:hover{border-color:var(--text-muted);color:var(--text)}.theme-toggle svg{width:18px;height:18px}.theme-toggle .icon-moon,html[data-theme=light] .theme-toggle .icon-sun{display:none}html[data-theme=light] .theme-toggle .icon-moon{display:block}.btn{font-family:var(--mono);border:1px solid var(--border);white-space:nowrap;border-radius:8px;align-items:center;gap:8px;padding:11px 20px;font-size:13.5px;font-weight:500;transition:border-color .15s,background .15s,transform .15s;display:inline-flex}.btn:hover{transform:translateY(-1px)}.btn svg{width:15px;height:15px}.btn-primary{background:var(--amber);color:var(--on-accent);border-color:var(--amber);font-weight:600}.btn-primary:hover{background:var(--amber);box-shadow:0 6px 20px var(--amber-dim)}.btn-ghost{color:var(--text)}.btn-ghost:hover{border-color:var(--text-muted)}.btn-sm{border-radius:7px;padding:8px 14px;font-size:12.5px}.hero{padding:76px 0 40px}.hero h1{letter-spacing:-.02em;margin-top:18px;font-size:44px;line-height:1.15}.hero p.sub{max-width:520px;color:var(--text-muted);margin-top:20px;font-size:18px}.hero-grid{grid-template-columns:1.05fr .95fr;align-items:center;gap:64px;display:grid}.hero-ctas{flex-wrap:wrap;gap:14px;margin-top:32px;display:flex}.hero-stack-note{font-family:var(--mono);color:var(--text-dim);flex-wrap:wrap;gap:18px;margin-top:34px;font-size:12.5px;display:flex}.hero-stack-note span{color:var(--text-muted)}.pipeline{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:26px 26px 30px;position:relative}.pipeline-label{font-family:var(--mono);letter-spacing:.12em;text-transform:uppercase;color:var(--text-dim);justify-content:space-between;margin-bottom:18px;font-size:11px;display:flex}.pipeline-track{padding-left:28px;position:relative}.pipeline-track:before{content:"";background:linear-gradient(180deg, var(--sage), var(--brand-red));opacity:.5;width:2px;position:absolute;top:10px;bottom:10px;left:9px}.pl-step{background:var(--surface-2);border:1px solid var(--border-soft);border-radius:9px;justify-content:space-between;align-items:center;gap:10px;margin-bottom:10px;padding:13px 16px;display:flex;position:relative}.pl-step:last-child{margin-bottom:0}.pl-step:before{content:"";background:var(--bg);border:2px solid var(--teal);border-radius:50%;width:9px;height:9px;position:absolute;top:50%;left:-23px;transform:translateY(-50%)}.pl-step .name{font-family:var(--mono);color:var(--text);font-size:13.5px;font-weight:500}.pl-step .tag{font-family:var(--mono);color:var(--text-dim);font-size:10.5px}.pl-packet{background:var(--brand-red);border-radius:50%;width:14px;height:14px;animation:5s ease-in-out infinite travel;position:absolute;left:2px;box-shadow:0 0 12px 2px #c71f3838}@keyframes travel{0%{opacity:0;top:8px}6%{opacity:1}46%{opacity:1;top:calc(100% - 22px)}50%{opacity:0}50.01%{top:8px}56%{opacity:1}96%{opacity:1;top:calc(100% - 22px)}to{opacity:0;top:calc(100% - 22px)}}@media (prefers-reduced-motion:reduce){.pl-packet{opacity:1;animation:none;top:8px}html{scroll-behavior:auto}}.split{grid-template-columns:1.1fr .9fr;align-items:start;gap:64px;display:grid}.split h2{font-size:28px}.split .lede{color:var(--text-muted);margin-top:16px;font-size:17px;line-height:1.7}.extending{font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim);align-items:center;gap:12px;margin-top:26px;font-size:12px;display:flex}.extending .extending-logo{text-transform:none;align-items:center;display:flex}.extending .extending-logo img{width:auto;height:36px;display:block}.extending .lockup{font-family:var(--mono);color:var(--text);text-transform:none;letter-spacing:0;font-size:15px;font-weight:600}.extending .lockup .x{color:var(--text-dim);margin:0 6px;font-weight:400}.traits{grid-template-columns:1fr 1fr;gap:14px;display:grid}.trait{background:var(--surface);border:1px solid var(--border);text-align:left;border-radius:12px;padding:22px 18px}.trait .icon{margin-bottom:12px}.trait p{font-family:var(--mono);color:var(--text);font-size:13px;font-weight:500;line-height:1.4}.products-grid{grid-template-columns:repeat(3,1fr);gap:18px;display:grid}.card{background:var(--surface);border:1px solid var(--border);border-top:3px solid var(--accent,var(--teal));border-radius:var(--radius);flex-direction:column;height:100%;padding:26px 24px 24px;display:flex}.card .card-top{justify-content:space-between;align-items:flex-start;margin-bottom:14px;display:flex}.card h3{color:var(--text);font-size:20px}.card .kicker{font-family:var(--mono);color:var(--text-dim);letter-spacing:.1em;text-transform:uppercase;margin-bottom:6px;font-size:10.5px;display:block}.card p.desc{flex-grow:1;font-size:14.5px;line-height:1.65}.card .card-btns{flex-wrap:wrap;gap:8px;margin-top:20px;display:flex}.badges{flex-wrap:wrap;gap:5px;margin-bottom:16px;display:flex}.badges img{border-radius:3px;height:19px}.standards-grid{background:var(--border);border:1px solid var(--border);border-radius:var(--radius);grid-template-columns:repeat(3,1fr);gap:1px;display:grid;overflow:hidden}.standard{background:var(--surface);padding:30px 26px}.standard h4{color:var(--text);margin-bottom:10px;font-size:16px}.standard h4 a{color:inherit;border-bottom:1px solid var(--border)}.standard h4 a:hover{color:var(--amber);border-color:var(--amber)}.standard p{font-size:14px;line-height:1.65}.standard .get-started{font-family:var(--mono);color:var(--text-dim);margin-top:14px;font-size:12px}.standard .get-started a{color:var(--teal)}.standard .get-started a:hover{text-decoration:underline}.components-grid{grid-template-columns:1fr 1fr;gap:0 40px;display:grid}details.acc{border-bottom:1px solid var(--border-soft)}details.acc summary{cursor:pointer;font-family:var(--mono);color:var(--text);justify-content:space-between;align-items:center;padding:18px 0;font-size:15px;font-weight:500;list-style:none;display:flex}details.acc summary::-webkit-details-marker{display:none}details.acc summary .chev{color:var(--text-dim);font-size:18px;transition:transform .2s}details.acc[open] summary .chev{color:var(--amber);transform:rotate(45deg)}.acc-body{padding:0 0 20px}.pkg-row{border-top:1px solid var(--border-soft);justify-content:space-between;gap:16px;padding:9px 0;display:flex}.pkg-row:first-child{border-top:none}.pkg-row a{font-family:var(--mono);color:var(--teal);white-space:nowrap;font-size:13.5px}.pkg-row a:hover{text-decoration:underline}.pkg-row .pkg-desc{color:var(--text-muted);text-align:right;font-size:13px}.posts-grid{grid-template-columns:repeat(3,1fr);gap:20px;display:grid}.posts-grid-2-col{grid-template-columns:repeat(2,1fr);gap:20px;display:grid}.post-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:24px;transition:border-color .15s}.post-card:hover{border-color:var(--text-dim)}.post-card h4{color:var(--text);margin-top:10px;font-size:16.5px;line-height:1.4}.post-card p{margin-top:10px;font-size:13.5px;line-height:1.6}.post-card .read-more{font-family:var(--mono);color:var(--amber);margin-top:14px;margin-left:2px;font-size:12px;display:inline-block}.post-date{font-family:var(--mono);color:var(--text-dim);letter-spacing:.06em;text-transform:uppercase;font-size:11.5px}.about-band{background:var(--surface);border-top:1px solid var(--border-soft);border-bottom:1px solid var(--border-soft)}.about-inner{grid-template-columns:1fr 1.3fr;align-items:center;gap:56px;display:grid}.about-inner h2{margin-top:14px;font-size:26px;line-height:1.3}.about-inner .about-text{font-size:15px;line-height:1.75}.about-inner .about-cta{margin-top:22px}footer{padding:50px 0 40px}.footer-top{border-bottom:1px solid var(--border-soft);flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:30px;padding-bottom:34px;display:flex}.footer-copy{color:var(--text-dim);max-width:460px;font-size:13px;line-height:1.8}.footer-copy a{color:var(--text-muted);border-bottom:1px solid var(--border)}.footer-social{gap:12px;display:flex}.footer-social a{border:1px solid var(--border);width:38px;height:38px;color:var(--text);border-radius:9px;justify-content:center;align-items:center;transition:border-color .15s,color .15s;display:flex}.footer-social a:hover{border-color:var(--teal);color:var(--teal)}.footer-social svg{width:17px;height:17px}.footer-bottom{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;padding-top:24px;display:flex}.footer-bottom .sponsor{font-family:var(--mono);color:var(--text-dim);font-size:12px}.footer-bottom .sponsor a{color:var(--text-muted);border-bottom:1px solid var(--border)}@media (width<=980px){.hero-grid{grid-template-columns:1fr;gap:44px}.hero{padding-top:44px}.split{grid-template-columns:1fr;gap:40px}.products-grid,.standards-grid{grid-template-columns:repeat(2,1fr)}.posts-grid{grid-template-columns:1fr}.about-inner{grid-template-columns:1fr;gap:26px}}@media (width<=700px){.wrap{padding:0 16px}.hero h1{font-size:32px}.products-grid,.standards-grid,.components-grid{grid-template-columns:1fr}section{padding:56px 0}.pkg-row{flex-direction:column;gap:2px}.pkg-row .pkg-desc{text-align:left}}:focus-visible{outline:2px solid var(--amber);outline-offset:2px}.icon{flex-shrink:0;width:18px;height:18px}.icon-lg{width:50px;height:50px}.icon-jetbrains{min-width:100px}[data-theme=light] .icon{filter:none}[data-theme=dark] .icon{filter:invert()}.contact-grid{grid-template-columns:1fr 1fr;gap:18px;display:grid}@media (width<=700px){.contact-grid{grid-template-columns:1fr}}.contact-card{text-align:center;align-items:center}.contact-card svg{width:40px;height:40px;color:var(--teal);margin-bottom:14px}.contact-card .card-btns{justify-content:center}.approach-card{margin-top:18px}.approach-card h3{margin-bottom:10px}.latest-posts{margin-top:48px}.latest-posts .section-head{margin-bottom:24px}.latest-posts .posts-grid{grid-template-columns:repeat(2,1fr)}@media (width<=700px){.latest-posts .posts-grid{grid-template-columns:1fr}}.sidebar{flex-direction:column;gap:34px;display:flex}@media (width<=900px){.sidebar{order:2}}.widget{border-bottom:1px solid var(--border-soft);padding-bottom:28px}.widget:last-child{border-bottom:none;padding-bottom:0}.widget ul{margin:0;padding:0;list-style:none}.widget-title{font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim);margin-bottom:16px;font-size:11.5px}.search-form{border:1px solid var(--border);border-radius:8px;display:flex;overflow:hidden}.search-form input{min-width:0;color:var(--text);font-family:var(--sans);background:0 0;border:none;flex:1;padding:10px 12px;font-size:14px}.search-form input:focus{outline:none}.search-form button{background:var(--surface-2);color:var(--text-muted);cursor:pointer;font-family:var(--mono);border:none;padding:0 14px;font-size:12px}.search-form button:hover{color:var(--amber)}.widget-recent ul{flex-direction:column;gap:14px;display:flex}.widget-recent li a{color:var(--text);font-size:14px;line-height:1.4;display:block}.widget-recent li a:hover{color:var(--amber)}.widget-recent li .post-date{font-family:var(--mono);color:var(--text-dim);margin-top:4px;font-size:11px;display:block}.widget-categories li{border-bottom:1px solid var(--border-soft)}.widget-categories li:last-child{border-bottom:none}.widget-categories li.current a{color:var(--amber);font-weight:600}.widget-categories li a{color:var(--text-muted);justify-content:space-between;align-items:center;gap:10px;padding:9px 0;font-size:14px;display:flex}.widget-categories li a:hover{color:var(--text)}.widget-categories .cat-count{min-width:28px;font-family:var(--mono);text-align:center;color:var(--text-dim);background:var(--surface-2);border:1px solid var(--border-soft);border-radius:999px;flex-shrink:0;padding:1px 9px;font-size:11px;display:inline-block}.widget-categories li a:hover .cat-count{color:var(--text)}.widget-more{margin-top:14px}.widget-more a{font-family:var(--mono);color:var(--amber);font-size:12px}.widget-more a:hover{text-decoration:underline}.no-articles{color:var(--text-dim);font-size:13.5px}.widget-connect ul{flex-direction:column;gap:12px;display:flex}.widget-connect li a{color:var(--text-muted);align-items:center;gap:10px;font-size:14px;display:flex}.widget-connect li a:hover{color:var(--text)}.widget-connect li a svg{width:17px;height:17px;color:var(--teal);flex-shrink:0}.widget-approach p{color:var(--text-muted);margin-bottom:12px;font-size:13.5px;line-height:1.7}.widget-approach p:last-child{margin-bottom:0}.breadcrumb-back{font-family:var(--mono);color:var(--text-dim);align-items:center;gap:6px;font-size:13px;display:inline-flex}.breadcrumb-back:hover{color:var(--amber)}.breadcrumb-back svg{width:14px;height:14px}.post-hero{border-bottom:1px solid var(--border-soft);padding:40px 0}.post-hero h1{max-width:820px;margin-top:16px;font-size:38px;line-height:1.2}@media (width<=900px){.post-hero h1{font-size:28px}}.post-meta{font-family:var(--mono);color:var(--text-dim);flex-wrap:wrap;align-items:center;gap:6px 14px;margin-top:22px;font-size:13px;display:flex}.post-meta a{color:var(--text-muted)}.post-meta a:hover{color:var(--amber)}.post-meta .featured-tag{color:var(--brand-red);font-weight:600}.post-body-wrap{padding:52px 0 72px}.post-layout{grid-template-columns:270px 1fr;align-items:start;gap:64px;display:grid}@media (width<=900px){.post-layout{grid-template-columns:1fr;gap:44px}.article{order:1}}.entry{max-width:720px}@media (width<=900px){.entry{max-width:100%}}.entry h2{font-family:var(--mono);color:var(--text);margin-top:48px;margin-bottom:16px;font-size:26px}.entry h2:first-child{margin-top:0}.entry h3{font-family:var(--mono);color:var(--text);margin-top:36px;margin-bottom:14px;font-size:20px}.entry h4{font-family:var(--mono);color:var(--text);margin-top:28px;margin-bottom:12px;font-size:17px}.entry p{color:var(--text-muted);margin-bottom:20px;font-size:16.5px;line-height:1.8}.entry strong{color:var(--text);font-weight:600}.entry a{color:var(--teal);text-decoration:underline;-webkit-text-decoration-color:var(--border);text-decoration-color:var(--border);text-underline-offset:3px}.entry a:hover{color:var(--amber);-webkit-text-decoration-color:var(--amber);text-decoration-color:var(--amber)}.entry ul{margin:0 0 20px;padding-left:0;list-style:none}.entry ul li{color:var(--text-muted);margin-bottom:10px;padding-left:22px;font-size:16px;line-height:1.7;position:relative}.entry ul li:before{content:"";background:var(--amber);border-radius:50%;width:6px;height:6px;position:absolute;top:10px;left:0}.entry figure{margin:28px 0}.entry figure img{border:1px solid var(--border);border-radius:10px;width:100%;height:auto;display:block}.entry .img-row{gap:20px;margin:28px 0;display:flex}@media (width<=900px){.entry .img-row{flex-direction:column}}.entry .img-row figure{flex:1;margin:0}.entry .img-row img{width:100%}.entry code{font-family:var(--mono);background:var(--surface-2);border:1px solid var(--border);border-radius:4px;padding:2px 6px;font-size:.9em}.entry pre{font-family:var(--mono);background:var(--surface-2);border:1px solid var(--border);color:var(--text);border-radius:8px;margin:0 0 20px;padding:16px 18px;font-size:14px;line-height:1.6;overflow-x:auto}.entry pre code{font-size:inherit;background:0 0;border:none;padding:0}.obsolete-warning{border-radius:var(--radius);border:1px solid var(--brand-red);border-left:4px solid var(--brand-red);background:#c71f381f;margin:0 0 40px;padding:20px 24px}.obsolete-warning p{color:var(--text);margin:0;font-size:14.5px;line-height:1.7}.obsolete-warning strong{color:var(--brand-red)}.obsolete-warning a{color:var(--brand-red);text-decoration:underline;-webkit-text-decoration-color:var(--brand-red);text-decoration-color:var(--brand-red);text-underline-offset:3px;font-weight:600}.obsolete-warning a:hover{color:var(--teal);-webkit-text-decoration-color:var(--teal);text-decoration-color:var(--teal)}.callout{background:var(--surface);border:1px solid var(--border);border-left:3px solid var(--brand-red);border-radius:12px;margin:44px 0;padding:28px 30px}.callout h4{font-family:var(--mono);color:var(--text);margin-bottom:12px;font-size:18px}.callout p{color:var(--text-muted);margin-bottom:14px;font-size:14.5px;line-height:1.7}.callout ul{margin:0 0 20px;padding-left:0;list-style:none}.callout ul li{color:var(--text-muted);margin-bottom:8px;padding-left:20px;font-size:14.5px;position:relative}.callout ul li:before{content:"";background:var(--brand-red);border-radius:50%;width:5px;height:5px;position:absolute;top:9px;left:0}.post-nav{grid-template-columns:1fr 1fr;gap:16px;margin:48px 0;display:grid}@media (width<=900px){.post-nav{grid-template-columns:1fr}}.post-nav a{border:1px solid var(--border);background:var(--surface);border-radius:12px;padding:20px 22px;display:block}.post-nav a:hover{border-color:var(--text-dim)}.post-nav .direction{font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim);margin-bottom:8px;font-size:11px;display:block}.post-nav .title{color:var(--text);font-size:14.5px;line-height:1.4}.post-nav .next-post{text-align:right}.comment-section{border-top:1px solid var(--border-soft);margin-top:56px;padding-top:40px}.comment-section h3{font-family:var(--mono);color:var(--text);margin-bottom:24px;font-size:20px}.comment-form-mock{flex-direction:column;gap:16px;max-width:560px;display:flex}.comment-form-mock label{font-family:var(--mono);text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin-bottom:6px;font-size:12px;display:block}.comment-form-mock input,.comment-form-mock textarea{background:var(--surface);border:1px solid var(--border);width:100%;color:var(--text);font-family:var(--sans);border-radius:8px;padding:11px 14px;font-size:14.5px}.comment-form-mock input:focus,.comment-form-mock textarea:focus{border-color:var(--amber);outline:none}.comment-form-mock textarea{resize:vertical;min-height:120px}.post-hero-v2{padding:20px 0 16px;position:relative}.post-hero-v2:after{content:"";background:linear-gradient(90deg, var(--amber), var(--teal), transparent 85%);border-radius:2px;height:2px;position:absolute;bottom:0;left:0;right:0}.post-hero-v2 h1{max-width:none;margin:12px 0 0;font-size:38px;line-height:1.2}@media (width<=900px){.post-hero-v2 h1{font-size:28px}}.hero-top-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px 18px;display:flex}.hero-badge{background:var(--teal-dim);border:1px solid var(--teal);color:var(--teal);font-family:var(--mono);letter-spacing:.08em;text-transform:uppercase;border-radius:999px;align-items:center;gap:8px;padding:6px 14px 6px 10px;font-size:12px;display:inline-flex}.hero-badge svg{flex-shrink:0;width:14px;height:14px}.post-meta-v2{font-family:var(--mono);color:var(--text-dim);flex-wrap:wrap;align-items:center;gap:8px 22px;font-size:13px;display:flex}.post-meta-v2 a{color:var(--text-muted)}.post-meta-v2 a:hover{color:var(--amber)}.meta-item{align-items:center;gap:6px;display:inline-flex}.meta-item svg{width:14px;height:14px;color:var(--text-dim);flex-shrink:0}.md-actions{display:inline-flex;position:relative}.md-actions-toggle{background:var(--surface);border:1px solid var(--border);color:var(--text-muted);font-family:var(--sans);cursor:pointer;border-radius:8px;align-items:stretch;padding:0;font-size:13px;transition:box-shadow .15s,border-color .15s,color .15s;display:inline-flex;overflow:hidden}.md-actions-toggle svg{flex-shrink:0;width:14px;height:14px}.md-actions-toggle .chev{width:12px;height:12px;transition:transform .15s}.md-actions-toggle:hover{border-color:var(--text-dim);color:var(--text);box-shadow:0 4px 12px #0000001f}.md-actions-toggle-label{align-items:center;gap:8px;padding:6px 12px;display:inline-flex}.md-actions-toggle-chev{border-left:1px solid var(--border);align-items:center;padding:6px 10px;display:inline-flex}.md-actions.open .md-actions-toggle{border-color:var(--text-dim);color:var(--text);box-shadow:0 4px 12px #0000001f}.md-actions.open .md-actions-toggle .chev{transform:rotate(180deg)}.md-actions-menu{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);z-index:20;flex-direction:column;gap:2px;min-width:240px;padding:6px;display:none;position:absolute;top:calc(100% + 8px);right:0;box-shadow:0 12px 32px #0000002e}.md-actions.open .md-actions-menu{display:flex}.md-actions-item{color:var(--text);font-family:var(--sans);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:8px;align-items:center;gap:10px;padding:8px 10px;font-size:13px;text-decoration:none;display:flex}.md-actions-item svg{width:16px;height:16px;color:var(--text-dim);flex-shrink:0}.md-actions-item:hover{background:var(--surface-2);color:var(--amber)}.md-actions-item:hover svg{color:var(--amber)}.md-actions-bar{justify-content:flex-end;margin-bottom:12px;display:flex}.md-actions-bar+h2{margin-top:0} diff --git a/public/js/app.js b/public/js/app.js index bd319d7..016d053 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -1 +1 @@ -/* empty css */((e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports))(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self,n.bootstrap=r())})(e,(function(){let e=new Map,t={set(t,n,r){e.has(t)||e.set(t,new Map);let i=e.get(t);if(!i.has(n)&&i.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`);return}i.set(n,r)},get(t,n){return e.has(t)&&e.get(t).get(n)||null},remove(t,n){if(!e.has(t))return;let r=e.get(t);r.delete(n),r.size===0&&e.delete(t)}},n=`transitionend`,r=e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),e),i=e=>e==null?`${e}`:Object.prototype.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),a=e=>{do e+=Math.floor(Math.random()*1e6);while(document.getElementById(e));return e},o=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);return!Number.parseFloat(t)&&!Number.parseFloat(n)?0:(t=t.split(`,`)[0],n=n.split(`,`)[0],(Number.parseFloat(t)+Number.parseFloat(n))*1e3)},s=e=>{e.dispatchEvent(new Event(n))},c=e=>!e||typeof e!=`object`?!1:(e.jquery!==void 0&&(e=e[0]),e.nodeType!==void 0),l=e=>c(e)?e.jquery?e[0]:e:typeof e==`string`&&e.length>0?document.querySelector(r(e)):null,u=e=>{if(!c(e)||e.getClientRects().length===0)return!1;let t=getComputedStyle(e).getPropertyValue(`visibility`)===`visible`,n=e.closest(`details:not([open])`);if(!n)return t;if(n!==e){let t=e.closest(`summary`);if(t&&t.parentNode!==n||t===null)return!1}return t},d=e=>!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains(`disabled`)?!0:e.disabled===void 0?e.hasAttribute(`disabled`)&&e.getAttribute(`disabled`)!==`false`:e.disabled,f=e=>{if(!document.documentElement.attachShadow)return null;if(typeof e.getRootNode==`function`){let t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?f(e.parentNode):null},p=()=>{},m=e=>{e.offsetHeight},h=()=>window.jQuery&&!document.body.hasAttribute(`data-bs-no-jquery`)?window.jQuery:null,g=[],_=e=>{document.readyState===`loading`?(g.length||document.addEventListener(`DOMContentLoaded`,()=>{for(let e of g)e()}),g.push(e)):e()},v=()=>document.documentElement.dir===`rtl`,y=e=>{_(()=>{let t=h();if(t){let n=e.NAME,r=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=r,e.jQueryInterface)}})},b=(e,t=[],n=e)=>typeof e==`function`?e.call(...t):n,x=(e,t,r=!0)=>{if(!r){b(e);return}let i=o(t)+5,a=!1,c=({target:r})=>{r===t&&(a=!0,t.removeEventListener(n,c),b(e))};t.addEventListener(n,c),setTimeout(()=>{a||s(t)},i)},S=(e,t,n,r)=>{let i=e.length,a=e.indexOf(t);return a===-1?!n&&r?e[i-1]:e[0]:(a+=n?1:-1,r&&(a=(a+i)%i),e[Math.max(0,Math.min(a,i-1))])},C=/[^.]*(?=\..*)\.|.*/,w=/\..*/,T=/::\d+$/,E={},D=1,O={mouseenter:`mouseover`,mouseleave:`mouseout`},k=new Set(`click.dblclick.mouseup.mousedown.contextmenu.mousewheel.DOMMouseScroll.mouseover.mouseout.mousemove.selectstart.selectend.keydown.keypress.keyup.orientationchange.touchstart.touchmove.touchend.touchcancel.pointerdown.pointermove.pointerup.pointerleave.pointercancel.gesturestart.gesturechange.gestureend.focus.blur.change.reset.select.submit.focusin.focusout.load.unload.beforeunload.resize.move.DOMContentLoaded.readystatechange.error.abort.scroll`.split(`.`));function ee(e,t){return t&&`${t}::${D++}`||e.uidEvent||D++}function A(e){let t=ee(e);return e.uidEvent=t,E[t]=E[t]||{},E[t]}function j(e,t){return function n(r){return ce(r,{delegateTarget:e}),n.oneOff&&M.off(e,r.type,t),t.apply(e,[r])}}function te(e,t,n){return function r(i){let a=e.querySelectorAll(t);for(let{target:o}=i;o&&o!==this;o=o.parentNode)for(let s of a)if(s===o)return ce(i,{delegateTarget:o}),r.oneOff&&M.off(e,i.type,t,n),n.apply(o,[i])}}function ne(e,t,n=null){return Object.values(e).find(e=>e.callable===t&&e.delegationSelector===n)}function re(e,t,n){let r=typeof t==`string`,i=r?n:t||n,a=se(e);return k.has(a)||(a=e),[r,i,a]}function ie(e,t,n,r,i){if(typeof t!=`string`||!e)return;let[a,o,s]=re(t,n,r);t in O&&(o=(e=>function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)})(o));let c=A(e),l=c[s]||(c[s]={}),u=ne(l,o,a?n:null);if(u){u.oneOff=u.oneOff&&i;return}let d=ee(o,t.replace(C,``)),f=a?te(e,n,o):j(e,o);f.delegationSelector=a?n:null,f.callable=o,f.oneOff=i,f.uidEvent=d,l[d]=f,e.addEventListener(s,f,a)}function ae(e,t,n,r,i){let a=ne(t[n],r,i);a&&(e.removeEventListener(n,a,!!i),delete t[n][a.uidEvent])}function oe(e,t,n,r){let i=t[n]||{};for(let[a,o]of Object.entries(i))a.includes(r)&&ae(e,t,n,o.callable,o.delegationSelector)}function se(e){return e=e.replace(w,``),O[e]||e}let M={on(e,t,n,r){ie(e,t,n,r,!1)},one(e,t,n,r){ie(e,t,n,r,!0)},off(e,t,n,r){if(typeof t!=`string`||!e)return;let[i,a,o]=re(t,n,r),s=o!==t,c=A(e),l=c[o]||{},u=t.startsWith(`.`);if(a!==void 0){if(!Object.keys(l).length)return;ae(e,c,o,a,i?n:null);return}if(u)for(let n of Object.keys(c))oe(e,c,n,t.slice(1));for(let[n,r]of Object.entries(l)){let i=n.replace(T,``);(!s||t.includes(i))&&ae(e,c,o,r.callable,r.delegationSelector)}},trigger(e,t,n){if(typeof t!=`string`||!e)return null;let r=h(),i=t!==se(t),a=null,o=!0,s=!0,c=!1;i&&r&&(a=r.Event(t,n),r(e).trigger(a),o=!a.isPropagationStopped(),s=!a.isImmediatePropagationStopped(),c=a.isDefaultPrevented());let l=ce(new Event(t,{bubbles:o,cancelable:!0}),n);return c&&l.preventDefault(),s&&e.dispatchEvent(l),l.defaultPrevented&&a&&a.preventDefault(),l}};function ce(e,t={}){for(let[n,r]of Object.entries(t))try{e[n]=r}catch{Object.defineProperty(e,n,{configurable:!0,get(){return r}})}return e}function le(e){if(e===`true`)return!0;if(e===`false`)return!1;if(e===Number(e).toString())return Number(e);if(e===``||e===`null`)return null;if(typeof e!=`string`)return e;try{return JSON.parse(decodeURIComponent(e))}catch{return e}}function ue(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}let N={setDataAttribute(e,t,n){e.setAttribute(`data-bs-${ue(t)}`,n)},removeDataAttribute(e,t){e.removeAttribute(`data-bs-${ue(t)}`)},getDataAttributes(e){if(!e)return{};let t={},n=Object.keys(e.dataset).filter(e=>e.startsWith(`bs`)&&!e.startsWith(`bsConfig`));for(let r of n){let n=r.replace(/^bs/,``);n=n.charAt(0).toLowerCase()+n.slice(1),t[n]=le(e.dataset[r])}return t},getDataAttribute(e,t){return le(e.getAttribute(`data-bs-${ue(t)}`))}};class de{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw Error(`You have to implement the static method "NAME", for each component!`)}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){let n=c(t)?N.getDataAttribute(t,`config`):{};return{...this.constructor.Default,...typeof n==`object`?n:{},...c(t)?N.getDataAttributes(t):{},...typeof e==`object`?e:{}}}_typeCheckConfig(e,t=this.constructor.DefaultType){for(let[n,r]of Object.entries(t)){let t=e[n],a=c(t)?`element`:i(t);if(!new RegExp(r).test(a))throw TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${r}".`)}}}class P extends de{constructor(e,n){super(),e=l(e),e&&(this._element=e,this._config=this._getConfig(n),t.set(this._element,this.constructor.DATA_KEY,this))}dispose(){t.remove(this._element,this.constructor.DATA_KEY),M.off(this._element,this.constructor.EVENT_KEY);for(let e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,n=!0){x(e,t,n)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return t.get(l(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t==`object`?t:null)}static get VERSION(){return`5.3.8`}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}}let fe=e=>{let t=e.getAttribute(`data-bs-target`);if(!t||t===`#`){let n=e.getAttribute(`href`);if(!n||!n.includes(`#`)&&!n.startsWith(`.`))return null;n.includes(`#`)&&!n.startsWith(`#`)&&(n=`#${n.split(`#`)[1]}`),t=n&&n!==`#`?n.trim():null}return t?t.split(`,`).map(e=>r(e)).join(`,`):null},F={find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(e=>e.matches(t))},parents(e,t){let n=[],r=e.parentNode.closest(t);for(;r;)n.push(r),r=r.parentNode.closest(t);return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]},focusableChildren(e){let t=[`a`,`button`,`input`,`textarea`,`select`,`details`,`[tabindex]`,`[contenteditable="true"]`].map(e=>`${e}:not([tabindex^="-"])`).join(`,`);return this.find(t,e).filter(e=>!d(e)&&u(e))},getSelectorFromElement(e){let t=fe(e);return t&&F.findOne(t)?t:null},getElementFromSelector(e){let t=fe(e);return t?F.findOne(t):null},getMultipleElementsFromSelector(e){let t=fe(e);return t?F.find(t):[]}},pe=(e,t=`hide`)=>{let n=`click.dismiss${e.EVENT_KEY}`,r=e.NAME;M.on(document,n,`[data-bs-dismiss="${r}"]`,function(n){if([`A`,`AREA`].includes(this.tagName)&&n.preventDefault(),d(this))return;let i=F.getElementFromSelector(this)||this.closest(`.${r}`);e.getOrCreateInstance(i)[t]()})},me=`.bs.alert`,he=`close${me}`,ge=`closed${me}`;class _e extends P{static get NAME(){return`alert`}close(){if(M.trigger(this._element,he).defaultPrevented)return;this._element.classList.remove(`show`);let e=this._element.classList.contains(`fade`);this._queueCallback(()=>this._destroyElement(),this._element,e)}_destroyElement(){this._element.remove(),M.trigger(this._element,ge),this.dispose()}static jQueryInterface(e){return this.each(function(){let t=_e.getOrCreateInstance(this);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e](this)}})}}pe(_e,`close`),y(_e);let I=`[data-bs-toggle="button"]`;class L extends P{static get NAME(){return`button`}toggle(){this._element.setAttribute(`aria-pressed`,this._element.classList.toggle(`active`))}static jQueryInterface(e){return this.each(function(){let t=L.getOrCreateInstance(this);e===`toggle`&&t[e]()})}}M.on(document,`click.bs.button.data-api`,I,e=>{e.preventDefault();let t=e.target.closest(I);L.getOrCreateInstance(t).toggle()}),y(L);let R=`.bs.swipe`,ve=`touchstart${R}`,ye=`touchmove${R}`,be=`touchend${R}`,xe=`pointerdown${R}`,Se=`pointerup${R}`,Ce={endCallback:null,leftCallback:null,rightCallback:null},we={endCallback:`(function|null)`,leftCallback:`(function|null)`,rightCallback:`(function|null)`};class Te extends de{constructor(e,t){super(),this._element=e,!(!e||!Te.isSupported())&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return Ce}static get DefaultType(){return we}static get NAME(){return`swipe`}dispose(){M.off(this._element,R)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),b(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){let e=Math.abs(this._deltaX);if(e<=40)return;let t=e/this._deltaX;this._deltaX=0,t&&b(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(M.on(this._element,xe,e=>this._start(e)),M.on(this._element,Se,e=>this._end(e)),this._element.classList.add(`pointer-event`)):(M.on(this._element,ve,e=>this._start(e)),M.on(this._element,ye,e=>this._move(e)),M.on(this._element,be,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===`pen`||e.pointerType===`touch`)}static isSupported(){return`ontouchstart`in document.documentElement||navigator.maxTouchPoints>0}}let z=`.bs.carousel`,Ee=`.data-api`,De=`next`,Oe=`prev`,ke=`left`,Ae=`right`,je=`slide${z}`,Me=`slid${z}`,Ne=`keydown${z}`,Pe=`mouseenter${z}`,Fe=`mouseleave${z}`,Ie=`dragstart${z}`,Le=`load${z}${Ee}`,Re=`click${z}${Ee}`,ze=`carousel`,Be=`active`,Ve={ArrowLeft:Ae,ArrowRight:ke},He={interval:5e3,keyboard:!0,pause:`hover`,ride:!1,touch:!0,wrap:!0},Ue={interval:`(number|boolean)`,keyboard:`boolean`,pause:`(string|boolean)`,ride:`(boolean|string)`,touch:`boolean`,wrap:`boolean`};class We extends P{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=F.findOne(`.carousel-indicators`,this._element),this._addEventListeners(),this._config.ride===ze&&this.cycle()}static get Default(){return He}static get DefaultType(){return Ue}static get NAME(){return`carousel`}next(){this._slide(De)}nextWhenVisible(){!document.hidden&&u(this._element)&&this.next()}prev(){this._slide(Oe)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){M.one(this._element,Me,()=>this.cycle());return}this.cycle()}}to(e){let t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding){M.one(this._element,Me,()=>this.to(e));return}let n=this._getItemIndex(this._getActive());if(n===e)return;let r=e>n?De:Oe;this._slide(r,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&M.on(this._element,Ne,e=>this._keydown(e)),this._config.pause===`hover`&&(M.on(this._element,Pe,()=>this.pause()),M.on(this._element,Fe,()=>this._maybeEnableCycle())),this._config.touch&&Te.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(let e of F.find(`.carousel-item img`,this._element))M.on(e,Ie,e=>e.preventDefault());let e={leftCallback:()=>this._slide(this._directionToOrder(ke)),rightCallback:()=>this._slide(this._directionToOrder(Ae)),endCallback:()=>{this._config.pause===`hover`&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new Te(this._element,e)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let t=Ve[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;let t=F.findOne(`.active`,this._indicatorsElement);t.classList.remove(Be),t.removeAttribute(`aria-current`);let n=F.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);n&&(n.classList.add(Be),n.setAttribute(`aria-current`,`true`))}_updateInterval(){let e=this._activeElement||this._getActive();if(!e)return;let t=Number.parseInt(e.getAttribute(`data-bs-interval`),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;let n=this._getActive(),r=e===De,i=t||S(this._getItems(),n,r,this._config.wrap);if(i===n)return;let a=this._getItemIndex(i),o=t=>M.trigger(this._element,t,{relatedTarget:i,direction:this._orderToDirection(e),from:this._getItemIndex(n),to:a});if(o(je).defaultPrevented||!n||!i)return;let s=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(a),this._activeElement=i;let c=r?`carousel-item-start`:`carousel-item-end`,l=r?`carousel-item-next`:`carousel-item-prev`;i.classList.add(l),m(i),n.classList.add(c),i.classList.add(c),this._queueCallback(()=>{i.classList.remove(c,l),i.classList.add(Be),n.classList.remove(Be,l,c),this._isSliding=!1,o(Me)},n,this._isAnimated()),s&&this.cycle()}_isAnimated(){return this._element.classList.contains(`slide`)}_getActive(){return F.findOne(`.active.carousel-item`,this._element)}_getItems(){return F.find(`.carousel-item`,this._element)}_clearInterval(){this._interval&&=(clearInterval(this._interval),null)}_directionToOrder(e){return v()?e===ke?Oe:De:e===ke?De:Oe}_orderToDirection(e){return v()?e===Oe?ke:Ae:e===Oe?Ae:ke}static jQueryInterface(e){return this.each(function(){let t=We.getOrCreateInstance(this,e);if(typeof e==`number`){t.to(e);return}if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e]()}})}}M.on(document,Re,`[data-bs-slide], [data-bs-slide-to]`,function(e){let t=F.getElementFromSelector(this);if(!t||!t.classList.contains(ze))return;e.preventDefault();let n=We.getOrCreateInstance(t),r=this.getAttribute(`data-bs-slide-to`);if(r){n.to(r),n._maybeEnableCycle();return}if(N.getDataAttribute(this,`slide`)===`next`){n.next(),n._maybeEnableCycle();return}n.prev(),n._maybeEnableCycle()}),M.on(window,Le,()=>{let e=F.find(`[data-bs-ride="carousel"]`);for(let t of e)We.getOrCreateInstance(t)}),y(We);let Ge=`.bs.collapse`,Ke=`show${Ge}`,qe=`shown${Ge}`,Je=`hide${Ge}`,Ye=`hidden${Ge}`,Xe=`click${Ge}.data-api`,Ze=`show`,Qe=`collapse`,$e=`collapsing`,et=`:scope .${Qe} .${Qe}`,tt=`[data-bs-toggle="collapse"]`,nt={parent:null,toggle:!0},rt={parent:`(null|element)`,toggle:`boolean`};class it extends P{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];let n=F.find(tt);for(let e of n){let t=F.getSelectorFromElement(e),n=F.find(t).filter(e=>e===this._element);t!==null&&n.length&&this._triggerArray.push(e)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return nt}static get DefaultType(){return rt}static get NAME(){return`collapse`}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(`.collapse.show, .collapse.collapsing`).filter(e=>e!==this._element).map(e=>it.getOrCreateInstance(e,{toggle:!1}))),e.length&&e[0]._isTransitioning||M.trigger(this._element,Ke).defaultPrevented)return;for(let t of e)t.hide();let t=this._getDimension();this._element.classList.remove(Qe),this._element.classList.add($e),this._element.style[t]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let n=()=>{this._isTransitioning=!1,this._element.classList.remove($e),this._element.classList.add(Qe,Ze),this._element.style[t]=``,M.trigger(this._element,qe)},r=`scroll${t[0].toUpperCase()+t.slice(1)}`;this._queueCallback(n,this._element,!0),this._element.style[t]=`${this._element[r]}px`}hide(){if(this._isTransitioning||!this._isShown()||M.trigger(this._element,Je).defaultPrevented)return;let e=this._getDimension();this._element.style[e]=`${this._element.getBoundingClientRect()[e]}px`,m(this._element),this._element.classList.add($e),this._element.classList.remove(Qe,Ze);for(let e of this._triggerArray){let t=F.getElementFromSelector(e);t&&!this._isShown(t)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0;let t=()=>{this._isTransitioning=!1,this._element.classList.remove($e),this._element.classList.add(Qe),M.trigger(this._element,Ye)};this._element.style[e]=``,this._queueCallback(t,this._element,!0)}_isShown(e=this._element){return e.classList.contains(Ze)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=l(e.parent),e}_getDimension(){return this._element.classList.contains(`collapse-horizontal`)?`width`:`height`}_initializeChildren(){if(!this._config.parent)return;let e=this._getFirstLevelChildren(tt);for(let t of e){let e=F.getElementFromSelector(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}}_getFirstLevelChildren(e){let t=F.find(et,this._config.parent);return F.find(e,this._config.parent).filter(e=>!t.includes(e))}_addAriaAndCollapsedClass(e,t){if(e.length)for(let n of e)n.classList.toggle(`collapsed`,!t),n.setAttribute(`aria-expanded`,t)}static jQueryInterface(e){let t={};return typeof e==`string`&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){let n=it.getOrCreateInstance(this,t);if(typeof e==`string`){if(n[e]===void 0)throw TypeError(`No method named "${e}"`);n[e]()}})}}M.on(document,Xe,tt,function(e){(e.target.tagName===`A`||e.delegateTarget&&e.delegateTarget.tagName===`A`)&&e.preventDefault();for(let e of F.getMultipleElementsFromSelector(this))it.getOrCreateInstance(e,{toggle:!1}).toggle()}),y(it);var B=`top`,V=`bottom`,H=`right`,U=`left`,at=`auto`,ot=[B,V,H,U],st=`start`,ct=`end`,lt=`clippingParents`,ut=`viewport`,dt=`popper`,ft=`reference`,pt=ot.reduce(function(e,t){return e.concat([t+`-`+st,t+`-`+ct])},[]),mt=[].concat(ot,[at]).reduce(function(e,t){return e.concat([t,t+`-`+st,t+`-`+ct])},[]),ht=`beforeRead`,gt=`read`,_t=`afterRead`,vt=`beforeMain`,yt=`main`,bt=`afterMain`,xt=`beforeWrite`,St=`write`,Ct=`afterWrite`,wt=[ht,gt,_t,vt,yt,bt,xt,St,Ct];function W(e){return e?(e.nodeName||``).toLowerCase():null}function G(e){if(e==null)return window;if(e.toString()!==`[object Window]`){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function Tt(e){return e instanceof G(e).Element||e instanceof Element}function K(e){return e instanceof G(e).HTMLElement||e instanceof HTMLElement}function Et(e){return typeof ShadowRoot>`u`?!1:e instanceof G(e).ShadowRoot||e instanceof ShadowRoot}function Dt(e){var t=e.state;Object.keys(t.elements).forEach(function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},i=t.elements[e];!K(i)||!W(i)||(Object.assign(i.style,n),Object.keys(r).forEach(function(e){var t=r[e];t===!1?i.removeAttribute(e):i.setAttribute(e,t===!0?``:t)}))})}function Ot(e){var t=e.state,n={popper:{position:t.options.strategy,left:`0`,top:`0`,margin:`0`},arrow:{position:`absolute`},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(e){var r=t.elements[e],i=t.attributes[e]||{},a=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce(function(e,t){return e[t]=``,e},{});!K(r)||!W(r)||(Object.assign(r.style,a),Object.keys(i).forEach(function(e){r.removeAttribute(e)}))})}}let kt={name:`applyStyles`,enabled:!0,phase:`write`,fn:Dt,effect:Ot,requires:[`computeStyles`]};function q(e){return e.split(`-`)[0]}var At=Math.max,jt=Math.min,Mt=Math.round;function Nt(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(e){return e.brand+`/`+e.version}).join(` `):navigator.userAgent}function Pt(){return!/^((?!chrome|android).)*safari/i.test(Nt())}function Ft(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),i=1,a=1;t&&K(e)&&(i=e.offsetWidth>0&&Mt(r.width)/e.offsetWidth||1,a=e.offsetHeight>0&&Mt(r.height)/e.offsetHeight||1);var o=(Tt(e)?G(e):window).visualViewport,s=!Pt()&&n,c=(r.left+(s&&o?o.offsetLeft:0))/i,l=(r.top+(s&&o?o.offsetTop:0))/a,u=r.width/i,d=r.height/a;return{width:u,height:d,top:l,right:c+u,bottom:l+d,left:c,x:c,y:l}}function It(e){var t=Ft(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function Lt(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Et(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function J(e){return G(e).getComputedStyle(e)}function Rt(e){return[`table`,`td`,`th`].indexOf(W(e))>=0}function Y(e){return((Tt(e)?e.ownerDocument:e.document)||window.document).documentElement}function zt(e){return W(e)===`html`?e:e.assignedSlot||e.parentNode||(Et(e)?e.host:null)||Y(e)}function Bt(e){return!K(e)||J(e).position===`fixed`?null:e.offsetParent}function Vt(e){var t=/firefox/i.test(Nt());if(/Trident/i.test(Nt())&&K(e)&&J(e).position===`fixed`)return null;var n=zt(e);for(Et(n)&&(n=n.host);K(n)&&[`html`,`body`].indexOf(W(n))<0;){var r=J(n);if(r.transform!==`none`||r.perspective!==`none`||r.contain===`paint`||[`transform`,`perspective`].indexOf(r.willChange)!==-1||t&&r.willChange===`filter`||t&&r.filter&&r.filter!==`none`)return n;n=n.parentNode}return null}function Ht(e){for(var t=G(e),n=Bt(e);n&&Rt(n)&&J(n).position===`static`;)n=Bt(n);return n&&(W(n)===`html`||W(n)===`body`&&J(n).position===`static`)?t:n||Vt(e)||t}function Ut(e){return[`top`,`bottom`].indexOf(e)>=0?`x`:`y`}function Wt(e,t,n){return At(e,jt(t,n))}function Gt(e,t,n){var r=Wt(e,t,n);return r>n?n:r}function Kt(){return{top:0,right:0,bottom:0,left:0}}function qt(e){return Object.assign({},Kt(),e)}function Jt(e,t){return t.reduce(function(t,n){return t[n]=e,t},{})}var Yt=function(e,t){return e=typeof e==`function`?e(Object.assign({},t.rects,{placement:t.placement})):e,qt(typeof e==`number`?Jt(e,ot):e)};function Xt(e){var t,n=e.state,r=e.name,i=e.options,a=n.elements.arrow,o=n.modifiersData.popperOffsets,s=q(n.placement),c=Ut(s),l=[U,H].indexOf(s)>=0?`height`:`width`;if(!(!a||!o)){var u=Yt(i.padding,n),d=It(a),f=c===`y`?B:U,p=c===`y`?V:H,m=n.rects.reference[l]+n.rects.reference[c]-o[c]-n.rects.popper[l],h=o[c]-n.rects.reference[c],g=Ht(a),_=g?c===`y`?g.clientHeight||0:g.clientWidth||0:0,v=m/2-h/2,y=u[f],b=_-d[l]-u[p],x=_/2-d[l]/2+v,S=Wt(y,x,b),C=c;n.modifiersData[r]=(t={},t[C]=S,t.centerOffset=S-x,t)}}function Zt(e){var t=e.state,n=e.options.element,r=n===void 0?`[data-popper-arrow]`:n;r!=null&&(typeof r==`string`&&(r=t.elements.popper.querySelector(r),!r)||Lt(t.elements.popper,r)&&(t.elements.arrow=r))}let Qt={name:`arrow`,enabled:!0,phase:`main`,fn:Xt,effect:Zt,requires:[`popperOffsets`],requiresIfExists:[`preventOverflow`]};function $t(e){return e.split(`-`)[1]}var en={top:`auto`,right:`auto`,bottom:`auto`,left:`auto`};function tn(e,t){var n=e.x,r=e.y,i=t.devicePixelRatio||1;return{x:Mt(n*i)/i||0,y:Mt(r*i)/i||0}}function nn(e){var t,n=e.popper,r=e.popperRect,i=e.placement,a=e.variation,o=e.offsets,s=e.position,c=e.gpuAcceleration,l=e.adaptive,u=e.roundOffsets,d=e.isFixed,f=o.x,p=f===void 0?0:f,m=o.y,h=m===void 0?0:m,g=typeof u==`function`?u({x:p,y:h}):{x:p,y:h};p=g.x,h=g.y;var _=o.hasOwnProperty(`x`),v=o.hasOwnProperty(`y`),y=U,b=B,x=window;if(l){var S=Ht(n),C=`clientHeight`,w=`clientWidth`;if(S===G(n)&&(S=Y(n),J(S).position!==`static`&&s===`absolute`&&(C=`scrollHeight`,w=`scrollWidth`)),S=S,i===B||(i===U||i===H)&&a===ct){b=V;var T=d&&S===x&&x.visualViewport?x.visualViewport.height:S[C];h-=T-r.height,h*=c?1:-1}if(i===U||(i===B||i===V)&&a===ct){y=H;var E=d&&S===x&&x.visualViewport?x.visualViewport.width:S[w];p-=E-r.width,p*=c?1:-1}}var D=Object.assign({position:s},l&&en),O=u===!0?tn({x:p,y:h},G(n)):{x:p,y:h};if(p=O.x,h=O.y,c){var k;return Object.assign({},D,(k={},k[b]=v?`0`:``,k[y]=_?`0`:``,k.transform=(x.devicePixelRatio||1)<=1?`translate(`+p+`px, `+h+`px)`:`translate3d(`+p+`px, `+h+`px, 0)`,k))}return Object.assign({},D,(t={},t[b]=v?h+`px`:``,t[y]=_?p+`px`:``,t.transform=``,t))}function rn(e){var t=e.state,n=e.options,r=n.gpuAcceleration,i=r===void 0?!0:r,a=n.adaptive,o=a===void 0?!0:a,s=n.roundOffsets,c=s===void 0?!0:s,l={placement:q(t.placement),variation:$t(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:i,isFixed:t.options.strategy===`fixed`};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,nn(Object.assign({},l,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:o,roundOffsets:c})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,nn(Object.assign({},l,{offsets:t.modifiersData.arrow,position:`absolute`,adaptive:!1,roundOffsets:c})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}let an={name:`computeStyles`,enabled:!0,phase:`beforeWrite`,fn:rn,data:{}};var on={passive:!0};function sn(e){var t=e.state,n=e.instance,r=e.options,i=r.scroll,a=i===void 0?!0:i,o=r.resize,s=o===void 0?!0:o,c=G(t.elements.popper),l=[].concat(t.scrollParents.reference,t.scrollParents.popper);return a&&l.forEach(function(e){e.addEventListener(`scroll`,n.update,on)}),s&&c.addEventListener(`resize`,n.update,on),function(){a&&l.forEach(function(e){e.removeEventListener(`scroll`,n.update,on)}),s&&c.removeEventListener(`resize`,n.update,on)}}let cn={name:`eventListeners`,enabled:!0,phase:`write`,fn:function(){},effect:sn,data:{}};var ln={left:`right`,right:`left`,bottom:`top`,top:`bottom`};function un(e){return e.replace(/left|right|bottom|top/g,function(e){return ln[e]})}var dn={start:`end`,end:`start`};function fn(e){return e.replace(/start|end/g,function(e){return dn[e]})}function pn(e){var t=G(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function mn(e){return Ft(Y(e)).left+pn(e).scrollLeft}function hn(e,t){var n=G(e),r=Y(e),i=n.visualViewport,a=r.clientWidth,o=r.clientHeight,s=0,c=0;if(i){a=i.width,o=i.height;var l=Pt();(l||!l&&t===`fixed`)&&(s=i.offsetLeft,c=i.offsetTop)}return{width:a,height:o,x:s+mn(e),y:c}}function gn(e){var t=Y(e),n=pn(e),r=e.ownerDocument?.body,i=At(t.scrollWidth,t.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),a=At(t.scrollHeight,t.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),o=-n.scrollLeft+mn(e),s=-n.scrollTop;return J(r||t).direction===`rtl`&&(o+=At(t.clientWidth,r?r.clientWidth:0)-i),{width:i,height:a,x:o,y:s}}function _n(e){var t=J(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function vn(e){return[`html`,`body`,`#document`].indexOf(W(e))>=0?e.ownerDocument.body:K(e)&&_n(e)?e:vn(zt(e))}function yn(e,t){t===void 0&&(t=[]);var n=vn(e),r=n===e.ownerDocument?.body,i=G(n),a=r?[i].concat(i.visualViewport||[],_n(n)?n:[]):n,o=t.concat(a);return r?o:o.concat(yn(zt(a)))}function bn(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function xn(e,t){var n=Ft(e,!1,t===`fixed`);return n.top+=e.clientTop,n.left+=e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function Sn(e,t,n){return t===ut?bn(hn(e,n)):Tt(t)?xn(t,n):bn(gn(Y(e)))}function Cn(e){var t=yn(zt(e)),n=[`absolute`,`fixed`].indexOf(J(e).position)>=0&&K(e)?Ht(e):e;return Tt(n)?t.filter(function(e){return Tt(e)&&Lt(e,n)&&W(e)!==`body`}):[]}function wn(e,t,n,r){var i=t===`clippingParents`?Cn(e):[].concat(t),a=[].concat(i,[n]),o=a[0],s=a.reduce(function(t,n){var i=Sn(e,n,r);return t.top=At(i.top,t.top),t.right=jt(i.right,t.right),t.bottom=jt(i.bottom,t.bottom),t.left=At(i.left,t.left),t},Sn(e,o,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}function Tn(e){var t=e.reference,n=e.element,r=e.placement,i=r?q(r):null,a=r?$t(r):null,o=t.x+t.width/2-n.width/2,s=t.y+t.height/2-n.height/2,c;switch(i){case B:c={x:o,y:t.y-n.height};break;case V:c={x:o,y:t.y+t.height};break;case H:c={x:t.x+t.width,y:s};break;case U:c={x:t.x-n.width,y:s};break;default:c={x:t.x,y:t.y}}var l=i?Ut(i):null;if(l!=null){var u=l===`y`?`height`:`width`;switch(a){case st:c[l]=c[l]-(t[u]/2-n[u]/2);break;case ct:c[l]=c[l]+(t[u]/2-n[u]/2);break}}return c}function En(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=r===void 0?e.placement:r,a=n.strategy,o=a===void 0?e.strategy:a,s=n.boundary,c=s===void 0?lt:s,l=n.rootBoundary,u=l===void 0?ut:l,d=n.elementContext,f=d===void 0?dt:d,p=n.altBoundary,m=p===void 0?!1:p,h=n.padding,g=h===void 0?0:h,_=qt(typeof g==`number`?Jt(g,ot):g),v=f===dt?ft:dt,y=e.rects.popper,b=e.elements[m?v:f],x=wn(Tt(b)?b:b.contextElement||Y(e.elements.popper),c,u,o),S=Ft(e.elements.reference),C=Tn({reference:S,element:y,placement:i}),w=bn(Object.assign({},y,C)),T=f===dt?w:S,E={top:x.top-T.top+_.top,bottom:T.bottom-x.bottom+_.bottom,left:x.left-T.left+_.left,right:T.right-x.right+_.right},D=e.modifiersData.offset;if(f===dt&&D){var O=D[i];Object.keys(E).forEach(function(e){var t=[H,V].indexOf(e)>=0?1:-1,n=[B,V].indexOf(e)>=0?`y`:`x`;E[e]+=O[n]*t})}return E}function Dn(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=n.boundary,a=n.rootBoundary,o=n.padding,s=n.flipVariations,c=n.allowedAutoPlacements,l=c===void 0?mt:c,u=$t(r),d=u?s?pt:pt.filter(function(e){return $t(e)===u}):ot,f=d.filter(function(e){return l.indexOf(e)>=0});f.length===0&&(f=d);var p=f.reduce(function(t,n){return t[n]=En(e,{placement:n,boundary:i,rootBoundary:a,padding:o})[q(n)],t},{});return Object.keys(p).sort(function(e,t){return p[e]-p[t]})}function On(e){if(q(e)===at)return[];var t=un(e);return[fn(e),t,fn(t)]}function kn(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var i=n.mainAxis,a=i===void 0?!0:i,o=n.altAxis,s=o===void 0?!0:o,c=n.fallbackPlacements,l=n.padding,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,p=n.flipVariations,m=p===void 0?!0:p,h=n.allowedAutoPlacements,g=t.options.placement,_=q(g)===g,v=c||(_||!m?[un(g)]:On(g)),y=[g].concat(v).reduce(function(e,n){return e.concat(q(n)===at?Dn(t,{placement:n,boundary:u,rootBoundary:d,padding:l,flipVariations:m,allowedAutoPlacements:h}):n)},[]),b=t.rects.reference,x=t.rects.popper,S=new Map,C=!0,w=y[0],T=0;T=0,ee=k?`width`:`height`,A=En(t,{placement:E,boundary:u,rootBoundary:d,altBoundary:f,padding:l}),j=k?O?H:U:O?V:B;b[ee]>x[ee]&&(j=un(j));var te=un(j),ne=[];if(a&&ne.push(A[D]<=0),s&&ne.push(A[j]<=0,A[te]<=0),ne.every(function(e){return e})){w=E,C=!1;break}S.set(E,ne)}if(C)for(var re=m?3:1,ie=function(e){var t=y.find(function(t){var n=S.get(t);if(n)return n.slice(0,e).every(function(e){return e})});if(t)return w=t,`break`},ae=re;ae>0&&ie(ae)!==`break`;ae--);t.placement!==w&&(t.modifiersData[r]._skip=!0,t.placement=w,t.reset=!0)}}let An={name:`flip`,enabled:!0,phase:`main`,fn:kn,requiresIfExists:[`offset`],data:{_skip:!1}};function jn(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Mn(e){return[B,H,V,U].some(function(t){return e[t]>=0})}function Nn(e){var t=e.state,n=e.name,r=t.rects.reference,i=t.rects.popper,a=t.modifiersData.preventOverflow,o=En(t,{elementContext:`reference`}),s=En(t,{altBoundary:!0}),c=jn(o,r),l=jn(s,i,a),u=Mn(c),d=Mn(l);t.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:l,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}let Pn={name:`hide`,enabled:!0,phase:`main`,requiresIfExists:[`preventOverflow`],fn:Nn};function Fn(e,t,n){var r=q(e),i=[U,B].indexOf(r)>=0?-1:1,a=typeof n==`function`?n(Object.assign({},t,{placement:e})):n,o=a[0],s=a[1];return o||=0,s=(s||0)*i,[U,H].indexOf(r)>=0?{x:s,y:o}:{x:o,y:s}}function In(e){var t=e.state,n=e.options,r=e.name,i=n.offset,a=i===void 0?[0,0]:i,o=mt.reduce(function(e,n){return e[n]=Fn(n,t.rects,a),e},{}),s=o[t.placement],c=s.x,l=s.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=l),t.modifiersData[r]=o}let Ln={name:`offset`,enabled:!0,phase:`main`,requires:[`popperOffsets`],fn:In};function Rn(e){var t=e.state,n=e.name;t.modifiersData[n]=Tn({reference:t.rects.reference,element:t.rects.popper,placement:t.placement})}let zn={name:`popperOffsets`,enabled:!0,phase:`read`,fn:Rn,data:{}};function Bn(e){return e===`x`?`y`:`x`}function Vn(e){var t=e.state,n=e.options,r=e.name,i=n.mainAxis,a=i===void 0?!0:i,o=n.altAxis,s=o===void 0?!1:o,c=n.boundary,l=n.rootBoundary,u=n.altBoundary,d=n.padding,f=n.tether,p=f===void 0?!0:f,m=n.tetherOffset,h=m===void 0?0:m,g=En(t,{boundary:c,rootBoundary:l,padding:d,altBoundary:u}),_=q(t.placement),v=$t(t.placement),y=!v,b=Ut(_),x=Bn(b),S=t.modifiersData.popperOffsets,C=t.rects.reference,w=t.rects.popper,T=typeof h==`function`?h(Object.assign({},t.rects,{placement:t.placement})):h,E=typeof T==`number`?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),D=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,O={x:0,y:0};if(S){if(a){var k=b===`y`?B:U,ee=b===`y`?V:H,A=b===`y`?`height`:`width`,j=S[b],te=j+g[k],ne=j-g[ee],re=p?-w[A]/2:0,ie=v===st?C[A]:w[A],ae=v===st?-w[A]:-C[A],oe=t.elements.arrow,se=p&&oe?It(oe):{width:0,height:0},M=t.modifiersData[`arrow#persistent`]?t.modifiersData[`arrow#persistent`].padding:Kt(),ce=M[k],le=M[ee],ue=Wt(0,C[A],se[A]),N=y?C[A]/2-re-ue-ce-E.mainAxis:ie-ue-ce-E.mainAxis,de=y?-C[A]/2+re+ue+le+E.mainAxis:ae+ue+le+E.mainAxis,P=t.elements.arrow&&Ht(t.elements.arrow),fe=P?b===`y`?P.clientTop||0:P.clientLeft||0:0,F=D?.[b]??0,pe=j+N-F-fe,me=j+de-F,he=Wt(p?jt(te,pe):te,j,p?At(ne,me):ne);S[b]=he,O[b]=he-j}if(s){var ge=b===`x`?B:U,_e=b===`x`?V:H,I=S[x],L=x===`y`?`height`:`width`,R=I+g[ge],ve=I-g[_e],ye=[B,U].indexOf(_)!==-1,be=D?.[x]??0,xe=ye?R:I-C[L]-w[L]-be+E.altAxis,Se=ye?I+C[L]+w[L]-be-E.altAxis:ve,Ce=p&&ye?Gt(xe,I,Se):Wt(p?xe:R,I,p?Se:ve);S[x]=Ce,O[x]=Ce-I}t.modifiersData[r]=O}}let Hn={name:`preventOverflow`,enabled:!0,phase:`main`,fn:Vn,requiresIfExists:[`offset`]};function Un(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function Wn(e){return e===G(e)||!K(e)?pn(e):Un(e)}function Gn(e){var t=e.getBoundingClientRect(),n=Mt(t.width)/e.offsetWidth||1,r=Mt(t.height)/e.offsetHeight||1;return n!==1||r!==1}function Kn(e,t,n){n===void 0&&(n=!1);var r=K(t),i=K(t)&&Gn(t),a=Y(t),o=Ft(e,i,n),s={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(r||!r&&!n)&&((W(t)!==`body`||_n(a))&&(s=Wn(t)),K(t)?(c=Ft(t,!0),c.x+=t.clientLeft,c.y+=t.clientTop):a&&(c.x=mn(a))),{x:o.left+s.scrollLeft-c.x,y:o.top+s.scrollTop-c.y,width:o.width,height:o.height}}function qn(e){var t=new Map,n=new Set,r=[];e.forEach(function(e){t.set(e.name,e)});function i(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach(function(e){if(!n.has(e)){var r=t.get(e);r&&i(r)}}),r.push(e)}return e.forEach(function(e){n.has(e.name)||i(e)}),r}function Jn(e){var t=qn(e);return wt.reduce(function(e,n){return e.concat(t.filter(function(e){return e.phase===n}))},[])}function Yn(e){var t;return function(){return t||=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})}),t}}function Xn(e){var t=e.reduce(function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e},{});return Object.keys(t).map(function(e){return t[e]})}var Zn={placement:`bottom`,modifiers:[],strategy:`absolute`};function Qn(){return![...arguments].some(function(e){return!(e&&typeof e.getBoundingClientRect==`function`)})}function $n(e){e===void 0&&(e={});var t=e,n=t.defaultModifiers,r=n===void 0?[]:n,i=t.defaultOptions,a=i===void 0?Zn:i;return function(e,t,n){n===void 0&&(n=a);var i={placement:`bottom`,orderedModifiers:[],options:Object.assign({},Zn,a),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},o=[],s=!1,c={state:i,setOptions:function(n){var o=typeof n==`function`?n(i.options):n;u(),i.options=Object.assign({},a,i.options,o),i.scrollParents={reference:Tt(e)?yn(e):e.contextElement?yn(e.contextElement):[],popper:yn(t)};var s=Jn(Xn([].concat(r,i.options.modifiers)));return i.orderedModifiers=s.filter(function(e){return e.enabled}),l(),c.update()},forceUpdate:function(){if(!s){var e=i.elements,t=e.reference,n=e.popper;if(Qn(t,n)){i.rects={reference:Kn(t,Ht(n),i.options.strategy===`fixed`),popper:It(n)},i.reset=!1,i.placement=i.options.placement,i.orderedModifiers.forEach(function(e){return i.modifiersData[e.name]=Object.assign({},e.data)});for(var r=0;rNumber.parseInt(e,10)):typeof e==`function`?t=>e(t,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:`preventOverflow`,options:{boundary:this._config.boundary}},{name:`offset`,options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display===`static`)&&(N.setDataAttribute(this._menu,`popper`,`static`),e.modifiers=[{name:`applyStyles`,enabled:!1}]),{...e,...b(this._config.popperConfig,[void 0,e])}}_selectMenuItem({key:e,target:t}){let n=F.find(`.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)`,this._menu).filter(e=>u(e));n.length&&S(n,t,e===or,!n.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){let t=X.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e.button===2||e.type===`keyup`&&e.key!==`Tab`)return;let t=F.find(gr);for(let n of t){let t=X.getInstance(n);if(!t||t._config.autoClose===!1)continue;let r=e.composedPath(),i=r.includes(t._menu);if(r.includes(t._element)||t._config.autoClose===`inside`&&!i||t._config.autoClose===`outside`&&i||t._menu.contains(e.target)&&(e.type===`keyup`&&e.key===`Tab`||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;let a={relatedTarget:t._element};e.type===`click`&&(a.clickEvent=e),t._completeHide(a)}}static dataApiKeydownHandler(e){let t=/input|textarea/i.test(e.target.tagName),n=e.key===`Escape`,r=[`ArrowUp`,or].includes(e.key);if(!r&&!n||t&&!n)return;e.preventDefault();let i=this.matches(hr)?this:F.prev(this,hr)[0]||F.next(this,hr)[0]||F.findOne(hr,e.delegateTarget.parentNode),a=X.getOrCreateInstance(i);if(r){e.stopPropagation(),a.show(),a._selectMenuItem(e);return}a._isShown()&&(e.stopPropagation(),a.hide(),i.focus())}}M.on(document,fr,hr,X.dataApiKeydownHandler),M.on(document,fr,_r,X.dataApiKeydownHandler),M.on(document,dr,X.clearMenus),M.on(document,pr,X.clearMenus),M.on(document,dr,hr,function(e){e.preventDefault(),X.getOrCreateInstance(this).toggle()}),y(X);let Er=`backdrop`,Dr=`show`,Or=`mousedown.bs.${Er}`,kr={className:`modal-backdrop`,clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:`body`},Ar={className:`string`,clickCallback:`(function|null)`,isAnimated:`boolean`,isVisible:`boolean`,rootElement:`(element|string)`};class jr extends de{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return kr}static get DefaultType(){return Ar}static get NAME(){return Er}show(e){if(!this._config.isVisible){b(e);return}this._append();let t=this._getElement();this._config.isAnimated&&m(t),t.classList.add(Dr),this._emulateAnimation(()=>{b(e)})}hide(e){if(!this._config.isVisible){b(e);return}this._getElement().classList.remove(Dr),this._emulateAnimation(()=>{this.dispose(),b(e)})}dispose(){this._isAppended&&=(M.off(this._element,Or),this._element.remove(),!1)}_getElement(){if(!this._element){let e=document.createElement(`div`);e.className=this._config.className,this._config.isAnimated&&e.classList.add(`fade`),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=l(e.rootElement),e}_append(){if(this._isAppended)return;let e=this._getElement();this._config.rootElement.append(e),M.on(e,Or,()=>{b(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){x(e,this._getElement(),this._config.isAnimated)}}let Mr=`.bs.focustrap`,Nr=`focusin${Mr}`,Pr=`keydown.tab${Mr}`,Fr=`backward`,Ir={autofocus:!0,trapElement:null},Lr={autofocus:`boolean`,trapElement:`element`};class Rr extends de{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Ir}static get DefaultType(){return Lr}static get NAME(){return`focustrap`}activate(){this._isActive||=(this._config.autofocus&&this._config.trapElement.focus(),M.off(document,Mr),M.on(document,Nr,e=>this._handleFocusin(e)),M.on(document,Pr,e=>this._handleKeydown(e)),!0)}deactivate(){this._isActive&&(this._isActive=!1,M.off(document,Mr))}_handleFocusin(e){let{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;let n=F.focusableChildren(t);n.length===0?t.focus():this._lastTabNavDirection===Fr?n[n.length-1].focus():n[0].focus()}_handleKeydown(e){e.key===`Tab`&&(this._lastTabNavDirection=e.shiftKey?Fr:`forward`)}}let zr=`.fixed-top, .fixed-bottom, .is-fixed, .sticky-top`,Br=`.sticky-top`,Vr=`padding-right`,Hr=`margin-right`;class Ur{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Vr,t=>t+e),this._setElementAttributes(zr,Vr,t=>t+e),this._setElementAttributes(Br,Hr,t=>t-e)}reset(){this._resetElementAttributes(this._element,`overflow`),this._resetElementAttributes(this._element,Vr),this._resetElementAttributes(zr,Vr),this._resetElementAttributes(Br,Hr)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,`overflow`),this._element.style.overflow=`hidden`}_setElementAttributes(e,t,n){let r=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+r)return;this._saveInitialAttribute(e,t);let i=window.getComputedStyle(e).getPropertyValue(t);e.style.setProperty(t,`${n(Number.parseFloat(i))}px`)})}_saveInitialAttribute(e,t){let n=e.style.getPropertyValue(t);n&&N.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{let n=N.getDataAttribute(e,t);if(n===null){e.style.removeProperty(t);return}N.removeDataAttribute(e,t),e.style.setProperty(t,n)})}_applyManipulationCallback(e,t){if(c(e)){t(e);return}for(let n of F.find(e,this._element))t(n)}}let Z=`.bs.modal`,Wr=`hide${Z}`,Gr=`hidePrevented${Z}`,Kr=`hidden${Z}`,qr=`show${Z}`,Jr=`shown${Z}`,Yr=`resize${Z}`,Xr=`click.dismiss${Z}`,Zr=`mousedown.dismiss${Z}`,Qr=`keydown.dismiss${Z}`,$r=`click${Z}.data-api`,ei=`modal-open`,ti=`show`,ni=`modal-static`,ri={backdrop:!0,focus:!0,keyboard:!0},ii={backdrop:`(boolean|string)`,focus:`boolean`,keyboard:`boolean`};class ai extends P{constructor(e,t){super(e,t),this._dialog=F.findOne(`.modal-dialog`,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ur,this._addEventListeners()}static get Default(){return ri}static get DefaultType(){return ii}static get NAME(){return`modal`}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||M.trigger(this._element,qr,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ei),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||M.trigger(this._element,Wr).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(ti),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){M.off(window,Z),M.off(this._dialog,Z),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new jr({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Rr({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display=`block`,this._element.removeAttribute(`aria-hidden`),this._element.setAttribute(`aria-modal`,!0),this._element.setAttribute(`role`,`dialog`),this._element.scrollTop=0;let t=F.findOne(`.modal-body`,this._dialog);t&&(t.scrollTop=0),m(this._element),this._element.classList.add(ti),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,M.trigger(this._element,Jr,{relatedTarget:e})},this._dialog,this._isAnimated())}_addEventListeners(){M.on(this._element,Qr,e=>{if(e.key===`Escape`){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),M.on(window,Yr,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),M.on(this._element,Zr,e=>{M.one(this._element,Xr,t=>{if(!(this._element!==e.target||this._element!==t.target)){if(this._config.backdrop===`static`){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display=`none`,this._element.setAttribute(`aria-hidden`,!0),this._element.removeAttribute(`aria-modal`),this._element.removeAttribute(`role`),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(ei),this._resetAdjustments(),this._scrollBar.reset(),M.trigger(this._element,Kr)})}_isAnimated(){return this._element.classList.contains(`fade`)}_triggerBackdropTransition(){if(M.trigger(this._element,Gr).defaultPrevented)return;let e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._element.style.overflowY;t===`hidden`||this._element.classList.contains(ni)||(e||(this._element.style.overflowY=`hidden`),this._element.classList.add(ni),this._queueCallback(()=>{this._element.classList.remove(ni),this._queueCallback(()=>{this._element.style.overflowY=t},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;if(n&&!e){let e=v()?`paddingLeft`:`paddingRight`;this._element.style[e]=`${t}px`}if(!n&&e){let e=v()?`paddingRight`:`paddingLeft`;this._element.style[e]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft=``,this._element.style.paddingRight=``}static jQueryInterface(e,t){return this.each(function(){let n=ai.getOrCreateInstance(this,e);if(typeof e==`string`){if(n[e]===void 0)throw TypeError(`No method named "${e}"`);n[e](t)}})}}M.on(document,$r,`[data-bs-toggle="modal"]`,function(e){let t=F.getElementFromSelector(this);[`A`,`AREA`].includes(this.tagName)&&e.preventDefault(),M.one(t,qr,e=>{e.defaultPrevented||M.one(t,Kr,()=>{u(this)&&this.focus()})});let n=F.findOne(`.modal.show`);n&&ai.getInstance(n).hide(),ai.getOrCreateInstance(t).toggle(this)}),pe(ai),y(ai);let Q=`.bs.offcanvas`,oi=`.data-api`,si=`load${Q}${oi}`,ci=`show`,li=`showing`,ui=`hiding`,di=`.offcanvas.show`,fi=`show${Q}`,pi=`shown${Q}`,mi=`hide${Q}`,hi=`hidePrevented${Q}`,gi=`hidden${Q}`,_i=`resize${Q}`,vi=`click${Q}${oi}`,yi=`keydown.dismiss${Q}`,bi={backdrop:!0,keyboard:!0,scroll:!1},xi={backdrop:`(boolean|string)`,keyboard:`boolean`,scroll:`boolean`};class Si extends P{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return bi}static get DefaultType(){return xi}static get NAME(){return`offcanvas`}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||M.trigger(this._element,fi,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||new Ur().hide(),this._element.setAttribute(`aria-modal`,!0),this._element.setAttribute(`role`,`dialog`),this._element.classList.add(li),this._queueCallback(()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(ci),this._element.classList.remove(li),M.trigger(this._element,pi,{relatedTarget:e})},this._element,!0))}hide(){!this._isShown||M.trigger(this._element,mi).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ui),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(ci,ui),this._element.removeAttribute(`aria-modal`),this._element.removeAttribute(`role`),this._config.scroll||new Ur().reset(),M.trigger(this._element,gi)},this._element,!0))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){let e=()=>{if(this._config.backdrop===`static`){M.trigger(this._element,hi);return}this.hide()},t=!!this._config.backdrop;return new jr({className:`offcanvas-backdrop`,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?e:null})}_initializeFocusTrap(){return new Rr({trapElement:this._element})}_addEventListeners(){M.on(this._element,yi,e=>{if(e.key===`Escape`){if(this._config.keyboard){this.hide();return}M.trigger(this._element,hi)}})}static jQueryInterface(e){return this.each(function(){let t=Si.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e](this)}})}}M.on(document,vi,`[data-bs-toggle="offcanvas"]`,function(e){let t=F.getElementFromSelector(this);if([`A`,`AREA`].includes(this.tagName)&&e.preventDefault(),d(this))return;M.one(t,gi,()=>{u(this)&&this.focus()});let n=F.findOne(di);n&&n!==t&&Si.getInstance(n).hide(),Si.getOrCreateInstance(t).toggle(this)}),M.on(window,si,()=>{for(let e of F.find(di))Si.getOrCreateInstance(e).show()}),M.on(window,_i,()=>{for(let e of F.find(`[aria-modal][class*=show][class*=offcanvas-]`))getComputedStyle(e).position!==`fixed`&&Si.getOrCreateInstance(e).hide()}),pe(Si),y(Si);let Ci={"*":[`class`,`dir`,`id`,`lang`,`role`,/^aria-[\w-]*$/i],a:[`target`,`href`,`title`,`rel`],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:[`src`,`srcset`,`alt`,`title`,`width`,`height`],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},wi=new Set([`background`,`cite`,`href`,`itemtype`,`longdesc`,`poster`,`src`,`xlink:href`]),Ti=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Ei=(e,t)=>{let n=e.nodeName.toLowerCase();return t.includes(n)?wi.has(n)?!!Ti.test(e.nodeValue):!0:t.filter(e=>e instanceof RegExp).some(e=>e.test(n))};function Di(e,t,n){if(!e.length)return e;if(n&&typeof n==`function`)return n(e);let r=new window.DOMParser().parseFromString(e,`text/html`),i=[].concat(...r.body.querySelectorAll(`*`));for(let e of i){let n=e.nodeName.toLowerCase();if(!Object.keys(t).includes(n)){e.remove();continue}let r=[].concat(...e.attributes),i=[].concat(t[`*`]||[],t[n]||[]);for(let t of r)Ei(t,i)||e.removeAttribute(t.nodeName)}return r.body.innerHTML}let Oi={allowList:Ci,content:{},extraClass:``,html:!1,sanitize:!0,sanitizeFn:null,template:`
`},ki={allowList:`object`,content:`object`,extraClass:`(string|function)`,html:`boolean`,sanitize:`boolean`,sanitizeFn:`(null|function)`,template:`string`},Ai={entry:`(string|element|function|null)`,selector:`(string|element)`};class ji extends de{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Oi}static get DefaultType(){return ki}static get NAME(){return`TemplateFactory`}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){let e=document.createElement(`div`);e.innerHTML=this._maybeSanitize(this._config.template);for(let[t,n]of Object.entries(this._config.content))this._setContent(e,n,t);let t=e.children[0],n=this._resolvePossibleFunction(this._config.extraClass);return n&&t.classList.add(...n.split(` `)),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(let[t,n]of Object.entries(e))super._typeCheckConfig({selector:t,entry:n},Ai)}_setContent(e,t,n){let r=F.findOne(n,e);if(r){if(t=this._resolvePossibleFunction(t),!t){r.remove();return}if(c(t)){this._putElementInTemplate(l(t),r);return}if(this._config.html){r.innerHTML=this._maybeSanitize(t);return}r.textContent=t}}_maybeSanitize(e){return this._config.sanitize?Di(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return b(e,[void 0,this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML=``,t.append(e);return}t.textContent=e.textContent}}let Mi=new Set([`sanitize`,`allowList`,`sanitizeFn`]),Ni=`fade`,Pi=`show`,Fi=`.modal`,Ii=`hide.bs.modal`,Li=`hover`,Ri=`focus`,zi=`click`,Bi={AUTO:`auto`,TOP:`top`,RIGHT:v()?`left`:`right`,BOTTOM:`bottom`,LEFT:v()?`right`:`left`},Vi={allowList:Ci,animation:!0,boundary:`clippingParents`,container:!1,customClass:``,delay:0,fallbackPlacements:[`top`,`right`,`bottom`,`left`],html:!1,offset:[0,6],placement:`top`,popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:``,title:``,trigger:`hover focus`},Hi={allowList:`object`,animation:`boolean`,boundary:`(string|element)`,container:`(string|element|boolean)`,customClass:`(string|function)`,delay:`(number|object)`,fallbackPlacements:`array`,html:`boolean`,offset:`(array|string|function)`,placement:`(string|function)`,popperConfig:`(null|object|function)`,sanitize:`boolean`,sanitizeFn:`(null|function)`,selector:`(string|boolean)`,template:`string`,title:`(string|element|function)`,trigger:`string`};class Ui extends P{constructor(e,t){if(rr===void 0)throw TypeError(`Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)`);super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Vi}static get DefaultType(){return Hi}static get NAME(){return`tooltip`}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),M.off(this._element.closest(Fi),Ii,this._hideModalHandler),this._element.getAttribute(`data-bs-original-title`)&&this._element.setAttribute(`title`,this._element.getAttribute(`data-bs-original-title`)),this._disposePopper(),super.dispose()}show(){if(this._element.style.display===`none`)throw Error(`Please use show on visible elements`);if(!(this._isWithContent()&&this._isEnabled))return;let e=M.trigger(this._element,this.constructor.eventName(`show`)),t=(f(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!t)return;this._disposePopper();let n=this._getTipElement();this._element.setAttribute(`aria-describedby`,n.getAttribute(`id`));let{container:r}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(r.append(n),M.trigger(this._element,this.constructor.eventName(`inserted`))),this._popper=this._createPopper(n),n.classList.add(Pi),`ontouchstart`in document.documentElement)for(let e of[].concat(...document.body.children))M.on(e,`mouseover`,p);this._queueCallback(()=>{M.trigger(this._element,this.constructor.eventName(`shown`)),this._isHovered===!1&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(!(!this._isShown()||M.trigger(this._element,this.constructor.eventName(`hide`)).defaultPrevented)){if(this._getTipElement().classList.remove(Pi),`ontouchstart`in document.documentElement)for(let e of[].concat(...document.body.children))M.off(e,`mouseover`,p);this._activeTrigger[zi]=!1,this._activeTrigger[Ri]=!1,this._activeTrigger[Li]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute(`aria-describedby`),M.trigger(this._element,this.constructor.eventName(`hidden`)))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||=this._createTipElement(this._newContent||this._getContentForTemplate()),this.tip}_createTipElement(e){let t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(Ni,Pi),t.classList.add(`bs-${this.constructor.NAME}-auto`);let n=a(this.constructor.NAME).toString();return t.setAttribute(`id`,n),this._isAnimated()&&t.classList.add(Ni),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new ji({...this._config,content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute(`data-bs-original-title`)}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ni)}_isShown(){return this.tip&&this.tip.classList.contains(Pi)}_createPopper(e){let t=b(this._config.placement,[this,e,this._element]),n=Bi[t.toUpperCase()];return nr(this._element,e,this._getPopperConfig(n))}_getOffset(){let{offset:e}=this._config;return typeof e==`string`?e.split(`,`).map(e=>Number.parseInt(e,10)):typeof e==`function`?t=>e(t,this._element):e}_resolvePossibleFunction(e){return b(e,[this._element,this._element])}_getPopperConfig(e){let t={placement:e,modifiers:[{name:`flip`,options:{fallbackPlacements:this._config.fallbackPlacements}},{name:`offset`,options:{offset:this._getOffset()}},{name:`preventOverflow`,options:{boundary:this._config.boundary}},{name:`arrow`,options:{element:`.${this.constructor.NAME}-arrow`}},{name:`preSetPlacement`,enabled:!0,phase:`beforeMain`,fn:e=>{this._getTipElement().setAttribute(`data-popper-placement`,e.state.placement)}}]};return{...t,...b(this._config.popperConfig,[void 0,t])}}_setListeners(){let e=this._config.trigger.split(` `);for(let t of e)if(t===`click`)M.on(this._element,this.constructor.eventName(`click`),this._config.selector,e=>{let t=this._initializeOnDelegatedTarget(e);t._activeTrigger[zi]=!(t._isShown()&&t._activeTrigger[zi]),t.toggle()});else if(t!==`manual`){let e=t===Li?this.constructor.eventName(`mouseenter`):this.constructor.eventName(`focusin`),n=t===Li?this.constructor.eventName(`mouseleave`):this.constructor.eventName(`focusout`);M.on(this._element,e,this._config.selector,e=>{let t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type===`focusin`?Ri:Li]=!0,t._enter()}),M.on(this._element,n,this._config.selector,e=>{let t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type===`focusout`?Ri:Li]=t._element.contains(e.relatedTarget),t._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},M.on(this._element.closest(Fi),Ii,this._hideModalHandler)}_fixTitle(){let e=this._element.getAttribute(`title`);e&&(!this._element.getAttribute(`aria-label`)&&!this._element.textContent.trim()&&this._element.setAttribute(`aria-label`,e),this._element.setAttribute(`data-bs-original-title`,e),this._element.removeAttribute(`title`))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){let t=N.getDataAttributes(this._element);for(let e of Object.keys(t))Mi.has(e)&&delete t[e];return e={...t,...typeof e==`object`&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:l(e.container),typeof e.delay==`number`&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title==`number`&&(e.title=e.title.toString()),typeof e.content==`number`&&(e.content=e.content.toString()),e}_getDelegateConfig(){let e={};for(let[t,n]of Object.entries(this._config))this.constructor.Default[t]!==n&&(e[t]=n);return e.selector=!1,e.trigger=`manual`,e}_disposePopper(){this._popper&&=(this._popper.destroy(),null),this.tip&&=(this.tip.remove(),null)}static jQueryInterface(e){return this.each(function(){let t=Ui.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e]()}})}}y(Ui);let Wi={...Ui.Default,content:``,offset:[0,8],placement:`right`,template:``,trigger:`click`},Gi={...Ui.DefaultType,content:`(null|string|element|function)`};class Ki extends Ui{static get Default(){return Wi}static get DefaultType(){return Gi}static get NAME(){return`popover`}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){let t=Ki.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e]()}})}}y(Ki);let qi=`.bs.scrollspy`,Ji=`activate${qi}`,Yi=`click${qi}`,Xi=`load${qi}.data-api`,Zi=`active`,Qi=`[href]`,$i=`.nav-link`,ea=`${$i}, .nav-item > ${$i}, .list-group-item`,ta={offset:null,rootMargin:`0px 0px -25%`,smoothScroll:!1,target:null,threshold:[.1,.5,1]},na={offset:`(number|null)`,rootMargin:`string`,smoothScroll:`boolean`,target:`element`,threshold:`array`};class ra extends P{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY===`visible`?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ta}static get DefaultType(){return na}static get NAME(){return`scrollspy`}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=l(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold==`string`&&(e.threshold=e.threshold.split(`,`).map(e=>Number.parseFloat(e))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(M.off(this._config.target,Yi),M.on(this._config.target,Yi,Qi,e=>{let t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();let n=this._rootElement||window,r=t.offsetTop-this._element.offsetTop;if(n.scrollTo){n.scrollTo({top:r,behavior:`smooth`});return}n.scrollTop=r}}))}_getNewObserver(){let e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(e=>this._observerCallback(e),e)}_observerCallback(e){let t=e=>this._targetLinks.get(`#${e.target.id}`),n=e=>{this._previousScrollData.visibleEntryTop=e.target.offsetTop,this._process(t(e))},r=(this._rootElement||document.documentElement).scrollTop,i=r>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=r;for(let a of e){if(!a.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(a));continue}let e=a.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(i&&e){if(n(a),!r)return;continue}!i&&!e&&n(a)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let e=F.find(Qi,this._config.target);for(let t of e){if(!t.hash||d(t))continue;let e=F.findOne(decodeURI(t.hash),this._element);u(e)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,e))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(Zi),this._activateParents(e),M.trigger(this._element,Ji,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(`dropdown-item`)){F.findOne(`.dropdown-toggle`,e.closest(`.dropdown`)).classList.add(Zi);return}for(let t of F.parents(e,`.nav, .list-group`))for(let e of F.prev(t,ea))e.classList.add(Zi)}_clearActiveClass(e){e.classList.remove(Zi);let t=F.find(`${Qi}.${Zi}`,e);for(let e of t)e.classList.remove(Zi)}static jQueryInterface(e){return this.each(function(){let t=ra.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e]()}})}}M.on(window,Xi,()=>{for(let e of F.find(`[data-bs-spy="scroll"]`))ra.getOrCreateInstance(e)}),y(ra);let ia=`.bs.tab`,aa=`hide${ia}`,oa=`hidden${ia}`,sa=`show${ia}`,ca=`shown${ia}`,la=`click${ia}`,ua=`keydown${ia}`,da=`load${ia}`,fa=`ArrowRight`,pa=`ArrowDown`,ma=`Home`,ha=`active`,ga=`fade`,_a=`show`,va=`.dropdown-toggle`,ya=`:not(${va})`,ba=`.nav-link${ya}, .list-group-item${ya}, [role="tab"]${ya}`,xa=`[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]`,Sa=`${ba}, ${xa}`,Ca=`.${ha}[data-bs-toggle="tab"], .${ha}[data-bs-toggle="pill"], .${ha}[data-bs-toggle="list"]`;class wa extends P{constructor(e){super(e),this._parent=this._element.closest(`.list-group, .nav, [role="tablist"]`),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),M.on(this._element,ua,e=>this._keydown(e)))}static get NAME(){return`tab`}show(){let e=this._element;if(this._elemIsActive(e))return;let t=this._getActiveElem(),n=t?M.trigger(t,aa,{relatedTarget:e}):null;M.trigger(e,sa,{relatedTarget:t}).defaultPrevented||n&&n.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){e&&(e.classList.add(ha),this._activate(F.getElementFromSelector(e)),this._queueCallback(()=>{if(e.getAttribute(`role`)!==`tab`){e.classList.add(_a);return}e.removeAttribute(`tabindex`),e.setAttribute(`aria-selected`,!0),this._toggleDropDown(e,!0),M.trigger(e,ca,{relatedTarget:t})},e,e.classList.contains(ga)))}_deactivate(e,t){e&&(e.classList.remove(ha),e.blur(),this._deactivate(F.getElementFromSelector(e)),this._queueCallback(()=>{if(e.getAttribute(`role`)!==`tab`){e.classList.remove(_a);return}e.setAttribute(`aria-selected`,!1),e.setAttribute(`tabindex`,`-1`),this._toggleDropDown(e,!1),M.trigger(e,oa,{relatedTarget:t})},e,e.classList.contains(ga)))}_keydown(e){if(![`ArrowLeft`,fa,`ArrowUp`,pa,ma,`End`].includes(e.key))return;e.stopPropagation(),e.preventDefault();let t=this._getChildren().filter(e=>!d(e)),n;if([ma,`End`].includes(e.key))n=t[e.key===ma?0:t.length-1];else{let r=[fa,pa].includes(e.key);n=S(t,e.target,r,!0)}n&&(n.focus({preventScroll:!0}),wa.getOrCreateInstance(n).show())}_getChildren(){return F.find(Sa,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,`role`,`tablist`);for(let e of t)this._setInitialAttributesOnChild(e)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);let t=this._elemIsActive(e),n=this._getOuterElement(e);e.setAttribute(`aria-selected`,t),n!==e&&this._setAttributeIfNotExists(n,`role`,`presentation`),t||e.setAttribute(`tabindex`,`-1`),this._setAttributeIfNotExists(e,`role`,`tab`),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){let t=F.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,`role`,`tabpanel`),e.id&&this._setAttributeIfNotExists(t,`aria-labelledby`,`${e.id}`))}_toggleDropDown(e,t){let n=this._getOuterElement(e);if(!n.classList.contains(`dropdown`))return;let r=(e,r)=>{let i=F.findOne(e,n);i&&i.classList.toggle(r,t)};r(va,ha),r(`.dropdown-menu`,_a),n.setAttribute(`aria-expanded`,t)}_setAttributeIfNotExists(e,t,n){e.hasAttribute(t)||e.setAttribute(t,n)}_elemIsActive(e){return e.classList.contains(ha)}_getInnerElement(e){return e.matches(Sa)?e:F.findOne(Sa,e)}_getOuterElement(e){return e.closest(`.nav-item, .list-group-item`)||e}static jQueryInterface(e){return this.each(function(){let t=wa.getOrCreateInstance(this);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e]()}})}}M.on(document,la,xa,function(e){[`A`,`AREA`].includes(this.tagName)&&e.preventDefault(),!d(this)&&wa.getOrCreateInstance(this).show()}),M.on(window,da,()=>{for(let e of F.find(Ca))wa.getOrCreateInstance(e)}),y(wa);let $=`.bs.toast`,Ta=`mouseover${$}`,Ea=`mouseout${$}`,Da=`focusin${$}`,Oa=`focusout${$}`,ka=`hide${$}`,Aa=`hidden${$}`,ja=`show${$}`,Ma=`shown${$}`,Na=`hide`,Pa=`show`,Fa=`showing`,Ia={animation:`boolean`,autohide:`boolean`,delay:`number`},La={animation:!0,autohide:!0,delay:5e3};class Ra extends P{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return La}static get DefaultType(){return Ia}static get NAME(){return`toast`}show(){M.trigger(this._element,ja).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add(`fade`),this._element.classList.remove(Na),m(this._element),this._element.classList.add(Pa,Fa),this._queueCallback(()=>{this._element.classList.remove(Fa),M.trigger(this._element,Ma),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){!this.isShown()||M.trigger(this._element,ka).defaultPrevented||(this._element.classList.add(Fa),this._queueCallback(()=>{this._element.classList.add(Na),this._element.classList.remove(Fa,Pa),M.trigger(this._element,Aa)},this._element,this._config.animation))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Pa),super.dispose()}isShown(){return this._element.classList.contains(Pa)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case`mouseover`:case`mouseout`:this._hasMouseInteraction=t;break;case`focusin`:case`focusout`:this._hasKeyboardInteraction=t;break}if(t){this._clearTimeout();return}let n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){M.on(this._element,Ta,e=>this._onInteraction(e,!0)),M.on(this._element,Ea,e=>this._onInteraction(e,!1)),M.on(this._element,Da,e=>this._onInteraction(e,!0)),M.on(this._element,Oa,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let t=Ra.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e](this)}})}}return pe(Ra),y(Ra),{Alert:_e,Button:L,Carousel:We,Collapse:it,Dropdown:X,Modal:ai,Offcanvas:Si,Popover:Ki,ScrollSpy:ra,Tab:wa,Toast:Ra,Tooltip:Ui}}))}))();function e(e){document.documentElement.setAttribute(`data-theme`,e)}function t(){var t=document.documentElement.getAttribute(`data-theme`)===`light`?`dark`:`light`;e(t),localStorage.setItem(`theme`,t)}window.toggleTheme=t; \ No newline at end of file +/* empty css */((e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports))(((e,t)=>{(function(n,r){typeof e==`object`&&t!==void 0?t.exports=r():typeof define==`function`&&define.amd?define(r):(n=typeof globalThis<`u`?globalThis:n||self,n.bootstrap=r())})(e,(function(){let e=new Map,t={set(t,n,r){e.has(t)||e.set(t,new Map);let i=e.get(t);if(!i.has(n)&&i.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(i.keys())[0]}.`);return}i.set(n,r)},get(t,n){return e.has(t)&&e.get(t).get(n)||null},remove(t,n){if(!e.has(t))return;let r=e.get(t);r.delete(n),r.size===0&&e.delete(t)}},n=`transitionend`,r=e=>(e&&window.CSS&&window.CSS.escape&&(e=e.replace(/#([^\s"#']+)/g,(e,t)=>`#${CSS.escape(t)}`)),e),i=e=>e==null?`${e}`:Object.prototype.toString.call(e).match(/\s([a-z]+)/i)[1].toLowerCase(),a=e=>{do e+=Math.floor(Math.random()*1e6);while(document.getElementById(e));return e},o=e=>{if(!e)return 0;let{transitionDuration:t,transitionDelay:n}=window.getComputedStyle(e);return!Number.parseFloat(t)&&!Number.parseFloat(n)?0:(t=t.split(`,`)[0],n=n.split(`,`)[0],(Number.parseFloat(t)+Number.parseFloat(n))*1e3)},s=e=>{e.dispatchEvent(new Event(n))},c=e=>!e||typeof e!=`object`?!1:(e.jquery!==void 0&&(e=e[0]),e.nodeType!==void 0),l=e=>c(e)?e.jquery?e[0]:e:typeof e==`string`&&e.length>0?document.querySelector(r(e)):null,u=e=>{if(!c(e)||e.getClientRects().length===0)return!1;let t=getComputedStyle(e).getPropertyValue(`visibility`)===`visible`,n=e.closest(`details:not([open])`);if(!n)return t;if(n!==e){let t=e.closest(`summary`);if(t&&t.parentNode!==n||t===null)return!1}return t},d=e=>!e||e.nodeType!==Node.ELEMENT_NODE||e.classList.contains(`disabled`)?!0:e.disabled===void 0?e.hasAttribute(`disabled`)&&e.getAttribute(`disabled`)!==`false`:e.disabled,f=e=>{if(!document.documentElement.attachShadow)return null;if(typeof e.getRootNode==`function`){let t=e.getRootNode();return t instanceof ShadowRoot?t:null}return e instanceof ShadowRoot?e:e.parentNode?f(e.parentNode):null},p=()=>{},m=e=>{e.offsetHeight},h=()=>window.jQuery&&!document.body.hasAttribute(`data-bs-no-jquery`)?window.jQuery:null,g=[],_=e=>{document.readyState===`loading`?(g.length||document.addEventListener(`DOMContentLoaded`,()=>{for(let e of g)e()}),g.push(e)):e()},v=()=>document.documentElement.dir===`rtl`,y=e=>{_(()=>{let t=h();if(t){let n=e.NAME,r=t.fn[n];t.fn[n]=e.jQueryInterface,t.fn[n].Constructor=e,t.fn[n].noConflict=()=>(t.fn[n]=r,e.jQueryInterface)}})},b=(e,t=[],n=e)=>typeof e==`function`?e.call(...t):n,x=(e,t,r=!0)=>{if(!r){b(e);return}let i=o(t)+5,a=!1,c=({target:r})=>{r===t&&(a=!0,t.removeEventListener(n,c),b(e))};t.addEventListener(n,c),setTimeout(()=>{a||s(t)},i)},S=(e,t,n,r)=>{let i=e.length,a=e.indexOf(t);return a===-1?!n&&r?e[i-1]:e[0]:(a+=n?1:-1,r&&(a=(a+i)%i),e[Math.max(0,Math.min(a,i-1))])},C=/[^.]*(?=\..*)\.|.*/,w=/\..*/,T=/::\d+$/,E={},D=1,O={mouseenter:`mouseover`,mouseleave:`mouseout`},k=new Set(`click.dblclick.mouseup.mousedown.contextmenu.mousewheel.DOMMouseScroll.mouseover.mouseout.mousemove.selectstart.selectend.keydown.keypress.keyup.orientationchange.touchstart.touchmove.touchend.touchcancel.pointerdown.pointermove.pointerup.pointerleave.pointercancel.gesturestart.gesturechange.gestureend.focus.blur.change.reset.select.submit.focusin.focusout.load.unload.beforeunload.resize.move.DOMContentLoaded.readystatechange.error.abort.scroll`.split(`.`));function ee(e,t){return t&&`${t}::${D++}`||e.uidEvent||D++}function A(e){let t=ee(e);return e.uidEvent=t,E[t]=E[t]||{},E[t]}function j(e,t){return function n(r){return ce(r,{delegateTarget:e}),n.oneOff&&M.off(e,r.type,t),t.apply(e,[r])}}function te(e,t,n){return function r(i){let a=e.querySelectorAll(t);for(let{target:o}=i;o&&o!==this;o=o.parentNode)for(let s of a)if(s===o)return ce(i,{delegateTarget:o}),r.oneOff&&M.off(e,i.type,t,n),n.apply(o,[i])}}function ne(e,t,n=null){return Object.values(e).find(e=>e.callable===t&&e.delegationSelector===n)}function re(e,t,n){let r=typeof t==`string`,i=r?n:t||n,a=se(e);return k.has(a)||(a=e),[r,i,a]}function ie(e,t,n,r,i){if(typeof t!=`string`||!e)return;let[a,o,s]=re(t,n,r);t in O&&(o=(e=>function(t){if(!t.relatedTarget||t.relatedTarget!==t.delegateTarget&&!t.delegateTarget.contains(t.relatedTarget))return e.call(this,t)})(o));let c=A(e),l=c[s]||(c[s]={}),u=ne(l,o,a?n:null);if(u){u.oneOff=u.oneOff&&i;return}let d=ee(o,t.replace(C,``)),f=a?te(e,n,o):j(e,o);f.delegationSelector=a?n:null,f.callable=o,f.oneOff=i,f.uidEvent=d,l[d]=f,e.addEventListener(s,f,a)}function ae(e,t,n,r,i){let a=ne(t[n],r,i);a&&(e.removeEventListener(n,a,!!i),delete t[n][a.uidEvent])}function oe(e,t,n,r){let i=t[n]||{};for(let[a,o]of Object.entries(i))a.includes(r)&&ae(e,t,n,o.callable,o.delegationSelector)}function se(e){return e=e.replace(w,``),O[e]||e}let M={on(e,t,n,r){ie(e,t,n,r,!1)},one(e,t,n,r){ie(e,t,n,r,!0)},off(e,t,n,r){if(typeof t!=`string`||!e)return;let[i,a,o]=re(t,n,r),s=o!==t,c=A(e),l=c[o]||{},u=t.startsWith(`.`);if(a!==void 0){if(!Object.keys(l).length)return;ae(e,c,o,a,i?n:null);return}if(u)for(let n of Object.keys(c))oe(e,c,n,t.slice(1));for(let[n,r]of Object.entries(l)){let i=n.replace(T,``);(!s||t.includes(i))&&ae(e,c,o,r.callable,r.delegationSelector)}},trigger(e,t,n){if(typeof t!=`string`||!e)return null;let r=h(),i=t!==se(t),a=null,o=!0,s=!0,c=!1;i&&r&&(a=r.Event(t,n),r(e).trigger(a),o=!a.isPropagationStopped(),s=!a.isImmediatePropagationStopped(),c=a.isDefaultPrevented());let l=ce(new Event(t,{bubbles:o,cancelable:!0}),n);return c&&l.preventDefault(),s&&e.dispatchEvent(l),l.defaultPrevented&&a&&a.preventDefault(),l}};function ce(e,t={}){for(let[n,r]of Object.entries(t))try{e[n]=r}catch{Object.defineProperty(e,n,{configurable:!0,get(){return r}})}return e}function le(e){if(e===`true`)return!0;if(e===`false`)return!1;if(e===Number(e).toString())return Number(e);if(e===``||e===`null`)return null;if(typeof e!=`string`)return e;try{return JSON.parse(decodeURIComponent(e))}catch{return e}}function ue(e){return e.replace(/[A-Z]/g,e=>`-${e.toLowerCase()}`)}let N={setDataAttribute(e,t,n){e.setAttribute(`data-bs-${ue(t)}`,n)},removeDataAttribute(e,t){e.removeAttribute(`data-bs-${ue(t)}`)},getDataAttributes(e){if(!e)return{};let t={},n=Object.keys(e.dataset).filter(e=>e.startsWith(`bs`)&&!e.startsWith(`bsConfig`));for(let r of n){let n=r.replace(/^bs/,``);n=n.charAt(0).toLowerCase()+n.slice(1),t[n]=le(e.dataset[r])}return t},getDataAttribute(e,t){return le(e.getAttribute(`data-bs-${ue(t)}`))}};class de{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw Error(`You have to implement the static method "NAME", for each component!`)}_getConfig(e){return e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e}_mergeConfigObj(e,t){let n=c(t)?N.getDataAttribute(t,`config`):{};return{...this.constructor.Default,...typeof n==`object`?n:{},...c(t)?N.getDataAttributes(t):{},...typeof e==`object`?e:{}}}_typeCheckConfig(e,t=this.constructor.DefaultType){for(let[n,r]of Object.entries(t)){let t=e[n],a=c(t)?`element`:i(t);if(!new RegExp(r).test(a))throw TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${r}".`)}}}class P extends de{constructor(e,n){super(),e=l(e),e&&(this._element=e,this._config=this._getConfig(n),t.set(this._element,this.constructor.DATA_KEY,this))}dispose(){t.remove(this._element,this.constructor.DATA_KEY),M.off(this._element,this.constructor.EVENT_KEY);for(let e of Object.getOwnPropertyNames(this))this[e]=null}_queueCallback(e,t,n=!0){x(e,t,n)}_getConfig(e){return e=this._mergeConfigObj(e,this._element),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}static getInstance(e){return t.get(l(e),this.DATA_KEY)}static getOrCreateInstance(e,t={}){return this.getInstance(e)||new this(e,typeof t==`object`?t:null)}static get VERSION(){return`5.3.8`}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(e){return`${e}${this.EVENT_KEY}`}}let fe=e=>{let t=e.getAttribute(`data-bs-target`);if(!t||t===`#`){let n=e.getAttribute(`href`);if(!n||!n.includes(`#`)&&!n.startsWith(`.`))return null;n.includes(`#`)&&!n.startsWith(`#`)&&(n=`#${n.split(`#`)[1]}`),t=n&&n!==`#`?n.trim():null}return t?t.split(`,`).map(e=>r(e)).join(`,`):null},F={find(e,t=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(t,e))},findOne(e,t=document.documentElement){return Element.prototype.querySelector.call(t,e)},children(e,t){return[].concat(...e.children).filter(e=>e.matches(t))},parents(e,t){let n=[],r=e.parentNode.closest(t);for(;r;)n.push(r),r=r.parentNode.closest(t);return n},prev(e,t){let n=e.previousElementSibling;for(;n;){if(n.matches(t))return[n];n=n.previousElementSibling}return[]},next(e,t){let n=e.nextElementSibling;for(;n;){if(n.matches(t))return[n];n=n.nextElementSibling}return[]},focusableChildren(e){let t=[`a`,`button`,`input`,`textarea`,`select`,`details`,`[tabindex]`,`[contenteditable="true"]`].map(e=>`${e}:not([tabindex^="-"])`).join(`,`);return this.find(t,e).filter(e=>!d(e)&&u(e))},getSelectorFromElement(e){let t=fe(e);return t&&F.findOne(t)?t:null},getElementFromSelector(e){let t=fe(e);return t?F.findOne(t):null},getMultipleElementsFromSelector(e){let t=fe(e);return t?F.find(t):[]}},pe=(e,t=`hide`)=>{let n=`click.dismiss${e.EVENT_KEY}`,r=e.NAME;M.on(document,n,`[data-bs-dismiss="${r}"]`,function(n){if([`A`,`AREA`].includes(this.tagName)&&n.preventDefault(),d(this))return;let i=F.getElementFromSelector(this)||this.closest(`.${r}`);e.getOrCreateInstance(i)[t]()})},me=`.bs.alert`,he=`close${me}`,ge=`closed${me}`;class _e extends P{static get NAME(){return`alert`}close(){if(M.trigger(this._element,he).defaultPrevented)return;this._element.classList.remove(`show`);let e=this._element.classList.contains(`fade`);this._queueCallback(()=>this._destroyElement(),this._element,e)}_destroyElement(){this._element.remove(),M.trigger(this._element,ge),this.dispose()}static jQueryInterface(e){return this.each(function(){let t=_e.getOrCreateInstance(this);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e](this)}})}}pe(_e,`close`),y(_e);let I=`[data-bs-toggle="button"]`;class L extends P{static get NAME(){return`button`}toggle(){this._element.setAttribute(`aria-pressed`,this._element.classList.toggle(`active`))}static jQueryInterface(e){return this.each(function(){let t=L.getOrCreateInstance(this);e===`toggle`&&t[e]()})}}M.on(document,`click.bs.button.data-api`,I,e=>{e.preventDefault();let t=e.target.closest(I);L.getOrCreateInstance(t).toggle()}),y(L);let R=`.bs.swipe`,ve=`touchstart${R}`,ye=`touchmove${R}`,be=`touchend${R}`,xe=`pointerdown${R}`,Se=`pointerup${R}`,Ce={endCallback:null,leftCallback:null,rightCallback:null},we={endCallback:`(function|null)`,leftCallback:`(function|null)`,rightCallback:`(function|null)`};class Te extends de{constructor(e,t){super(),this._element=e,!(!e||!Te.isSupported())&&(this._config=this._getConfig(t),this._deltaX=0,this._supportPointerEvents=!!window.PointerEvent,this._initEvents())}static get Default(){return Ce}static get DefaultType(){return we}static get NAME(){return`swipe`}dispose(){M.off(this._element,R)}_start(e){if(!this._supportPointerEvents){this._deltaX=e.touches[0].clientX;return}this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX)}_end(e){this._eventIsPointerPenTouch(e)&&(this._deltaX=e.clientX-this._deltaX),this._handleSwipe(),b(this._config.endCallback)}_move(e){this._deltaX=e.touches&&e.touches.length>1?0:e.touches[0].clientX-this._deltaX}_handleSwipe(){let e=Math.abs(this._deltaX);if(e<=40)return;let t=e/this._deltaX;this._deltaX=0,t&&b(t>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(M.on(this._element,xe,e=>this._start(e)),M.on(this._element,Se,e=>this._end(e)),this._element.classList.add(`pointer-event`)):(M.on(this._element,ve,e=>this._start(e)),M.on(this._element,ye,e=>this._move(e)),M.on(this._element,be,e=>this._end(e)))}_eventIsPointerPenTouch(e){return this._supportPointerEvents&&(e.pointerType===`pen`||e.pointerType===`touch`)}static isSupported(){return`ontouchstart`in document.documentElement||navigator.maxTouchPoints>0}}let z=`.bs.carousel`,Ee=`.data-api`,De=`next`,Oe=`prev`,ke=`left`,Ae=`right`,je=`slide${z}`,Me=`slid${z}`,Ne=`keydown${z}`,Pe=`mouseenter${z}`,Fe=`mouseleave${z}`,Ie=`dragstart${z}`,Le=`load${z}${Ee}`,Re=`click${z}${Ee}`,ze=`carousel`,Be=`active`,Ve={ArrowLeft:Ae,ArrowRight:ke},He={interval:5e3,keyboard:!0,pause:`hover`,ride:!1,touch:!0,wrap:!0},Ue={interval:`(number|boolean)`,keyboard:`boolean`,pause:`(string|boolean)`,ride:`(boolean|string)`,touch:`boolean`,wrap:`boolean`};class We extends P{constructor(e,t){super(e,t),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=F.findOne(`.carousel-indicators`,this._element),this._addEventListeners(),this._config.ride===ze&&this.cycle()}static get Default(){return He}static get DefaultType(){return Ue}static get NAME(){return`carousel`}next(){this._slide(De)}nextWhenVisible(){!document.hidden&&u(this._element)&&this.next()}prev(){this._slide(Oe)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(this._config.ride){if(this._isSliding){M.one(this._element,Me,()=>this.cycle());return}this.cycle()}}to(e){let t=this._getItems();if(e>t.length-1||e<0)return;if(this._isSliding){M.one(this._element,Me,()=>this.to(e));return}let n=this._getItemIndex(this._getActive());if(n===e)return;let r=e>n?De:Oe;this._slide(r,t[e])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(e){return e.defaultInterval=e.interval,e}_addEventListeners(){this._config.keyboard&&M.on(this._element,Ne,e=>this._keydown(e)),this._config.pause===`hover`&&(M.on(this._element,Pe,()=>this.pause()),M.on(this._element,Fe,()=>this._maybeEnableCycle())),this._config.touch&&Te.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(let e of F.find(`.carousel-item img`,this._element))M.on(e,Ie,e=>e.preventDefault());let e={leftCallback:()=>this._slide(this._directionToOrder(ke)),rightCallback:()=>this._slide(this._directionToOrder(Ae)),endCallback:()=>{this._config.pause===`hover`&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),500+this._config.interval))}};this._swipeHelper=new Te(this._element,e)}_keydown(e){if(/input|textarea/i.test(e.target.tagName))return;let t=Ve[e.key];t&&(e.preventDefault(),this._slide(this._directionToOrder(t)))}_getItemIndex(e){return this._getItems().indexOf(e)}_setActiveIndicatorElement(e){if(!this._indicatorsElement)return;let t=F.findOne(`.active`,this._indicatorsElement);t.classList.remove(Be),t.removeAttribute(`aria-current`);let n=F.findOne(`[data-bs-slide-to="${e}"]`,this._indicatorsElement);n&&(n.classList.add(Be),n.setAttribute(`aria-current`,`true`))}_updateInterval(){let e=this._activeElement||this._getActive();if(!e)return;let t=Number.parseInt(e.getAttribute(`data-bs-interval`),10);this._config.interval=t||this._config.defaultInterval}_slide(e,t=null){if(this._isSliding)return;let n=this._getActive(),r=e===De,i=t||S(this._getItems(),n,r,this._config.wrap);if(i===n)return;let a=this._getItemIndex(i),o=t=>M.trigger(this._element,t,{relatedTarget:i,direction:this._orderToDirection(e),from:this._getItemIndex(n),to:a});if(o(je).defaultPrevented||!n||!i)return;let s=!!this._interval;this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(a),this._activeElement=i;let c=r?`carousel-item-start`:`carousel-item-end`,l=r?`carousel-item-next`:`carousel-item-prev`;i.classList.add(l),m(i),n.classList.add(c),i.classList.add(c),this._queueCallback(()=>{i.classList.remove(c,l),i.classList.add(Be),n.classList.remove(Be,l,c),this._isSliding=!1,o(Me)},n,this._isAnimated()),s&&this.cycle()}_isAnimated(){return this._element.classList.contains(`slide`)}_getActive(){return F.findOne(`.active.carousel-item`,this._element)}_getItems(){return F.find(`.carousel-item`,this._element)}_clearInterval(){this._interval&&=(clearInterval(this._interval),null)}_directionToOrder(e){return v()?e===ke?Oe:De:e===ke?De:Oe}_orderToDirection(e){return v()?e===Oe?ke:Ae:e===Oe?Ae:ke}static jQueryInterface(e){return this.each(function(){let t=We.getOrCreateInstance(this,e);if(typeof e==`number`){t.to(e);return}if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e]()}})}}M.on(document,Re,`[data-bs-slide], [data-bs-slide-to]`,function(e){let t=F.getElementFromSelector(this);if(!t||!t.classList.contains(ze))return;e.preventDefault();let n=We.getOrCreateInstance(t),r=this.getAttribute(`data-bs-slide-to`);if(r){n.to(r),n._maybeEnableCycle();return}if(N.getDataAttribute(this,`slide`)===`next`){n.next(),n._maybeEnableCycle();return}n.prev(),n._maybeEnableCycle()}),M.on(window,Le,()=>{let e=F.find(`[data-bs-ride="carousel"]`);for(let t of e)We.getOrCreateInstance(t)}),y(We);let Ge=`.bs.collapse`,Ke=`show${Ge}`,qe=`shown${Ge}`,Je=`hide${Ge}`,Ye=`hidden${Ge}`,Xe=`click${Ge}.data-api`,Ze=`show`,Qe=`collapse`,$e=`collapsing`,et=`:scope .${Qe} .${Qe}`,tt=`[data-bs-toggle="collapse"]`,nt={parent:null,toggle:!0},rt={parent:`(null|element)`,toggle:`boolean`};class it extends P{constructor(e,t){super(e,t),this._isTransitioning=!1,this._triggerArray=[];let n=F.find(tt);for(let e of n){let t=F.getSelectorFromElement(e),n=F.find(t).filter(e=>e===this._element);t!==null&&n.length&&this._triggerArray.push(e)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return nt}static get DefaultType(){return rt}static get NAME(){return`collapse`}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let e=[];if(this._config.parent&&(e=this._getFirstLevelChildren(`.collapse.show, .collapse.collapsing`).filter(e=>e!==this._element).map(e=>it.getOrCreateInstance(e,{toggle:!1}))),e.length&&e[0]._isTransitioning||M.trigger(this._element,Ke).defaultPrevented)return;for(let t of e)t.hide();let t=this._getDimension();this._element.classList.remove(Qe),this._element.classList.add($e),this._element.style[t]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;let n=()=>{this._isTransitioning=!1,this._element.classList.remove($e),this._element.classList.add(Qe,Ze),this._element.style[t]=``,M.trigger(this._element,qe)},r=`scroll${t[0].toUpperCase()+t.slice(1)}`;this._queueCallback(n,this._element,!0),this._element.style[t]=`${this._element[r]}px`}hide(){if(this._isTransitioning||!this._isShown()||M.trigger(this._element,Je).defaultPrevented)return;let e=this._getDimension();this._element.style[e]=`${this._element.getBoundingClientRect()[e]}px`,m(this._element),this._element.classList.add($e),this._element.classList.remove(Qe,Ze);for(let e of this._triggerArray){let t=F.getElementFromSelector(e);t&&!this._isShown(t)&&this._addAriaAndCollapsedClass([e],!1)}this._isTransitioning=!0;let t=()=>{this._isTransitioning=!1,this._element.classList.remove($e),this._element.classList.add(Qe),M.trigger(this._element,Ye)};this._element.style[e]=``,this._queueCallback(t,this._element,!0)}_isShown(e=this._element){return e.classList.contains(Ze)}_configAfterMerge(e){return e.toggle=!!e.toggle,e.parent=l(e.parent),e}_getDimension(){return this._element.classList.contains(`collapse-horizontal`)?`width`:`height`}_initializeChildren(){if(!this._config.parent)return;let e=this._getFirstLevelChildren(tt);for(let t of e){let e=F.getElementFromSelector(t);e&&this._addAriaAndCollapsedClass([t],this._isShown(e))}}_getFirstLevelChildren(e){let t=F.find(et,this._config.parent);return F.find(e,this._config.parent).filter(e=>!t.includes(e))}_addAriaAndCollapsedClass(e,t){if(e.length)for(let n of e)n.classList.toggle(`collapsed`,!t),n.setAttribute(`aria-expanded`,t)}static jQueryInterface(e){let t={};return typeof e==`string`&&/show|hide/.test(e)&&(t.toggle=!1),this.each(function(){let n=it.getOrCreateInstance(this,t);if(typeof e==`string`){if(n[e]===void 0)throw TypeError(`No method named "${e}"`);n[e]()}})}}M.on(document,Xe,tt,function(e){(e.target.tagName===`A`||e.delegateTarget&&e.delegateTarget.tagName===`A`)&&e.preventDefault();for(let e of F.getMultipleElementsFromSelector(this))it.getOrCreateInstance(e,{toggle:!1}).toggle()}),y(it);var B=`top`,V=`bottom`,H=`right`,U=`left`,at=`auto`,ot=[B,V,H,U],st=`start`,ct=`end`,lt=`clippingParents`,ut=`viewport`,dt=`popper`,ft=`reference`,pt=ot.reduce(function(e,t){return e.concat([t+`-`+st,t+`-`+ct])},[]),mt=[].concat(ot,[at]).reduce(function(e,t){return e.concat([t,t+`-`+st,t+`-`+ct])},[]),ht=`beforeRead`,gt=`read`,_t=`afterRead`,vt=`beforeMain`,yt=`main`,bt=`afterMain`,xt=`beforeWrite`,St=`write`,Ct=`afterWrite`,wt=[ht,gt,_t,vt,yt,bt,xt,St,Ct];function W(e){return e?(e.nodeName||``).toLowerCase():null}function G(e){if(e==null)return window;if(e.toString()!==`[object Window]`){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function Tt(e){return e instanceof G(e).Element||e instanceof Element}function K(e){return e instanceof G(e).HTMLElement||e instanceof HTMLElement}function Et(e){return typeof ShadowRoot>`u`?!1:e instanceof G(e).ShadowRoot||e instanceof ShadowRoot}function Dt(e){var t=e.state;Object.keys(t.elements).forEach(function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},i=t.elements[e];!K(i)||!W(i)||(Object.assign(i.style,n),Object.keys(r).forEach(function(e){var t=r[e];t===!1?i.removeAttribute(e):i.setAttribute(e,t===!0?``:t)}))})}function Ot(e){var t=e.state,n={popper:{position:t.options.strategy,left:`0`,top:`0`,margin:`0`},arrow:{position:`absolute`},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(e){var r=t.elements[e],i=t.attributes[e]||{},a=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce(function(e,t){return e[t]=``,e},{});!K(r)||!W(r)||(Object.assign(r.style,a),Object.keys(i).forEach(function(e){r.removeAttribute(e)}))})}}let kt={name:`applyStyles`,enabled:!0,phase:`write`,fn:Dt,effect:Ot,requires:[`computeStyles`]};function q(e){return e.split(`-`)[0]}var At=Math.max,jt=Math.min,Mt=Math.round;function Nt(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(e){return e.brand+`/`+e.version}).join(` `):navigator.userAgent}function Pt(){return!/^((?!chrome|android).)*safari/i.test(Nt())}function Ft(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),i=1,a=1;t&&K(e)&&(i=e.offsetWidth>0&&Mt(r.width)/e.offsetWidth||1,a=e.offsetHeight>0&&Mt(r.height)/e.offsetHeight||1);var o=(Tt(e)?G(e):window).visualViewport,s=!Pt()&&n,c=(r.left+(s&&o?o.offsetLeft:0))/i,l=(r.top+(s&&o?o.offsetTop:0))/a,u=r.width/i,d=r.height/a;return{width:u,height:d,top:l,right:c+u,bottom:l+d,left:c,x:c,y:l}}function It(e){var t=Ft(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function Lt(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Et(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function J(e){return G(e).getComputedStyle(e)}function Rt(e){return[`table`,`td`,`th`].indexOf(W(e))>=0}function Y(e){return((Tt(e)?e.ownerDocument:e.document)||window.document).documentElement}function zt(e){return W(e)===`html`?e:e.assignedSlot||e.parentNode||(Et(e)?e.host:null)||Y(e)}function Bt(e){return!K(e)||J(e).position===`fixed`?null:e.offsetParent}function Vt(e){var t=/firefox/i.test(Nt());if(/Trident/i.test(Nt())&&K(e)&&J(e).position===`fixed`)return null;var n=zt(e);for(Et(n)&&(n=n.host);K(n)&&[`html`,`body`].indexOf(W(n))<0;){var r=J(n);if(r.transform!==`none`||r.perspective!==`none`||r.contain===`paint`||[`transform`,`perspective`].indexOf(r.willChange)!==-1||t&&r.willChange===`filter`||t&&r.filter&&r.filter!==`none`)return n;n=n.parentNode}return null}function Ht(e){for(var t=G(e),n=Bt(e);n&&Rt(n)&&J(n).position===`static`;)n=Bt(n);return n&&(W(n)===`html`||W(n)===`body`&&J(n).position===`static`)?t:n||Vt(e)||t}function Ut(e){return[`top`,`bottom`].indexOf(e)>=0?`x`:`y`}function Wt(e,t,n){return At(e,jt(t,n))}function Gt(e,t,n){var r=Wt(e,t,n);return r>n?n:r}function Kt(){return{top:0,right:0,bottom:0,left:0}}function qt(e){return Object.assign({},Kt(),e)}function Jt(e,t){return t.reduce(function(t,n){return t[n]=e,t},{})}var Yt=function(e,t){return e=typeof e==`function`?e(Object.assign({},t.rects,{placement:t.placement})):e,qt(typeof e==`number`?Jt(e,ot):e)};function Xt(e){var t,n=e.state,r=e.name,i=e.options,a=n.elements.arrow,o=n.modifiersData.popperOffsets,s=q(n.placement),c=Ut(s),l=[U,H].indexOf(s)>=0?`height`:`width`;if(!(!a||!o)){var u=Yt(i.padding,n),d=It(a),f=c===`y`?B:U,p=c===`y`?V:H,m=n.rects.reference[l]+n.rects.reference[c]-o[c]-n.rects.popper[l],h=o[c]-n.rects.reference[c],g=Ht(a),_=g?c===`y`?g.clientHeight||0:g.clientWidth||0:0,v=m/2-h/2,y=u[f],b=_-d[l]-u[p],x=_/2-d[l]/2+v,S=Wt(y,x,b),C=c;n.modifiersData[r]=(t={},t[C]=S,t.centerOffset=S-x,t)}}function Zt(e){var t=e.state,n=e.options.element,r=n===void 0?`[data-popper-arrow]`:n;r!=null&&(typeof r==`string`&&(r=t.elements.popper.querySelector(r),!r)||Lt(t.elements.popper,r)&&(t.elements.arrow=r))}let Qt={name:`arrow`,enabled:!0,phase:`main`,fn:Xt,effect:Zt,requires:[`popperOffsets`],requiresIfExists:[`preventOverflow`]};function $t(e){return e.split(`-`)[1]}var en={top:`auto`,right:`auto`,bottom:`auto`,left:`auto`};function tn(e,t){var n=e.x,r=e.y,i=t.devicePixelRatio||1;return{x:Mt(n*i)/i||0,y:Mt(r*i)/i||0}}function nn(e){var t,n=e.popper,r=e.popperRect,i=e.placement,a=e.variation,o=e.offsets,s=e.position,c=e.gpuAcceleration,l=e.adaptive,u=e.roundOffsets,d=e.isFixed,f=o.x,p=f===void 0?0:f,m=o.y,h=m===void 0?0:m,g=typeof u==`function`?u({x:p,y:h}):{x:p,y:h};p=g.x,h=g.y;var _=o.hasOwnProperty(`x`),v=o.hasOwnProperty(`y`),y=U,b=B,x=window;if(l){var S=Ht(n),C=`clientHeight`,w=`clientWidth`;if(S===G(n)&&(S=Y(n),J(S).position!==`static`&&s===`absolute`&&(C=`scrollHeight`,w=`scrollWidth`)),S=S,i===B||(i===U||i===H)&&a===ct){b=V;var T=d&&S===x&&x.visualViewport?x.visualViewport.height:S[C];h-=T-r.height,h*=c?1:-1}if(i===U||(i===B||i===V)&&a===ct){y=H;var E=d&&S===x&&x.visualViewport?x.visualViewport.width:S[w];p-=E-r.width,p*=c?1:-1}}var D=Object.assign({position:s},l&&en),O=u===!0?tn({x:p,y:h},G(n)):{x:p,y:h};if(p=O.x,h=O.y,c){var k;return Object.assign({},D,(k={},k[b]=v?`0`:``,k[y]=_?`0`:``,k.transform=(x.devicePixelRatio||1)<=1?`translate(`+p+`px, `+h+`px)`:`translate3d(`+p+`px, `+h+`px, 0)`,k))}return Object.assign({},D,(t={},t[b]=v?h+`px`:``,t[y]=_?p+`px`:``,t.transform=``,t))}function rn(e){var t=e.state,n=e.options,r=n.gpuAcceleration,i=r===void 0?!0:r,a=n.adaptive,o=a===void 0?!0:a,s=n.roundOffsets,c=s===void 0?!0:s,l={placement:q(t.placement),variation:$t(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:i,isFixed:t.options.strategy===`fixed`};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,nn(Object.assign({},l,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:o,roundOffsets:c})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,nn(Object.assign({},l,{offsets:t.modifiersData.arrow,position:`absolute`,adaptive:!1,roundOffsets:c})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}let an={name:`computeStyles`,enabled:!0,phase:`beforeWrite`,fn:rn,data:{}};var on={passive:!0};function sn(e){var t=e.state,n=e.instance,r=e.options,i=r.scroll,a=i===void 0?!0:i,o=r.resize,s=o===void 0?!0:o,c=G(t.elements.popper),l=[].concat(t.scrollParents.reference,t.scrollParents.popper);return a&&l.forEach(function(e){e.addEventListener(`scroll`,n.update,on)}),s&&c.addEventListener(`resize`,n.update,on),function(){a&&l.forEach(function(e){e.removeEventListener(`scroll`,n.update,on)}),s&&c.removeEventListener(`resize`,n.update,on)}}let cn={name:`eventListeners`,enabled:!0,phase:`write`,fn:function(){},effect:sn,data:{}};var ln={left:`right`,right:`left`,bottom:`top`,top:`bottom`};function un(e){return e.replace(/left|right|bottom|top/g,function(e){return ln[e]})}var dn={start:`end`,end:`start`};function fn(e){return e.replace(/start|end/g,function(e){return dn[e]})}function pn(e){var t=G(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function mn(e){return Ft(Y(e)).left+pn(e).scrollLeft}function hn(e,t){var n=G(e),r=Y(e),i=n.visualViewport,a=r.clientWidth,o=r.clientHeight,s=0,c=0;if(i){a=i.width,o=i.height;var l=Pt();(l||!l&&t===`fixed`)&&(s=i.offsetLeft,c=i.offsetTop)}return{width:a,height:o,x:s+mn(e),y:c}}function gn(e){var t=Y(e),n=pn(e),r=e.ownerDocument?.body,i=At(t.scrollWidth,t.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),a=At(t.scrollHeight,t.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),o=-n.scrollLeft+mn(e),s=-n.scrollTop;return J(r||t).direction===`rtl`&&(o+=At(t.clientWidth,r?r.clientWidth:0)-i),{width:i,height:a,x:o,y:s}}function _n(e){var t=J(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function vn(e){return[`html`,`body`,`#document`].indexOf(W(e))>=0?e.ownerDocument.body:K(e)&&_n(e)?e:vn(zt(e))}function yn(e,t){t===void 0&&(t=[]);var n=vn(e),r=n===e.ownerDocument?.body,i=G(n),a=r?[i].concat(i.visualViewport||[],_n(n)?n:[]):n,o=t.concat(a);return r?o:o.concat(yn(zt(a)))}function bn(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function xn(e,t){var n=Ft(e,!1,t===`fixed`);return n.top+=e.clientTop,n.left+=e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function Sn(e,t,n){return t===ut?bn(hn(e,n)):Tt(t)?xn(t,n):bn(gn(Y(e)))}function Cn(e){var t=yn(zt(e)),n=[`absolute`,`fixed`].indexOf(J(e).position)>=0&&K(e)?Ht(e):e;return Tt(n)?t.filter(function(e){return Tt(e)&&Lt(e,n)&&W(e)!==`body`}):[]}function wn(e,t,n,r){var i=t===`clippingParents`?Cn(e):[].concat(t),a=[].concat(i,[n]),o=a[0],s=a.reduce(function(t,n){var i=Sn(e,n,r);return t.top=At(i.top,t.top),t.right=jt(i.right,t.right),t.bottom=jt(i.bottom,t.bottom),t.left=At(i.left,t.left),t},Sn(e,o,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}function Tn(e){var t=e.reference,n=e.element,r=e.placement,i=r?q(r):null,a=r?$t(r):null,o=t.x+t.width/2-n.width/2,s=t.y+t.height/2-n.height/2,c;switch(i){case B:c={x:o,y:t.y-n.height};break;case V:c={x:o,y:t.y+t.height};break;case H:c={x:t.x+t.width,y:s};break;case U:c={x:t.x-n.width,y:s};break;default:c={x:t.x,y:t.y}}var l=i?Ut(i):null;if(l!=null){var u=l===`y`?`height`:`width`;switch(a){case st:c[l]=c[l]-(t[u]/2-n[u]/2);break;case ct:c[l]=c[l]+(t[u]/2-n[u]/2);break}}return c}function En(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=r===void 0?e.placement:r,a=n.strategy,o=a===void 0?e.strategy:a,s=n.boundary,c=s===void 0?lt:s,l=n.rootBoundary,u=l===void 0?ut:l,d=n.elementContext,f=d===void 0?dt:d,p=n.altBoundary,m=p===void 0?!1:p,h=n.padding,g=h===void 0?0:h,_=qt(typeof g==`number`?Jt(g,ot):g),v=f===dt?ft:dt,y=e.rects.popper,b=e.elements[m?v:f],x=wn(Tt(b)?b:b.contextElement||Y(e.elements.popper),c,u,o),S=Ft(e.elements.reference),C=Tn({reference:S,element:y,placement:i}),w=bn(Object.assign({},y,C)),T=f===dt?w:S,E={top:x.top-T.top+_.top,bottom:T.bottom-x.bottom+_.bottom,left:x.left-T.left+_.left,right:T.right-x.right+_.right},D=e.modifiersData.offset;if(f===dt&&D){var O=D[i];Object.keys(E).forEach(function(e){var t=[H,V].indexOf(e)>=0?1:-1,n=[B,V].indexOf(e)>=0?`y`:`x`;E[e]+=O[n]*t})}return E}function Dn(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=n.boundary,a=n.rootBoundary,o=n.padding,s=n.flipVariations,c=n.allowedAutoPlacements,l=c===void 0?mt:c,u=$t(r),d=u?s?pt:pt.filter(function(e){return $t(e)===u}):ot,f=d.filter(function(e){return l.indexOf(e)>=0});f.length===0&&(f=d);var p=f.reduce(function(t,n){return t[n]=En(e,{placement:n,boundary:i,rootBoundary:a,padding:o})[q(n)],t},{});return Object.keys(p).sort(function(e,t){return p[e]-p[t]})}function On(e){if(q(e)===at)return[];var t=un(e);return[fn(e),t,fn(t)]}function kn(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var i=n.mainAxis,a=i===void 0?!0:i,o=n.altAxis,s=o===void 0?!0:o,c=n.fallbackPlacements,l=n.padding,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,p=n.flipVariations,m=p===void 0?!0:p,h=n.allowedAutoPlacements,g=t.options.placement,_=q(g)===g,v=c||(_||!m?[un(g)]:On(g)),y=[g].concat(v).reduce(function(e,n){return e.concat(q(n)===at?Dn(t,{placement:n,boundary:u,rootBoundary:d,padding:l,flipVariations:m,allowedAutoPlacements:h}):n)},[]),b=t.rects.reference,x=t.rects.popper,S=new Map,C=!0,w=y[0],T=0;T=0,ee=k?`width`:`height`,A=En(t,{placement:E,boundary:u,rootBoundary:d,altBoundary:f,padding:l}),j=k?O?H:U:O?V:B;b[ee]>x[ee]&&(j=un(j));var te=un(j),ne=[];if(a&&ne.push(A[D]<=0),s&&ne.push(A[j]<=0,A[te]<=0),ne.every(function(e){return e})){w=E,C=!1;break}S.set(E,ne)}if(C)for(var re=m?3:1,ie=function(e){var t=y.find(function(t){var n=S.get(t);if(n)return n.slice(0,e).every(function(e){return e})});if(t)return w=t,`break`},ae=re;ae>0&&ie(ae)!==`break`;ae--);t.placement!==w&&(t.modifiersData[r]._skip=!0,t.placement=w,t.reset=!0)}}let An={name:`flip`,enabled:!0,phase:`main`,fn:kn,requiresIfExists:[`offset`],data:{_skip:!1}};function jn(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Mn(e){return[B,H,V,U].some(function(t){return e[t]>=0})}function Nn(e){var t=e.state,n=e.name,r=t.rects.reference,i=t.rects.popper,a=t.modifiersData.preventOverflow,o=En(t,{elementContext:`reference`}),s=En(t,{altBoundary:!0}),c=jn(o,r),l=jn(s,i,a),u=Mn(c),d=Mn(l);t.modifiersData[n]={referenceClippingOffsets:c,popperEscapeOffsets:l,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}let Pn={name:`hide`,enabled:!0,phase:`main`,requiresIfExists:[`preventOverflow`],fn:Nn};function Fn(e,t,n){var r=q(e),i=[U,B].indexOf(r)>=0?-1:1,a=typeof n==`function`?n(Object.assign({},t,{placement:e})):n,o=a[0],s=a[1];return o||=0,s=(s||0)*i,[U,H].indexOf(r)>=0?{x:s,y:o}:{x:o,y:s}}function In(e){var t=e.state,n=e.options,r=e.name,i=n.offset,a=i===void 0?[0,0]:i,o=mt.reduce(function(e,n){return e[n]=Fn(n,t.rects,a),e},{}),s=o[t.placement],c=s.x,l=s.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=c,t.modifiersData.popperOffsets.y+=l),t.modifiersData[r]=o}let Ln={name:`offset`,enabled:!0,phase:`main`,requires:[`popperOffsets`],fn:In};function Rn(e){var t=e.state,n=e.name;t.modifiersData[n]=Tn({reference:t.rects.reference,element:t.rects.popper,placement:t.placement})}let zn={name:`popperOffsets`,enabled:!0,phase:`read`,fn:Rn,data:{}};function Bn(e){return e===`x`?`y`:`x`}function Vn(e){var t=e.state,n=e.options,r=e.name,i=n.mainAxis,a=i===void 0?!0:i,o=n.altAxis,s=o===void 0?!1:o,c=n.boundary,l=n.rootBoundary,u=n.altBoundary,d=n.padding,f=n.tether,p=f===void 0?!0:f,m=n.tetherOffset,h=m===void 0?0:m,g=En(t,{boundary:c,rootBoundary:l,padding:d,altBoundary:u}),_=q(t.placement),v=$t(t.placement),y=!v,b=Ut(_),x=Bn(b),S=t.modifiersData.popperOffsets,C=t.rects.reference,w=t.rects.popper,T=typeof h==`function`?h(Object.assign({},t.rects,{placement:t.placement})):h,E=typeof T==`number`?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),D=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,O={x:0,y:0};if(S){if(a){var k=b===`y`?B:U,ee=b===`y`?V:H,A=b===`y`?`height`:`width`,j=S[b],te=j+g[k],ne=j-g[ee],re=p?-w[A]/2:0,ie=v===st?C[A]:w[A],ae=v===st?-w[A]:-C[A],oe=t.elements.arrow,se=p&&oe?It(oe):{width:0,height:0},M=t.modifiersData[`arrow#persistent`]?t.modifiersData[`arrow#persistent`].padding:Kt(),ce=M[k],le=M[ee],ue=Wt(0,C[A],se[A]),N=y?C[A]/2-re-ue-ce-E.mainAxis:ie-ue-ce-E.mainAxis,de=y?-C[A]/2+re+ue+le+E.mainAxis:ae+ue+le+E.mainAxis,P=t.elements.arrow&&Ht(t.elements.arrow),fe=P?b===`y`?P.clientTop||0:P.clientLeft||0:0,F=D?.[b]??0,pe=j+N-F-fe,me=j+de-F,he=Wt(p?jt(te,pe):te,j,p?At(ne,me):ne);S[b]=he,O[b]=he-j}if(s){var ge=b===`x`?B:U,_e=b===`x`?V:H,I=S[x],L=x===`y`?`height`:`width`,R=I+g[ge],ve=I-g[_e],ye=[B,U].indexOf(_)!==-1,be=D?.[x]??0,xe=ye?R:I-C[L]-w[L]-be+E.altAxis,Se=ye?I+C[L]+w[L]-be-E.altAxis:ve,Ce=p&&ye?Gt(xe,I,Se):Wt(p?xe:R,I,p?Se:ve);S[x]=Ce,O[x]=Ce-I}t.modifiersData[r]=O}}let Hn={name:`preventOverflow`,enabled:!0,phase:`main`,fn:Vn,requiresIfExists:[`offset`]};function Un(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function Wn(e){return e===G(e)||!K(e)?pn(e):Un(e)}function Gn(e){var t=e.getBoundingClientRect(),n=Mt(t.width)/e.offsetWidth||1,r=Mt(t.height)/e.offsetHeight||1;return n!==1||r!==1}function Kn(e,t,n){n===void 0&&(n=!1);var r=K(t),i=K(t)&&Gn(t),a=Y(t),o=Ft(e,i,n),s={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(r||!r&&!n)&&((W(t)!==`body`||_n(a))&&(s=Wn(t)),K(t)?(c=Ft(t,!0),c.x+=t.clientLeft,c.y+=t.clientTop):a&&(c.x=mn(a))),{x:o.left+s.scrollLeft-c.x,y:o.top+s.scrollTop-c.y,width:o.width,height:o.height}}function qn(e){var t=new Map,n=new Set,r=[];e.forEach(function(e){t.set(e.name,e)});function i(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach(function(e){if(!n.has(e)){var r=t.get(e);r&&i(r)}}),r.push(e)}return e.forEach(function(e){n.has(e.name)||i(e)}),r}function Jn(e){var t=qn(e);return wt.reduce(function(e,n){return e.concat(t.filter(function(e){return e.phase===n}))},[])}function Yn(e){var t;return function(){return t||=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})}),t}}function Xn(e){var t=e.reduce(function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e},{});return Object.keys(t).map(function(e){return t[e]})}var Zn={placement:`bottom`,modifiers:[],strategy:`absolute`};function Qn(){return![...arguments].some(function(e){return!(e&&typeof e.getBoundingClientRect==`function`)})}function $n(e){e===void 0&&(e={});var t=e,n=t.defaultModifiers,r=n===void 0?[]:n,i=t.defaultOptions,a=i===void 0?Zn:i;return function(e,t,n){n===void 0&&(n=a);var i={placement:`bottom`,orderedModifiers:[],options:Object.assign({},Zn,a),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},o=[],s=!1,c={state:i,setOptions:function(n){var o=typeof n==`function`?n(i.options):n;u(),i.options=Object.assign({},a,i.options,o),i.scrollParents={reference:Tt(e)?yn(e):e.contextElement?yn(e.contextElement):[],popper:yn(t)};var s=Jn(Xn([].concat(r,i.options.modifiers)));return i.orderedModifiers=s.filter(function(e){return e.enabled}),l(),c.update()},forceUpdate:function(){if(!s){var e=i.elements,t=e.reference,n=e.popper;if(Qn(t,n)){i.rects={reference:Kn(t,Ht(n),i.options.strategy===`fixed`),popper:It(n)},i.reset=!1,i.placement=i.options.placement,i.orderedModifiers.forEach(function(e){return i.modifiersData[e.name]=Object.assign({},e.data)});for(var r=0;rNumber.parseInt(e,10)):typeof e==`function`?t=>e(t,this._element):e}_getPopperConfig(){let e={placement:this._getPlacement(),modifiers:[{name:`preventOverflow`,options:{boundary:this._config.boundary}},{name:`offset`,options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display===`static`)&&(N.setDataAttribute(this._menu,`popper`,`static`),e.modifiers=[{name:`applyStyles`,enabled:!1}]),{...e,...b(this._config.popperConfig,[void 0,e])}}_selectMenuItem({key:e,target:t}){let n=F.find(`.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)`,this._menu).filter(e=>u(e));n.length&&S(n,t,e===or,!n.includes(t)).focus()}static jQueryInterface(e){return this.each(function(){let t=X.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e]()}})}static clearMenus(e){if(e.button===2||e.type===`keyup`&&e.key!==`Tab`)return;let t=F.find(gr);for(let n of t){let t=X.getInstance(n);if(!t||t._config.autoClose===!1)continue;let r=e.composedPath(),i=r.includes(t._menu);if(r.includes(t._element)||t._config.autoClose===`inside`&&!i||t._config.autoClose===`outside`&&i||t._menu.contains(e.target)&&(e.type===`keyup`&&e.key===`Tab`||/input|select|option|textarea|form/i.test(e.target.tagName)))continue;let a={relatedTarget:t._element};e.type===`click`&&(a.clickEvent=e),t._completeHide(a)}}static dataApiKeydownHandler(e){let t=/input|textarea/i.test(e.target.tagName),n=e.key===`Escape`,r=[`ArrowUp`,or].includes(e.key);if(!r&&!n||t&&!n)return;e.preventDefault();let i=this.matches(hr)?this:F.prev(this,hr)[0]||F.next(this,hr)[0]||F.findOne(hr,e.delegateTarget.parentNode),a=X.getOrCreateInstance(i);if(r){e.stopPropagation(),a.show(),a._selectMenuItem(e);return}a._isShown()&&(e.stopPropagation(),a.hide(),i.focus())}}M.on(document,fr,hr,X.dataApiKeydownHandler),M.on(document,fr,_r,X.dataApiKeydownHandler),M.on(document,dr,X.clearMenus),M.on(document,pr,X.clearMenus),M.on(document,dr,hr,function(e){e.preventDefault(),X.getOrCreateInstance(this).toggle()}),y(X);let Er=`backdrop`,Dr=`show`,Or=`mousedown.bs.${Er}`,kr={className:`modal-backdrop`,clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:`body`},Ar={className:`string`,clickCallback:`(function|null)`,isAnimated:`boolean`,isVisible:`boolean`,rootElement:`(element|string)`};class jr extends de{constructor(e){super(),this._config=this._getConfig(e),this._isAppended=!1,this._element=null}static get Default(){return kr}static get DefaultType(){return Ar}static get NAME(){return Er}show(e){if(!this._config.isVisible){b(e);return}this._append();let t=this._getElement();this._config.isAnimated&&m(t),t.classList.add(Dr),this._emulateAnimation(()=>{b(e)})}hide(e){if(!this._config.isVisible){b(e);return}this._getElement().classList.remove(Dr),this._emulateAnimation(()=>{this.dispose(),b(e)})}dispose(){this._isAppended&&=(M.off(this._element,Or),this._element.remove(),!1)}_getElement(){if(!this._element){let e=document.createElement(`div`);e.className=this._config.className,this._config.isAnimated&&e.classList.add(`fade`),this._element=e}return this._element}_configAfterMerge(e){return e.rootElement=l(e.rootElement),e}_append(){if(this._isAppended)return;let e=this._getElement();this._config.rootElement.append(e),M.on(e,Or,()=>{b(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(e){x(e,this._getElement(),this._config.isAnimated)}}let Mr=`.bs.focustrap`,Nr=`focusin${Mr}`,Pr=`keydown.tab${Mr}`,Fr=`backward`,Ir={autofocus:!0,trapElement:null},Lr={autofocus:`boolean`,trapElement:`element`};class Rr extends de{constructor(e){super(),this._config=this._getConfig(e),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Ir}static get DefaultType(){return Lr}static get NAME(){return`focustrap`}activate(){this._isActive||=(this._config.autofocus&&this._config.trapElement.focus(),M.off(document,Mr),M.on(document,Nr,e=>this._handleFocusin(e)),M.on(document,Pr,e=>this._handleKeydown(e)),!0)}deactivate(){this._isActive&&(this._isActive=!1,M.off(document,Mr))}_handleFocusin(e){let{trapElement:t}=this._config;if(e.target===document||e.target===t||t.contains(e.target))return;let n=F.focusableChildren(t);n.length===0?t.focus():this._lastTabNavDirection===Fr?n[n.length-1].focus():n[0].focus()}_handleKeydown(e){e.key===`Tab`&&(this._lastTabNavDirection=e.shiftKey?Fr:`forward`)}}let zr=`.fixed-top, .fixed-bottom, .is-fixed, .sticky-top`,Br=`.sticky-top`,Vr=`padding-right`,Hr=`margin-right`;class Ur{constructor(){this._element=document.body}getWidth(){let e=document.documentElement.clientWidth;return Math.abs(window.innerWidth-e)}hide(){let e=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Vr,t=>t+e),this._setElementAttributes(zr,Vr,t=>t+e),this._setElementAttributes(Br,Hr,t=>t-e)}reset(){this._resetElementAttributes(this._element,`overflow`),this._resetElementAttributes(this._element,Vr),this._resetElementAttributes(zr,Vr),this._resetElementAttributes(Br,Hr)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,`overflow`),this._element.style.overflow=`hidden`}_setElementAttributes(e,t,n){let r=this.getWidth();this._applyManipulationCallback(e,e=>{if(e!==this._element&&window.innerWidth>e.clientWidth+r)return;this._saveInitialAttribute(e,t);let i=window.getComputedStyle(e).getPropertyValue(t);e.style.setProperty(t,`${n(Number.parseFloat(i))}px`)})}_saveInitialAttribute(e,t){let n=e.style.getPropertyValue(t);n&&N.setDataAttribute(e,t,n)}_resetElementAttributes(e,t){this._applyManipulationCallback(e,e=>{let n=N.getDataAttribute(e,t);if(n===null){e.style.removeProperty(t);return}N.removeDataAttribute(e,t),e.style.setProperty(t,n)})}_applyManipulationCallback(e,t){if(c(e)){t(e);return}for(let n of F.find(e,this._element))t(n)}}let Z=`.bs.modal`,Wr=`hide${Z}`,Gr=`hidePrevented${Z}`,Kr=`hidden${Z}`,qr=`show${Z}`,Jr=`shown${Z}`,Yr=`resize${Z}`,Xr=`click.dismiss${Z}`,Zr=`mousedown.dismiss${Z}`,Qr=`keydown.dismiss${Z}`,$r=`click${Z}.data-api`,ei=`modal-open`,ti=`show`,ni=`modal-static`,ri={backdrop:!0,focus:!0,keyboard:!0},ii={backdrop:`(boolean|string)`,focus:`boolean`,keyboard:`boolean`};class ai extends P{constructor(e,t){super(e,t),this._dialog=F.findOne(`.modal-dialog`,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ur,this._addEventListeners()}static get Default(){return ri}static get DefaultType(){return ii}static get NAME(){return`modal`}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||this._isTransitioning||M.trigger(this._element,qr,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ei),this._adjustDialog(),this._backdrop.show(()=>this._showElement(e)))}hide(){!this._isShown||this._isTransitioning||M.trigger(this._element,Wr).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(ti),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated()))}dispose(){M.off(window,Z),M.off(this._dialog,Z),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new jr({isVisible:!!this._config.backdrop,isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new Rr({trapElement:this._element})}_showElement(e){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display=`block`,this._element.removeAttribute(`aria-hidden`),this._element.setAttribute(`aria-modal`,!0),this._element.setAttribute(`role`,`dialog`),this._element.scrollTop=0;let t=F.findOne(`.modal-body`,this._dialog);t&&(t.scrollTop=0),m(this._element),this._element.classList.add(ti),this._queueCallback(()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,M.trigger(this._element,Jr,{relatedTarget:e})},this._dialog,this._isAnimated())}_addEventListeners(){M.on(this._element,Qr,e=>{if(e.key===`Escape`){if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}}),M.on(window,Yr,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),M.on(this._element,Zr,e=>{M.one(this._element,Xr,t=>{if(!(this._element!==e.target||this._element!==t.target)){if(this._config.backdrop===`static`){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()}})})}_hideModal(){this._element.style.display=`none`,this._element.setAttribute(`aria-hidden`,!0),this._element.removeAttribute(`aria-modal`),this._element.removeAttribute(`role`),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(ei),this._resetAdjustments(),this._scrollBar.reset(),M.trigger(this._element,Kr)})}_isAnimated(){return this._element.classList.contains(`fade`)}_triggerBackdropTransition(){if(M.trigger(this._element,Gr).defaultPrevented)return;let e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._element.style.overflowY;t===`hidden`||this._element.classList.contains(ni)||(e||(this._element.style.overflowY=`hidden`),this._element.classList.add(ni),this._queueCallback(()=>{this._element.classList.remove(ni),this._queueCallback(()=>{this._element.style.overflowY=t},this._dialog)},this._dialog),this._element.focus())}_adjustDialog(){let e=this._element.scrollHeight>document.documentElement.clientHeight,t=this._scrollBar.getWidth(),n=t>0;if(n&&!e){let e=v()?`paddingLeft`:`paddingRight`;this._element.style[e]=`${t}px`}if(!n&&e){let e=v()?`paddingRight`:`paddingLeft`;this._element.style[e]=`${t}px`}}_resetAdjustments(){this._element.style.paddingLeft=``,this._element.style.paddingRight=``}static jQueryInterface(e,t){return this.each(function(){let n=ai.getOrCreateInstance(this,e);if(typeof e==`string`){if(n[e]===void 0)throw TypeError(`No method named "${e}"`);n[e](t)}})}}M.on(document,$r,`[data-bs-toggle="modal"]`,function(e){let t=F.getElementFromSelector(this);[`A`,`AREA`].includes(this.tagName)&&e.preventDefault(),M.one(t,qr,e=>{e.defaultPrevented||M.one(t,Kr,()=>{u(this)&&this.focus()})});let n=F.findOne(`.modal.show`);n&&ai.getInstance(n).hide(),ai.getOrCreateInstance(t).toggle(this)}),pe(ai),y(ai);let Q=`.bs.offcanvas`,oi=`.data-api`,si=`load${Q}${oi}`,ci=`show`,li=`showing`,ui=`hiding`,di=`.offcanvas.show`,fi=`show${Q}`,pi=`shown${Q}`,mi=`hide${Q}`,hi=`hidePrevented${Q}`,gi=`hidden${Q}`,_i=`resize${Q}`,vi=`click${Q}${oi}`,yi=`keydown.dismiss${Q}`,bi={backdrop:!0,keyboard:!0,scroll:!1},xi={backdrop:`(boolean|string)`,keyboard:`boolean`,scroll:`boolean`};class Si extends P{constructor(e,t){super(e,t),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return bi}static get DefaultType(){return xi}static get NAME(){return`offcanvas`}toggle(e){return this._isShown?this.hide():this.show(e)}show(e){this._isShown||M.trigger(this._element,fi,{relatedTarget:e}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||new Ur().hide(),this._element.setAttribute(`aria-modal`,!0),this._element.setAttribute(`role`,`dialog`),this._element.classList.add(li),this._queueCallback(()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(ci),this._element.classList.remove(li),M.trigger(this._element,pi,{relatedTarget:e})},this._element,!0))}hide(){!this._isShown||M.trigger(this._element,mi).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ui),this._backdrop.hide(),this._queueCallback(()=>{this._element.classList.remove(ci,ui),this._element.removeAttribute(`aria-modal`),this._element.removeAttribute(`role`),this._config.scroll||new Ur().reset(),M.trigger(this._element,gi)},this._element,!0))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){let e=()=>{if(this._config.backdrop===`static`){M.trigger(this._element,hi);return}this.hide()},t=!!this._config.backdrop;return new jr({className:`offcanvas-backdrop`,isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?e:null})}_initializeFocusTrap(){return new Rr({trapElement:this._element})}_addEventListeners(){M.on(this._element,yi,e=>{if(e.key===`Escape`){if(this._config.keyboard){this.hide();return}M.trigger(this._element,hi)}})}static jQueryInterface(e){return this.each(function(){let t=Si.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e](this)}})}}M.on(document,vi,`[data-bs-toggle="offcanvas"]`,function(e){let t=F.getElementFromSelector(this);if([`A`,`AREA`].includes(this.tagName)&&e.preventDefault(),d(this))return;M.one(t,gi,()=>{u(this)&&this.focus()});let n=F.findOne(di);n&&n!==t&&Si.getInstance(n).hide(),Si.getOrCreateInstance(t).toggle(this)}),M.on(window,si,()=>{for(let e of F.find(di))Si.getOrCreateInstance(e).show()}),M.on(window,_i,()=>{for(let e of F.find(`[aria-modal][class*=show][class*=offcanvas-]`))getComputedStyle(e).position!==`fixed`&&Si.getOrCreateInstance(e).hide()}),pe(Si),y(Si);let Ci={"*":[`class`,`dir`,`id`,`lang`,`role`,/^aria-[\w-]*$/i],a:[`target`,`href`,`title`,`rel`],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:[`src`,`srcset`,`alt`,`title`,`width`,`height`],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},wi=new Set([`background`,`cite`,`href`,`itemtype`,`longdesc`,`poster`,`src`,`xlink:href`]),Ti=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Ei=(e,t)=>{let n=e.nodeName.toLowerCase();return t.includes(n)?wi.has(n)?!!Ti.test(e.nodeValue):!0:t.filter(e=>e instanceof RegExp).some(e=>e.test(n))};function Di(e,t,n){if(!e.length)return e;if(n&&typeof n==`function`)return n(e);let r=new window.DOMParser().parseFromString(e,`text/html`),i=[].concat(...r.body.querySelectorAll(`*`));for(let e of i){let n=e.nodeName.toLowerCase();if(!Object.keys(t).includes(n)){e.remove();continue}let r=[].concat(...e.attributes),i=[].concat(t[`*`]||[],t[n]||[]);for(let t of r)Ei(t,i)||e.removeAttribute(t.nodeName)}return r.body.innerHTML}let Oi={allowList:Ci,content:{},extraClass:``,html:!1,sanitize:!0,sanitizeFn:null,template:`
`},ki={allowList:`object`,content:`object`,extraClass:`(string|function)`,html:`boolean`,sanitize:`boolean`,sanitizeFn:`(null|function)`,template:`string`},Ai={entry:`(string|element|function|null)`,selector:`(string|element)`};class ji extends de{constructor(e){super(),this._config=this._getConfig(e)}static get Default(){return Oi}static get DefaultType(){return ki}static get NAME(){return`TemplateFactory`}getContent(){return Object.values(this._config.content).map(e=>this._resolvePossibleFunction(e)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(e){return this._checkContent(e),this._config.content={...this._config.content,...e},this}toHtml(){let e=document.createElement(`div`);e.innerHTML=this._maybeSanitize(this._config.template);for(let[t,n]of Object.entries(this._config.content))this._setContent(e,n,t);let t=e.children[0],n=this._resolvePossibleFunction(this._config.extraClass);return n&&t.classList.add(...n.split(` `)),t}_typeCheckConfig(e){super._typeCheckConfig(e),this._checkContent(e.content)}_checkContent(e){for(let[t,n]of Object.entries(e))super._typeCheckConfig({selector:t,entry:n},Ai)}_setContent(e,t,n){let r=F.findOne(n,e);if(r){if(t=this._resolvePossibleFunction(t),!t){r.remove();return}if(c(t)){this._putElementInTemplate(l(t),r);return}if(this._config.html){r.innerHTML=this._maybeSanitize(t);return}r.textContent=t}}_maybeSanitize(e){return this._config.sanitize?Di(e,this._config.allowList,this._config.sanitizeFn):e}_resolvePossibleFunction(e){return b(e,[void 0,this])}_putElementInTemplate(e,t){if(this._config.html){t.innerHTML=``,t.append(e);return}t.textContent=e.textContent}}let Mi=new Set([`sanitize`,`allowList`,`sanitizeFn`]),Ni=`fade`,Pi=`show`,Fi=`.modal`,Ii=`hide.bs.modal`,Li=`hover`,Ri=`focus`,zi=`click`,Bi={AUTO:`auto`,TOP:`top`,RIGHT:v()?`left`:`right`,BOTTOM:`bottom`,LEFT:v()?`right`:`left`},Vi={allowList:Ci,animation:!0,boundary:`clippingParents`,container:!1,customClass:``,delay:0,fallbackPlacements:[`top`,`right`,`bottom`,`left`],html:!1,offset:[0,6],placement:`top`,popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:``,title:``,trigger:`hover focus`},Hi={allowList:`object`,animation:`boolean`,boundary:`(string|element)`,container:`(string|element|boolean)`,customClass:`(string|function)`,delay:`(number|object)`,fallbackPlacements:`array`,html:`boolean`,offset:`(array|string|function)`,placement:`(string|function)`,popperConfig:`(null|object|function)`,sanitize:`boolean`,sanitizeFn:`(null|function)`,selector:`(string|boolean)`,template:`string`,title:`(string|element|function)`,trigger:`string`};class Ui extends P{constructor(e,t){if(rr===void 0)throw TypeError(`Bootstrap's tooltips require Popper (https://popper.js.org/docs/v2/)`);super(e,t),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Vi}static get DefaultType(){return Hi}static get NAME(){return`tooltip`}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(this._isEnabled){if(this._isShown()){this._leave();return}this._enter()}}dispose(){clearTimeout(this._timeout),M.off(this._element.closest(Fi),Ii,this._hideModalHandler),this._element.getAttribute(`data-bs-original-title`)&&this._element.setAttribute(`title`,this._element.getAttribute(`data-bs-original-title`)),this._disposePopper(),super.dispose()}show(){if(this._element.style.display===`none`)throw Error(`Please use show on visible elements`);if(!(this._isWithContent()&&this._isEnabled))return;let e=M.trigger(this._element,this.constructor.eventName(`show`)),t=(f(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(e.defaultPrevented||!t)return;this._disposePopper();let n=this._getTipElement();this._element.setAttribute(`aria-describedby`,n.getAttribute(`id`));let{container:r}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(r.append(n),M.trigger(this._element,this.constructor.eventName(`inserted`))),this._popper=this._createPopper(n),n.classList.add(Pi),`ontouchstart`in document.documentElement)for(let e of[].concat(...document.body.children))M.on(e,`mouseover`,p);this._queueCallback(()=>{M.trigger(this._element,this.constructor.eventName(`shown`)),this._isHovered===!1&&this._leave(),this._isHovered=!1},this.tip,this._isAnimated())}hide(){if(!(!this._isShown()||M.trigger(this._element,this.constructor.eventName(`hide`)).defaultPrevented)){if(this._getTipElement().classList.remove(Pi),`ontouchstart`in document.documentElement)for(let e of[].concat(...document.body.children))M.off(e,`mouseover`,p);this._activeTrigger[zi]=!1,this._activeTrigger[Ri]=!1,this._activeTrigger[Li]=!1,this._isHovered=null,this._queueCallback(()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute(`aria-describedby`),M.trigger(this._element,this.constructor.eventName(`hidden`)))},this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return!!this._getTitle()}_getTipElement(){return this.tip||=this._createTipElement(this._newContent||this._getContentForTemplate()),this.tip}_createTipElement(e){let t=this._getTemplateFactory(e).toHtml();if(!t)return null;t.classList.remove(Ni,Pi),t.classList.add(`bs-${this.constructor.NAME}-auto`);let n=a(this.constructor.NAME).toString();return t.setAttribute(`id`,n),this._isAnimated()&&t.classList.add(Ni),t}setContent(e){this._newContent=e,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(e){return this._templateFactory?this._templateFactory.changeContent(e):this._templateFactory=new ji({...this._config,content:e,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute(`data-bs-original-title`)}_initializeOnDelegatedTarget(e){return this.constructor.getOrCreateInstance(e.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ni)}_isShown(){return this.tip&&this.tip.classList.contains(Pi)}_createPopper(e){let t=b(this._config.placement,[this,e,this._element]),n=Bi[t.toUpperCase()];return nr(this._element,e,this._getPopperConfig(n))}_getOffset(){let{offset:e}=this._config;return typeof e==`string`?e.split(`,`).map(e=>Number.parseInt(e,10)):typeof e==`function`?t=>e(t,this._element):e}_resolvePossibleFunction(e){return b(e,[this._element,this._element])}_getPopperConfig(e){let t={placement:e,modifiers:[{name:`flip`,options:{fallbackPlacements:this._config.fallbackPlacements}},{name:`offset`,options:{offset:this._getOffset()}},{name:`preventOverflow`,options:{boundary:this._config.boundary}},{name:`arrow`,options:{element:`.${this.constructor.NAME}-arrow`}},{name:`preSetPlacement`,enabled:!0,phase:`beforeMain`,fn:e=>{this._getTipElement().setAttribute(`data-popper-placement`,e.state.placement)}}]};return{...t,...b(this._config.popperConfig,[void 0,t])}}_setListeners(){let e=this._config.trigger.split(` `);for(let t of e)if(t===`click`)M.on(this._element,this.constructor.eventName(`click`),this._config.selector,e=>{let t=this._initializeOnDelegatedTarget(e);t._activeTrigger[zi]=!(t._isShown()&&t._activeTrigger[zi]),t.toggle()});else if(t!==`manual`){let e=t===Li?this.constructor.eventName(`mouseenter`):this.constructor.eventName(`focusin`),n=t===Li?this.constructor.eventName(`mouseleave`):this.constructor.eventName(`focusout`);M.on(this._element,e,this._config.selector,e=>{let t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type===`focusin`?Ri:Li]=!0,t._enter()}),M.on(this._element,n,this._config.selector,e=>{let t=this._initializeOnDelegatedTarget(e);t._activeTrigger[e.type===`focusout`?Ri:Li]=t._element.contains(e.relatedTarget),t._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},M.on(this._element.closest(Fi),Ii,this._hideModalHandler)}_fixTitle(){let e=this._element.getAttribute(`title`);e&&(!this._element.getAttribute(`aria-label`)&&!this._element.textContent.trim()&&this._element.setAttribute(`aria-label`,e),this._element.setAttribute(`data-bs-original-title`,e),this._element.removeAttribute(`title`))}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide))}_setTimeout(e,t){clearTimeout(this._timeout),this._timeout=setTimeout(e,t)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(e){let t=N.getDataAttributes(this._element);for(let e of Object.keys(t))Mi.has(e)&&delete t[e];return e={...t,...typeof e==`object`&&e?e:{}},e=this._mergeConfigObj(e),e=this._configAfterMerge(e),this._typeCheckConfig(e),e}_configAfterMerge(e){return e.container=e.container===!1?document.body:l(e.container),typeof e.delay==`number`&&(e.delay={show:e.delay,hide:e.delay}),typeof e.title==`number`&&(e.title=e.title.toString()),typeof e.content==`number`&&(e.content=e.content.toString()),e}_getDelegateConfig(){let e={};for(let[t,n]of Object.entries(this._config))this.constructor.Default[t]!==n&&(e[t]=n);return e.selector=!1,e.trigger=`manual`,e}_disposePopper(){this._popper&&=(this._popper.destroy(),null),this.tip&&=(this.tip.remove(),null)}static jQueryInterface(e){return this.each(function(){let t=Ui.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e]()}})}}y(Ui);let Wi={...Ui.Default,content:``,offset:[0,8],placement:`right`,template:``,trigger:`click`},Gi={...Ui.DefaultType,content:`(null|string|element|function)`};class Ki extends Ui{static get Default(){return Wi}static get DefaultType(){return Gi}static get NAME(){return`popover`}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(e){return this.each(function(){let t=Ki.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e]()}})}}y(Ki);let qi=`.bs.scrollspy`,Ji=`activate${qi}`,Yi=`click${qi}`,Xi=`load${qi}.data-api`,Zi=`active`,Qi=`[href]`,$i=`.nav-link`,ea=`${$i}, .nav-item > ${$i}, .list-group-item`,ta={offset:null,rootMargin:`0px 0px -25%`,smoothScroll:!1,target:null,threshold:[.1,.5,1]},na={offset:`(number|null)`,rootMargin:`string`,smoothScroll:`boolean`,target:`element`,threshold:`array`};class ra extends P{constructor(e,t){super(e,t),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY===`visible`?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ta}static get DefaultType(){return na}static get NAME(){return`scrollspy`}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(let e of this._observableSections.values())this._observer.observe(e)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(e){return e.target=l(e.target)||document.body,e.rootMargin=e.offset?`${e.offset}px 0px -30%`:e.rootMargin,typeof e.threshold==`string`&&(e.threshold=e.threshold.split(`,`).map(e=>Number.parseFloat(e))),e}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(M.off(this._config.target,Yi),M.on(this._config.target,Yi,Qi,e=>{let t=this._observableSections.get(e.target.hash);if(t){e.preventDefault();let n=this._rootElement||window,r=t.offsetTop-this._element.offsetTop;if(n.scrollTo){n.scrollTo({top:r,behavior:`smooth`});return}n.scrollTop=r}}))}_getNewObserver(){let e={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(e=>this._observerCallback(e),e)}_observerCallback(e){let t=e=>this._targetLinks.get(`#${e.target.id}`),n=e=>{this._previousScrollData.visibleEntryTop=e.target.offsetTop,this._process(t(e))},r=(this._rootElement||document.documentElement).scrollTop,i=r>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=r;for(let a of e){if(!a.isIntersecting){this._activeTarget=null,this._clearActiveClass(t(a));continue}let e=a.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(i&&e){if(n(a),!r)return;continue}!i&&!e&&n(a)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;let e=F.find(Qi,this._config.target);for(let t of e){if(!t.hash||d(t))continue;let e=F.findOne(decodeURI(t.hash),this._element);u(e)&&(this._targetLinks.set(decodeURI(t.hash),t),this._observableSections.set(t.hash,e))}}_process(e){this._activeTarget!==e&&(this._clearActiveClass(this._config.target),this._activeTarget=e,e.classList.add(Zi),this._activateParents(e),M.trigger(this._element,Ji,{relatedTarget:e}))}_activateParents(e){if(e.classList.contains(`dropdown-item`)){F.findOne(`.dropdown-toggle`,e.closest(`.dropdown`)).classList.add(Zi);return}for(let t of F.parents(e,`.nav, .list-group`))for(let e of F.prev(t,ea))e.classList.add(Zi)}_clearActiveClass(e){e.classList.remove(Zi);let t=F.find(`${Qi}.${Zi}`,e);for(let e of t)e.classList.remove(Zi)}static jQueryInterface(e){return this.each(function(){let t=ra.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e]()}})}}M.on(window,Xi,()=>{for(let e of F.find(`[data-bs-spy="scroll"]`))ra.getOrCreateInstance(e)}),y(ra);let ia=`.bs.tab`,aa=`hide${ia}`,oa=`hidden${ia}`,sa=`show${ia}`,ca=`shown${ia}`,la=`click${ia}`,ua=`keydown${ia}`,da=`load${ia}`,fa=`ArrowRight`,pa=`ArrowDown`,ma=`Home`,ha=`active`,ga=`fade`,_a=`show`,va=`.dropdown-toggle`,ya=`:not(${va})`,ba=`.nav-link${ya}, .list-group-item${ya}, [role="tab"]${ya}`,xa=`[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]`,Sa=`${ba}, ${xa}`,Ca=`.${ha}[data-bs-toggle="tab"], .${ha}[data-bs-toggle="pill"], .${ha}[data-bs-toggle="list"]`;class wa extends P{constructor(e){super(e),this._parent=this._element.closest(`.list-group, .nav, [role="tablist"]`),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),M.on(this._element,ua,e=>this._keydown(e)))}static get NAME(){return`tab`}show(){let e=this._element;if(this._elemIsActive(e))return;let t=this._getActiveElem(),n=t?M.trigger(t,aa,{relatedTarget:e}):null;M.trigger(e,sa,{relatedTarget:t}).defaultPrevented||n&&n.defaultPrevented||(this._deactivate(t,e),this._activate(e,t))}_activate(e,t){e&&(e.classList.add(ha),this._activate(F.getElementFromSelector(e)),this._queueCallback(()=>{if(e.getAttribute(`role`)!==`tab`){e.classList.add(_a);return}e.removeAttribute(`tabindex`),e.setAttribute(`aria-selected`,!0),this._toggleDropDown(e,!0),M.trigger(e,ca,{relatedTarget:t})},e,e.classList.contains(ga)))}_deactivate(e,t){e&&(e.classList.remove(ha),e.blur(),this._deactivate(F.getElementFromSelector(e)),this._queueCallback(()=>{if(e.getAttribute(`role`)!==`tab`){e.classList.remove(_a);return}e.setAttribute(`aria-selected`,!1),e.setAttribute(`tabindex`,`-1`),this._toggleDropDown(e,!1),M.trigger(e,oa,{relatedTarget:t})},e,e.classList.contains(ga)))}_keydown(e){if(![`ArrowLeft`,fa,`ArrowUp`,pa,ma,`End`].includes(e.key))return;e.stopPropagation(),e.preventDefault();let t=this._getChildren().filter(e=>!d(e)),n;if([ma,`End`].includes(e.key))n=t[e.key===ma?0:t.length-1];else{let r=[fa,pa].includes(e.key);n=S(t,e.target,r,!0)}n&&(n.focus({preventScroll:!0}),wa.getOrCreateInstance(n).show())}_getChildren(){return F.find(Sa,this._parent)}_getActiveElem(){return this._getChildren().find(e=>this._elemIsActive(e))||null}_setInitialAttributes(e,t){this._setAttributeIfNotExists(e,`role`,`tablist`);for(let e of t)this._setInitialAttributesOnChild(e)}_setInitialAttributesOnChild(e){e=this._getInnerElement(e);let t=this._elemIsActive(e),n=this._getOuterElement(e);e.setAttribute(`aria-selected`,t),n!==e&&this._setAttributeIfNotExists(n,`role`,`presentation`),t||e.setAttribute(`tabindex`,`-1`),this._setAttributeIfNotExists(e,`role`,`tab`),this._setInitialAttributesOnTargetPanel(e)}_setInitialAttributesOnTargetPanel(e){let t=F.getElementFromSelector(e);t&&(this._setAttributeIfNotExists(t,`role`,`tabpanel`),e.id&&this._setAttributeIfNotExists(t,`aria-labelledby`,`${e.id}`))}_toggleDropDown(e,t){let n=this._getOuterElement(e);if(!n.classList.contains(`dropdown`))return;let r=(e,r)=>{let i=F.findOne(e,n);i&&i.classList.toggle(r,t)};r(va,ha),r(`.dropdown-menu`,_a),n.setAttribute(`aria-expanded`,t)}_setAttributeIfNotExists(e,t,n){e.hasAttribute(t)||e.setAttribute(t,n)}_elemIsActive(e){return e.classList.contains(ha)}_getInnerElement(e){return e.matches(Sa)?e:F.findOne(Sa,e)}_getOuterElement(e){return e.closest(`.nav-item, .list-group-item`)||e}static jQueryInterface(e){return this.each(function(){let t=wa.getOrCreateInstance(this);if(typeof e==`string`){if(t[e]===void 0||e.startsWith(`_`)||e===`constructor`)throw TypeError(`No method named "${e}"`);t[e]()}})}}M.on(document,la,xa,function(e){[`A`,`AREA`].includes(this.tagName)&&e.preventDefault(),!d(this)&&wa.getOrCreateInstance(this).show()}),M.on(window,da,()=>{for(let e of F.find(Ca))wa.getOrCreateInstance(e)}),y(wa);let $=`.bs.toast`,Ta=`mouseover${$}`,Ea=`mouseout${$}`,Da=`focusin${$}`,Oa=`focusout${$}`,ka=`hide${$}`,Aa=`hidden${$}`,ja=`show${$}`,Ma=`shown${$}`,Na=`hide`,Pa=`show`,Fa=`showing`,Ia={animation:`boolean`,autohide:`boolean`,delay:`number`},La={animation:!0,autohide:!0,delay:5e3};class Ra extends P{constructor(e,t){super(e,t),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return La}static get DefaultType(){return Ia}static get NAME(){return`toast`}show(){M.trigger(this._element,ja).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add(`fade`),this._element.classList.remove(Na),m(this._element),this._element.classList.add(Pa,Fa),this._queueCallback(()=>{this._element.classList.remove(Fa),M.trigger(this._element,Ma),this._maybeScheduleHide()},this._element,this._config.animation))}hide(){!this.isShown()||M.trigger(this._element,ka).defaultPrevented||(this._element.classList.add(Fa),this._queueCallback(()=>{this._element.classList.add(Na),this._element.classList.remove(Fa,Pa),M.trigger(this._element,Aa)},this._element,this._config.animation))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Pa),super.dispose()}isShown(){return this._element.classList.contains(Pa)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout(()=>{this.hide()},this._config.delay)))}_onInteraction(e,t){switch(e.type){case`mouseover`:case`mouseout`:this._hasMouseInteraction=t;break;case`focusin`:case`focusout`:this._hasKeyboardInteraction=t;break}if(t){this._clearTimeout();return}let n=e.relatedTarget;this._element===n||this._element.contains(n)||this._maybeScheduleHide()}_setListeners(){M.on(this._element,Ta,e=>this._onInteraction(e,!0)),M.on(this._element,Ea,e=>this._onInteraction(e,!1)),M.on(this._element,Da,e=>this._onInteraction(e,!0)),M.on(this._element,Oa,e=>this._onInteraction(e,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(e){return this.each(function(){let t=Ra.getOrCreateInstance(this,e);if(typeof e==`string`){if(t[e]===void 0)throw TypeError(`No method named "${e}"`);t[e](this)}})}}return pe(Ra),y(Ra),{Alert:_e,Button:L,Carousel:We,Collapse:it,Dropdown:X,Modal:ai,Offcanvas:Si,Popover:Ki,ScrollSpy:ra,Tab:wa,Toast:Ra,Tooltip:Ui}}))}))();function e(e){document.documentElement.setAttribute(`data-theme`,e)}function t(){var t=document.documentElement.getAttribute(`data-theme`)===`light`?`dark`:`light`;e(t),localStorage.setItem(`theme`,t)}window.toggleTheme=t;function n(e){document.querySelectorAll(`.md-actions.open`).forEach(function(t){t!==e&&(t.classList.remove(`open`),t.querySelector(`.md-actions-toggle`).setAttribute(`aria-expanded`,`false`))})}function r(e){var t=e.closest(`.md-actions`),r=t.classList.contains(`open`);n(t),t.classList.toggle(`open`,!r),e.setAttribute(`aria-expanded`,String(!r))}window.toggleMdActionsMenu=r,document.addEventListener(`click`,function(e){e.target.closest(`.md-actions`)||n()}),document.addEventListener(`keydown`,function(e){e.key===`Escape`&&n()}),document.addEventListener(`click`,function(e){var t=e.target.closest(`[data-copy-url]`);if(t){e.preventDefault();var r=t.getAttribute(`data-copy-url`),i=t.querySelector(`.label`),a=i.textContent;fetch(r).then(function(e){return e.text()}).then(function(e){return navigator.clipboard.writeText(e)}).then(function(){i.textContent=`Copied!`,setTimeout(function(){i.textContent=a},1500)}).catch(function(){navigator.clipboard.writeText(r)}),n()}}); \ No newline at end of file diff --git a/src/App/assets/js/components/_main.js b/src/App/assets/js/components/_main.js index 6754819..74d1682 100644 --- a/src/App/assets/js/components/_main.js +++ b/src/App/assets/js/components/_main.js @@ -10,3 +10,58 @@ function toggleTheme() { localStorage.setItem('theme', next); } window.toggleTheme = toggleTheme; + +function closeAllMdActionsMenus(except) { + document.querySelectorAll('.md-actions.open').forEach(function (wrapper) { + if (wrapper !== except) { + wrapper.classList.remove('open'); + wrapper.querySelector('.md-actions-toggle').setAttribute('aria-expanded', 'false'); + } + }); +} + +function toggleMdActionsMenu(button) { + var wrapper = button.closest('.md-actions'); + var isOpen = wrapper.classList.contains('open'); + closeAllMdActionsMenus(wrapper); + wrapper.classList.toggle('open', !isOpen); + button.setAttribute('aria-expanded', String(!isOpen)); +} +window.toggleMdActionsMenu = toggleMdActionsMenu; + +document.addEventListener('click', function (event) { + if (!event.target.closest('.md-actions')) { + closeAllMdActionsMenus(); + } +}); + +document.addEventListener('keydown', function (event) { + if (event.key === 'Escape') { + closeAllMdActionsMenus(); + } +}); + +document.addEventListener('click', function (event) { + var item = event.target.closest('[data-copy-url]'); + if (!item) { + return; + } + event.preventDefault(); + + var url = item.getAttribute('data-copy-url'); + var label = item.querySelector('.label'); + var originalText = label.textContent; + + fetch(url) + .then(function (response) { return response.text(); }) + .then(function (markdown) { return navigator.clipboard.writeText(markdown); }) + .then(function () { + label.textContent = 'Copied!'; + setTimeout(function () { label.textContent = originalText; }, 1500); + }) + .catch(function () { + navigator.clipboard.writeText(url); + }); + + closeAllMdActionsMenus(); +}); diff --git a/src/App/assets/scss/components/_blog.scss b/src/App/assets/scss/components/_blog.scss index a2ae0b8..9e8a50b 100644 --- a/src/App/assets/scss/components/_blog.scss +++ b/src/App/assets/scss/components/_blog.scss @@ -502,4 +502,129 @@ $bp-tablet: 900px; color: var(--text-dim); flex-shrink: 0; } -} \ No newline at end of file +} + +// ---------- Copy page / view as markdown / open in Claude dropdown ---------- +.md-actions { + position: relative; + display: inline-flex; +} + +.md-actions-toggle { + display: inline-flex; + align-items: stretch; + padding: 0; + border-radius: 8px; + background: var(--surface); + border: 1px solid var(--border); + color: var(--text-muted); + font-family: var(--sans); + font-size: 13px; + cursor: pointer; + overflow: hidden; + transition: box-shadow .15s ease, border-color .15s ease, color .15s ease; + + svg { + width: 14px; + height: 14px; + flex-shrink: 0; + } + + .chev { + width: 12px; + height: 12px; + transition: transform .15s ease; + } + + &:hover { + border-color: var(--text-dim); + color: var(--text); + box-shadow: 0 4px 12px rgba(0, 0, 0, .12); + } +} + +.md-actions-toggle-label { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 12px; +} + +.md-actions-toggle-chev { + display: inline-flex; + align-items: center; + padding: 6px 10px; + border-left: 1px solid var(--border); +} + +.md-actions.open .md-actions-toggle { + border-color: var(--text-dim); + color: var(--text); + box-shadow: 0 4px 12px rgba(0, 0, 0, .12); +} + +.md-actions.open .md-actions-toggle .chev { + transform: rotate(180deg); +} + +.md-actions-menu { + position: absolute; + top: calc(100% + 8px); + right: 0; + min-width: 240px; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + box-shadow: 0 12px 32px rgba(0, 0, 0, .18); + padding: 6px; + display: none; + flex-direction: column; + gap: 2px; + z-index: 20; +} + +.md-actions.open .md-actions-menu { + display: flex; +} + +.md-actions-item { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 10px; + border-radius: 8px; + border: none; + background: transparent; + color: var(--text); + font-family: var(--sans); + font-size: 13px; + text-align: left; + text-decoration: none; + cursor: pointer; + + svg { + width: 16px; + height: 16px; + color: var(--text-dim); + flex-shrink: 0; + } + + &:hover { + background: var(--surface-2); + color: var(--amber); + + svg { + color: var(--amber); + } + } +} + +.md-actions-bar { + display: flex; + justify-content: flex-end; + margin-bottom: 12px; + + & + h2 { + margin-top: 0; + } +} diff --git a/src/App/templates/layout/blog-post.html.twig b/src/App/templates/layout/blog-post.html.twig new file mode 100644 index 0000000..d4e9607 --- /dev/null +++ b/src/App/templates/layout/blog-post.html.twig @@ -0,0 +1,34 @@ +{% extends '@layout/default.html.twig' %} + +{% block json_ld %} {{ include('@jsonld/' ~ article.category.slug ~ '/' ~ article.slug ~ '.jsonld.twig') }} {% endblock %} + +{% block title %}{{ article.title }}{% endblock %} + +{% block page_title %} + {{ include('@partial/title-section.html.twig', { + back_href: url('page::blog'), + back_label: 'Back to Blog', + badge: article.category.name, + article: article, + }) }} +{% endblock %} + +{% block content %} +
+
+ + {{ include('@partial/left-menu.html.twig') }} + +
+
+ {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} + {{ include('@partial/markdown-actions.html.twig', {article: article}) }} + {% block body %}{% endblock %} +
+ + {{ include('@partial/post-nav.html.twig') }} +
+ +
+
+{% endblock %} diff --git a/src/App/templates/partial/markdown-actions.html.twig b/src/App/templates/partial/markdown-actions.html.twig new file mode 100644 index 0000000..091587e --- /dev/null +++ b/src/App/templates/partial/markdown-actions.html.twig @@ -0,0 +1,29 @@ +{% set markdown_url = url('app::markdown-article', {categorySlug: article.category.slug, slug: article.slug}) %} +{% set claude_prompt = 'Read from ' ~ markdown_url ~ ' so I can ask questions about it.' %} +
+
+ + +
+
diff --git a/src/App/templates/partial/title-section.html.twig b/src/App/templates/partial/title-section.html.twig index 948072b..9f04a5c 100644 --- a/src/App/templates/partial/title-section.html.twig +++ b/src/App/templates/partial/title-section.html.twig @@ -34,7 +34,7 @@ {% endif %} {% endif %} - {% if author_github %} + {% if author_github and show_github is defined and show_github %} - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/android/multiple-broadcast-receivers-in-the-same-app-for-the-same-action.html.twig b/src/Blog/templates/page/blog-resource/android/multiple-broadcast-receivers-in-the-same-app-for-the-same-action.html.twig index 99297ae..687045f 100644 --- a/src/Blog/templates/page/blog-resource/android/multiple-broadcast-receivers-in-the-same-app-for-the-same-action.html.twig +++ b/src/Blog/templates/page/blog-resource/android/multiple-broadcast-receivers-in-the-same-app-for-the-same-action.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/android/multiple-broadcast-receivers-in-the-same-app-for-the-same-action.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Multiple broadcast receivers in the same app, for the same action{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Android', - article: article, - }) }} -{% endblock %} - -{% block content %} -
-
- - {{ include('@partial/left-menu.html.twig') }} - -
-
- {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Did you come to a point where using multiple broadcast receivers to listen for the same intent, separatly, in the same android app, leads to unexpected results? If that's the case, one broadcast receiver might consume the broadcasted intent, online casino leaving the others with nothing to receive. This can be the case where you use 3rd party libraries with broadcast receivers defined. @@ -43,11 +23,4 @@ The following is a solution for this kind of problem, a code snippet inspired by
-
- - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/architecture/configprovider-bootstrap-modern-php-applications.html.twig b/src/Blog/templates/page/blog-resource/architecture/configprovider-bootstrap-modern-php-applications.html.twig index 36fed50..a40ae30 100644 --- a/src/Blog/templates/page/blog-resource/architecture/configprovider-bootstrap-modern-php-applications.html.twig +++ b/src/Blog/templates/page/blog-resource/architecture/configprovider-bootstrap-modern-php-applications.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/architecture/configprovider-bootstrap-modern-php-applications.jsonld.twig') }} {% endblock %} - -{% block title %}ConfigProvider - Bootstrap Modern PHP Applications{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Architecture', - article: article, - }) }} -{% endblock %} - -{% block content %} -
-
- - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
-
- {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

In PHP, the ConfigProvider is a class that is part of an application's bootstrap process. It's a class or callable that returns configuration data telling the platform which middleware should run, in what order, and sometimes under what conditions.

If you're talking specifically about the ConfigProvider in the Laminas/Mezzio ecosystem, it's literally an array of configuration, settings, or anything else your application needs.

@@ -184,11 +164,4 @@

-
- - {{ include('@partial/post-nav.html.twig') }} -
- -
-
{% endblock %} diff --git a/src/Blog/templates/page/blog-resource/architecture/request-lifecycle-for-a-mezzio-based-application.html.twig b/src/Blog/templates/page/blog-resource/architecture/request-lifecycle-for-a-mezzio-based-application.html.twig index 9ab6ddf..4aa60a8 100644 --- a/src/Blog/templates/page/blog-resource/architecture/request-lifecycle-for-a-mezzio-based-application.html.twig +++ b/src/Blog/templates/page/blog-resource/architecture/request-lifecycle-for-a-mezzio-based-application.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/architecture/request-lifecycle-for-a-mezzio-based-application.jsonld.twig') }} {% endblock %} - -{% block title %}Request Lifecycle for a Mezzio-Based Application{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Architecture', - article: article, - }) }} -{% endblock %} - -{% block content %} -
-
+{% extends '@layout/blog-post.html.twig' %} - {{ include('@partial/left-menu.html.twig') }} - -
-
- {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

Seamlessly Interconnected Middleware for Enterprise-Level Solutions

The request lifecycle is the sequence of steps that happen from the moment a user makes an HTTP request until the server sends back a response.

@@ -597,11 +577,4 @@ $('.hasTooltip').hover(
-
- - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/architecture/understanding-middleware.html.twig b/src/Blog/templates/page/blog-resource/architecture/understanding-middleware.html.twig index e317c2d..649217d 100644 --- a/src/Blog/templates/page/blog-resource/architecture/understanding-middleware.html.twig +++ b/src/Blog/templates/page/blog-resource/architecture/understanding-middleware.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/architecture/understanding-middleware.jsonld.twig') }} {% endblock %} - -{% block title %}Understanding Middleware{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Architecture', - article: article, - }) }} -{% endblock %} - -{% block content %} -
-
- - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
-
- {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

Middleware is code that exists between the request and response, and which can take the incoming request, perform actions based on it, and either complete the response or pass delegation on to the next middleware in the queue.

The purpose of middleware

@@ -176,11 +156,4 @@
  • From Helpers to Middleware
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/aptana-set-svn-keywords.html.twig b/src/Blog/templates/page/blog-resource/best-practice/aptana-set-svn-keywords.html.twig index 33ae725..a6aa857 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/aptana-set-svn-keywords.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/aptana-set-svn-keywords.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/aptana-set-svn-keywords.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Aptana - set SVN keywords{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In Aptana it's very simple to set the svn:keywords property for a file. For example if you want to set the svn keyword property Id: @@ -64,11 +44,4 @@ When you make the SVN commit of the file, the $Id$ keyword will be repl
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/basic-security-in-dotkernel-headless-platform.html.twig b/src/Blog/templates/page/blog-resource/best-practice/basic-security-in-dotkernel-headless-platform.html.twig index 360b713..b271bb7 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/basic-security-in-dotkernel-headless-platform.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/basic-security-in-dotkernel-headless-platform.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/basic-security-in-dotkernel-headless-platform.jsonld.twig') }} {% endblock %} - -{% block title %}Basic Security in Dotkernel Headless Platform{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Software security should always be in the back of your mind as a developer. It may seem fine at first to deliver a feature sooner, only to find later on that you left a backdoor into your crisp new update. You ignore security at your own risk, with potentially major costs to your personal or your organization's image, and to your client's trust in your abilities. The costs to recover the damages caused by a lacking security are sometimes astronomical, enough to put a company out of business.

    There are many facets of software security, meaning there are a lot of potential ways a hacker can access your code or your data fraudulently:

    @@ -246,11 +226,4 @@

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/golden-rules-of-professional-php-coding.html.twig b/src/Blog/templates/page/blog-resource/best-practice/golden-rules-of-professional-php-coding.html.twig index fd622d8..2becc9f 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/golden-rules-of-professional-php-coding.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/golden-rules-of-professional-php-coding.html.twig @@ -1,34 +1,14 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/golden-rules-of-professional-php-coding.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Golden Rules of Professional PHP Coding{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} 1.  Always use in development and in staging highest error reporting level, and display_errors ON: -
    >error_reporting(-1);
    +
    error_reporting(-1);
     ini_set('display_errors', 1);
    2. Fix every warning or notice that occur. 3. Check regularly server's error_log for notices/warnings 4. Identify any temporary hack with a special mark. Maybe something like: -
    >#@TODO masterpiece by @smartguy, to quick fix the division by zero
    +
    #@TODO masterpiece by @smartguy, to quick fix the division by zero
      5. Each function must do a single task. If is log in the user and record the login in stats table, be nice and create a separate function for 'record the login' stuff. @@ -74,11 +54,4 @@ Maybe even a distinct class for stats ?
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/htaccess-301-redirect-non-www-to-www.html.twig b/src/Blog/templates/page/blog-resource/best-practice/htaccess-301-redirect-non-www-to-www.html.twig index f159e07..c4d7ae4 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/htaccess-301-redirect-non-www-to-www.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/htaccess-301-redirect-non-www-to-www.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/htaccess-301-redirect-non-www-to-www.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}htaccess 301 redirect non-www to www{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} To always redirect users to the www site (for example: http://dotboost.com to http://www.dotboost.com), add the following lines to .htaccess, right after RewriteEngine On:
    RewriteCond %{HTTP_HOST} ^dotboost.com
    @@ -49,11 +29,4 @@ Replace dotboost.com with your site's domain.
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/insert-update-delete-statements-with-zend-db.html.twig b/src/Blog/templates/page/blog-resource/best-practice/insert-update-delete-statements-with-zend-db.html.twig index 269690a..514425e 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/insert-update-delete-statements-with-zend-db.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/insert-update-delete-statements-with-zend-db.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/insert-update-delete-statements-with-zend-db.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}INSERT, UPDATE, DELETE statements with Zend_Db{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Continuing the Zend_DB article series, we are stopping now at DML statements.
    DML (Data Manipulation Language) statements are statements that change data values in database tables. There are 3 primary DML statements:
      @@ -31,17 +11,17 @@ DML (Data Manipulation Language) statements are statements that change data valu
      Note*: -
      >
      +
       $db = Zend_Db::factory('Pdo_Mysql', $dbConnect);
       

      INSERT -
      >
      +
       INSERT INTO user(email, password, firstName, lastName, active)
              VALUES ('$email', '$password', '$firstName', '$lastName', 1);
       
      The above SQL INSERT statement is translated in Zend_Db as follow: -
      >
      +
       $data = array( 'email' => $email,
                   'password' => $password,
                   'firstName' => $firstName,
      @@ -50,7 +30,7 @@ $data = array( 'email' => $email,
       $db->insert('user', $data);
       

      UPDATE -
      >
      +
       UPDATE user
          SET password = '$password',
              firstName = '$firstName',
      @@ -59,7 +39,7 @@ UPDATE user
        WHERE id = '$id'
       
      The above SQL UPDATE statemnet is translated in Zend_Db as follow: -
      >
      +
       $data = array('password' => $password,
                     'firstName' => $firstName,
                     'lastName' => $vlastname,
      @@ -68,11 +48,11 @@ $db->update('user', $data, 'id = '.$id);
       

      DELETE -
      >
      +
       DELETE FROM user WHERE id = '$id'
       
      The above SQL DELETE statemnet is translated in Zend_Db as follow: -
      >
      +
       $db->delete('user', 'id = '.$id);
       
      @@ -104,11 +84,4 @@ $db->delete('user', 'id = '.$id);
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/sql-queries-using-zend-db-select.html.twig b/src/Blog/templates/page/blog-resource/best-practice/sql-queries-using-zend-db-select.html.twig index 6d8e0c0..df91be2 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/sql-queries-using-zend-db-select.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/sql-queries-using-zend-db-select.html.twig @@ -1,29 +1,9 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/sql-queries-using-zend-db-select.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}SQL queries using Zend_Db – SELECT{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Zend_Db and its related classes provide a simple SQL database interface for Zend Framework. To connect to MySql database, we are using Pdo_Mysql adapter : -
    >
    +
     $db = Zend_Db::factory('Pdo_Mysql', $dbConnect);
     

    @@ -32,14 +12,14 @@ $db = Zend_Db::factory('Pdo_Mysql', $dbConnect); SELECT query - WHERE clause
    The below 2 classical SQL queries are equivalent. First one is simple, the second one use INNER JOIN keyword, but the result is the same. -
    >
    +
     SELECT a.id, a.name, b.order_id
     FROM users AS a, orders AS b
     WHERE a.id = b.user_id
     AND a.id = {$userId}
     

    -
    >
    +
     SELECT `a`.`id`, `a`.`name`, `b`.`order_id`
     FROM `users` AS `a` INNER JOIN `orders` AS `b` ON a.id = b.user_id
     WHERE (a.id = '{$userId}')
    @@ -47,7 +27,7 @@ WHERE (a.id = '{$userId}')
     
    The above querys are translated in Zend_Db style:
    -
    >
    +
     $select = $db->select()
                  ->from(array('a'=>'users'),
                         array('a.id', 'a.name'))
    @@ -56,7 +36,7 @@ $select = $db->select()
     

    If we don't want to select any column from the second table, the 3rd parameter of join() method should be an empty string -
    >
    +
     SELECT a.id, a.name
     FROM users AS a, orders AS b
     WHERE a.id = b.user_id
    @@ -72,7 +52,7 @@ $select = $db->select()
     

    Note*: If we don't write the 3rd parameter, it will select all the fields from that table: -
    >
    +
     SELECT a.id, a.name, b.*
     FROM users AS a, orders AS b
     WHERE a.id = b.user_id
    @@ -89,7 +69,7 @@ $select = $db->select()
     
    SELECT query - WHERE IN clause
    -
    >
    +
     SELECT id
     FROM users
     WHERE aff_id IN ('1','2','3')
    @@ -102,7 +82,7 @@ $select = $db->select()
     

    Note*: If you are not sure if you write the correct query, before you fetch it you can echo your query to visualize it: -
    >
    +
     echo $select->__toString();exit;
     

    @@ -151,11 +131,4 @@ Also see:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/subqueries-with-zend-db.html.twig b/src/Blog/templates/page/blog-resource/best-practice/subqueries-with-zend-db.html.twig index a37d7c2..d2d8041 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/subqueries-with-zend-db.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/subqueries-with-zend-db.html.twig @@ -1,32 +1,12 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/subqueries-with-zend-db.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Subqueries with Zend_Db{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Continuing the Zend_DB article series, we are stopping now at subqueries.
    As you note, the below is a complicate query, with COUNT(), LEFT JOIN(), GROUP BY - select from 3 tables, and make a count from 2 different tables: -
    >
    +
     SELECT a.id,
            a.title,
            (SELECT COUNT(c.track_id)
    @@ -40,11 +20,11 @@ GROUP BY a.id
     

    Initialize the connection to our MySql database: -
    >
    +
     $db = Zend_Db::factory('Pdo_Mysql', $dbConnect);
     

    -
    >
    +
     $db->select()
        ->from(array('a'=>'tracks'),
              array('id',
    @@ -85,11 +65,4 @@ $db->select()
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/svn-export-in-a-virtual-host.html.twig b/src/Blog/templates/page/blog-resource/best-practice/svn-export-in-a-virtual-host.html.twig index 98b9e4e..321a628 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/svn-export-in-a-virtual-host.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/svn-export-in-a-virtual-host.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/svn-export-in-a-virtual-host.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}SVN Export in a virtual host{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} The following commands should be run in the terminal (for example, using Putty in Windows) on the host where you want to export the repository). It's recommended that you run them using the domain's user, not root. First make sure that Subversion is installed on the host. To check if it is installed, run: @@ -44,13 +24,13 @@ The command looks like this:
    svn export repositoryUrl repositoryUrl
  • --force - optional - by default SVN will not export in an existing directory. if you want to override this, you have to use the force parameter. Be careful, this option can overwrite files
  • Examples: -
    >svn export http://v1.dotkernel.net/svn/trunk ./ --force
    +
    svn export http://v1.dotkernel.net/svn/trunk ./ --force
     svn export -r 423 http://v1.dotkernel.net/svn/trunk ./ --force
     svn export http://v1.dotkernel.net/svn/trunk /var/www/vhosts/domain.com/httpdocs/dk
    For more information, you can run svn help export. If you've exported the repository using a different user (root for example), you can change the permissions back by running the following command as root: -
    >chown -R siteuser.psacln /var/www/vhosts/example.com/httpdocs
    +
    chown -R siteuser.psacln /var/www/vhosts/example.com/httpdocs

    Frequently Asked Questions

    @@ -86,11 +66,4 @@ If you've exported the repository using a different user (root for example), you
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/svn-keywords-setup-in-php-ide-zend-studio.html.twig b/src/Blog/templates/page/blog-resource/best-practice/svn-keywords-setup-in-php-ide-zend-studio.html.twig index 317256e..14a5710 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/svn-keywords-setup-in-php-ide-zend-studio.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/svn-keywords-setup-in-php-ide-zend-studio.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/svn-keywords-setup-in-php-ide-zend-studio.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}SVN keywords setup in PHP IDE ( Zend Studio){% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} For a better integration of SVN, your PHP IDE( Zend Studio), and a bug tracker of choice, the below proprieties must be set, for each project you have. @@ -96,11 +76,4 @@ Check the Use filtration by the resource name and add
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/using-like-wildcards-with-zend-db.html.twig b/src/Blog/templates/page/blog-resource/best-practice/using-like-wildcards-with-zend-db.html.twig index 26ebf24..3d83fe1 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/using-like-wildcards-with-zend-db.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/using-like-wildcards-with-zend-db.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/using-like-wildcards-with-zend-db.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Using LIKE wildcards with Zend_Db{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Continuing the Zend_Db article series, let's discuss the LIKE condition. The LIKE condition allows you to use wildcards in the WHERE clause of an SQL statement. This allows pattern matching. It can be used in any valid SQL statement (SELECT, INSERT, UPDATE or DELETE). @@ -33,13 +13,13 @@ The LIKE condition allows you to use wildcards in the WHERE Note*: -
    >$db = Zend_Db::factory('Pdo_Mysql', $dbConnect);
    +
    $db = Zend_Db::factory('Pdo_Mysql', $dbConnect);
    LIKE _
    • Return all ids which start with '1' and second digit is between 0 and 9 (10, 11, 12, ..., 18, 19):
    -
    >SELECT * FROM `table` WHERE (`id` LIKE '1_' )
    -
    >$col = $this->db->quoteIdentifier('id');
    +
    SELECT * FROM `table` WHERE (`id` LIKE '1_' )
    +
    $col = $this->db->quoteIdentifier('id');
     $where = $this->db->quoteInto("$col LIKE ? ", '1_');
     $select = $this->db->select()
         ->from('table')
    @@ -48,10 +28,10 @@ $result = $this->db->fetchAll($select);
    • Return all instances whose name is 4 characters long, where the first two characters are 'Fr' and the last character is 'd' (Frad, Fred, Frod, etc.) :
    -
    >
    +
     SELECT * FROM `table` WHERE (`name` LIKE 'Fr_d' )
     
    -
    >
    +
     $col = $this->db->quoteIdentifier('name');
     $where = $this->db->quoteInto("$col LIKE ? ", 'Fr_d');
     $select = $this->db->select()
    @@ -65,10 +45,10 @@ $result = $this->db->fetchAll($select);
     
    • Returns all instances that have the 'gallery' string in the source field:
    -
    >
    +
     SELECT * FROM `table` WHERE (`source` LIKE '%gallery%' )
     
    -
    >
    +
     $col = $this->db->quoteIdentifier('source');
     $where = $this->db->quoteInto("$col LIKE ? ", '%gallery%');
     $select = $this->db->select()
    @@ -79,10 +59,10 @@ $result = $this->db->fetchAll($select);
     
    • Returns all instances that have the 'gallery' or 'folder' strings in the source field:
    -
    >
    +
     SELECT * FROM `table` WHERE (`source` LIKE '%gallery%' OR `source` LIKE ('%folder%') )
     
    -
    >
    +
     $col = $this->db->quoteIdentifier('source');
     $where = $this->db->quoteInto("$col LIKE ? ", '%gallery%');
     $where .= $this->db->quoteInto("OR $col LIKE (?) ", '%folder%');
    @@ -97,10 +77,10 @@ $result = $this->db->fetchAll($select);
     
    • Returns all 2-digit ids that don't start with 1 (20->99 ) or have a different number of digits than 2 (1, 2, ..., 8, 9, 100, 101, ...):
    -
    >
    +
     SELECT * FROM `table` WHERE (`id` NOT LIKE '1_' )
     
    -
    >
    +
     $col = $this->db->quoteIdentifier('id');
     $where = $this->db->quoteInto("$col NOT LIKE ? ", '1_');
     $select = $this->db->select()
    @@ -114,10 +94,10 @@ $result = $this->db->fetchAll($select);
     
    • Returns all instances that don't have 'gallery', 'folder' or 'file' strings in the source field:
    -
    >
    +
     SELECT * FROM `table` WHERE (`source` NOT LIKE ('%gallery%') AND `source` NOT LIKE ('%folder%') AND `source` NOT LIKE ('%file%') )
     
    -
    >
    +
     $col = $this->db->quoteIdentifier('source');
     $where = $this->db->quoteInto("$col NOT LIKE (?) ", '%gallery%');
     $where .= $this->db->quoteInto("AND $col NOT LIKE (?) ", '%folder%');
    @@ -130,8 +110,8 @@ $result = $this->db->fetchAll($select);
     

    OTHER Example -
    >SELECT * FROM `table` WHERE `number` LIKE '_6%' 
    -
    >$col = $this->db->quoteIdentifier('number');
    +
    SELECT * FROM `table` WHERE `number` LIKE '_6%' 
    +
    $col = $this->db->quoteIdentifier('number');
     $where = $this->db->quoteInto("$col LIKE ? ", '_6%');
     $select = $this->db->select()
         ->from('table')
    @@ -178,11 +158,4 @@ $result = $this->db->fetchAll($select);
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/what-are-returning-the-fetch-functions-from-zend-db.html.twig b/src/Blog/templates/page/blog-resource/best-practice/what-are-returning-the-fetch-functions-from-zend-db.html.twig index 3e933a6..5bdaedf 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/what-are-returning-the-fetch-functions-from-zend-db.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/what-are-returning-the-fetch-functions-from-zend-db.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/what-are-returning-the-fetch-functions-from-zend-db.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}What are returning the FETCH functions from Zend_Db{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Continuing the Zend_DB article series, we are stopping now at FETCH methods that are in Zend_Db_Adapter_Abstract:
     array  fetchAll  (string|Zend_Db_Select $sql, , )
    @@ -171,11 +151,4 @@ $a = $db->fetchRow($select);
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/best-practice/why-use-current-timestamp-on-a-field-that-record-date-time.html.twig b/src/Blog/templates/page/blog-resource/best-practice/why-use-current-timestamp-on-a-field-that-record-date-time.html.twig index c2fd04f..2d9019c 100644 --- a/src/Blog/templates/page/blog-resource/best-practice/why-use-current-timestamp-on-a-field-that-record-date-time.html.twig +++ b/src/Blog/templates/page/blog-resource/best-practice/why-use-current-timestamp-on-a-field-that-record-date-time.html.twig @@ -1,33 +1,13 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/best-practice/why-use-current-timestamp-on-a-field-that-record-date-time.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Why use CURRENT_TIMESTAMP on a field that record date/time?{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Best Practice', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} On a TIMESTAMP field that records date and time when inserting a new record, it is encouraged to use as a DEFAULT value, the CURRENT_TIMESTAMP constant. Why? Because when inserting a new row in the table for the date and time field there is no need to specifically add its value, either by creating it from PHP code with the Date/ Time functions or with MySQL function NOW() -
    >ALTER TABLE `user` CHANGE `dateCreated` `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
    +
    ALTER TABLE `user` CHANGE `dateCreated` `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
    CURRENT_TIMESTAMP is also a solution for  updating date and time fields. Use ON UPDATE CURRENT_TIMESTAMP clause, if you want the value of the field to be changed automatically each time the row is updated. -
    >ALTER TABLE `user` CHANGE `dateLogin` `dateLogin` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
    +
    ALTER TABLE `user` CHANGE `dateLogin` `dateLogin` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
    DEFAULT and ON UPDATE clauses can be used together or separately, depending on your needs:

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/api-client-migration-from-postman-to-bruno.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/api-client-migration-from-postman-to-bruno.html.twig index b384677..0e12af9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/api-client-migration-from-postman-to-bruno.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/api-client-migration-from-postman-to-bruno.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/api-client-migration-from-postman-to-bruno.jsonld.twig') }} {% endblock %} - -{% block title %}API Client Migration: From Postman to Bruno{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Why We Switched to the Offline-Focused Bruno

    Every API developer knows that to build an API properly you need a reliable client for testing and interacting with the API. Ideally this tool should be free, it should store endpoint collections and share them easily with your team, and it should be fast and secure.

    @@ -155,11 +135,4 @@

    Additional Resources

    Bruno homepage

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/api-endpoint-to-collect-client-errors.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/api-endpoint-to-collect-client-errors.html.twig index 8a26645..870d6a9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/api-endpoint-to-collect-client-errors.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/api-endpoint-to-collect-client-errors.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/api-endpoint-to-collect-client-errors.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}API Endpoint to Collect Client Errors{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    API Endpoint to Collect Client Errors

    Let's say you have a (Client) Frontend (e.g. Angular) over a Dotkernel API and there may be cases when there are errors, eighter the API changed it's response(s) over night or just a simple variable being undefined for some reason.

    @@ -61,11 +41,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/content-negotiation-in-dotkernel-rest-api.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/content-negotiation-in-dotkernel-rest-api.html.twig index 7d42627..f84d42b 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/content-negotiation-in-dotkernel-rest-api.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/content-negotiation-in-dotkernel-rest-api.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/content-negotiation-in-dotkernel-rest-api.jsonld.twig') }} {% endblock %} - -{% block title %}Content Negotiation in Dotkernel REST API{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Content negotiation is an important aspect of RESTful APIs to make it possible for diverse systems to work seamlessly together. It's based on enabling clients and servers to agree on the format and language of data they exchange.

    @@ -166,11 +146,4 @@ https://www.example-api.com/record/47?format=json

    Content Negotiation in Dotkernel API

    Content types on iana.org

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-1-0-0-released.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-1-0-0-released.html.twig index 86bceef..e19526a 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-1-0-0-released.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-1-0-0-released.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/dotkernel-api-1-0-0-released.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel API 1.0.0 Released{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel API has come a long way since this post was created. Check out the newest version of Dotkernel API to stay up to date with the latest functional and security features.

    @@ -78,11 +58,4 @@

     

    -
    - - {{ include('@partial/post-nav.html.twig') }} - - -
    - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-client-side-authorization.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-client-side-authorization.html.twig index 3c3dda4..b4222e9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-client-side-authorization.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-client-side-authorization.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/dotkernel-api-client-side-authorization.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel API Client Side Authorization{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article covers the basic authorization of a Client application which use a backend built using Dotkernel API

    Authorization Request

    @@ -71,11 +51,4 @@ When sending API requests to an endpoint which requires authori
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-server-side-authorization.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-server-side-authorization.html.twig index 70466ff..a9a71e5 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-server-side-authorization.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-server-side-authorization.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/dotkernel-api-server-side-authorization.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel API Server Side Authorization{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article covers the basic authorization of a Server Side application  built using Dotkernel API

    Protecting an endpoint

      @@ -112,11 +92,4 @@ $app->get('/users', , 'users');
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-versus-laminas-api-tools.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-versus-laminas-api-tools.html.twig index 981ae41..7ed56d9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-versus-laminas-api-tools.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/dotkernel-api-versus-laminas-api-tools.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/dotkernel-api-versus-laminas-api-tools.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel API versus Laminas API Tools{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Below we have created an analysis of the basic features available in Laminas Api Tools and Dotkernel API. It's intended to highlight the differences between the two and also to showcase why Dotkernel API is a good alternative for Laminas API Tools, especially considering the latter's archived status.

    The table below refers to Dotkernel API V7

    @@ -35,11 +15,4 @@

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/error-reporting-endpoint-in-dotkernel-api.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/error-reporting-endpoint-in-dotkernel-api.html.twig index 800d1c1..fc41189 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/error-reporting-endpoint-in-dotkernel-api.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/error-reporting-endpoint-in-dotkernel-api.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/error-reporting-endpoint-in-dotkernel-api.jsonld.twig') }} {% endblock %} - -{% block title %}Error reporting endpoint in Dotkernel API{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel API has received a lot of love from our developers, with regular updates to the platform for years. We use Dotkernel API in our projects, so any bugs and issues are addressed as soon as they are found. Still, it's not unlikely that some hidden issues remain in fringe use cases that we simply haven't explored. The occurrence of bugs increases when the API is used in a complex frontend project.

    @@ -136,11 +116,4 @@ return ,

    The error reporting feature in Dotkernel API is a secured and highly configurable tool for users of your API to report any unwanted behavior. More often than not, a detailed error report will help developers understand how to replicate the issue and fix it in due course.

    This article is also included in the full API documentation https://docs.dotkernel.org/api-documentation/v5/core-features/error-reporting.

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/how-to-implement-mailchimp-in-dotkernel-api.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/how-to-implement-mailchimp-in-dotkernel-api.html.twig index 7b6b04a..817bda1 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/how-to-implement-mailchimp-in-dotkernel-api.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/how-to-implement-mailchimp-in-dotkernel-api.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/how-to-implement-mailchimp-in-dotkernel-api.jsonld.twig') }} {% endblock %} - -{% block title %}How to implement MailChimp in Dotkernel API{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    This article will walk you through the process of implementing MailChimp into your instance of Dotkernel API using drewm/mailchimp-api

      @@ -119,11 +99,4 @@ After this, you can start using the library by @Injecting
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - -
    - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel-api/openapi-implementation-in-dotkernel-api.html.twig b/src/Blog/templates/page/blog-resource/dotkernel-api/openapi-implementation-in-dotkernel-api.html.twig index 6eb1e29..351951a 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel-api/openapi-implementation-in-dotkernel-api.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel-api/openapi-implementation-in-dotkernel-api.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel-api/openapi-implementation-in-dotkernel-api.jsonld.twig') }} {% endblock %} - -{% block title %}OpenAPI implementation in Dotkernel API{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel API', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    What is OpenAPI?

    The OpenAPI Specification provides a consistent way to develop and interact with an API. It defines API structure and syntax in a universal way, regardless of the programming language used in the API's development. API specifications typically use YAML or JSON to share and use the specification. They allow users of the API to quickly discover how it works by describing its elements, e.g. endpoints, request and response formats, security mechanisms and more.

    @@ -163,11 +143,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/adding-a-cors-implementation-to-zend-expressive.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/adding-a-cors-implementation-to-zend-expressive.html.twig index cdd0150..c79122f 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/adding-a-cors-implementation-to-zend-expressive.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/adding-a-cors-implementation-to-zend-expressive.html.twig @@ -1,52 +1,32 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/adding-a-cors-implementation-to-zend-expressive.jsonld.twig') }} {% endblock %} - -{% block title %}Adding a CORS implementation to Zend Expressive{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} -

    This article is a guide on how to add a CORS implementation on an existing Dotkernel3 project.

    - -

    The issue

    -

    If you're facing this message:

    -

    "Access to XMLHttpRequest at 'url' has been blocked by cors policy. No 'Access-Control-Allow-Origin header is present on the requested resource."

    -

    It means the server didn't sent the header that lets you access its data through a local client (eg.: browser).

    -

    This issue is most common when trying to get some data (usually json) that you want to process using JavaScript.

    -

    The error looks similar to the image below:

    - -
    - -
    - -

    The solution

    -

    A simple implementation would be using Tuupola's Cors Middleware package.

    -

    This article was inspired by: akrabat.com/implementing-tuupola-cors-in-expressive

    - -

    Adding the package to your project

    -

    Run the following command in your project:

    -
    composer require tuupola/cors-middleware
    -

    At the time writing this article the current package version is: 0.9.4.

    -

    Follow the next steps to get your Zend Expressive or Dotkernel3 project CORS friendly.

    - -

    Create the CORS config file

    -

    Create a cors.global.php file in the config/autoload directory.

    -
    return [
    +{% extends '@layout/blog-post.html.twig' %}
    +
    +{% block body %}
    +

    This article is a guide on how to add a CORS implementation on an existing Dotkernel3 project.

    + +

    The issue

    +

    If you're facing this message:

    +

    "Access to XMLHttpRequest at 'url' has been blocked by cors policy. No 'Access-Control-Allow-Origin header is present on the requested resource."

    +

    It means the server didn't sent the header that lets you access its data through a local client (eg.: browser).

    +

    This issue is most common when trying to get some data (usually json) that you want to process using JavaScript.

    +

    The error looks similar to the image below:

    + +
    + +
    + +

    The solution

    +

    A simple implementation would be using Tuupola's Cors Middleware package.

    +

    This article was inspired by: akrabat.com/implementing-tuupola-cors-in-expressive

    + +

    Adding the package to your project

    +

    Run the following command in your project:

    +
    composer require tuupola/cors-middleware
    +

    At the time writing this article the current package version is: 0.9.4.

    +

    Follow the next steps to get your Zend Expressive or Dotkernel3 project CORS friendly.

    + +

    Create the CORS config file

    +

    Create a cors.global.php file in the config/autoload directory.

    +
    return [
         'cors' => [
             "origin" => [],
             "methods" => [],
    @@ -57,12 +37,12 @@
         ],
         'dependencies' => [],
     ];
    -

    We'll come back at this file to register the CORS middleware.

    +

    We'll come back at this file to register the CORS middleware.

    -

    Creating a factory for the middleware

    -

    The factory should look like the one below.

    -

    The code below extracts de config from the cors key if provided or initializes an empty array and instantiates the Tuupola CORS middleware.

    -
    <?php
    +

    Creating a factory for the middleware

    +

    The factory should look like the one below.

    +

    The code below extracts de config from the cors key if provided or initializes an empty array and instantiates the Tuupola CORS middleware.

    +
    <?php
     
     namespace App\Cors;
     
    @@ -77,9 +57,9 @@ class CorsMiddlewareFactory
         }
     }
    -

    Registering the CORS middleware

    -

    Back at cors.global.php we will register the cors middleware so our custom implemented factory will be used to create the middleware. (basic config example below)

    -
    <?php
    +

    Registering the CORS middleware

    +

    Back at cors.global.php we will register the cors middleware so our custom implemented factory will be used to create the middleware. (basic config example below)

    +
    <?php
     
     use App\Cors\CorsMiddlewareFactory;
     use Tuupola\Middleware\CorsMiddleware;
    @@ -100,9 +80,9 @@ return [
         ]
     ];
    -

    Final step: Adding (registering) the CorsMiddleware in the pipeline

    -

    In this last step we only need to add the CorsMiddleware in config/pipelines.php

    -
    // don't forget the use statement
    +

    Final step: Adding (registering) the CorsMiddleware in the pipeline

    +

    In this last step we only need to add the CorsMiddleware in config/pipelines.php

    +
    // don't forget the use statement
     use Tuupola\Middleware\CorsMiddleware;
     
     return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container) : void {
    @@ -110,48 +90,41 @@ return function (Application $app, MiddlewareFactory $factory, ContainerInterfac
         $app->pipe(CorsMiddleware::class);
         // ...
     };
    -

    Add the cors middleware after the Error handler and before the middleware providing the data you want to access to make sure everything runs smoothly.

    -

    This should get your project working with CORS.

    - -

    Frequently Asked Questions

    - -
    -
    - What causes the "No 'Access-Control-Allow-Origin' header" error? + -
    -

    It means the server didn't send the header that lets a local client, such as a browser, access its data. This is most common when trying to fetch data (usually JSON) that you want to process using JavaScript.

    -
    -
    -
    - What package does the article use to add CORS support? + -
    -

    Tuupola's Cors Middleware package, installed by running composer require tuupola/cors-middleware in the project.

    -
    -
    -
    - Where does the CORS configuration live? + -
    -

    In a cors.global.php file created in the config/autoload directory, containing a "cors" key with settings like origin, methods, headers.allow, headers.expose, credentials, and cache.

    -
    -
    -
    - How is the CorsMiddleware wired into the container? + -
    -

    A CorsMiddlewareFactory extracts the "cors" config array (or an empty array if it's not provided) and instantiates Tuupola's CorsMiddleware with it. That factory is then registered under the "dependencies" > "factories" section of cors.global.php.

    -
    -
    -
    - Where should the CORS middleware be added in the pipeline? + -
    -

    In config/pipelines.php via $app->pipe(CorsMiddleware::class), placed after the Error handler and before the middleware that provides the data you want to access.

    -
    -
    -
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    +

    Add the cors middleware after the Error handler and before the middleware providing the data you want to access to make sure everything runs smoothly.

    +

    This should get your project working with CORS.

    +

    Frequently Asked Questions

    + +
    +
    + What causes the "No 'Access-Control-Allow-Origin' header" error? + +
    +

    It means the server didn't send the header that lets a local client, such as a browser, access its data. This is most common when trying to fetch data (usually JSON) that you want to process using JavaScript.

    +
    +
    +
    + What package does the article use to add CORS support? + +
    +

    Tuupola's Cors Middleware package, installed by running composer require tuupola/cors-middleware in the project.

    +
    +
    +
    + Where does the CORS configuration live? + +
    +

    In a cors.global.php file created in the config/autoload directory, containing a "cors" key with settings like origin, methods, headers.allow, headers.expose, credentials, and cache.

    +
    +
    +
    + How is the CorsMiddleware wired into the container? + +
    +

    A CorsMiddlewareFactory extracts the "cors" config array (or an empty array if it's not provided) and instantiates Tuupola's CorsMiddleware with it. That factory is then registered under the "dependencies" > "factories" section of cors.global.php.

    +
    +
    +
    + Where should the CORS middleware be added in the pipeline? + +
    +

    In config/pipelines.php via $app->pipe(CorsMiddleware::class), placed after the Error handler and before the middleware that provides the data you want to access.

    -
    + +
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/adding-a-second-caching-layer-to-wurfl-in-dotkernel-using-apc.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/adding-a-second-caching-layer-to-wurfl-in-dotkernel-using-apc.html.twig index 973dd60..bd6c63f 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/adding-a-second-caching-layer-to-wurfl-in-dotkernel-using-apc.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/adding-a-second-caching-layer-to-wurfl-in-dotkernel-using-apc.html.twig @@ -1,30 +1,8 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/adding-a-second-caching-layer-to-wurfl-in-dotkernel-using-apc.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Adding a second caching layer to WURFL in Dotkernel using APC{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} On one of our recent projects that used WURFL, response time was an important factor. Profiling revealed that the greatest chunk of response time (up to a few hundred milliseconds) was taken up by WURFL. We realized that its default filesystem cache was too slow for our needs, especially with a relatively high traffic application. - - If you're not familiar with how WURFL's caching works, here's a brief introduction:
    1. The device data is stored at first in a large, zipped XML file, with one entry for each device.
    2. @@ -75,11 +53,4 @@ This small change (under 10 lines of code), decreased our response time by an
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/adding-composer-support-in-your-dotkernel-project.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/adding-composer-support-in-your-dotkernel-project.html.twig index 2d0d8db..12e24b1 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/adding-composer-support-in-your-dotkernel-project.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/adding-composer-support-in-your-dotkernel-project.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/adding-composer-support-in-your-dotkernel-project.jsonld.twig') }} {% endblock %} - -{% block title %}Adding Composer support in your Dotkernel project{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Composer is an application-level package manager. Composer auto-loads the dependencies on demand and can also auto-load custom classes . This article will cover the needed steps to add composer support to your Dotkernel project or even "composify" it. @@ -32,7 +12,7 @@ Assuming that you know how to use composer (if not you should consider reading < The Dotkernel project must have a composer.json file so that composer can work. Our composer.json file should look like this: -
    >{
    +
    {
       "require" : {
         "zendframework/zendframework1" : "1.12.*",
         "mobiledetect/mobiledetectlib" : "2.8.*"
    @@ -56,7 +36,7 @@ The dependencies provided in the require section are also loade
      
     
     In order to have these components instaled you must run the following command in your Dotkernel root path
    -
    >composer update
    +
    composer update
    If the vendor folder is present composer will check for updates, and update the packages as needed. If the vendor folder does not exist composer will create a vendor folder. This folder will contain all the requested packages. @@ -66,12 +46,12 @@ Composer will create an autoload file, which will be use to load our dependencie  

    Adding Composer Support to Dotkernel

    The autoload file created by composer will be used to load our packages. -
    >$composerAutoLoaderPath = realpath(APPLICATION_PATH.'/vendor/autoload.php');
    +
    $composerAutoLoaderPath = realpath(APPLICATION_PATH.'/vendor/autoload.php');
     require_once($composerAutoLoaderPath);
    So far so good, but what if the file does not exist or composer is not present? First we must make sure the composer autoload path exists and only load the dependencies if composer autoload file was found. -
    >$composerAutoLoaderPath = realpath('./vendor/autoload.php');
    +
    $composerAutoLoaderPath = realpath('./vendor/autoload.php');
     
     $composerEnabled = file_exists($composerAutoLoaderPath);
     
    @@ -87,7 +67,7 @@ else
     The variable $composerEnabled will be true only if the composer path exists so the application behavior can be controlled if composer is not present.
     
     Later on, the packages can be used like this:
    -
    >use VendorName\PackageName\ClassName as MyDependency;
    +
    use VendorName\PackageName\ClassName as MyDependency;
     
     $myDependency = new MyDependency($neededArguments);
     $myDependency->doSomething();
    @@ -129,11 +109,4 @@ This article works for any Dotkernel 1.x version if your server
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/adding-windows-10-os-and-browser-detection-in-dotkernel-projects.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/adding-windows-10-os-and-browser-detection-in-dotkernel-projects.html.twig index 1c772ae..de2a0fe 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/adding-windows-10-os-and-browser-detection-in-dotkernel-projects.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/adding-windows-10-os-and-browser-detection-in-dotkernel-projects.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/adding-windows-10-os-and-browser-detection-in-dotkernel-projects.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Adding Windows 10 OS and Browser detection in Dotkernel projects{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Recently we have added the Windows 8, 8.1 and 10 OS icon and Microsoft's Edge browser icon. In this article we will have the icon upgrade guide. @@ -78,11 +58,4 @@ A /images/os/windows_metro.png
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/autologin-using-cookie-remember-me-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/autologin-using-cookie-remember-me-in-dotkernel.html.twig index af285f0..0779fd9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/autologin-using-cookie-remember-me-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/autologin-using-cookie-remember-me-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/autologin-using-cookie-remember-me-in-dotkernel.jsonld.twig') }} {% endblock %} - -{% block title %}Autologin using Cookie / Remember Me in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Autologin using Cookie / Remember Me in Dotkernel

    This feature is used to automatically log the user who chooses this by checking the remember me box.

    @@ -159,11 +139,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/avoid-routing-through-bootstrap-of-non-existent-files.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/avoid-routing-through-bootstrap-of-non-existent-files.html.twig index 6c994e1..c73c6d5 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/avoid-routing-through-bootstrap-of-non-existent-files.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/avoid-routing-through-bootstrap-of-non-existent-files.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/avoid-routing-through-bootstrap-of-non-existent-files.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Avoid routing through bootstrap of non existent files{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In some cases you may encounter missing files: images, css or js files. All those missing files are processed by the current bootstrap: index.php @@ -51,11 +31,4 @@ Even though it's a well known fact that real men do not test...
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/caching-in-dotkernel-using-zend-framework.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/caching-in-dotkernel-using-zend-framework.html.twig index b751f6d..489ac83 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/caching-in-dotkernel-using-zend-framework.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/caching-in-dotkernel-using-zend-framework.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/caching-in-dotkernel-using-zend-framework.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Caching in Dotkernel using Zend Framework{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} It's very expensive to load configurations and settings from XML files, on every requests. First because of latency of accessing files from hard drive, second because of the XML @@ -39,11 +19,11 @@ For more info about the configuration and help configuring the cache see: see Dot_Kernel::initialize($startTime)), but if you would like to use caching for other purposes (where you are not initializing the kernel), the loading syntax is the following: -
    >Dot_Cache::loadCache();
    +
    Dot_Cache::loadCache();
    Below is a simple object caching sample, yes, you can also cache objects.
    Note: The cache key must match the following RegEx pattern: [A-Za-z0-9_]* -
    >$id = 'MyCachedKey';
    +
    $id = 'MyCachedKey';
     $obj = new stdClass();
     $obj->text = 'I am a cached text';
     
    @@ -98,11 +78,4 @@ else
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/camelcase-table-names-in-mysql-on-windows.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/camelcase-table-names-in-mysql-on-windows.html.twig index c682bd2..6f3510d 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/camelcase-table-names-in-mysql-on-windows.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/camelcase-table-names-in-mysql-on-windows.html.twig @@ -1,29 +1,9 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/camelcase-table-names-in-mysql-on-windows.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}camelCase Table Names in MySQL on Windows{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} If you are using a WAMP stack, like WAMP or XAMPP, and try to create a table in camelCase ( example: adminLogin) you will notice that camelCase is not working, table name will be lowercase: adminlogin. In order to fix this, you need to add to your my.cnf file the line: -
    >lower_case_table_names=2
    +
    lower_case_table_names=2
    and restart mysql. More on that here:
    http://dev.mysql.com/doc/refman/4.1/en/server-system-variables.html#sysvar_lower_case_table_names @@ -44,11 +24,4 @@ More on that here: -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Another 2 of our team members passed the ZCE exam. Now we are 5 :-) @@ -39,11 +19,4 @@ That mean we are really taking PHP  into serious , and at least we have good t
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/configuring-the-cache-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/configuring-the-cache-in-dotkernel.html.twig index bb8aa50..59044d1 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/configuring-the-cache-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/configuring-the-cache-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/configuring-the-cache-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Configuring the Cache in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article contains the Dotkernel cache layer configuration guide. The Dotkernel Caching Layer is based on Zend Framework Cache, more configuration options can be found at the following links: @@ -31,7 +11,7 @@ The Dotkernel Caching Layer is based on Zend Framework Cache, more configuration

    Main cache settings (Cache Frontend)

    The main cache settings within the application.ini file should look like this: -
    >cache.enable = true
    +
    cache.enable = true
     cache.factory = "apc"
     cache.lifetime = "86400"
     cache.namespace = "dotkernel"
    @@ -44,7 +24,7 @@ The cache.namespace will be the cache variables prefix and the cach  

    Individual cache settings (Cache Backend)

    The individual cache settings are optional but we highly recommend that you have theese values set, otherwise other projects might use the same cache -
    >; file caching settings
    +
    ; file caching settings
      cache.file.cache_dir = APPLICATION_PATH "/cache"
      cache.file.cache_file_perm = 0600
      @@ -52,7 +32,7 @@ The individual cache settings are optional but we highly recommend that you have For more settings and caching alternatives see the Zend Framework Cache Links at the article beginning. The setting pattern and sample are below: -
    >cache.BACKEND_NAME.SETTING = "VALUE"
    +
    cache.BACKEND_NAME.SETTING = "VALUE"
     ; example:
     cache.file.file_name_prefix = "Dotkernel"
    @@ -84,11 +64,4 @@ cache.file.file_name_prefix = "Dotkernel"
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dependency-injection-made-easy-in-laminas-mezzio-applications.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dependency-injection-made-easy-in-laminas-mezzio-applications.html.twig index abd6991..9d8fcce 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dependency-injection-made-easy-in-laminas-mezzio-applications.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dependency-injection-made-easy-in-laminas-mezzio-applications.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dependency-injection-made-easy-in-laminas-mezzio-applications.jsonld.twig') }} {% endblock %} - -{% block title %}Dependency Injection made easy in Laminas/Mezzio applications{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Note: The package requires Doctrine ORM. Still, it can be used in applications which do not integrate Doctrine.

    @@ -181,11 +161,4 @@ class UserHandler implements RequestHandlerInterface
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/detecting-mobile-devices-in-dotkernel-1-6-0.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/detecting-mobile-devices-in-dotkernel-1-6-0.html.twig index 6fa9cef..cd59387 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/detecting-mobile-devices-in-dotkernel-1-6-0.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/detecting-mobile-devices-in-dotkernel-1-6-0.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/detecting-mobile-devices-in-dotkernel-1-6-0.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Detecting Mobile Devices in Dotkernel 1.6.0{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} The new Dotkernel version 1.6.0 is comming with some changes how we are detecting mobile devices, this changes are because of the new Wurfl Cloud integration. This version of Dotkernel is not comming anymore with a working built in method for mobile detection, so first we have to configure it. @@ -38,7 +18,7 @@ We choosed device_os and mobile_browser capabilities because with these two capa Choosing other capabilities from scientiamobile will result in wrong detection of these extra capabilities, but you can get only those capabilities using another method from Dot_UserAgent_WurflCloud class. Wurfl Cloud setting in application.ini -
    >resources.useragent.wurflcloud.active = TRUE
    +
    resources.useragent.wurflcloud.active = TRUE
     resources.useragent.wurflcloud.redirect = TRUE
     resources.useragent.wurflcloud.cache = TRUE
     resources.useragent.wurflcloud.cache_lifetime = 3600
    @@ -58,17 +38,17 @@ Because of these changes we removed the old Dot_UserAgent_Wurfl class and added
     

    Example of Dot_UserAgent usage in Dotkernel:

    Get Wurfl configuration -
    >$wurflConf = $registry->configuration->resources->useragent->wurflcloud;
    +
    $wurflConf = $registry->configuration->resources->useragent->wurflcloud;
    Note: You can have more Wurfl configurations if you have more libraries like Wurfl Package (GPL) If Wurfl is active then get device info -
    >if($wurflConf->active)
    +
    if($wurflConf->active)
     {
         $deviceInfo = Dot_UserAgent :: getDeviceInfo($_SERVER);
         ...
     }
    If detected device is an mobile device we will save device info in database and redirect it to the mobile controller -
    >if( (0 < count((array)$deviceInfo)) && $deviceInfo->isMobile)
    +
    if( (0 < count((array)$deviceInfo)) && $deviceInfo->isMobile)
     {
     
         if(!$registry->session->visitId)
    @@ -128,11 +108,4 @@ If detected device is an mobile device we will save device info in database and
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/disable-wurfl-redirect-for-mobile-browsers.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/disable-wurfl-redirect-for-mobile-browsers.html.twig index d5dd708..6b8d447 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/disable-wurfl-redirect-for-mobile-browsers.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/disable-wurfl-redirect-for-mobile-browsers.html.twig @@ -1,35 +1,15 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/disable-wurfl-redirect-for-mobile-browsers.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Disable Wurfl redirect for mobile browsers{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel has an example mobile site at http://v1.dotkernel.net/mobile that uses jQuery Mobile. Wurfl is also used to detect mobile browsers (as discussed in a previous blog post) and automatically redirect them to the mobile site the first time they view the homepage. Sometimes, this behavior isn't desired (for example when you don't have a mobile site, or you don't plan on using Wurfl at all) Starting with revision 408, there's an option in application.ini to disable the automatic redirect (by default the redirect is disabled): -
    >resources.useragent.wurflapi.redirect = false
    +
    resources.useragent.wurflapi.redirect = false
    The following condition is also added to Controllers/frontend/IndexController.php (at line 19) to check the configuration: -
    >//if automatic redirect is enabled in application.ini and the browser is mobile and session->mobileHit is not set, register it and redirect
    +
    //if automatic redirect is enabled in application.ini and the browser is mobile and session->mobileHit is not set, register it and redirect
     if($config->resources->useragent->wurflapi->redirect && 'mobile' == Dot_Kernel::getDevice()->getType() && !isset($session->mobileHit))

    Frequently Asked Questions

    @@ -48,11 +28,4 @@ if($config->resources->useragent->wurflapi->redirect && 'mobile' == Dot_Kernel::
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/disambiguation-dotkernel-1-and-dotkernel-3.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/disambiguation-dotkernel-1-and-dotkernel-3.html.twig index 5e1fb9f..3d95765 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/disambiguation-dotkernel-1-and-dotkernel-3.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/disambiguation-dotkernel-1-and-dotkernel-3.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/disambiguation-dotkernel-1-and-dotkernel-3.jsonld.twig') }} {% endblock %} - -{% block title %}Disambiguation: Dotkernel 1 and Dotkernel 3{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    What is Dotkernel?

    The name Dotkernel symbiotically  combines the string  Dot, as a representation of the Internet, and Kernel, the quintessence of any IT application. @@ -101,11 +81,4 @@ Dotkernel 3 = Dotkernel 3
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/doctrine-cache-using-symfony-cache.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/doctrine-cache-using-symfony-cache.html.twig index 732ca08..eab1beb 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/doctrine-cache-using-symfony-cache.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/doctrine-cache-using-symfony-cache.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/doctrine-cache-using-symfony-cache.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Doctrine cache using symfony/cache{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    When it comes to web development, performance is one of the critical elements that influence the success of an application. Developers focus on improving response times and overall speed to enhance the user experience.

    @@ -126,11 +106,4 @@ Doctrine hydration cache is a feature that stores the results of data hydration,
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/doctrine-enum-implementation-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/doctrine-enum-implementation-in-dotkernel.html.twig index 968be0e..831aa48 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/doctrine-enum-implementation-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/doctrine-enum-implementation-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/doctrine-enum-implementation-in-dotkernel.jsonld.twig') }} {% endblock %} - -{% block title %}Doctrine enum implementation in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The update of doctrine/orm to version 3.2.0 saw the introduction of EnumType columns. The enum type was introduced in PHP 8.1. This new data type is now implemented in Dotkernel, on both the PHP side and the database side.

    Below we will discuss some technical aspects behind this update. You can review the full update in this Dotkernel API Pull Request.

    @@ -284,11 +264,4 @@ new setup: status ENUM(\'active\', \'pending\') DEFAULT \'pending\' NOT NULLPHP Enumerations -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotboost-technologies-products-and-services-north-american-relaunch.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotboost-technologies-products-and-services-north-american-relaunch.html.twig index 6e1a0c1..d18f8f2 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotboost-technologies-products-and-services-north-american-relaunch.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotboost-technologies-products-and-services-north-american-relaunch.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotboost-technologies-products-and-services-north-american-relaunch.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}DotBoost Technologies : Products and Services North American Relaunch{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} A new style and advanced approach to accompany the Dotkernel source release Dotboost is pleased to announce our North American Relaunch. This new phase comes as a result of dedicated research and analysis on how to best serve clients in Canada and the US. @@ -48,11 +28,4 @@ Founded in 2005, the Dotboost process can incorporate anywhere into your project
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-0-release.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-0-release.html.twig index 807d720..1229a53 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-0-release.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-0-release.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-1-2-0-release.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel 1.2.0 release{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Finally we reached Dotkernel 1.2.0 milestone. Since the previous released 1.1.2, some changes have been made. @@ -79,11 +59,4 @@ For more details, see 
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - -
    - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-2-release.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-2-release.html.twig index 569f530..5b65538 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-2-release.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-2-2-release.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-1-2-2-release.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel 1.2.2 release{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-0-release.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-0-release.html.twig index c00c234..6fa3361 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-0-release.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-0-release.html.twig @@ -1,27 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-1-3-0-release.jsonld.twig') }} {% endblock %} - -{% block title %}Dotkernel 1.3.0 release{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% extends '@layout/blog-post.html.twig' %} +{% block body %} Dotkernel 1.3.0 is released at last. It contains important changes and new features. - 64: [Feature] Skin switcher in admin - closed. @@ -88,11 +67,4 @@ For more details see ChangeLog 1.3.0.
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-2-release.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-2-release.html.twig index 287c98e..328bba6 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-2-release.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-3-2-release.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-1-3-2-release.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel 1.3.2 release{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Before the winter holiday we came with a new release: Dotkernel 1.3.2 It contains many bug fixes, some refactoring and a few minor features. @@ -68,11 +48,4 @@ Refactoring:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-5-0-released.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-5-0-released.html.twig index ac08ba7..717e041 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-5-0-released.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-5-0-released.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-1-5-0-released.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel 1.5.0 Released{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} After a longer wait than usual, Dotkernel 1.5.0 was just released. Due to the large amount of changes and the long time spent in development, we chose to skip 1.4 and go straight to 1.5.0. Here are a few of the many changes to Dotkernel in the latest release: @@ -79,11 +59,4 @@ There have been about 250 commits in our SVN repository since the latest release
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-0-lts-released.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-0-lts-released.html.twig index ff1eed1..1898767 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-0-lts-released.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-0-lts-released.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-1-8-0-lts-released.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel 1.8.0 LTS Released{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel 1.8.0 (LTS) was just released.

    What is LTS?

    @@ -107,11 +87,4 @@ There have been a lot of commits in our SVN repository since the latest release,
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-1-upgrade-from-1-8-0-released.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-1-upgrade-from-1-8-0-released.html.twig index ef9e13c..06d78df 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-1-upgrade-from-1-8-0-released.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-1-8-1-upgrade-from-1-8-0-released.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-1-8-1-upgrade-from-1-8-0-released.jsonld.twig') }} {% endblock %} - -{% block title %}Dotkernel 1.8.1 + Upgrade from 1.8.0 Released{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel 1.8.1 was just released. Changes to Dotkernel in the latest release: @@ -50,11 +30,4 @@ Here are some useful download links:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-coding-standard.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-coding-standard.html.twig index 471b7da..e8d957e 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-coding-standard.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-coding-standard.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-coding-standard.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel Coding Standard{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel will be a "skeleton"of Zend Framework. Dotkernel borrowed the coding standard from Zend Framework: ZF Coding Standard with some exceptions. @@ -46,11 +26,11 @@ All php files will have the extension ".php". No fancy extensions like .inc B.4.6. Control Statements every starting curly brace } after a statement starts on a new line, end it's closing curly brace } will be on a new line too. The start and end braces must be on the same column (for better indentation of the code) e.g: -
    >if ($a != 2)
    +
    if ($a != 2)
     {
        $a = 2;
     }
    -
    >if ($a != 2)
    +
    if ($a != 2)
     {
         $a = 2;
         if($a == 2)
    @@ -87,11 +67,4 @@ e.g:
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-database-naming-conventions-for-mysql.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-database-naming-conventions-for-mysql.html.twig index f151f64..e7270b0 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-database-naming-conventions-for-mysql.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-database-naming-conventions-for-mysql.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-database-naming-conventions-for-mysql.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel Database Naming Conventions for MySQL{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel borrows the database naming conventions from FaZend: Rules of naming of database tables and columns. FaZend is an open-source PHP framework based on Zend Framework. Database naming conventions for tables and columns: @@ -37,7 +17,7 @@ Dotkernel borrows the database naming conventions from -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel Light is a version of Dotkernel Frontend that includes only the bare-bones essentials. Though simpler, it's perfect for:

    • A presentation site,
    • @@ -166,11 +146,4 @@

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-light-the-best-choice-for-your-presentation-site.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-light-the-best-choice-for-your-presentation-site.html.twig index 27cb4f8..11d737b 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-light-the-best-choice-for-your-presentation-site.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-light-the-best-choice-for-your-presentation-site.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-light-the-best-choice-for-your-presentation-site.jsonld.twig') }} {% endblock %} - -{% block title %}Dotkernel Light: the best choice for your presentation site{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} - - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-on-nginx.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-on-nginx.html.twig index a8a8c2c..95b2ee9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-on-nginx.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-on-nginx.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-on-nginx.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel on Nginx{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Due to the fact that the current buzzword is Nginx instead of Apache, we decided to test if Dotkernel is running out of the box on it. And how to configure Nginx :-) @@ -33,16 +13,16 @@ Due to the fact that the current buzzword is Nginx instead of <
  • Now the fine part: editing the Nginx config ( in our case /etc/nginx/conf.d/default.conf)
    • Set server name: -
      >server_name  nginx.dotkernel.net;
      +
      server_name  nginx.dotkernel.net;
    • Set document root , in the location / area -
      >root   /var/www/html;
      +
      root   /var/www/html;
    • Equivalent of the main .htaccess file is -
      >try_files    $uri $uri/ /index.php;
      +
      try_files    $uri $uri/ /index.php;
      This directive will send all requests to index.php file
    • Set the location for php directive -
      >    location ~ \.php$ {
      +
          location ~ \.php$ {
                  root           /var/www/html;
                  fastcgi_pass   127.0.0.1:9000;
                  fastcgi_index  index.php;
      @@ -52,7 +32,7 @@ This directive will send all requests to index.php file
    • } In the lines above , you can change the value for APPLICATION_ENV into production or development
    • Protect configs folder from web access -
      >#protect folders
      +
      #protect folders
       location ~ ^/configs/ {
               deny all;
        }
      @@ -60,7 +40,7 @@ location ~ ^/configs/ {
  •   Export a Dotkernel copy from SVN -
    >svn export --force  http://v1.dotkernel.net/svn/trunk/ /var/www/html
    +
    svn export --force  http://v1.dotkernel.net/svn/trunk/ /var/www/html
  • Edit application.ini to reflect the current settings and check if is  protected http://nginx.dotkernel.net/configs/application.ini
  • @@ -96,11 +76,4 @@ location ~ ^/configs/ {
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-reserved-variable-names-for-caching.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-reserved-variable-names-for-caching.html.twig index d8abfae..2d0e4f1 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-reserved-variable-names-for-caching.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-reserved-variable-names-for-caching.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-reserved-variable-names-for-caching.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel Reserved Variable Names for Caching{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article is related to: Caching in Dotkernel with Zend Framework Cache The variables that Dotkernel cache are below: @@ -88,11 +68,4 @@ Browser & OS are cached as browser_xml and os_x
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-template-engine.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-template-engine.html.twig index fe745b5..d61b04b 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-template-engine.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-template-engine.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-template-engine.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel Template Engine{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel Template Engine is an implementation of PHPLib Template engine for PHP5.

    @@ -42,11 +22,4 @@ It has an amazing ability to separate the application code from the presentation
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-version-1-0-in-action.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-version-1-0-in-action.html.twig index 5fc62e0..4ec5635 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-version-1-0-in-action.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/dotkernel-version-1-0-in-action.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/dotkernel-version-1-0-in-action.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel version 1.0 in action{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}
    Dotkernel is the DotBoost's in-house developed framework, based on Zend Framework. @@ -73,11 +53,4 @@ It has eliminated the complexity of Zend Framework by using a different approach
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - -
    - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/forcing-utf8-connections-and-character-set-in-mysql.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/forcing-utf8-connections-and-character-set-in-mysql.html.twig index 32811bf..1fd2823 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/forcing-utf8-connections-and-character-set-in-mysql.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/forcing-utf8-connections-and-character-set-in-mysql.html.twig @@ -1,37 +1,17 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/forcing-utf8-connections-and-character-set-in-mysql.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Forcing UTF8 connections and character set in MySQL{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In some situations, it may be neccesar to force MySQL server collation and character set to UTF8. As you can't control all scripts that are connecting to your database( for instance: mysql command line, or mysqldump) For that , open the my.cnf file and add the below lines: -
    >character_set_server=utf8
    +
    character_set_server=utf8
     skip-character-set-client-handshake
    If you are interested in better performance, add the below line: -
    >collation_server=utf8_general_ci
    +
    collation_server=utf8_general_ci
    If you are interested in better sorting order, add the below line instead: -
    >collation_server=utf8_unicode_ci
    +
    collation_server=utf8_unicode_ci

    Frequently Asked Questions

    @@ -55,11 +35,4 @@ If you are interested in better sorting order, add the below line instead:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/geoip-city-removed-from-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/geoip-city-removed-from-dotkernel.html.twig index 29993a7..ab2c5e6 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/geoip-city-removed-from-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/geoip-city-removed-from-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/geoip-city-removed-from-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}GeoIP City Removed From Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In the newest version we have removed the GeoIP City integration. The City database on GeoIP 1.1.0 extension was causing a segmentation fault, which resulted in crashing or outputting an error instead of executing the PHP Code. @@ -30,7 +10,7 @@ This error occurs due to the extension incompatibility with the database(dat) fi On some operating systems Apache will respond your request with HTTP Status Code 200 (OK) and a web page containing the text below. Error result: -
    >The server encountered an internal error or
    +
    The server encountered an internal error or
      misconfiguration and was unable to complete
      your request.
    The error might not be logged as the error is generated the GeoIP extension and not by your PHP code. @@ -39,7 +19,7 @@ If you don't want to use GeoIP City and just want to get rid of the error go to
    • Dotkernel/admin/System.php (Admin/System model) and comment or remove the lines below
    -
    >if(geoip_db_avail(GEOIP_CITY_EDITION_REV0))
    +
    if(geoip_db_avail(GEOIP_CITY_EDITION_REV0))
     {
         $info = explode(" ",geoip_database_info(GEOIP_CITY_EDITION_REV0));
         $return = $info.' '.Dot_Kernel::TimeFormat($info);
    @@ -47,7 +27,7 @@ If you don't want to use GeoIP City and just want to get rid of the error go to
     
    • library/Dot/GeoIp.php (Dot_GeoIp class) and comment or remove the lines below
    -
    >if(function_exists('geoip_db_avail') && geoip_db_avail(GEOIP_CITY_EDITION_REV0)
    +
    if(function_exists('geoip_db_avail') && geoip_db_avail(GEOIP_CITY_EDITION_REV0)
     && 'unknown' == $country)
     {
         //if GeoIPCity.dat file exists
    @@ -100,11 +80,4 @@ Note that GeoIP is an obsolete extension, Maxmind recommends using GeoIP2.
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/geoip-ip-address-location-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/geoip-ip-address-location-in-dotkernel.html.twig index d5f3e13..1b451f9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/geoip-ip-address-location-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/geoip-ip-address-location-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/geoip-ip-address-location-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}GeoIP: Ip Address Location In Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} GeoIP is the proprietary technology that drives MaxMind's IP geolocation data and services. It is a non-invasive way to determine geographical and other information about Internet visitors in real-time. When a person visits your website, GeoIP can determine which country, region, city, postal code, area code the visitor is coming from. Dotkernel uses GeoIP to get user statistics by country. The main file for GeoIP is library/Dot/Geoip.php @@ -144,11 +124,4 @@ public function getCountryByIp($ip)
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/handling-and-logging-errors-with-dot-errorhandler-and-dot-log.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/handling-and-logging-errors-with-dot-errorhandler-and-dot-log.html.twig index d5b8cdd..a394ab2 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/handling-and-logging-errors-with-dot-errorhandler-and-dot-log.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/handling-and-logging-errors-with-dot-errorhandler-and-dot-log.html.twig @@ -1,31 +1,11 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/handling-and-logging-errors-with-dot-errorhandler-and-dot-log.jsonld.twig') }} {% endblock %} - -{% block title %}Handling and Logging errors with dot-errorhandler and dot-log{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} -This article is a follow-up for: Logging with dot-log in Zend Expressive and Dotkernel, the mentioned article is a guide to using dot-log. +{% block body %} +This article is a follow-up for: Logging with dot-log in Zend Expressive and Dotkernel, the mentioned article is a guide to using dot-log.   -This article explains the usage of dotkernel/dot-errorhandler with dotkernel/dot-log or zendframework/zend-log to log errors in Zend Expressive applications. +This article explains the usage of dotkernel/dot-errorhandler with dotkernel/dot-log or zendframework/zend-log to log errors in Zend Expressive applications. This can be considered as a guide on how the dot-errorhandler was made and how it's meant to be used. @@ -35,14 +15,14 @@ This can be considered as a guide on how the dot-errorhandler w As a first note Dot Error Handler provides two kinds of error handlers:
      -
    • the plain ErrorHandler  - this class is a copy of Zend Expressive's error handler Zend\Stratigility\Middleware\ErrorHandler (as it is final)
    • -
    • the logging LogErrorHandler - this class is like the above one, but with added Logging support (via container)
    • +
    • the plain ErrorHandler - this class is a copy of Zend Expressive's error handler Zend\Stratigility\Middleware\ErrorHandler (as it is final)
    • +
    • the logging LogErrorHandler - this class is like the above one, but with added Logging support (via container)
    Both error handlers have factories for an easier usage with the Container.   -To use dot-error handler in your project run the following command: composer require dotkernel/dot-errorhandler. +To use dot-error handler in your project run the following command: composer require dotkernel/dot-errorhandler.  

    The Config Provider

    @@ -57,24 +37,24 @@ As a fallback case the plain error handler is selected by default and can be ove  

    Configuration

    -IMPORTANT NOTES:  +IMPORTANT NOTES:
      -
    • Assuming the project in hand has a configured logger as per this article and the logger name is default_logger (as provided in the package's config example).
    • -
    • Although the key is dot_log, when selecting a logger the dot log abstract factory responds to the dot-log selector +
    • Assuming the project in hand has a configured logger as per this article and the logger name is default_logger (as provided in the package's config example).
    • +
    • Although the key is dot_log, when selecting a logger the dot log abstract factory responds to the dot-log selector
        -
      • to select the container key asked for is dot-log.default_logger
      • +
      • to select the container key asked for is dot-log.default_logger
    • The dot-errorhandler was meant as a silent logger for staging and production environments doesn't block whoops
        -
      • to test it the development mode should be disabled, otherwise whoops will catch the errors and show them to the developer
      • -
      • you can use any custom implemented error handler as long as it implements the provided ErrorHandlerInterface
      • +
      • to test it the development mode should be disabled, otherwise whoops will catch the errors and show them to the developer
      • +
      • you can use any custom implemented error handler as long as it implements the provided ErrorHandlerInterface
    The steps to configuring are the following:
      -
    • add the Dot\ErrorHandler\ConfigProvider in the project's config/config.php file
    • +
    • add the Dot\ErrorHandler\ConfigProvider in the project's config/config.php file
    • write the error handler config
      @@ -147,11 +127,4 @@ The tests we have made were the following:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/highcharts-integration-in-dotkernel-1-6-0.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/highcharts-integration-in-dotkernel-1-6-0.html.twig index 59a8d8a..e95a470 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/highcharts-integration-in-dotkernel-1-6-0.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/highcharts-integration-in-dotkernel-1-6-0.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/highcharts-integration-in-dotkernel-1-6-0.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Highcharts Integration in Dotkernel 1.6.0{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Integrating a new charting library in the latest version of Dotkernel (1.6.0) we offer a new experience with this new intuitive and interactive charts. @@ -30,7 +10,7 @@ Also in admin we made some samples using highcharts. These samples includes an p You can find highcharts library in the externals directory. Take a quick view on the code to see how highcharts are working. -
    >chart = new Highcharts.Chart({
    +
    chart = new Highcharts.Chart({
             chart: {
                 renderTo: elementId,
                 type: 'line',
    @@ -94,11 +74,4 @@ Take a quick view on the code to see how highcharts are working.
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/how-to-group-log-files-by-date-using-dot-log.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/how-to-group-log-files-by-date-using-dot-log.html.twig index 124fc02..0fb1834 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/how-to-group-log-files-by-date-using-dot-log.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/how-to-group-log-files-by-date-using-dot-log.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/how-to-group-log-files-by-date-using-dot-log.jsonld.twig') }} {% endblock %} - -{% block title %}How to group log files by date using dot-log{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    As described in this article, dot-log is a powerful tool for logging messages in your application. It's power stays in the fact that it can be implemented in a few easy steps and that it's highly customizable.

    @@ -210,11 +190,4 @@ return [
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/how-to-set-a-persistent-connection-to-database-with-zend-framework-zend-db-adapter.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/how-to-set-a-persistent-connection-to-database-with-zend-framework-zend-db-adapter.html.twig index ed1c8d5..86c66b3 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/how-to-set-a-persistent-connection-to-database-with-zend-framework-zend-db-adapter.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/how-to-set-a-persistent-connection-to-database-with-zend-framework-zend-db-adapter.html.twig @@ -1,36 +1,16 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/how-to-set-a-persistent-connection-to-database-with-zend-framework-zend-db-adapter.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}How to Set a Persistent Connection to Database with Zend Framework Zend_Db adapter{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} From time to time, it may be a good idea to have a persistent connection to database. The place where it should be added that new configuration option is application.ini ( Dotkernel approach as an example) Do not try something like below, will not work: -
    >database.params.options.PDO::ATTR_PERSISTENT = TRUE
    +
    database.params.options.PDO::ATTR_PERSISTENT = TRUE
      Instead , use the below line -
    >database.params.persistent = TRUE
    +
    database.params.persistent = TRUE

    Frequently Asked Questions

    @@ -54,11 +34,4 @@ Instead , use the below line
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/how-to-use-alerts-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/how-to-use-alerts-in-dotkernel.html.twig index 9c6a038..9c6f719 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/how-to-use-alerts-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/how-to-use-alerts-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/how-to-use-alerts-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}How to use Alerts in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Alerts (or Dot_Alert's) are e-mails usually sent to the site developers, these messages are sent with mail() therefore you shouldn't use them to send regular mail. Alerts should only notify you as a developer: "Hey, something's wrong here, you might want to know this!" In this article you will find out how to use the Alerts system in Dotkernel, we will also go through an existing example so this can be understood easier. @@ -32,7 +12,7 @@ The Dot_Alert class resembles with Dot_Email, the alerts, like a mail message, h In Dotkernel we use the Alerts for notifying the developer that an email was not sent successfully. In this case we kept the message in the dots.xml file -
    >
    +
     
         
             
    @@ -55,16 +35,16 @@ Date: {DATE_NOW}
     If you're not familiar  with the dots.xml, you should see this article.
     
     First the message will be fetched from the xml file, we already have it in $this->option
    -
    >
    +
     $subject = $this->option->alertMessages->email->subject;
     $message = $this->option->alertMessages->email->message;
    Second, we get the destination recipient (in this case the developers e-mail addresses) -
    >
    +
     $devEmails = explode(',', $this->settings->devEmails);
     
     
    As you can see the Alert messages contains {VARIABLES} called details in the Alert system. Now we will prepare the details: -
    >$details = array(
    +
    $details = array(
         'e_class' => get_class($e),
         'site_name' => $this->seoOption->siteName,
         'site_url' => $registry->configuration->website->params->url,
    @@ -75,18 +55,18 @@ As you can see the Alert messages contains {VARIABLES} called d
     );
    Note that $e is a caught exception, this exception is thrown when the e-mail send process fails. Now that we have it all, let's create an alert: -
    >$alert = new Dot_Alert();
    +
    $alert = new Dot_Alert();
    This is just an empty alert, we will now set the sender, the subject and the message, the sender is set on sending -
    >$alert->addHeader( "From: " . $this->settings->siteEmail);
    +
    $alert->addHeader( "From: " . $this->settings->siteEmail);
     $alert->addHeader( "Reply-To:" . $this->settings->siteEmail );
     $alert->addHeader( "X-Mailer: PHP/" . phpversion() ) ;
    -
    >$alert->setTo($devEmails);
    +
    $alert->setTo($devEmails);
     $alert->setSubject($subject);
     $alert->setContent($message);
    Our message doesn't look that good, the setDetails method will replace our {VARIABLES} within subject and message with actual data -
    >$alert->setDetails($details);
    +
    $alert->setDetails($details);
    Everything is great, we can now send our alert: -
    >$alert->send();
    +
    $alert->send();

    Frequently Asked Questions

    @@ -122,11 +102,4 @@ Everything is great, we can now send our alert:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/implementing-the-new-password-hashing-api-from-php-5-5-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/implementing-the-new-password-hashing-api-from-php-5-5-in-dotkernel.html.twig index 24ace8d..9b61c3c 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/implementing-the-new-password-hashing-api-from-php-5-5-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/implementing-the-new-password-hashing-api-from-php-5-5-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/implementing-the-new-password-hashing-api-from-php-5-5-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Implementing the new Password Hashing API from PHP 5.5 in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In order to use the new Password Hashing functions , introduced in PHP 5.5 , and unify all password related functions , used for both admin and users, we did a major refactor of Dotkernel codebase, in version 1.8.0 , starting from revision 799. See more on that matter here @@ -39,8 +19,8 @@ The minimum PHP version in order to run Dotkernel was raised to PHP 5.3.8 .
  • change table structure in order to handle future algo
  • -
    >ALTER TABLE `admin` CHANGE `password` `password` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
    -
    >ALTER TABLE `user` CHANGE `password` `password` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
    +
    ALTER TABLE `admin` CHANGE `password` `password` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
    +
    ALTER TABLE `user` CHANGE `password` `password` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;
    • Remove from application.ini the variable settings.admin.salt = 5F6WQ9U3YT
    • apply the patch . Download
    • @@ -89,11 +69,4 @@ The minimum PHP version in order to run Dotkernel was raised to PHP 5.3.8 .
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-5-6-on-windows.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-5-6-on-windows.html.twig index aff4af7..87eee31 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-5-6-on-windows.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-5-6-on-windows.html.twig @@ -1,28 +1,8 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/installing-geoip-extension-in-zend-server-5-6-on-windows.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Installing GeoIP extension in Zend Server 5.6 on Windows{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} To test if you have php_geoip extension on your Zend Server, create an php file and copy the following code. This will output true if extension is available or false if not. -
    >
     If your output is false than you have to download an php_geoip.dll file correctly compiled for your zend server version.
     
    @@ -108,11 +88,4 @@ And now you can use geoip functions on your Zend Server 5.6
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-6-on-windows.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-6-on-windows.html.twig index d6fcf4f..4725a0e 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-6-on-windows.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/installing-geoip-extension-in-zend-server-6-on-windows.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/installing-geoip-extension-in-zend-server-6-on-windows.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Installing GeoIP extension in Zend Server 6 on Windows{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    - - {{ include('@partial/post-nav.html.twig') }} - - -
    - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/logging-with-dot-log-in-zend-expressive-and-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/logging-with-dot-log-in-zend-expressive-and-dotkernel.html.twig index c471307..f3118c9 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/logging-with-dot-log-in-zend-expressive-and-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/logging-with-dot-log-in-zend-expressive-and-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/logging-with-dot-log-in-zend-expressive-and-dotkernel.jsonld.twig') }} {% endblock %} - -{% block title %}Logging with dot-log in Zend Expressive and Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article will explain the usage of the dot-log component within Dotkernel, Zend Expressive or in a project that uses Zend Service Manager. Since dot-log extends zendframework/zend-log this tutorial mostly compatible with zend-log as well. @@ -293,11 +273,4 @@ $logger->log(Logger::NOTICE, 'NOTICE from log()'); This article will be continued in a different article that treats the error handling in middleware applications.   -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/manual-upgrade-of-wurfl-xml-file-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/manual-upgrade-of-wurfl-xml-file-in-dotkernel.html.twig index bcdbc69..1f1008c 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/manual-upgrade-of-wurfl-xml-file-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/manual-upgrade-of-wurfl-xml-file-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/manual-upgrade-of-wurfl-xml-file-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Manual upgrade of WURFL xml file in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel Application Framework can be downloaded with WURFL XML file bundled in it, but is quite an old file,  the latest GPL version, from June 2011. Because of license changed of that WURFL file,  this bundled file will not be upgraded anymore by us. You need to manually upgrade the xml file, if you still want to use it , and of course, please pay attention to license changes. @@ -65,11 +45,4 @@ Again, please pay attention to WURFL license changes.
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/migration-of-zend-framework-1-pear-channel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/migration-of-zend-framework-1-pear-channel.html.twig index 59f26aa..bea5ab4 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/migration-of-zend-framework-1-pear-channel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/migration-of-zend-framework-1-pear-channel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/migration-of-zend-framework-1-pear-channel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Migration of Zend Framework 1 PEAR channel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} The unofficial PEAR channel for Zend Framework 1 was hosted on Google Code at this location: ZF Pear, but since the closing of Google Code we were forced to move it. Zend Framework 1 is still used by a lot of  projects in Production, it's still a viable library collection  and it's also  running on  PHP7 ; even if is only in maintenance/security-patch mode, so it's not an option to cancel it completely. @@ -32,13 +12,13 @@ Instructions on how to use the new channel can be found below . Use the PEAR installer: 1. Remove the installed pear package -
    >pear uninstall zend/zend
    +
    pear uninstall zend/zend
    2. Remove the old googlecode channel -
    >pear channel-delete zend.googlecode.com/svn
    +
    pear channel-delete zend.googlecode.com/svn
    3. Discover the new channel -
    >pear channel-discover pear.dotkernel.com/zf1/svn
    +
    pear channel-discover pear.dotkernel.com/zf1/svn
    4. Install the package -
    >pear install zend/zend
    +
    pear install zend/zend
    Follow @dotkernel  in order to be up to date related to new releases.   @@ -71,11 +51,4 @@ Follow -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} According to Matthew Weier O'Phinney announcement, Zend Framework team is pleased to announce the immediate availability of the first release candidate of the Zend Framework 1.12 series, 1.12.0RC1

     New Features

    @@ -101,11 +81,4 @@ For a complete list go here: -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Because Zend donated the Zend Studio's Formatter upstream to the PDT project, the Formatter plugin for Zend Studio 10.1 need to be changed: replace  "com.zend.php" to "org.eclipse.php". See  the updated file  Dotkernel PHP Formatter for Zend Studio 10.1 @@ -51,11 +31,4 @@ About Templates in Zend Studio and how to import/export: -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In /var/www/vhosts/exampledomain.com/conf/vhost.conf file add this code: -
    >
    +
     < Location /admin>
        AuthType Basic
        AuthName "My Site Admin"
    @@ -32,7 +12,7 @@ In /var/www/vhosts/exampledomain.com/conf/vhost.conf file add t
      
     
     Notice the server that vhost.conf has been added/changed with command:
    -
    >/usr/local/psa/admin/sbin/websrvmng -a
    +
    /usr/local/psa/admin/sbin/websrvmng -a
      Then create the .htpasswd file and upload it to /var/www/vhosts/exampledomain.com/conf/ @@ -56,11 +36,4 @@ Then create the .htpasswd file and upload it to /var/www/vhosts/exampled
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/replacing-laminas-mail-with-symfony-mailer-in-dot-mail.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/replacing-laminas-mail-with-symfony-mailer-in-dot-mail.html.twig index 764f1cb..9060c7d 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/replacing-laminas-mail-with-symfony-mailer-in-dot-mail.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/replacing-laminas-mail-with-symfony-mailer-in-dot-mail.html.twig @@ -1,28 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/replacing-laminas-mail-with-symfony-mailer-in-dot-mail.jsonld.twig') }} {% endblock %} - -{% block title %}Replacing laminas-mail with Symfony mailer in dot-mail{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/scientia-mobile-licensed-its-wurfl-cloud-php-library-to-dotkernel-1-6.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/scientia-mobile-licensed-its-wurfl-cloud-php-library-to-dotkernel-1-6.html.twig index 75f71eb..c03414b 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/scientia-mobile-licensed-its-wurfl-cloud-php-library-to-dotkernel-1-6.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/scientia-mobile-licensed-its-wurfl-cloud-php-library-to-dotkernel-1-6.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/scientia-mobile-licensed-its-wurfl-cloud-php-library-to-dotkernel-1-6.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Scientia Mobile licensed its Wurfl Cloud PHP library to Dotkernel 1.6{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In the Dotkernel version 1.6.0 , released on May 16th, 2012 we have removed the GPL'ed WURFL PHP library , as the code it was obsolete anyway and also the structure of the XML file was changed. Instead , we implemented the Scientia Mobile's WURFL Cloud PHP  library . @@ -69,11 +49,4 @@ and regardless of whether the code is not obfuscated.
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/sending-emails-using-dot-email-component-and-zend-email.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/sending-emails-using-dot-email-component-and-zend-email.html.twig index 49c00ec..bd9f5c4 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/sending-emails-using-dot-email-component-and-zend-email.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/sending-emails-using-dot-email-component-and-zend-email.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/sending-emails-using-dot-email-component-and-zend-email.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Sending emails using Dot_Email component and Zend_Email{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dot_Email class extends Zend_Mail, so all the methods from Zend_Mail are available  in Dot_Email. Dot_Email is a simple class composed only from 2 methods, except constructor, all  other methods beeing inherited  from Zend_Mail. @@ -32,7 +12,7 @@ Note the declaration of this method: setContent ($content, $format = 'text/plain 2.  send(), set the transporter and is calling parent::send() method for sending the email For sending the email you MUST use this methods in the code above: -
    >$dotEmail = new Dot_Email();
    +
    $dotEmail = new Dot_Email();
     $dotEmail->addTo($email);
     $dotEmail->setSubject('Forgot Password');
     $dotEmail->setBodyText('Your password is '.$password);
    @@ -46,7 +26,7 @@ else
         echo "Message failed, not sent!";
     }
    Only if you want to overwrite the default Email and Name, add the below lines: -
    >$dotEmail->setFrom($fromEmail, $fromName);
    +
    $dotEmail->setFrom($fromEmail, $fromName);
     $dotEmail->setReplyTo($fromEmail, $fromName);
    NOTE*: you always have to use  addTo()setSubject(), setBodyText() or setBodyHtml() or setContent(), and finally send() method. @@ -98,11 +78,4 @@ Methods inherited  from Zend_Mail and that can be used in your code are:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/templating-in-dotkernel3.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/templating-in-dotkernel3.html.twig index 6b8a16e..3f7ec53 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/templating-in-dotkernel3.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/templating-in-dotkernel3.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/templating-in-dotkernel3.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Templating in Dotkernel3{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel3 aims to improve the Dotkernel stack in every way possible, and one of the painpoints in the previous version of Dotkernel was the templating engine. Albeit a solid and robust templating engine, it was also 10 years old, and used techniques that's slightly outdated by now. @@ -65,11 +45,4 @@ You can read the official documentation here: -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article will cover the external dependency usage VIA composer within Dotkernel applications. There is also an article explaining how composer can be added to Dotkernel learn more. @@ -30,16 +10,16 @@ Composer automatically loads our dependencies so there is no need to include/req For this example we will render a Barcode using Zend Framework 1 as the Non-Namespaced dependency and Zend Framework 2 as the Namespaced dependency.

    The Composer Dependencies

    ZendFramework 1 Barcode module can only be loaded with the ZF1 itself: -
    >composer require 'zendframework/zendframework1'
    +
    composer require 'zendframework/zendframework1'
    The ZendFramework 2 Barcode module can be separately loaded: -
    >composer require 'zendframework/zend-barcode'
    +
    composer require 'zendframework/zend-barcode'
     

    Important note

    These dependencies can be used anywhere after the Dot_Kernel::initialize() function was called
     

    Using Non-Namespaced Dependencies (Zend Framework 1)

    The class is loaded PSR-0 style, meaning the class name looks like VendorName_PackageName_ClassName -
    >// Only the text to draw is required
    +
    // Only the text to draw is required
     $barcodeOptions = array('text' =>; 'ZEND-FRAMEWORK');
      
     // No required options
    @@ -53,7 +33,7 @@ Zend_Barcode::factory(
      
     

    Using Namespaced Dependencies (Zend Framework 2)

    The class is loaded PSR-4 style, meaning the class name looks like \VendorName\PackageName\ClassName -
    >use Zend\Barcode\Barcode;
    +
    use Zend\Barcode\Barcode;
     
     // Only the text to draw is required
     $barcodeOptions = array('text' => 'ZEND-FRAMEWORK');
    @@ -72,7 +52,7 @@ Both the examples will render the following barcode if nothing goes wrong:
     Resulting barcode. Source: http://framework.zend.com/images/manual/zend.barcode.introduction.example-1.png  Resulting barcode.
    Source: bit.ly/1XbZZ81

    Tip

    In this case the first example will work for both namespaced an non-namespaced dependencies if we add the the following as the first line at the first example: -
    >use Zend\Barcode\Barcode as Zend_Barcode;
    +
    use Zend\Barcode\Barcode as Zend_Barcode;
    Now we can use any of the following to access ZF2's Barcode Module:
    • Zend\Barcode\Barcode
    • @@ -131,11 +111,4 @@ This article works for any Dotkernel 1.x version if your server
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/using-utf8-charset-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/using-utf8-charset-in-dotkernel.html.twig index 2c7ac7f..7c75e90 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/using-utf8-charset-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/using-utf8-charset-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/using-utf8-charset-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Using UTF8 charset in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In order to use UTF8 encoding in your Dotkernel based system, is needed to make some changes in both database structure and in the application.ini file.
    Those changes are commited into Dotkernel 1.6.0 dev codebase, which will be released in next days.
    @@ -28,7 +8,7 @@ In order to use UTF8 encoding in your Dotkernel based system, is needed to make set for all tables and columns proper collation , either utf8_general_ci or utf8_bin

    Application.ini

    add the line -
    >database.params.charset = utf8
    +
    database.params.charset = utf8
    to your application.ini file, in the [production] area.

    Differences between utf8_general_ci and utf8_bin

    utf8_bin: compare strings by the binary value of each character in the string @@ -70,11 +50,4 @@ Those differences happens only on MySQL level ( for instance in
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/wurfl-cloud-integration-in-dotkernel-1-6-0.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/wurfl-cloud-integration-in-dotkernel-1-6-0.html.twig index d631db7..fc22bbf 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/wurfl-cloud-integration-in-dotkernel-1-6-0.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/wurfl-cloud-integration-in-dotkernel-1-6-0.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/wurfl-cloud-integration-in-dotkernel-1-6-0.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Wurfl Cloud Integration in Dotkernel 1.6.0{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Another new feature in version 1.6.0 of Dotkernel is the integration of Wurfl Cloud. Wurfl or Wireless Universal Resource FiLe is coming with a new way to deliver their services of device detection and they named it Wurfl Cloud. @@ -37,7 +17,7 @@ Quick steps to have a functional device detection in Dotkernel.
  • choose device_os and mobile_browser as your capabilities
  • copy your API Key in application.ini in Dotkernel
  • -
    >resources.useragent.wurflcloud.api_key = 000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    +
    resources.useragent.wurflcloud.api_key = 000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Now you can test it by changing the user agent in your browser to a mobile device and access your project. Now you can see that you are redirected to the mobile module. To see how mobile detection is working in Dotkernel read this post. @@ -70,11 +50,4 @@ To see how mobile detection is working in Dotkernel read this -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} We integrated long time ago the WURFL PHP API into Dotkernel code base. At that time, the license of that WURFL library was GNU/GPL, which make it perfect compatible with Zend Framework license( new BSD) and Dotkernel ( OSL 3.0). Everybody was happy, users was able to make web applications for them or for their customers without worry about licensing costs at all. On June 6th, 2011, the WURFL PHP API library was updated to version 1.3.0. So we updated too the latest Dotkernel 1.5.0 ( now in release candidate stage, soon to be released as stable) , without noticing the change on its license, from GNU/GPL to AGPL which suddenly transform it into a 'trial only' library, for "Product evaluation" only. @@ -62,11 +42,4 @@ But we must keep -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} WURFL is integrated into Dotkernel, using the Zend_Http_UserAgent class from the latest release ZF 1.11.0rc1 ( Beta release at the date of this post). The integration of WURFL into Dotkernel is described below. @@ -44,7 +24,7 @@ Download resources.useragent.wurflapi.wurfl_api_version = "1.1" resources.useragent.wurflapi.wurfl_lib_dir = APPLICATION_PATH "/library/Wurfl/" resources.useragent.wurflapi.wurfl_config_file = APPLICATION_PATH "/configs/wurfl.xml"
      @@ -57,7 +37,7 @@ resources.useragent.wurflapi.wurfl_config_file = APPLICATION_PATH "/configs/wurf
    • Copy the contents of the folder wurfl-php-1.1\WURFL to library\Wurfl
    WURFL is integrated into Dotkernel in the mobile module, but to access WURFL configuration, use -
    >$userAgent = new Zend_Http_UserAgent($config->resources->useragent);
    +
    $userAgent = new Zend_Http_UserAgent($config->resources->useragent);
     $device = $userAgent->getDevice();
    $userAgent->getDevice() returns all the relevant information about the current user agent ($_SERVER['HTTP_USER_AGENT']) @@ -95,11 +75,4 @@ $device = $userAgent->getDevice();
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/zend-auth-and-zend-acl-integrated-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/zend-auth-and-zend-acl-integrated-in-dotkernel.html.twig index 3c3f87d..925ce13 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/zend-auth-and-zend-acl-integrated-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/zend-auth-and-zend-acl-integrated-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/zend-auth-and-zend-acl-integrated-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend_Auth and Zend_Acl integrated in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Zend_Auth and Zend_Acl have been integrated into the Dotkernel, starting with version 1.5.0 With the integration of these two major components for user authorization and access we completely refactored the User and Admin models by using Dot_Auth and Dot_Acl classes. @@ -28,7 +8,7 @@ With the integration of these two major components for user authorization and ac The Dot_Auth class authenticates the user by checking the database – Zend_Auth_Adapter_DbTable. -
    >private function _getAuthAdapter($who)
    +
    private function _getAuthAdapter($who)
         {
             $dbAdapter = Zend_Registry::get('database');
             $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
    @@ -48,9 +28,9 @@ The Dot_Acl class
         
  • uses Zend_Acl,  for checking if a role (user) has access to a resource (controller)
  • Dot_Auth calls the isAllowed method from Dot_Acl which authenticates the user. -
    >// instantiate Zend_Acl
    +
    // instantiate Zend_Acl
     $this->acl = new Zend_Acl();
    -
    >public function isAllowed($role)
    +
    public function isAllowed($role)
         {
             $resource = $this->requestControllerProcessed;
             $privillege = $this->requestAction;
    @@ -64,7 +44,7 @@ $this->acl = new Zend_Acl();
    } }
    IndexController.php is calling Dot_Auth -
    >$dotAuth = Dot_Auth::getInstance();
    +
    $dotAuth = Dot_Auth::getInstance();
     $dotAuth->checkIdentity('user');

    Frequently Asked Questions

    @@ -101,11 +81,4 @@ $dotAuth->checkIdentity('user');
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/zend-console-implementation-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/zend-console-implementation-in-dotkernel.html.twig index a9d5452..57f8ee6 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/zend-console-implementation-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/zend-console-implementation-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/zend-console-implementation-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend_Console implementation in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Starting with 1.5, Dotkernel has a Console bootstrap to easily run PHP scripts from the command line. The most common use for this is to be able to run cron jobs without using wget and going through Apache. @@ -36,8 +16,8 @@ Any other arguments set when calling the script will be available in the control The controller bundled with Dotkernel has two example actions, "count-users" which demonstrates how to interact with models, and "send-newsletter" which reads the newsletter from the command line.

    Examples

    -
    >/var/www/vhosts/example.com/httpdocs/Cron/index.php -e staging -a count-users
    -
    >/var/www/vhosts/example.com/httpdocs/Cron/index.php -e staging -a send-newsletter "test newsletter"
    +
    /var/www/vhosts/example.com/httpdocs/Cron/index.php -e staging -a count-users
    +
    /var/www/vhosts/example.com/httpdocs/Cron/index.php -e staging -a send-newsletter "test newsletter"

    Frequently Asked Questions

    @@ -73,11 +53,4 @@ The controller bundled with Dotkernel has two example actions, "count-users" whi
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/zend-framework-dropped-integration-of-wurfl-adapter.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/zend-framework-dropped-integration-of-wurfl-adapter.html.twig index 062e59e..62dc33e 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/zend-framework-dropped-integration-of-wurfl-adapter.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/zend-framework-dropped-integration-of-wurfl-adapter.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/zend-framework-dropped-integration-of-wurfl-adapter.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend Framework dropped integration of WURFL adapter{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} According to Matthew Weier O'Phinney, Zend Framework Project Leader, in the next release of ZF, 1.12.0 branch, WURFL adapter will be dropped
    due to a change in licensing by the WURFL project -- the free version is now AGPL -- we're dropping the WURFL adapter from @@ -53,11 +33,4 @@ Dotkernel framework is using its own WURFL adapter, so this will not affect proj
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/zend-registry-usage-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/zend-registry-usage-in-dotkernel.html.twig index 17eb136..2681bdc 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/zend-registry-usage-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/zend-registry-usage-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/zend-registry-usage-in-dotkernel.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend Registry usage in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In Dotkernel, Zend_Registry will contain the following variables:
    • startTime - the result of microtime() at the beginning of the request
    • @@ -36,13 +16,13 @@ In Dotkernel, Zend_Registry will contain the following variables:
    • session - the session object
    To use the variables in the registry, you must first get an instance of the registry object: -
    >$registry = Zend_Registry::getInstance();
    +
    $registry = Zend_Registry::getInstance();
     //...
     echo $registry->startTime;
     //...
     echo $registry->requestAction;
    Or if you only need one variable from the registry, you can get it directly using: -
    >$action = Zend_Registry::get('requestAction');
    +
    $action = Zend_Registry::get('requestAction');
    You can find more information about Zend_Registry, in the Zend Framework Documentation.

    Frequently Asked Questions

    @@ -73,11 +53,4 @@ You can find more information about Zend_Registry, in the -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel/zend-studio-php-formatter-file-for-dotkernel-coding-standard.html.twig b/src/Blog/templates/page/blog-resource/dotkernel/zend-studio-php-formatter-file-for-dotkernel-coding-standard.html.twig index f228306..ce8ffc1 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel/zend-studio-php-formatter-file-for-dotkernel-coding-standard.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel/zend-studio-php-formatter-file-for-dotkernel-coding-standard.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel/zend-studio-php-formatter-file-for-dotkernel-coding-standard.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend Studio PHP Formatter file for Dotkernel coding standard.{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Here is  uploaded the XML file , ready to be imported in your Zend Studio, version 9.x This file follow Dotkernel’s Coding standard. @@ -45,11 +25,4 @@ Import the xml file.
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/development-report-december-11-2017.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/development-report-december-11-2017.html.twig index a8df10d..2495ca2 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/development-report-december-11-2017.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/development-report-december-11-2017.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/development-report-december-11-2017.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Development Report December 11, 2017{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This report contains updates about the Dotkernel3 documentation. We have added the release notes for Dotkernel3 frontend and admin: you can now check the Release Notes page. @@ -59,11 +39,4 @@ The  -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-admin-version-3-launched.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-admin-version-3-launched.html.twig index 7397036..8ad53f2 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-admin-version-3-launched.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-admin-version-3-launched.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/dotkernel-admin-version-3-launched.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel Admin version 3 launched{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel Admin PHP Application version 3 was launched.

    @@ -81,11 +61,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-api-architecture-and-components.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-api-architecture-and-components.html.twig index 048075a..a829e87 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-api-architecture-and-components.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-api-architecture-and-components.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/dotkernel-api-architecture-and-components.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel API: architecture and components{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}
    This article refers to Dotkernel API v5. Checkout out the new additions for Dotkernel API v6 to stay up-to-date.

    Based on Enrico Zimuel's Zend Expressive API - Skeleton example, Dotkernel API runs on Mezzio microframework   andLaminas components and implements standards like PSR-3, PSR-4, PSR-7, PSR-11 and PSR-15.

    @@ -408,11 +388,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-frontend-version-3-launched.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-frontend-version-3-launched.html.twig index 97f9888..afb4fb6 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-frontend-version-3-launched.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel-frontend-version-3-launched.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/dotkernel-frontend-version-3-launched.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel Frontend version 3 launched{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel Frontend PHP Application version 3 was launched.

    @@ -65,11 +45,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel3-stable-release-version-1-0.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel3-stable-release-version-1-0.html.twig index 9341eb7..2477130 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel3-stable-release-version-1-0.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/dotkernel3-stable-release-version-1-0.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/dotkernel3-stable-release-version-1-0.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Dotkernel3 - Stable Release version 1.0{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel was updated to support Zend Expressive 3 alongside with PSR-15 middleware. We have updated the core packages to support PSR-15 Middleware. @@ -127,11 +107,4 @@ If your project is a Dotkernel 3 instance (based on expressive 2), you can migra
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-admin.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-admin.html.twig index ab3c409..2172b0a 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-admin.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-admin.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/php-8-3-support-in-dotkernel-admin.jsonld.twig') }} {% endblock %} - -{% block title %}PHP 8.3 support in Dotkernel Admin{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    With the release of PHP 8.3, the Dotkernel team has been working on updating the dependencies in our packages. Eventually, this allowed us to update our Applications as well, starting with the Admin, in release 4.3.1

    There were some issues and backward incompatibilities that we will list below.

    @@ -178,11 +158,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-api.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-api.html.twig index aed2653..1095f7a 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-api.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-api.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/php-8-3-support-in-dotkernel-api.jsonld.twig') }} {% endblock %} - -{% block title %}PHP 8.3 support in Dotkernel API{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The last remaining application to be updated to support PHP 8.3 is the API, now at v4.2.1. The steps taken to perform the update are similar to the ones in the update for the Frontend.

    The full list of file changes is here.

    @@ -166,11 +146,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-frontend.html.twig b/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-frontend.html.twig index 4e49148..468b7eb 100644 --- a/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-frontend.html.twig +++ b/src/Blog/templates/page/blog-resource/dotkernel3/php-8-3-support-in-dotkernel-frontend.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/dotkernel3/php-8-3-support-in-dotkernel-frontend.jsonld.twig') }} {% endblock %} - -{% block title %}PHP 8.3 support in Dotkernel Frontend{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Dotkernel 3', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    To be able to take advantage of the support for PHP 8.3 in the newest packages, the Dotkernel team has updated the Frontend Application to version 4.2.0. Very much like for the Admin update before it, the Frontend must also remove support for PHP 8.1 and the no-longer-available PhpFileCache class until a replacement is implemented.

    The full list of file changes is here.

    @@ -162,11 +142,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/complementary-admin-in-dotkernel-headless-platform.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/complementary-admin-in-dotkernel-headless-platform.html.twig index 10230a8..fca9f0d 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/complementary-admin-in-dotkernel-headless-platform.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/complementary-admin-in-dotkernel-headless-platform.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/complementary-admin-in-dotkernel-headless-platform.jsonld.twig') }} {% endblock %} - -{% block title %}Complementary Admin in Dotkernel Headless Platform{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The Dotkernel Headless Platform is built with an architecture designed to be easy to maintain and expand indefinitely. Its core components are Dotkernel API and Dotkernel Queue, but the Dotkernel application suite also offers a fully separate, complementary Admin application designed to pair seamlessly with Dotkernel API.

    What is Dotkernel Admin?

    @@ -131,11 +111,4 @@
  • PHP Framework Interop Group Standards
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-api-v6-the-root-of-dotkernel-headless-platform.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-api-v6-the-root-of-dotkernel-headless-platform.html.twig index 6970633..c3704ef 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-api-v6-the-root-of-dotkernel-headless-platform.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-api-v6-the-root-of-dotkernel-headless-platform.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/dotkernel-api-v6-the-root-of-dotkernel-headless-platform.jsonld.twig') }} {% endblock %} - -{% block title %}Dotkernel API v6: The root of Dotkernel Headless Platform{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel API has come a long way since we published a list of its architecture and components a while ago. We implemented new features, while some components were replaced, and others were enhanced. Our ultimate goal is to stay relevant in the PHP ecosystem by implementing best practices recommended by the PHP community.

    New Features

    @@ -105,11 +85,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-headless-platform-the-whats-hows-and-whys.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-headless-platform-the-whats-hows-and-whys.html.twig index 993fb4d..c350879 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-headless-platform-the-whats-hows-and-whys.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-headless-platform-the-whats-hows-and-whys.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/dotkernel-headless-platform-the-whats-hows-and-whys.jsonld.twig') }} {% endblock %} - -{% block title %}Dotkernel Headless Platform - The Whats, Hows and Whys{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The principle of a Headless Platform is to decouple the User Interface (frontend) from the backend services. The responses from the platform are then used by another system, such as a website or mobile app. In this article we will explore the Dotkernel implementation of the Headless Platform architecture, how to use it and what are its benefits.

    Components of the Dotkernel Headless Platform

    @@ -168,11 +148,4 @@

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-queue-asynchronous-execution-in-dotkernel-headless-platform.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-queue-asynchronous-execution-in-dotkernel-headless-platform.html.twig index f86fc70..2fbfa53 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-queue-asynchronous-execution-in-dotkernel-headless-platform.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/dotkernel-queue-asynchronous-execution-in-dotkernel-headless-platform.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/dotkernel-queue-asynchronous-execution-in-dotkernel-headless-platform.jsonld.twig') }} {% endblock %} - -{% block title %}Dotkernel Queue - Asynchronous Execution in Dotkernel Headless Platform{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel Queue is a component based on Symfony Messenger that is used to queue asynchronous tasks. netglue/laminas-messenger is an adapter that integrates Symfony Messenger with the Laminas Service Manager container for Mezzio/Laminas applications.

    Some everyday operations are time-consuming and resource-intensive, so it's best if they run on separate machines, decoupled from the regular request-response cycle. With the addition of asynchronous execution performed by background workers, you can ensure that these operations are not lost, terminated by PHP because of timeouts, or interrupted by new requests. The most important benefit is that you prevent the main platform from overloading, allowing it to return a response, remain responsive for new requests, while the heavy lifting is scheduled to run later.

    @@ -196,11 +176,4 @@
  • How To Prioritize Messages When Building Asynchronous Applications With Symfony Messenger
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/dotmaker-generate-common-code-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/dotmaker-generate-common-code-in-dotkernel.html.twig index da7fa84..c240467 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/dotmaker-generate-common-code-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/dotmaker-generate-common-code-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/dotmaker-generate-common-code-in-dotkernel.jsonld.twig') }} {% endblock %} - -{% block title %}DotMaker - Generate common code in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The dotkernel/dot-maker library, also named DotMaker, is designed to programmatically generate project files and directories that match the Dotkernel file structure inspired by Mezzio.

    Handling the file creation and configuration task manually invites mistakes that nobody has time for. Enter DotMaker which provides a big productivity boost compared to doing everything manually by promoting consistenty and standardization for these common tasks.

    @@ -177,11 +157,4 @@ https://www.youtube.com/watch?v=CPDilXP2kAc
  • Symfony Maker Bundle Documentation
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/evolution-pattern-versus-api-versioning.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/evolution-pattern-versus-api-versioning.html.twig index 27c7b88..c08f0d1 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/evolution-pattern-versus-api-versioning.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/evolution-pattern-versus-api-versioning.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/evolution-pattern-versus-api-versioning.jsonld.twig') }} {% endblock %} - -{% block title %}Evolution Pattern versus API Versioning{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    In programming and software architecture, an Evolution Pattern is a reusable, high-level strategy for modifying or evolving existing software systems over time. An evolution pattern tries to keep software relevant for old and new users by whatever means are available, as new needs arise.

    Versioning in software is the practice of assigning unique identifiers (version numbers) to different releases of a software platform. These numbers help track changes, improvements, bug fixes, compatibility, and evolution over time. In particular, API versioning is the practice of assigning versions to an API so that it can change over time without breaking existing clients that rely on it.

    @@ -147,11 +127,4 @@ Vary: Origin
  • Ways to version your API, Part 2
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/implementing-time-based-one-time-password-totp-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/implementing-time-based-one-time-password-totp-in-dotkernel.html.twig index 0a724b5..8079d79 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/implementing-time-based-one-time-password-totp-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/implementing-time-based-one-time-password-totp-in-dotkernel.html.twig @@ -1,28 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/implementing-time-based-one-time-password-totp-in-dotkernel.jsonld.twig') }} {% endblock %} - -{% block title %}Implementing Time-based One-Time Password (TOTP) in Dotkernel{% endblock %} - -{% block page_title %} - {{ - include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) - }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    What TOTP Does

    A Time-based One-Time Password (TOTP) is a security algorithm used as part of two-factor authentication (2FA) to protect against account attacks. The mechanism is integrated into dot-totp to enhance security by requiring both a password and an additional one-time code. Our implementation follows the industry standard of using an Authenticator app to generate temporary, unique 6 digit codes that change every 30 seconds.

    @@ -186,11 +164,4 @@
  • Dotkernel Documentation - Installing dot-totp into Dotkernel Admin
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/shared-core-submodule-in-dotkernel-headless-platform.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/shared-core-submodule-in-dotkernel-headless-platform.html.twig index 4e4f405..5f068d7 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/shared-core-submodule-in-dotkernel-headless-platform.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/shared-core-submodule-in-dotkernel-headless-platform.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/shared-core-submodule-in-dotkernel-headless-platform.jsonld.twig') }} {% endblock %} - -{% block title %}Shared Core Submodule in Dotkernel Headless Platform{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel has implemented a Headless solution made up of these applications:

    • Dotkernel API - a REST API, the root of the platform.
    • @@ -171,11 +151,4 @@ git submodule update

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/headless-platform/version-7-adds-postgresql-native-uuid-and-php-8-5.html.twig b/src/Blog/templates/page/blog-resource/headless-platform/version-7-adds-postgresql-native-uuid-and-php-8-5.html.twig index 39e048f..628486e 100644 --- a/src/Blog/templates/page/blog-resource/headless-platform/version-7-adds-postgresql-native-uuid-and-php-8-5.html.twig +++ b/src/Blog/templates/page/blog-resource/headless-platform/version-7-adds-postgresql-native-uuid-and-php-8-5.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/headless-platform/version-7-adds-postgresql-native-uuid-and-php-8-5.jsonld.twig') }} {% endblock %} - -{% block title %}Version 7 adds PostgreSQL, Native UUID and PHP 8.5{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Headless Platform', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The Dotkernel Headless Platform has seen new releases for both API and Admin. The Admin codebase has received an overall facelift, as well as updates to retain compatibility with API v7. The release for Dotkernel API v7 has several added features, as well as a few that are removed.

    New features are:

    @@ -97,11 +77,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/cors-policy-setup-in-dotkernel-using-mezzio-cors.html.twig b/src/Blog/templates/page/blog-resource/how-to/cors-policy-setup-in-dotkernel-using-mezzio-cors.html.twig index 648b4e3..c5c3b39 100644 --- a/src/Blog/templates/page/blog-resource/how-to/cors-policy-setup-in-dotkernel-using-mezzio-cors.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/cors-policy-setup-in-dotkernel-using-mezzio-cors.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/cors-policy-setup-in-dotkernel-using-mezzio-cors.jsonld.twig') }} {% endblock %} - -{% block title %}CORS policy setup in Dotkernel using mezzio-cors{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    CORS policy setup in Dotkernel using mezzio-cors

    Error message

    @@ -133,11 +113,4 @@ return [
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/creating-admin-accounts-in-dotkernel-api.html.twig b/src/Blog/templates/page/blog-resource/how-to/creating-admin-accounts-in-dotkernel-api.html.twig index aeb0a49..3399b56 100644 --- a/src/Blog/templates/page/blog-resource/how-to/creating-admin-accounts-in-dotkernel-api.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/creating-admin-accounts-in-dotkernel-api.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/creating-admin-accounts-in-dotkernel-api.jsonld.twig') }} {% endblock %} - -{% block title %}Creating admin accounts in Dotkernel API{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Creating admin accounts in Dotkernel API

    Starting from v3, Dotkernel API introduces support for admin accounts. In this article we will describe two different methods of creating an admin account.

    @@ -153,11 +133,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/database-migrations-and-how-to-use-them.html.twig b/src/Blog/templates/page/blog-resource/how-to/database-migrations-and-how-to-use-them.html.twig index 980d54c..6655f93 100644 --- a/src/Blog/templates/page/blog-resource/how-to/database-migrations-and-how-to-use-them.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/database-migrations-and-how-to-use-them.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/database-migrations-and-how-to-use-them.jsonld.twig') }} {% endblock %} - -{% block title %}Database migrations and how to use them{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Migrations, the superhero your database deserves

    Migrations ease the process of working together on projects, as well as deploying the database changes. @@ -134,11 +114,4 @@ Seeders are created the same way as migrations, and also benefits hugely from be
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/doctrine-cache-in-mezzio-and-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/how-to/doctrine-cache-in-mezzio-and-dotkernel.html.twig index 5ce50be..8ff76d0 100644 --- a/src/Blog/templates/page/blog-resource/how-to/doctrine-cache-in-mezzio-and-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/doctrine-cache-in-mezzio-and-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/doctrine-cache-in-mezzio-and-dotkernel.jsonld.twig') }} {% endblock %} - -{% block title %}Doctrine Cache in Mezzio and Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Doctrine caching in Dotkernel

    Following version 2 of doctrine/cache, in 2024 we published an update to this article here: https://www.dotkernel.com/dotkernel/doctrine-cache-using-symfony-cache/

    @@ -206,11 +186,4 @@ class MyCollection extends Paginator

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/generating-a-doctrine-migration-without-dropping-custom-tables.html.twig b/src/Blog/templates/page/blog-resource/how-to/generating-a-doctrine-migration-without-dropping-custom-tables.html.twig index 727cb1a..f6d4c0d 100644 --- a/src/Blog/templates/page/blog-resource/how-to/generating-a-doctrine-migration-without-dropping-custom-tables.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/generating-a-doctrine-migration-without-dropping-custom-tables.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/generating-a-doctrine-migration-without-dropping-custom-tables.jsonld.twig') }} {% endblock %} - -{% block title %}Generating a doctrine migration without dropping custom tables{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Generating a doctrine migration without dropping custom tables

    If your application needs to hold some custom (unmapped) tables in the database, then generating migrations with doctrine-migrations diff will try to drop the custom tables. This article provides a solution on how to avoid dropping those tables.

    @@ -105,11 +85,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/implementation-of-seo-friendly-url-in-an-generic-laminas-mezzio-app.html.twig b/src/Blog/templates/page/blog-resource/how-to/implementation-of-seo-friendly-url-in-an-generic-laminas-mezzio-app.html.twig index abfcac4..3d7171e 100644 --- a/src/Blog/templates/page/blog-resource/how-to/implementation-of-seo-friendly-url-in-an-generic-laminas-mezzio-app.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/implementation-of-seo-friendly-url-in-an-generic-laminas-mezzio-app.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/implementation-of-seo-friendly-url-in-an-generic-laminas-mezzio-app.jsonld.twig') }} {% endblock %} - -{% block title %}Implementation of SEO friendly URL in an generic Laminas Mezzio app{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Prerequisites:

    • Mezzio App
    • @@ -118,11 +98,4 @@ protected string $slug;
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/installing-almalinux-10-in-wsl2-php-mariadb-composer-phpmyadmin.html.twig b/src/Blog/templates/page/blog-resource/how-to/installing-almalinux-10-in-wsl2-php-mariadb-composer-phpmyadmin.html.twig index 97203a2..7dcccf6 100644 --- a/src/Blog/templates/page/blog-resource/how-to/installing-almalinux-10-in-wsl2-php-mariadb-composer-phpmyadmin.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/installing-almalinux-10-in-wsl2-php-mariadb-composer-phpmyadmin.html.twig @@ -1,148 +1,121 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/installing-almalinux-10-in-wsl2-php-mariadb-composer-phpmyadmin.jsonld.twig') }} {% endblock %} - -{% block title %}Installing AlmaLinux 10 in WSL2: PHP, MariaDB, Composer, PhpMyadmin{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} -

    With the recent release of AlmaLinux OS 10, we have created a new recipe for our WSL development environment. Compared to its predecessor, AlmaLinux 10 provides performance enhancements, security updates and improved hardware support.

    +{% block body %} +

    With the recent release of AlmaLinux OS 10, we have created a new recipe for our WSL development environment. Compared to its predecessor, AlmaLinux 10 provides performance enhancements, security updates and improved hardware support.

    -

    What You Get

    +

    What You Get

    -

    Like for AlmaLinux 9, the WSL recipe sets up the development environment with all the components a regular PHP developer needs:

    +

    Like for AlmaLinux 9, the WSL recipe sets up the development environment with all the components a regular PHP developer needs:

    -
    • WSL2 - Windows Subsystem for Linux.
    • +
      • WSL2 - Windows Subsystem for Linux.
      • -
      • AlmaLinux 10 - Free and open source Linux distribution.
      • +
      • AlmaLinux 10 - Free and open source Linux distribution.
      • -
      • PHP - General-purpose scripting language geared towards web development.
      • +
      • PHP - General-purpose scripting language geared towards web development.
      • -
      • Apache - Free and open-source cross-platform web server software.
      • +
      • Apache - Free and open-source cross-platform web server software.
      • -
      • MariaDB - Community-developed, commercially supported fork of the MySQL relational database management system.
      • +
      • MariaDB - Community-developed, commercially supported fork of the MySQL relational database management system.
      • -
      • Git - Distributed version control system.
      • +
      • Git - Distributed version control system.
      • -
      • Composer - Application-level dependency manager.
      • +
      • Composer - Application-level dependency manager.
      • -
      • Node.js - JavaScript runtime environment.
      • +
      • Node.js - JavaScript runtime environment.
      • -
      • PhpMyAdmin - Open source administration tool for MySQL and MariaDB.
      • -
      +
    • PhpMyAdmin - Open source administration tool for MySQL and MariaDB.
    • +
    -

    Requirements

    +

    Requirements

    -

    Make sure that you have the minimum requirements for running WSL2.

    +

    Make sure that you have the minimum requirements for running WSL2.

    -

    OS-wise you must be running:

    +

    OS-wise you must be running:

    -
    • Windows 10:
      • For x64 systems: Version 1903 or later with Build 18362.1049 or later.
      • +
        • Windows 10:
          • For x64 systems: Version 1903 or later with Build 18362.1049 or later.
          • -
          • For ARM64 systems: Version 2004 or later with Build 19041 or later.
          • -
          -
        • +
        • For ARM64 systems: Version 2004 or later with Build 19041 or later.
        • +
        + -
      • or Windows 11.
      • -
      +
    • or Windows 11.
    • +
    -

    Hardware-wise, you need virtualization support. On some older hardware that supports this feature, it may be disabled from the BIOS.

    +

    Hardware-wise, you need virtualization support. On some older hardware that supports this feature, it may be disabled from the BIOS.

    -

    WSL2 needs Virtual Machine Platform feature enabled. You can enable it via the PowerShell running as an Administrator:

    +

    WSL2 needs Virtual Machine Platform feature enabled. You can enable it via the PowerShell running as an Administrator:

    -
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    +
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    -

    Installing the distro

    +

    Installing the distro

    -

    Start by downloading and installing the Linux distro with this command:

    +

    Start by downloading and installing the Linux distro with this command:

    -
    wsl --install -d AlmaLinux-10
    +
    wsl --install -d AlmaLinux-10
    -

    If everything ran ok, you are asked to enter a password at the end.

    +

    If everything ran ok, you are asked to enter a password at the end.

    -

    Next run each of the ansible playbook commands to install the development components.

    +

    Next run each of the ansible playbook commands to install the development components.

    -

    Using WSL2 with AlmaLinux 10

    +

    Using WSL2 with AlmaLinux 10

    -

    You can start AlmaLinux10 by executing this coomand in the Windows Terminal:

    +

    You can start AlmaLinux10 by executing this coomand in the Windows Terminal:

    -
    wsl -d AlmaLinux-10
    +
    wsl -d AlmaLinux-10
    -

    Our PHP projects can be run by navigating into the root project folder and running this command:

    +

    Our PHP projects can be run by navigating into the root project folder and running this command:

    -
    php -S 0.0.0.0:8080 -t public
    +
    php -S 0.0.0.0:8080 -t public
    -

    Then you need to navigate to http://localhost:8080 in your preferred browser.

    +

    Then you need to navigate to http://localhost:8080 in your preferred browser.

    -

    Running the Application Via Virtual Hosts

    +

    Running the Application Via Virtual Hosts

    -

    An easier way to run your applications is via virtual hosts. The full instructions to set up your virtual hosts are in the Create virtualhosts page.

    +

    An easier way to run your applications is via virtual hosts. The full instructions to set up your virtual hosts are in the Create virtualhosts page.

    -

    After you set up your virtual hosts and install your project in e.g. the /var/www/example.localhost/html folder, you can run the application in the browser by accessing example.localhost.

    +

    After you set up your virtual hosts and install your project in e.g. the /var/www/example.localhost/html folder, you can run the application in the browser by accessing example.localhost.

    -

    If you run into any issues, make sure to first check our FAQ page. If all else fails, create an issue with details and we can talk.

    +

    If you run into any issues, make sure to first check our FAQ page. If all else fails, create an issue with details and we can talk.

    -

    Frequently Asked Questions

    +

    Frequently Asked Questions

    -
    -
    - What does this WSL recipe set up? + -
    -

    It sets up a full PHP development environment: WSL2, AlmaLinux 10, PHP, Apache, MariaDB, Git, Composer, Node.js and PhpMyAdmin.

    -
    -
    -
    - What are the OS and hardware requirements? + -
    -

    Windows 10 (Version 1903+ / Build 18362.1049+ for x64, or Version 2004+ / Build 19041+ for ARM64) or Windows 11, plus hardware virtualization support. If needed, enable the Virtual Machine Platform feature via dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart in an administrator PowerShell.

    -
    -
    -
    - How do I install AlmaLinux 10 via WSL2? + -
    -

    Run wsl --install -d AlmaLinux-10, set a password when prompted, then run each of the Ansible playbook commands from the Dotkernel docs to install the development components.

    -
    -
    -
    - How do I run a PHP project after setup? + -
    -

    Either run php -S 0.0.0.0:8080 -t public from the project root and browse to http://localhost:8080, or, more easily, set up virtual hosts per the Dotkernel docs and access the project at its configured hostname (e.g. example.localhost).

    -
    -
    -
    - What should I do if I run into issues during setup? + -
    -

    First check the Dotkernel FAQ page. If that doesn't resolve it, create an issue on the dotkernel/development GitHub repository with details.

    -
    -
    -
    - -

    Additional Resources

    - -
    • Full AlmaLinux 10 Installation Instructions
    • +
      +
      + What does this WSL recipe set up? + +
      +

      It sets up a full PHP development environment: WSL2, AlmaLinux 10, PHP, Apache, MariaDB, Git, Composer, Node.js and PhpMyAdmin.

      +
      +
      +
      + What are the OS and hardware requirements? + +
      +

      Windows 10 (Version 1903+ / Build 18362.1049+ for x64, or Version 2004+ / Build 19041+ for ARM64) or Windows 11, plus hardware virtualization support. If needed, enable the Virtual Machine Platform feature via dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart in an administrator PowerShell.

      +
      +
      +
      + How do I install AlmaLinux 10 via WSL2? + +
      +

      Run wsl --install -d AlmaLinux-10, set a password when prompted, then run each of the Ansible playbook commands from the Dotkernel docs to install the development components.

      +
      +
      +
      + How do I run a PHP project after setup? + +
      +

      Either run php -S 0.0.0.0:8080 -t public from the project root and browse to http://localhost:8080, or, more easily, set up virtual hosts per the Dotkernel docs and access the project at its configured hostname (e.g. example.localhost).

      +
      +
      +
      + What should I do if I run into issues during setup? + +
      +

      First check the Dotkernel FAQ page. If that doesn't resolve it, create an issue on the dotkernel/development GitHub repository with details.

      +
      +
      +
      -
    • AlmaLinux 9 in WSL2 with PHP, Mariadb, Composer, PhpMyadmin instructions
    • -
    -
    +

    Additional Resources

    - {{ include('@partial/post-nav.html.twig') }} -
    +
    -
    +
  • AlmaLinux 9 in WSL2 with PHP, Mariadb, Composer, PhpMyadmin instructions
  • + {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/list-available-endpoints-in-dotkernel-api-using-dot-cli.html.twig b/src/Blog/templates/page/blog-resource/how-to/list-available-endpoints-in-dotkernel-api-using-dot-cli.html.twig index 810128d..daa2cd7 100644 --- a/src/Blog/templates/page/blog-resource/how-to/list-available-endpoints-in-dotkernel-api-using-dot-cli.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/list-available-endpoints-in-dotkernel-api-using-dot-cli.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/list-available-endpoints-in-dotkernel-api-using-dot-cli.jsonld.twig') }} {% endblock %} - -{% block title %}List available endpoints in Dotkernel API using dot-cli{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Displaying Dotkernel API endpoints using dot-cli

    Starting from version 3, Dotkernel API uses dot-cli to display a list of available endpoints.

    @@ -140,11 +120,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/migrating-dotkernel-3-from-zend-expressive-2-to-zend-expressive-3.html.twig b/src/Blog/templates/page/blog-resource/how-to/migrating-dotkernel-3-from-zend-expressive-2-to-zend-expressive-3.html.twig index e4c5156..363d3c4 100644 --- a/src/Blog/templates/page/blog-resource/how-to/migrating-dotkernel-3-from-zend-expressive-2-to-zend-expressive-3.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/migrating-dotkernel-3-from-zend-expressive-2-to-zend-expressive-3.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/migrating-dotkernel-3-from-zend-expressive-2-to-zend-expressive-3.jsonld.twig') }} {% endblock %} - -{% block title %}Migrating Dotkernel 3 from Zend Expressive 2 to Zend Expressive 3{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article covers the steps required to migrate a Dotkernel 3 instance to the latest Zend Expressive Version. @@ -198,11 +178,4 @@ You can check the complete guides and example files from the following links
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/replacing-dot-console-with-dot-cli-based-on-laminas-cli.html.twig b/src/Blog/templates/page/blog-resource/how-to/replacing-dot-console-with-dot-cli-based-on-laminas-cli.html.twig index 877def0..fa5d4a4 100644 --- a/src/Blog/templates/page/blog-resource/how-to/replacing-dot-console-with-dot-cli-based-on-laminas-cli.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/replacing-dot-console-with-dot-cli-based-on-laminas-cli.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/replacing-dot-console-with-dot-cli-based-on-laminas-cli.jsonld.twig') }} {% endblock %} - -{% block title %}Replacing dot-console with dot-cli based on laminas-cli{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Replacing dot-console with dot-cli based on laminas-cli

    Implementing dot-cli in your application

    @@ -113,11 +93,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/using-postman-for-documentation-in-dotkernel-api-3.html.twig b/src/Blog/templates/page/blog-resource/how-to/using-postman-for-documentation-in-dotkernel-api-3.html.twig index 6d7bbaa..f9aae3a 100644 --- a/src/Blog/templates/page/blog-resource/how-to/using-postman-for-documentation-in-dotkernel-api-3.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/using-postman-for-documentation-in-dotkernel-api-3.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/using-postman-for-documentation-in-dotkernel-api-3.jsonld.twig') }} {% endblock %} - -{% block title %}Using Postman for documentation in Dotkernel API 3{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Using Postman documentation in Dotkernel API 3

    Starting from version 3.0 Dotkernel API provides it's documentation using Postman.

    @@ -164,11 +144,4 @@ VARIABLE INITIAL VALUE CURRENT_VALUE
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/using-the-urlgenerator-work-in-fastroute.html.twig b/src/Blog/templates/page/blog-resource/how-to/using-the-urlgenerator-work-in-fastroute.html.twig index 924b885..105389f 100644 --- a/src/Blog/templates/page/blog-resource/how-to/using-the-urlgenerator-work-in-fastroute.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/using-the-urlgenerator-work-in-fastroute.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/using-the-urlgenerator-work-in-fastroute.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Using the URLGenerator work in FastRoute{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Dotkernel 3 uses FastRoute under the hood, which is an excellent and fast routing package, but it does have some quirks. A wrong setup can lead to many headaches, as it's not prominent that the error you're experiencing is from FastRoute, and you may not know where exactly to look for the cause. @@ -28,19 +8,19 @@ A wrong setup can lead to many headaches, as it's not prominent that the error y To save you some time, here's a how-to for creating and using routes in Dotkernel 3.

    Declaring routes

    When defining routes in the routes.php file, they need to follow a specific pattern, a usual route would look like this: -
    >$app->route('/page', , , 'page');
    +
    $app->route('/page', , , 'page');
    Notice the '/page' part, as this is crucial. FastRoute cannot handle a slash-suffix, which means that /page will give you the indexAction, whereas /page/ will give you a 404.
    To prevent the URLGenerator from adding a slash-suffix, we need to make sure that the optional slash is included in the optional block. The above example is correct, if we instead wrote it like this, it'd be woefully bad. -
    >$app->route('/page/', , , 'page');
    +
    $app->route('/page/', , , 'page');
    Notice that the slash has changed places and is now outside the optional block. This would generate a /page/ route for the index action, which is bad, so always include any optional parts, even slashes, in the optional block.

    Referencing routes

    Developers are used to hand-write and hard-code URLs into anchor tags, but this is a bad idea, as a URL may change and then you'd have to go through the entire app to find every single reference for it. Instead, every route we define has a name that can be used to reference it in the URLGenerator. -
    >$app->route('/page', , , 'page');
    +
    $app->route('/page', , , 'page');
    That very last part there, that's the route name, which can be referenced in any view or controller to generate a route to a specific route in the app.
    To use it in a Controller, you have access to $this->url(); which takes the route name, in this case, 'page', as the first parameter, and then any optional blocks as the second parameter. A controller redirect may then look like this: -
    >return new RedirectResponse($this->url('contact', ['action' => 'thank-you']));
    +
    return new RedirectResponse($this->url('contact', ['action' => 'thank-you']));
    Using the URLGenerator in views is approximately the same, since you have access to the global path() method. The path method works the same way as the url() method, and takes the route name as the first parameter, and any optional blocks as its second parameter. This is of course done in Twig, so we need to put curly brackets around it since it's dynamic and not static HTML. It could look like this: @@ -74,11 +54,4 @@ The path method works the same way as the url() method, and takes t
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/what-is-cross-origin-token-redemption.html.twig b/src/Blog/templates/page/blog-resource/how-to/what-is-cross-origin-token-redemption.html.twig index f420823..c9a53c4 100644 --- a/src/Blog/templates/page/blog-resource/how-to/what-is-cross-origin-token-redemption.html.twig +++ b/src/Blog/templates/page/blog-resource/how-to/what-is-cross-origin-token-redemption.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/how-to/what-is-cross-origin-token-redemption.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}What is cross origin token redemption?{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: "How to's", - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    What is cross origin token redemption?

    Cross-origin token redemption is a technique used to ensure the security and authenticity of a token that is issued by one website or domain, but intended for use on a different website or domain. This process is commonly used in situations where a user needs to access resources from multiple domains, such as when a user is logged in to one website and needs to access resources from another website.

    @@ -74,11 +54,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/how-to/what-is-psr-7-and-how-to-use-it.html.twig b/src/Blog/templates/page/blog-resource/how-to/what-is-psr-7-and-how-to-use-it.html.twig index f528d82..a122b5a 100644 Binary files a/src/Blog/templates/page/blog-resource/how-to/what-is-psr-7-and-how-to-use-it.html.twig and b/src/Blog/templates/page/blog-resource/how-to/what-is-psr-7-and-how-to-use-it.html.twig differ diff --git a/src/Blog/templates/page/blog-resource/javascript/codelobster-php-edition-free-php-html-css-javascript-editor-ide.html.twig b/src/Blog/templates/page/blog-resource/javascript/codelobster-php-edition-free-php-html-css-javascript-editor-ide.html.twig index f91ca8c..6a55ccb 100644 --- a/src/Blog/templates/page/blog-resource/javascript/codelobster-php-edition-free-php-html-css-javascript-editor-ide.html.twig +++ b/src/Blog/templates/page/blog-resource/javascript/codelobster-php-edition-free-php-html-css-javascript-editor-ide.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/javascript/codelobster-php-edition-free-php-html-css-javascript-editor-ide.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Codelobster PHP Edition - Free PHP, HTML, CSS, JavaScript editor (IDE){% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Javascript', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Free PHP, HTML, CSS, JavaScript editor (IDE) - Codelobster PHP Edition

    Free PHP, HTML, CSS, JavaScript editor (IDE) - Codelobster PHP Edition

    For valuable work on creation of sites you need a good comfortable editor necessarily. There are many requiring paid products for this purpose, but we would like to select free of charge very functional and at the same time of simple in the use editor - Codelobster PHP Edition .

    @@ -76,11 +56,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/javascript/intro-to-jquery.html.twig b/src/Blog/templates/page/blog-resource/javascript/intro-to-jquery.html.twig index daeb69a..f54fd41 100644 --- a/src/Blog/templates/page/blog-resource/javascript/intro-to-jquery.html.twig +++ b/src/Blog/templates/page/blog-resource/javascript/intro-to-jquery.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/javascript/intro-to-jquery.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Intro to jQuery{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Javascript', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Starting with the 1.5 release, Dotkernel will make the switch from Dojo to jQuery. On jQuery's website, there's an excellent "Getting started with jQuery tutorial", as well as a extensive documentation for the framework, so I'll just go over a few basic concepts and common examples. @@ -33,7 +13,7 @@ It contains a few useful methods such as Manipulating matched elements There are a number of functions that can be applied to a jQuery object, for example: -
    >$("input#username").addClass("error")
    +
    $("input#username").addClass("error")
    Since most of these functions will also return the same jQuery object, they can be chained. For example, the following expression will set the text of the #errors element and fade it in: -
    >$("#errors").text("The was an eror").fadeIn()
    +
    $("#errors").text("The was an eror").fadeIn()

    Events

    Adding events in Javascript instead of using "onclick" attributes in HTML means that the markup is much cleaner, and you get better support for more events in all browsers. In the following example, a click event is attached to an element. The function that will be called when the event is fired (callback) is passed as an argument to the click function -
    >$("#helpButton").click(function(){
    +
    $("#helpButton").click(function(){
         $("#helpMessage").show()
     });
     

    Ajax

    jQuery has
    many ajax helper functions, here is a simple example that will replace the contents of an element with data loaded from the server: -
    >$.get("get-news.php", function(result){
    +
    $.get("get-news.php", function(result){
        $("#news").html(result)
     })
     

    Putting it all together

    The following snippet can be used on a registration form to check whether the username already exists, before the form is submitted. -
    >$(document).ready(
    +
    $(document).ready(
       $("input#username").blur(function(){
         $.getJSON(
           "/check-username.php",
    @@ -114,11 +94,4 @@ The following snippet can be used on a registration form to check whether the us
             
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/javascript/javascript-email-validator.html.twig b/src/Blog/templates/page/blog-resource/javascript/javascript-email-validator.html.twig index c36b9b8..fccf2ac 100644 --- a/src/Blog/templates/page/blog-resource/javascript/javascript-email-validator.html.twig +++ b/src/Blog/templates/page/blog-resource/javascript/javascript-email-validator.html.twig @@ -1,32 +1,12 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/javascript/javascript-email-validator.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Javascript: Email Validator{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Javascript', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Problem: email should allow +/- characters in user, - in domain. dash (-) should be allowed anywhere in an email address or domain. plus (+) is allowed in the username (many people use this for categorization, especially at gmail) Solution : -
    >var regex = new RegExp("^+(\.+)*@+(\.+)*\.({2,})$","i");
    +
    var regex = new RegExp("^+(\.+)*@+(\.+)*\.({2,})$","i");
    This will validated also emails like: username1+username2@gmail-domain.co.uk

    Frequently Asked Questions

    @@ -51,11 +31,4 @@ This will validated also emails like: username1+username2@gmail-domain.co.uk
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/licensing/mit-versus-lgpl-in-practice-dotkernel-case.html.twig b/src/Blog/templates/page/blog-resource/licensing/mit-versus-lgpl-in-practice-dotkernel-case.html.twig index 31bd99e..6918859 100644 --- a/src/Blog/templates/page/blog-resource/licensing/mit-versus-lgpl-in-practice-dotkernel-case.html.twig +++ b/src/Blog/templates/page/blog-resource/licensing/mit-versus-lgpl-in-practice-dotkernel-case.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/licensing/mit-versus-lgpl-in-practice-dotkernel-case.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}MIT versus LGPL in practice: Dotkernel case{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Licensing', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    After a recent analysis, we discovered that one of the upstream packages we use is licensed under LGPL v3. Even though we at Dotkernel use the MIT license for our open source projects, the more restrictive license must be applied to the whole application. We implemented a workaround detailed below.

    Detailing the problem

    @@ -77,11 +57,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/middleware/dotkernel-light-improvements-psr-15-handlers-vite-phpstan.html.twig b/src/Blog/templates/page/blog-resource/middleware/dotkernel-light-improvements-psr-15-handlers-vite-phpstan.html.twig index b16dd8c..9788e0b 100644 --- a/src/Blog/templates/page/blog-resource/middleware/dotkernel-light-improvements-psr-15-handlers-vite-phpstan.html.twig +++ b/src/Blog/templates/page/blog-resource/middleware/dotkernel-light-improvements-psr-15-handlers-vite-phpstan.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/middleware/dotkernel-light-improvements-psr-15-handlers-vite-phpstan.jsonld.twig') }} {% endblock %} - -{% block title %}Dotkernel Light improvements: PSR-15 Handlers, Vite, PHPStan{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Middleware', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Dotkernel Light is a PSR-15 compliant application that uses the Mezzio microframework and Laminas components. It's aimed at creating a simple website, like a presentation site, but can be expanded as needed.

    Dotkernel Light has come a long way since our last update. It's just as useful for a presentation site, but our perfectionist devs thought we could do better. Let's see what we have improved to make your use of Light that much more convenient.

    @@ -112,11 +92,4 @@

    PSR-15: HTTP Server Request Handlers

    Static Analysis – Replacing Psalm with PHPStan

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/middleware/handling-dynamic-routing-using-fastroute-in-dotkernel.html.twig b/src/Blog/templates/page/blog-resource/middleware/handling-dynamic-routing-using-fastroute-in-dotkernel.html.twig index b22cccb..14437e2 100644 --- a/src/Blog/templates/page/blog-resource/middleware/handling-dynamic-routing-using-fastroute-in-dotkernel.html.twig +++ b/src/Blog/templates/page/blog-resource/middleware/handling-dynamic-routing-using-fastroute-in-dotkernel.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/middleware/handling-dynamic-routing-using-fastroute-in-dotkernel.jsonld.twig') }} {% endblock %} - -{% block title %}Handling dynamic routing using FastRoute in Dotkernel{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Middleware', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The goal of this update is to replace the static way of creating routes with a more dynamic implementation. The result is a cleaner approach that is easier to set up and review at a glance.

    RoutesDelegator.php is used to configure the routes in Dotkernel applications. Routing allows web applications to respond to user requests by executing the correct code based on URL paths. The dynamic aspect discussed in this article moves the relevant items for each route into the local.php file. The RoutesDelegator then reads the route configuration and generates the routes.

    @@ -165,11 +145,4 @@ foreach ($routes as $prefix => $moduleRoutes) {

    FastRoute

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/middleware/replacing-controllers-with-psr-15-compliant-handlers-in-dotkernel-light.html.twig b/src/Blog/templates/page/blog-resource/middleware/replacing-controllers-with-psr-15-compliant-handlers-in-dotkernel-light.html.twig index a8858cf..4099d34 100644 --- a/src/Blog/templates/page/blog-resource/middleware/replacing-controllers-with-psr-15-compliant-handlers-in-dotkernel-light.html.twig +++ b/src/Blog/templates/page/blog-resource/middleware/replacing-controllers-with-psr-15-compliant-handlers-in-dotkernel-light.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/middleware/replacing-controllers-with-psr-15-compliant-handlers-in-dotkernel-light.jsonld.twig') }} {% endblock %} - -{% block title %}Replacing controllers with PSR-15 compliant handlers in Dotkernel Light{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Middleware', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    The goal of this update is to implement PSR-15 handlers into Dotkernel Light. There are several advantages to using handlers, which we will explore below.

    @@ -184,11 +164,4 @@ class GetPageViewHandler implements RequestHandlerInterface

    Single Action Handlers in PHP Frameworks

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/almalinux-9-in-wsl2-install-php-apache-mariadb-composer-phpmyadmin.html.twig b/src/Blog/templates/page/blog-resource/php-development/almalinux-9-in-wsl2-install-php-apache-mariadb-composer-phpmyadmin.html.twig index a89240b..0cbcdf5 100644 --- a/src/Blog/templates/page/blog-resource/php-development/almalinux-9-in-wsl2-install-php-apache-mariadb-composer-phpmyadmin.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/almalinux-9-in-wsl2-install-php-apache-mariadb-composer-phpmyadmin.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/almalinux-9-in-wsl2-install-php-apache-mariadb-composer-phpmyadmin.jsonld.twig') }} {% endblock %} - -{% block title %}AlmaLinux 9 in WSL2 : install PHP, Apache, MariaDB, Composer, PhpMyadmin{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    In this article we will demonstrate how we install AlmaLinux 9 using Windows Subsystem for Linux (WSL2).

    First, you need to check if your machine is ready for using WSL2. Open Windows Terminal and execute the following command:

    @@ -143,11 +123,4 @@ Windows version: 10.0.22631.3737
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/aptana-php-installation-in-aptana-2-x.html.twig b/src/Blog/templates/page/blog-resource/php-development/aptana-php-installation-in-aptana-2-x.html.twig index 92e8ff0..64c053e 100644 --- a/src/Blog/templates/page/blog-resource/php-development/aptana-php-installation-in-aptana-2-x.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/aptana-php-installation-in-aptana-2-x.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/aptana-php-installation-in-aptana-2-x.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Aptana PHP installation in Aptana 2.x{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} As all aptana fans know, Aptana PHP plugin was discontinued in Aptana 2.x, in favor of PDT. But PDT is a joke, not suitable for professional PHP development, major features are missing. So if you want to continue using Aptana PHP, that's what need to be done: @@ -36,11 +16,4 @@ In case you don't have yet a SVN plugin, go to
  • Others -> Subclipse
  • Follow the instructions
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/better-unicode-support-in-mysql-5-5-utf8mb4.html.twig b/src/Blog/templates/page/blog-resource/php-development/better-unicode-support-in-mysql-5-5-utf8mb4.html.twig index a972633..b836ae0 100644 --- a/src/Blog/templates/page/blog-resource/php-development/better-unicode-support-in-mysql-5-5-utf8mb4.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/better-unicode-support-in-mysql-5-5-utf8mb4.html.twig @@ -1,46 +1,19 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/better-unicode-support-in-mysql-5-5-utf8mb4.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Better Unicode Support in MySQL 5.5 UTF8MB4{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Beginning with version 5.5 of MySQL , utf8mb4 character set was introduced, in order to better support Unicode. Further reading: MySQL and Unicode , also directly related to PHP Sample dk.sql file, part of Dotkernel framework, was updated in revision 793 Only one downside , is not possible to use anymore VARCHAR(255), as you will get the error: -
    >#1071 - Specified key was too long; max key length is 767 bytes
    +
    #1071 - Specified key was too long; max key length is 767 bytes
    Explanation here ; so we use instead VARCHAR(150) Now we should change the connection charset. In config/application.ini file, edit the below line : -
    >database.params.charset = utf8mb4
    +
    database.params.charset = utf8mb4
    Other changes that can be made in my.cnf file are all related to replacing the string utf8_* with utf8mb4_* -
    >character_set_server=utf8mb4
    -
    >collation_server=utf8mb4_general_ci
    -
    >collation_server=utf8mb4_unicode_ci
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    +
    character_set_server=utf8mb4
    +
    collation_server=utf8mb4_general_ci
    +
    collation_server=utf8mb4_unicode_ci
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/database-seeding-doctrine-data-fixtures-vs-phinx.html.twig b/src/Blog/templates/page/blog-resource/php-development/database-seeding-doctrine-data-fixtures-vs-phinx.html.twig index 6e92e76..2a17c85 100644 --- a/src/Blog/templates/page/blog-resource/php-development/database-seeding-doctrine-data-fixtures-vs-phinx.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/database-seeding-doctrine-data-fixtures-vs-phinx.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/database-seeding-doctrine-data-fixtures-vs-phinx.jsonld.twig') }} {% endblock %} - -{% block title %}Database seeding: Doctrine data fixtures vs Phinx{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Database seeding: Doctrine data fixtures vs Phinx

    Seeding the database means populating the database with initial values, it's commonly used for seeding the user roles and user accounts.

    @@ -274,11 +254,4 @@ class UserLoader implements FixtureInterface, DependentFixtureInterface

    To wrap things up, we implemented a database seeder and saw a practical example of how to use it.

    More details about Fixtures in this blogpost: https://matthiasnoback.nl/2018/07/about-fixtures/ .

    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/end-of-support-for-php-5-2-x-branch.html.twig b/src/Blog/templates/page/blog-resource/php-development/end-of-support-for-php-5-2-x-branch.html.twig index eaf8add..f2aa257 100644 --- a/src/Blog/templates/page/blog-resource/php-development/end-of-support-for-php-5-2-x-branch.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/end-of-support-for-php-5-2-x-branch.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/end-of-support-for-php-5-2-x-branch.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}End of Support for PHP 5.2.x Branch{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} PHP 5.2.14 was just released . And this is the end of support for 5.2.x branch of PHP .
    NOTE:This release marks the end of the active support for PHP 5.2. Following this release the PHP 5.2 series will receive no further active bug maintenance. Security fixes for PHP 5.2 might be published on a case by cases basis. All users of PHP 5.2 are encouraged to upgrade to PHP 5.3
    PHP 5.3.3 is just released ,  so is time to upgrade every project  to PHP 5.3.x branch, and also upgrade all servers to 5.3.x @@ -47,11 +27,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/floating-point-arithmetic-why-is-int-0-7-0-1-10-7.html.twig b/src/Blog/templates/page/blog-resource/php-development/floating-point-arithmetic-why-is-int-0-7-0-1-10-7.html.twig index 0d72ddc..4a47cf0 100644 --- a/src/Blog/templates/page/blog-resource/php-development/floating-point-arithmetic-why-is-int-0-7-0-1-10-7.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/floating-point-arithmetic-why-is-int-0-7-0-1-10-7.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/floating-point-arithmetic-why-is-int-0-7-0-1-10-7.jsonld.twig') }} {% endblock %} - -{% block title %}Floating-Point Arithmetic - Why is (int)((0.7+0.1)*10) = 7 ?{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article applies to PHP 5.x but also to PHP 7 While using floating-point arithmetic you might have noticed that not all the calculus results are as expected, this can usually be observed when casting values. @@ -119,11 +99,4 @@ For a more technical & mathematical approach read -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/mezzio-app-development-in-wsl2.html.twig b/src/Blog/templates/page/blog-resource/php-development/mezzio-app-development-in-wsl2.html.twig index 0dbffee..d524f67 100644 --- a/src/Blog/templates/page/blog-resource/php-development/mezzio-app-development-in-wsl2.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/mezzio-app-development-in-wsl2.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/mezzio-app-development-in-wsl2.jsonld.twig') }} {% endblock %} - -{% block title %}Mezzio app development in WSL2{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Install a Mezzio app (Dotkernel API) using WSL2

    This article will run you through the steps of installing a Mezzio application (Dotkernel API) in WSL2 and run it on Ubuntu 20.04 LTS.

    @@ -97,11 +77,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/php-5-3-6-released-no-upgrade-possible-for-wampserver.html.twig b/src/Blog/templates/page/blog-resource/php-development/php-5-3-6-released-no-upgrade-possible-for-wampserver.html.twig index 5385801..c74e784 100644 --- a/src/Blog/templates/page/blog-resource/php-development/php-5-3-6-released-no-upgrade-possible-for-wampserver.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/php-5-3-6-released-no-upgrade-possible-for-wampserver.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/php-5-3-6-released-no-upgrade-possible-for-wampserver.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}PHP 5.3.6 released. No upgrade possible for WampServer.{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} PHP 5.3.6 was released, but it come with a bad news for WampServer users:
    "Windows users: please mind that we do no longer provide builds created with Visual Studio C++ 6"
    Since WampServer is built using VC++ 6,  is not possible an upgrade , without a rewrite from scratch of entire WampServer package. @@ -43,11 +23,4 @@ More details on WampServer forum  -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In hosted software development, the environment refers to a server tier designated to a specific stage in a release process. The purpose of these environments is to improve the development, testing and release processes in client-server applications. The most common environments are described below. @@ -71,11 +51,4 @@ To better understand the development of an application using environments, check
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/php-support-back-in-aptana-3-0.html.twig b/src/Blog/templates/page/blog-resource/php-development/php-support-back-in-aptana-3-0.html.twig index a47b9b1..fac5e96 100644 --- a/src/Blog/templates/page/blog-resource/php-development/php-support-back-in-aptana-3-0.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/php-support-back-in-aptana-3-0.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/php-support-back-in-aptana-3-0.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}PHP support back in Aptana 3.0{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/protection-against-sql-injection-using-pdo-and-zend-framework-part-2.html.twig b/src/Blog/templates/page/blog-resource/php-development/protection-against-sql-injection-using-pdo-and-zend-framework-part-2.html.twig index abfa755..1955088 100644 --- a/src/Blog/templates/page/blog-resource/php-development/protection-against-sql-injection-using-pdo-and-zend-framework-part-2.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/protection-against-sql-injection-using-pdo-and-zend-framework-part-2.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/protection-against-sql-injection-using-pdo-and-zend-framework-part-2.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Protection against SQL Injection using PDO and Zend Framework - part 2{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Following the preview article about SQL Injection, here is more - a strong argument why you should use Zend Framework for handling database access. Zend_Db is the primary class used for access the database, but there is more: Zend_Db_Statement, Zend_Db_Select and Zend_Db_Tables. What you should know about their methods is: @@ -62,7 +42,7 @@ What you should know about their methods is: For more details see Stefan Esser slides. PS. A short tip, you can use cast type to avoid SQL Injection in WHERE clause where is possible. -
    >$sql= 'SELECT * FROM table WHERE id = ' . (int)$_POST['id'];
    +
    $sql= 'SELECT * FROM table WHERE id = ' . (int)$_POST['id'];
     

    Frequently Asked Questions

    @@ -105,11 +85,4 @@ PS. A short -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} SQL injection is a technique that exploits a security vulnerability occurring in the database layer of an application. Usually, user input is not filtered by the script and is passed into a SQL statement. PDO – PHP Data Objects – is a database access layer providing a standardized method of access to multiple databases.  @@ -86,11 +66,4 @@ For more details see:
    -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/remote-connections-to-mysql-server-on-plesk-based-servers.html.twig b/src/Blog/templates/page/blog-resource/php-development/remote-connections-to-mysql-server-on-plesk-based-servers.html.twig index d7d52e8..104acf3 100644 --- a/src/Blog/templates/page/blog-resource/php-development/remote-connections-to-mysql-server-on-plesk-based-servers.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/remote-connections-to-mysql-server-on-plesk-based-servers.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/remote-connections-to-mysql-server-on-plesk-based-servers.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Remote connections to MySQL server on Plesk based servers{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} By default, MySql servers on Linux machines where Plesk is installed, have the old_passwords=1 or ON flag. That mean even if you have MySQL 5.5+ version, it still use old style of password storage, pre-mysql 4.1+ @@ -28,7 +8,7 @@ That mean even if you have MySQL 5.5+ version, it still use old style of passwor If you try to connect remote, from your local development machine, you will get an ugly error, like:   -
    >Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE  mysqlnd
    +
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE  mysqlnd
     cannot connect  to MySQL 4.1+ using the old insecure authentication. Please use an administration
     tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password').
     This will store a new, and more secure, hash value in mysql.user.
    @@ -40,7 +20,7 @@ If this user is used in other scripts executed by PHP 5.2 or earlier you might n
         
  • Grant priviledges to that user to the database you want to connect to.
  • Now run the below SQL statements:
  • -
    >SET old_passwords = 0;
    +
    SET old_passwords = 0;
     UPDATE mysql.user SET Password = PASSWORD('somepassword') WHERE User = 'someuser' limit 1;
     SELECT LENGTH(Password) FROM mysql.user WHERE User = 'someuser';
     FLUSH PRIVILEGES;
    @@ -80,11 +60,4 @@ NOTE: if you browse the table mysql.user , you will note that the password field
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/static-analysis-replacing-psalm-with-phpstan.html.twig b/src/Blog/templates/page/blog-resource/php-development/static-analysis-replacing-psalm-with-phpstan.html.twig index 2926d94..fb2d93f 100644 --- a/src/Blog/templates/page/blog-resource/php-development/static-analysis-replacing-psalm-with-phpstan.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/static-analysis-replacing-psalm-with-phpstan.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/static-analysis-replacing-psalm-with-phpstan.jsonld.twig') }} {% endblock %} - -{% block title %}Static Analysis - Replacing Psalm with PHPStan{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    What is Static Analysis

    Static analysis (static code analysis or source code analysis) applies a set of coding rules to debug source code before a program is run. Applied in the early phase of code development, the goals of static analysis are:

    @@ -221,11 +201,4 @@ parameters:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/using-aptana-to-connect-to-dotkernel-tracker-mantis.html.twig b/src/Blog/templates/page/blog-resource/php-development/using-aptana-to-connect-to-dotkernel-tracker-mantis.html.twig index e8ac3d9..27046de 100644 --- a/src/Blog/templates/page/blog-resource/php-development/using-aptana-to-connect-to-dotkernel-tracker-mantis.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/using-aptana-to-connect-to-dotkernel-tracker-mantis.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/using-aptana-to-connect-to-dotkernel-tracker-mantis.jsonld.twig') }} {% endblock %} - -{% block title %}Using Aptana to connect to Dotkernel tracker (Mantis){% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In developing Dotkernel application framework, we needed a tracking system. Dotkernel Tracker is the place where the bugs are reported, new features are announced and other general tickets are added. Dotkernel Tracker is a Mantis web-based bugtracking system. To simplify the development of Dotkernel, we integrated our web development IDE – Aptana with our bugtracking system – Dotkernel Tracker. In the Downloads section, you will find screenshots with the below steps for Using Aptana with the Mylyn connector for Mantis @@ -92,11 +72,4 @@ In developing Dotkernel application framework, we needed a trac
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/using-php-7-express-in-zend-studio-13.html.twig b/src/Blog/templates/page/blog-resource/php-development/using-php-7-express-in-zend-studio-13.html.twig index cbaeb60..4195c8b 100644 --- a/src/Blog/templates/page/blog-resource/php-development/using-php-7-express-in-zend-studio-13.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/using-php-7-express-in-zend-studio-13.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/using-php-7-express-in-zend-studio-13.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Using PHP 7 Express in Zend Studio 13{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article will cover the steps needed in order to check the PHP7 compatibility, a small troubleshooter. This article will also contain a compatibility issue check on the latest Zend Framework 1 version. @@ -100,11 +80,4 @@ The result should look like this:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/version-control-ignore-patterns-in-zend-studio.html.twig b/src/Blog/templates/page/blog-resource/php-development/version-control-ignore-patterns-in-zend-studio.html.twig index 8460a42..0222901 100644 --- a/src/Blog/templates/page/blog-resource/php-development/version-control-ignore-patterns-in-zend-studio.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/version-control-ignore-patterns-in-zend-studio.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/version-control-ignore-patterns-in-zend-studio.jsonld.twig') }} {% endblock %} - -{% block title %}Version Control Ignore Patterns in Zend Studio{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In order to globally manage the "Ignored Resources"  patterns in Zend Studio, for all projects , instead of manually add to each project, you can do the following: 1. Go to Window-> Preferences @@ -53,11 +33,4 @@ Also, on each project, you can use either global ignored  patterns, or use spec
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/welcome-to-the-10th-zend-certified-engineer-in-dotboost-team.html.twig b/src/Blog/templates/page/blog-resource/php-development/welcome-to-the-10th-zend-certified-engineer-in-dotboost-team.html.twig index 6ba4b47..ad28fa3 100644 --- a/src/Blog/templates/page/blog-resource/php-development/welcome-to-the-10th-zend-certified-engineer-in-dotboost-team.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/welcome-to-the-10th-zend-certified-engineer-in-dotboost-team.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/welcome-to-the-10th-zend-certified-engineer-in-dotboost-team.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Welcome to the 10th Zend Certified Engineer in Dotboost Team{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Today is a major milestone for our Dotboost Technologies Inc. Company. We are announcing the 10th member of the team passed the Zend Certified Engineer exam. Zend Yellow Pages @@ -46,11 +26,4 @@ Beginning 2014, a Zend Certification will became mandatory for every developer i
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-development/zend-server-5-5-quick-setup-on-windows.html.twig b/src/Blog/templates/page/blog-resource/php-development/zend-server-5-5-quick-setup-on-windows.html.twig index 00c861c..2234d14 100644 --- a/src/Blog/templates/page/blog-resource/php-development/zend-server-5-5-quick-setup-on-windows.html.twig +++ b/src/Blog/templates/page/blog-resource/php-development/zend-server-5-5-quick-setup-on-windows.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-development/zend-server-5-5-quick-setup-on-windows.jsonld.twig') }} {% endblock %} - -{% block title %}Zend Server 5.5 Quick Setup on Windows{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Development', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} In order to make  usable a fresh installation of Zend Server 5.5.0 on Windows 7, and be ready for development , few quick steps are required: @@ -75,11 +55,4 @@ In order to make  usable a fresh installation of Zend Server 5.5.0 on Windows 7
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-troubleshooting/fix-installing-pear-packages-with-php-7-2.html.twig b/src/Blog/templates/page/blog-resource/php-troubleshooting/fix-installing-pear-packages-with-php-7-2.html.twig index 8567966..98c09e1 100644 --- a/src/Blog/templates/page/blog-resource/php-troubleshooting/fix-installing-pear-packages-with-php-7-2.html.twig +++ b/src/Blog/templates/page/blog-resource/php-troubleshooting/fix-installing-pear-packages-with-php-7-2.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-troubleshooting/fix-installing-pear-packages-with-php-7-2.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}[FIX] Installing PEAR packages with PHP 7.2{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Troubleshooting', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} This article will cover the solution to the PEAR "Cannot use result of built-in function in write context" issue.

    The Issue

    If installing a pear package (for instance PHP Code Sniffer), when running: @@ -88,11 +68,4 @@ And to install the code sniffer run:
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/php-troubleshooting/where-is-the-intl-php-extension-problem-solved.html.twig b/src/Blog/templates/page/blog-resource/php-troubleshooting/where-is-the-intl-php-extension-problem-solved.html.twig index e842a6b..7dfa484 100644 --- a/src/Blog/templates/page/blog-resource/php-troubleshooting/where-is-the-intl-php-extension-problem-solved.html.twig +++ b/src/Blog/templates/page/blog-resource/php-troubleshooting/where-is-the-intl-php-extension-problem-solved.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/php-troubleshooting/where-is-the-intl-php-extension-problem-solved.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Where is the intl PHP extension? Problem solved!{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHP Troubleshooting', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Problem

    PHP packages/frameworks/libraries/scripts we work with might require different PHP extensions. In this case the Intl extension is needed to work with using Internationalization Functions. @@ -154,11 +134,4 @@ Edit: changed php7.0 occurrences with php7.x
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/phpstorm/code-quality-how-to-setup-phpcs-in-phpstorm.html.twig b/src/Blog/templates/page/blog-resource/phpstorm/code-quality-how-to-setup-phpcs-in-phpstorm.html.twig index bcbe229..f6b3297 100644 --- a/src/Blog/templates/page/blog-resource/phpstorm/code-quality-how-to-setup-phpcs-in-phpstorm.html.twig +++ b/src/Blog/templates/page/blog-resource/phpstorm/code-quality-how-to-setup-phpcs-in-phpstorm.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/phpstorm/code-quality-how-to-setup-phpcs-in-phpstorm.jsonld.twig') }} {% endblock %} - -{% block title %}Code Quality: How to setup phpcs in PHPStorm{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'PHPStorm', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    PHP_CodeSniffer or phpcs is a tool that helps developers maintain a specific standard in the way they write code. In order to be able to provide relevant information, phpcs needs to be configured correctly in PHPStorm (see image).

    @@ -128,11 +108,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/scienta-zf-debug-bar-a-very-helpfull-zf-debug-tool.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/scienta-zf-debug-bar-a-very-helpfull-zf-debug-tool.html.twig index 3ba9d30..296d064 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/scienta-zf-debug-bar-a-very-helpfull-zf-debug-tool.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/scienta-zf-debug-bar-a-very-helpfull-zf-debug-tool.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/scienta-zf-debug-bar-a-very-helpfull-zf-debug-tool.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Scienta ZF Debug Bar: A very helpfull ZF debug tool{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Just found today a very interesting and helpful debug tool: Scienta @@ -43,11 +23,4 @@ We at Dotkernel used some very basic debug bar:  queries, time spent , memory u
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/sunsetting-pear-channel-for-zend-framework-1.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/sunsetting-pear-channel-for-zend-framework-1.html.twig index 90735df..4b2955b 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/sunsetting-pear-channel-for-zend-framework-1.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/sunsetting-pear-channel-for-zend-framework-1.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/sunsetting-pear-channel-for-zend-framework-1.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Sunsetting PEAR Channel for Zend Framework 1{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %}

    Sunsetting PEAR Channel for Zend Framework 1

    The unofficial PEAR channel for Zend Framework 1 was created in 2016 , at the time when PEAR was still used a lot.

    @@ -61,11 +41,4 @@
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/wurfl-php-api-libraries-gpl-versions.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/wurfl-php-api-libraries-gpl-versions.html.twig index a3940e5..1577296 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/wurfl-php-api-libraries-gpl-versions.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/wurfl-php-api-libraries-gpl-versions.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/wurfl-php-api-libraries-gpl-versions.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}WURFL PHP API libraries , GPL versions{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} GPL versions of WURFL PHP API libraries are ready to be downloaded from here . Version 1.1 is the one integrated in Zend Framework Zend_Htpp_UserAgent component. @@ -47,11 +27,4 @@ Version 1.2.1 is the latest released under GPL license.
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-12-4-released-with-security-fixes.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-12-4-released-with-security-fixes.html.twig index 0b7b844..bdb7e67 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-12-4-released-with-security-fixes.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-12-4-released-with-security-fixes.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/zend-framework-1-12-4-released-with-security-fixes.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend Framework 1.12.4 Released with Security Fixes{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Matthew Weier O'Phinney just announced the release of ZF 1.12.4, 2.1.6, and 2.2.6 m with Security Updates For more information, please read the official release announcement: @@ -60,11 +40,4 @@ Zend Framework 1.12.5 was released, in order to fix a backward compatibility iss
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-7-0-released.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-7-0-released.html.twig index 55e52e3..77e7cf8 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-7-0-released.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-7-0-released.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/zend-framework-1-7-0-released.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend Framework 1.7.0 Released{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - - {{ include('@partial/post-nav.html.twig') }} - - - - {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-end-of-life.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-end-of-life.html.twig index 0b72bfc..69b1e1a 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-end-of-life.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-1-end-of-life.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/zend-framework-1-end-of-life.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend Framework 1 End-of-Life{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} EOL ( End-of-Life)  term was just announced. Only up until Sept. 28,2016 , Zend Framework 1 will receive security updates. @@ -32,11 +12,4 @@ Only up until Sept. 28,2016 , Zend Framework 1 will receive security updates.   Read the official announcement . -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-as-pear-accessible-repository-on-plesk-server.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-as-pear-accessible-repository-on-plesk-server.html.twig index 41412fa..e37e516 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-as-pear-accessible-repository-on-plesk-server.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/zend-framework-as-pear-accessible-repository-on-plesk-server.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/zend-framework-as-pear-accessible-repository-on-plesk-server.jsonld.twig') }} {% endblock %} +{% extends '@layout/blog-post.html.twig' %} -{% block title %}Zend Framework as PEAR accessible repository on Plesk server{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} - -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} Why we want to install ZF as PEAR ? Because is too boring and time consuming to move all ZF files up and down for each script you want to install , there are a lot of files. Also that way we can forget about the need to update ZF at latest versions, and keep tracks of which version and on which server we have ZF.  Of course, backward compatibility  can be an issue in future ZF releases ( like 2.0 branch for PHP > 5.3) @@ -30,18 +10,11 @@ Also that way we can forget about the need to update ZF at latest versions, and
  • Follow the instructions for ZF PEAR . Then simply use: pear install zend/zend
  • Create a vhosts.conf file in /var/www/vhosts/dotkernel.com/conf  or where is your vhost configuration folder located.
  • In that file, remove the open_basedir :
  • -
    >php_admin_value open_basedir "/var/www/vhosts/dotkernel.com/httpdocs:/tmp:/usr/share/pear"
    +
    php_admin_value open_basedir "/var/www/vhosts/dotkernel.com/httpdocs:/tmp:/usr/share/pear"
  • rebuild all vhosts:  /usr/local/psa/admin/sbin/websrvmng -a
  • Restart httpd
  • Call directly the preloader: -
    > require_once 'Zend/Loader/Autoloader.php';
    +
     require_once 'Zend/Loader/Autoloader.php';
  • -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %} diff --git a/src/Blog/templates/page/blog-resource/zend-framework/zend-mail-and-zend-http-security-fixes-in-zend-framework-1-12-12.html.twig b/src/Blog/templates/page/blog-resource/zend-framework/zend-mail-and-zend-http-security-fixes-in-zend-framework-1-12-12.html.twig index ec3f3a1..53ee89a 100644 --- a/src/Blog/templates/page/blog-resource/zend-framework/zend-mail-and-zend-http-security-fixes-in-zend-framework-1-12-12.html.twig +++ b/src/Blog/templates/page/blog-resource/zend-framework/zend-mail-and-zend-http-security-fixes-in-zend-framework-1-12-12.html.twig @@ -1,26 +1,6 @@ -{% extends '@layout/default.html.twig' %} -{% block json_ld %} {{ include('@jsonld/zend-framework/zend-mail-and-zend-http-security-fixes-in-zend-framework-1-12-12.jsonld.twig') }} {% endblock %} - -{% block title %}Zend_Mail and Zend_Http Security Fixes in Zend Framework 1.12.12{% endblock %} - -{% block page_title %} - {{ include('@partial/title-section.html.twig', { - back_href: url('page::blog'), - back_label: 'Back to Blog', - badge: 'Zend Framework', - article: article, - }) }} -{% endblock %} - -{% block content %} -
    -
    - - {{ include('@partial/left-menu.html.twig') }} +{% extends '@layout/blog-post.html.twig' %} -
    -
    - {{ include('@partial/obsolete-warning.html.twig', {article: article}) }} +{% block body %} The release of ZF 1.12.12 was just announced,  with Security Updates especially on Zend_Mail and Zend_Http components. @@ -45,11 +25,4 @@ If you cannot, you can download the patch separately and apply it to your ZF ins Zend Framework 1.12.13 was released, in order to fix a regression issue introduced in 1.12.12 release. Release Announcement -
    - - {{ include('@partial/post-nav.html.twig') }} -
    - -
    -
    {% endblock %}